diff --git a/conf/Gruntfile.js b/conf/Gruntfile.js index 2968b96a4e1ed39f07063a1bd8e043b7fd920b41..a6c6c7485d5db0cd7d11b9c5b36617c1b1c1ed5e 100755 --- a/conf/Gruntfile.js +++ b/conf/Gruntfile.js @@ -42,7 +42,9 @@ module.exports = function (grunt) { // Fichiers vMap4MapServer sHome + 'modules/vm4ms/javascript/**/*.js', // Fichiers ANC - sHome + 'modules/anc/javascript/**/*.js' + sHome + 'modules/anc/javascript/**/*.js', + // Fichiers suivi_prod_immo + sHome + 'modules/suivi_prod_immo/**/*.js' ] }, options: { @@ -125,6 +127,8 @@ module.exports = function (grunt) { '"' + sHome + 'modules/vm4ms/javascript ' + sClosureDepsHome + 'modules/vm4ms/javascript"', // Fichiers vMap4MapServer '"' + sHome + 'modules/anc/javascript ' + sClosureDepsHome + 'modules/anc/javascript"', + // Fichiers suivi_prod_immo + '"' + sHome + 'modules/suivi_prod_immo ' + sClosureDepsHome + 'modules/suivi_prod_immo"', // Closure library '"' + sHome + 'conf/node_modules/google-closure-library/closure/goog ' + sClosureDepsHome + 'conf/node_modules/google-closure-library/closure/goog"' ] diff --git a/conf/less/variables.less b/conf/less/variables.less index 9636cd033e250a040d282d02129ea7e3f22e61e1..bcc40f080a998793619abc8ebf3d513534637cf8 100755 --- a/conf/less/variables.less +++ b/conf/less/variables.less @@ -10,7 +10,7 @@ @veremes-qualigeo-color: #832C7A; @veremes-wab-color: #198D9F; /*@veremes-vmap-color: #CB0650;*/ -@veremes-vmap-color: #198D9F; +@veremes-vmap-color: #d06a3c; @veremes-map-backgroud-color: #020237; @veremes-gray-backgroud-color: #3A3A3A; diff --git a/conf/requires/requiresApp.js b/conf/requires/requiresApp.js index 616d38dad7241cdb3244ecd921ad501b04792ec2..f78b803e439e35e4abda4e23283515ad59e53a99 100755 --- a/conf/requires/requiresApp.js +++ b/conf/requires/requiresApp.js @@ -9,4 +9,5 @@ goog.provide('vitis.application.requires'); goog.require('vmap.script_module'); goog.require('vmap.vm4ms.script_module'); -goog.require('vmap.anc.script_module'); \ No newline at end of file +goog.require('vmap.anc.script_module'); +goog.require('vmap.suivi_prod_immo.script_module'); \ No newline at end of file diff --git a/src/module_suivi_prod_immo/module/component/dashboard/dashboard.html b/src/module_suivi_prod_immo/module/component/dashboard/dashboard.html new file mode 100644 index 0000000000000000000000000000000000000000..865b1666a2eae177cc9984aa27b2d9619196b7e6 --- /dev/null +++ b/src/module_suivi_prod_immo/module/component/dashboard/dashboard.html @@ -0,0 +1,20 @@ +<!--<input ng-model="city_show" type="text"> +<select ng-options="city as city.label for city in citys track by city.id" ng-model="city_show"></select> +<div ng-repeat="user in users" ng-if="user.city==city_show.id"> + +<div ng-repeat="user in users" ng-if="user.city==city_show"> + <div ng-style="{'background-color': user.color ? user.color : 'green'}" ng-repeat="(key, value) in user">{{key}} : {{value}}</div> + <div class="user" ng-repeat="(key, value) in user">{{key}} : {{value}}</div> +</div>--> + + +<div id="select_display_form_reader" app-form-reader app-form-definition="formCity" app-form-definition-name="'insert'" + app-form-values="formCityValues"> </div> +<div ng-repeat="city in citys"> + <div class="user" ng-repeat="(key, value) in city">{{key}} : {{value}}</div> + <input type="button" value="Edit" ng-click="getUpdateForm(city)"> + <div ng-if="city.updateForm"> + <div app-form-reader app-form-definition="city.updateForm.forDef" + app-form-definition-name="city.updateForm.formName" app-form-values="city.updateForm.formValues"> </div> + </div> +</div> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/module/component/dashboard/dashboard.js b/src/module_suivi_prod_immo/module/component/dashboard/dashboard.js new file mode 100644 index 0000000000000000000000000000000000000000..59c33c289b58a62540ac3e83fa75602ab704217c --- /dev/null +++ b/src/module_suivi_prod_immo/module/component/dashboard/dashboard.js @@ -0,0 +1,380 @@ +goog.provide('vmap.suivi_prod_immo.dashboard'); + +console.log('urbalyon Dashboard'); + +/** + * Dashboard Directive + * + * @return {angular.Directive} The directive specs. + * @export + * @constructor + */ +vitisApp.dashboardDirective = function () { + // vitisApp.broadcast('dashboardDirectiveLoaded'); + return { + restrict: 'A', + templateUrl: 'modules/suivi_prod_immo/component/dashboard/dashboard.html', + link: function (scope, element, attrs) { + scope.getUpdateForm = function (city) { + city.updateForm = { + formValues: { + display: {}, + update: {}, + insert: {} + }, + formDef: scope.formCity, + formName: 'update' + }; + }; + scope.citys = [{ id: 1, label: 'Lyon' }, { id: 2, label: 'Perpignan' }, { id: 3, label: 'Bordeaux' }]; + /*scope.city_show=scope.citys[0]; + scope.users=[ + {"name":'fabien', "city":1, "color":'red'}, + {"name":'armand', "city":2, "color":'yellow'}, + {"name":'nicolas', "city":3} + ];*/ + scope.formCityValues = { + display: {}, + update: {}, + insert: {} + }; + scope.formCity = { + "display": { + "name": "custom-form", + "title": "veremes_commune_point", + "input_size": "xxs", + "nb_cols": 12, + "javascript": false, + "rows": [ + { + "fields": [ + { + "type": "label", + "name": "code", + "label": "Code INSEE", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "code_1_1" + } + ] + }, + { + "fields": [ + { + "type": "label", + "name": "nom", + "label": "Nom de la commune", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "nom_2_1" + } + ] + }, + { + "fields": [ + { + "type": "label", + "pattern": "[-+]?(\\d*[.])?\\d+", + "name": "pop90", + "label": "Population en 1990", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "pop90_3_1" + } + ] + } + ], + "tabs": { + "position": "top", + "list": [ + { + "label": "Tab 0", + "elements": [ + "code", + "nom", + "pop90" + ] + } + ] + } + }, + "search": { + "name": "custom-form", + "title": "veremes_commune_point", + "input_size": "xxs", + "nb_cols": 12, + "javascript": false, + "rows": [ + { + "fields": [ + { + "type": "text", + "name": "nom", + "label": "Nom de la commune", + "required": false, + "pattern": "", + "nb_cols": 4, + "id": "Element_0_2_1" + }, + { + "type": "text", + "name": "code", + "label": "Code INSEE", + "required": false, + "pattern": "", + "nb_cols": 4, + "id": "Element_0_1_1" + }, + { + "type": "text", + "name": "pop90", + "label": "Population en 1990", + "required": false, + "pattern": "", + "nb_cols": 4, + "id": "Element_0_3_1" + } + ] + } + ], + "tabs": { + "position": "top", + "list": [ + { + "label": "Tab 0", + "elements": [ + "code", + "nom", + "pop90" + ] + } + ] + } + }, + "insert": { + "name": "custom-form", + "title": "veremes_commune_point", + "input_size": "xxs", + "nb_cols": 12, + "javascript": false, + "event": function (oValues) { + console.log(oValues); + scope.citys.push({ id: oValues.update.id, label: oValues.update.label }); + //alert(oValues.nom); + }, + "rows": [ + { + "fields": [ + { + "type": "text", + "name": "code", + "label": "Code INSEE", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "code_1_1" + } + ] + }, + { + "fields": [ + { + "type": "text", + "name": "nom", + "label": "Nom de la commune", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "nom_2_1" + } + ] + }, + { + "fields": [ + { + "type": "text", + "pattern": "[-+]?(\\d*[.])?\\d+", + "name": "pop90", + "label": "Population en 1990", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "pop90_3_1" + } + ] + } + ], + "tabs": { + "position": "top", + "list": [ + { + "label": "Tab 0", + "elements": [ + "code", + "nom", + "pop90" + ] + } + ] + } + }, + "update": { + "name": "custom-form", + "title": "veremes_commune_point", + "input_size": "xxs", + "nb_cols": 12, + "javascript": false, + "rows": [ + { + "fields": [ + { + "type": "label", + "name": "code", + "label": "Code INSEE", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "code_1_1" + } + ] + }, + { + "fields": [ + { + "type": "text", + "name": "label", + "label": "Nom de la commune", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "nom_2_1" + } + ] + }, + { + "fields": [ + { + "type": "text", + "name": "id", + "label": "Identifiant", + "disabled": false, + "required": false, + "nb_cols": 12, + "id": "pop90_3_1" + } + ] + }, + { + "fields": [ + { + "type": "text", + "name": "info", + "label": "Info", + "required": false, + "nb_cols": 12, + "id": "Element_1_1576580650627", + "dynamic_event_type": "focus", + "dynamic_event_function": "getData()" + } + ] + }, + { + "fields": [ + { + "type": "button", + "name": "Element_0", + "nb_cols": 12, + "id": "Element_0_1576578099615", + "class": "btn-ungroup btn-group-sm", + "buttons": [ + { + "type": "submit", + "name": "form_submit", + "label": "FORM_UPDATE", + "class": "btn-primary" + } + ] + } + ] + } + ], + "tabs": { + "position": "top", + "list": [ + { + "label": "Tab 0", + "elements": [ + "label", + "id", + "Element_0" + ] + } + ] + } + }, + "datasources": {}, + "multi-update": { + "name": "custom-form", + "title": "Commune", + "input_size": "xxs", + "nb_cols": 12, + "javascript": false, + "rows": [ + { + "fields": [ + { + "type": "text", + "name": "code", + "label": "code", + "disabled": false, + "required": false, + "nb_cols": 12 + } + ] + }, + { + "fields": [ + { + "type": "text", + "name": "nom", + "label": "nom", + "disabled": false, + "required": false, + "nb_cols": 12 + } + ] + }, + { + "fields": [ + { + "type": "integer", + "name": "pop90", + "label": "pop90", + "disabled": false, + "required": false, + "nb_cols": 12 + } + ] + }, + { + "fields": [ + { + "type": "text", + "name": "geom", + "label": "geom", + "disabled": false, + "required": false, + "nb_cols": 12 + } + ] + } + ] + } + }; + } + }; +}; +vitisApp.module.directive("appDashboard", vitisApp.dashboardDirective); diff --git a/src/module_suivi_prod_immo/module/component/dashboard/dashboard.less b/src/module_suivi_prod_immo/module/component/dashboard/dashboard.less new file mode 100644 index 0000000000000000000000000000000000000000..7072f05a70dd853f816f93e3d1469297e8fbcca5 --- /dev/null +++ b/src/module_suivi_prod_immo/module/component/dashboard/dashboard.less @@ -0,0 +1,3 @@ +.user{ + font-size: large; +} \ No newline at end of file diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_ilot.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_ilot.json new file mode 100644 index 0000000000000000000000000000000000000000..002e66a27cb9c470a7aa936a12f7a5b9daca237b --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_ilot.json @@ -0,0 +1,2632 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_ilot-form", + "title":"SUIVI_PROD_IMMO_ILOT_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"nom_ilot", + "label":"Nom de l'îlot", + "nb_cols":1, + "id":"id_ilot" + }, + { + "type":"label", + "name":"id_operation", + "label":"Identifiant de l'opération", + "nb_cols":6, + "id":"Element_0_1_1" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Indicateurs", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"coef_emprise_sol_moyen", + "label":"CES - Coefficient d'emprise au sol moyen net (en%)", + "nb_cols":3, + "id":"coef_emprise_sol_moyen" + }, + { + "type":"label", + "name":"densite_batie", + "label":"Densité bâtie - COS moyen des îlots batis", + "nb_cols":3, + "id":"densite_batie" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "id_ilot", + "nom_ilot", + "id_operation", + "Element_0", + "coef_emprise_sol_moyen", + "densite_batie" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_ilot-form", + "title":"SUIVI_PROD_IMMO_SAISIE_ILOT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"id_ilot", + "label":"Identifiant", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"id_ilot" + }, + { + "type":"text", + "name":"nom_ilot", + "label":"Nom", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"nom_ilot" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"id_operation", + "label":"Opération", + "required":true, + "nb_cols":3, + "id":"id_operation", + "datasource":{ + "datasource_id":"datasource_38", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_operation", + "order_by":"nom_operation", + "id_key":"id_operation", + "attributs":"id_operation|nom_operation" + }, + "id_from":"id_operation_from" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-xs", + "nb_cols":12, + "name":"search_button", + "id":"search_button", + "buttons":[ + { + "type":"button", + "name":"search", + "label":"FORM_SEARCH_BUTTON", + "class":"btn-primary", + "event":"setGridFilter()" + }, + { + "type":"reset", + "name":"reset", + "label":"FORM_RESET_BUTTON", + "class":"btn-primary", + "event":"resetGridFilter()" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "search_button", + "id_ilot", + "nom_ilot", + "id_operation" + ] + } + ] + } + }, + "insert":{ + "name":"anc_saisie_anc_traitement-form", + "title":"SUIVI_PROD_IMMO_ILOT_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"id_installation", + "label":"Installation", + "required":true, + "nb_cols":4, + "id":"id_installation", + "datasource":{ + "datasource_id":"datasource_38", + "sort_order":"ASC", + "distinct":"true", + "label_key":"num_dossier", + "order_by":"num_dossier", + "id_key":"id_installation", + "attributs":"id_installation|num_dossier" + }, + "id_from":"id_installation_from" + }, + { + "type":"select", + "name":"id_controle", + "label":"Contrôle", + "required":true, + "nb_cols":4, + "id":"id_controle_2_1", + "datasource":{ + "datasource_id":"datasource_39", + "sort_order":"ASC", + "distinct":"true", + "label_key":"id_controle", + "order_by":"id_controle", + "id_key":"id_controle", + "attributs":"id_controle|id_controle", + "parents":[ + { + "name":"id_installation", + "filter_attr":"id_installation", + "filter_equality":"=", + "wait_for_parent":true + } + ] + }, + "id_from":"id_controle_2_1_from" + }, + { + "type":"select", + "name":"tra_type", + "label":"Type de traitement", + "required":true, + "nb_cols":4, + "id":"Element_0_1_2", + "id_from":"Element_0_1_2_from", + "datasource":{ + "datasource_id":"datasource_1", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Dimensionnement", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_nb", + "label":"Nombre de tranchées", + "required":false, + "nb_cols":4, + "id":"Element_1_3_1", + "id_from":"Element_1_3_1_from", + "datasource":{ + "datasource_id":"datasource_2", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"number", + "name":"tra_long", + "label":"Longueur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_2" + }, + { + "type":"number", + "name":"tra_longueur", + "label":"Longueur de chaque tranchée (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_4" + }, + { + "type":"number", + "name":"tra_larg", + "label":"Largeur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_3" + }, + { + "type":"number", + "name":"tra_surf", + "label":"Surface (en m²)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_2" + }, + { + "type":"number", + "name":"tra_tot_lin", + "label":"Linéaire total (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_largeur", + "label":"Largeur des tranchées", + "required":false, + "nb_cols":4, + "id":"Element_1_4_3", + "id_from":"Element_1_4_3_from", + "datasource":{ + "datasource_id":"datasource_40", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"number", + "name":"tra_profond", + "label":"Profondeur des tranchées (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_3" + }, + { + "type":"number", + "name":"tra_profondeur", + "label":"Profondeur (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_2" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"tra_hauteur", + "label":"Hauteur", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"Element_1_5_1" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Implantation", + "nb_cols":12, + "id":"Element_1_6_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_hab", + "label":"Distance habitation > 5m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_1", + "id_from":"Element_2_7_1_from", + "datasource":{ + "datasource_id":"datasource_3", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_lim_parc", + "label":"Limite parcelle > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_2", + "id_from":"Element_2_7_2_from", + "datasource":{ + "datasource_id":"datasource_4", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_veget", + "label":"Distance végétation > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_1", + "id_from":"Element_2_8_1_from", + "datasource":{ + "datasource_id":"datasource_5", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_puit", + "label":"Distance puit 35m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_2", + "id_from":"Element_2_8_2_from", + "datasource":{ + "datasource_id":"datasource_6", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_2", + "label":"Vérification des matériaux", + "nb_cols":12, + "id":"Element_2_9_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_racine", + "label":"Présence d'un film anti-racine", + "nb_cols":4, + "id":"Element_3_10_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_14", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_1_from" + }, + { + "type":"select", + "name":"tra_vm_humidite", + "label":"Présence d'un film anti-humidité", + "nb_cols":4, + "id":"Element_3_10_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_15", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_2_from" + }, + { + "type":"select", + "name":"tra_vm_imper", + "label":"Présence d'un film imperméable", + "nb_cols":4, + "id":"Element_3_10_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_16", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_geomembrane", + "label":"Présence d'une géomembrane", + "nb_cols":4, + "id":"Element_3_11_0", + "datasource":{ + "datasource_id":"datasource_41", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_0_from" + }, + { + "type":"select", + "name":"tra_vm_geogrille", + "label":"Présence d'une géo-grille", + "nb_cols":4, + "id":"Element_3_11_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_17", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_1_from" + }, + { + "type":"select", + "name":"tra_vm_grav_qual", + "label":"Graviers de qualité conforme aux filières d'assainissement non collectif", + "nb_cols":8, + "id":"Element_3_11_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_18", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_2_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_grav_ep", + "label":"Epaisseur conforme des graviers", + "nb_cols":4, + "id":"Element_3_11_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_19", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_3_from" + }, + { + "type":"select", + "name":"tra_vm_geo_text", + "label":"Présence d'un géotextile", + "nb_cols":4, + "id":"Element_3_12_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_20", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_1_from" + }, + { + "type":"select", + "name":"tra_vm_ht_terre_veget", + "label":"Hauteur de terre vegetale de 20 cm au-dessus des drains", + "nb_cols":4, + "id":"Element_3_12_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "id_from":"Element_3_12_2_from", + "datasource":{ + "datasource_id":"datasource_7", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_tuy_perf", + "label":"Les tuyaux d'épandage mis en place sont-ils des tuyaux rigides perforés prévus pour l'assainissement non collectif, orifices dirigés vers le bas", + "nb_cols":12, + "id":"Element_3_12_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_22", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_bon_mat", + "label":"Les bons de matériaux ont-ils été fournis", + "nb_cols":4, + "id":"Element_3_13_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_23", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_1_from" + }, + { + "type":"select", + "name":"tra_vm_sab_qual", + "label":"Sable de qualité conforme", + "nb_cols":4, + "id":"Element_3_13_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_25", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_3_from" + }, + { + "type":"select", + "name":"tra_vm_sab_ep", + "label":"Epaisseur de sable de 0.7", + "nb_cols":4, + "id":"Element_3_13_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_24", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_3", + "label":"Regard de repartition", + "nb_cols":12, + "id":"Element_3_15_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_mat", + "label":"Matériau du regard de répartition", + "nb_cols":4, + "id":"Element_4_16_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_26", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_16_1_from" + }, + { + "type":"select", + "name":"tra_regrep_affl", + "label":"Affleure-t-il le niveau du sol", + "required":false, + "nb_cols":4, + "id":"Element_4_16_2", + "id_from":"Element_4_16_2_from", + "datasource":{ + "datasource_id":"datasource_8", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regrep_equi", + "label":"Equirépartition des eaux", + "required":false, + "nb_cols":4, + "id":"Element_4_16_3", + "id_from":"Element_4_16_3_from", + "datasource":{ + "datasource_id":"datasource_9", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_perf", + "label":"Les tuyaux de répartition sont-ils non perforés", + "nb_cols":12, + "id":"Element_4_17_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_29", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_1_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_5", + "label":"Regard de bouclage", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_mat", + "label":"Matériau du regard de bouclage", + "required":false, + "nb_cols":4, + "id":"Element_6_19_1", + "id_from":"Element_6_19_1_from", + "datasource":{ + "datasource_id":"datasource_10", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regbl_affl", + "label":"Affleure-t-il le niveau de sol", + "nb_cols":4, + "id":"Element_6_19_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_2_from" + }, + { + "type":"select", + "name":"tra_regbl_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_6_19_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_32", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_epand", + "label":"Les tuyaux d'épandage sont raccordés de manière indépendante au regard de bouclage", + "nb_cols":8, + "id":"Element_4_17_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_33", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_2_from" + }, + { + "type":"select", + "name":"tra_regbl_perf", + "label":"Les tuyaux de bouclage sont-ils perforés", + "nb_cols":4, + "id":"Element_6_20_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_34", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_20_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Regard de collecte", + "nb_cols":12, + "id":"Element_4_22_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regcol_mat", + "label":"Matériau du regard de collecte", + "required":false, + "nb_cols":4, + "id":"Element_6_22_1", + "id_from":"Element_6_22_1_from", + "datasource":{ + "datasource_id":"datasource_11", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regcol_affl", + "label":"Affleure-t-il le niveau du sol", + "nb_cols":4, + "id":"Element_7_22_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_7_22_2_from" + }, + { + "type":"select", + "name":"tra_regcol_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_8_22_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_37", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_7", + "label":"Documents", + "nb_cols":12, + "id":"Element_7_26_1" + } + ] + }, + { + "fields":[ + { + "type":"image_wsdata", + "name":"photos_f", + "label":"Photos", + "nb_cols":12, + "id":"Element_0_2_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"fiche_f", + "label":"Fiche Entretien", + "nb_cols":12, + "id":"Element_0_3_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"schema_f", + "label":"Schéma de principe", + "nb_cols":12, + "id":"Element_0_4_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"documents_f", + "label":"Documents", + "nb_cols":12, + "id":"Element_0_5_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"plan_f", + "label":"Plan de recolement", + "nb_cols":12, + "id":"Element_0_6_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"insert_button", + "id":"insert_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_CREATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "insert_button", + "id_controle", + "tra_type", + "id_traitement", + "tra_nb", + "tra_long", + "tra_longueur", + "tra_larg", + "tra_tot_lin", + "tra_surf", + "tra_largeur", + "tra_hauteur", + "tra_profondeur", + "tra_profond", + "Element_1", + "tra_dist_hab", + "tra_dist_lim_parc", + "tra_dist_veget", + "tra_dist_puit", + "Element_2", + "tra_vm_racine", + "tra_vm_humidite", + "tra_vm_imper", + "tra_vm_geogrille", + "tra_vm_grav_qual", + "tra_vm_grav_ep", + "tra_vm_geo_text", + "tra_vm_ht_terre_veget", + "tra_vm_tuy_perf", + "tra_vm_bon_mat", + "tra_vm_sab_ep", + "tra_vm_sab_qual", + "Element_3", + "tra_regrep_mat", + "tra_regrep_affl", + "tra_regrep_equi", + "tra_regrep_perf", + "tra_regbl_epand", + "Element_5", + "tra_regbl_mat", + "tra_regbl_affl", + "tra_regbl_hz", + "tra_regbl_perf", + "Element_4", + "tra_regcol_mat", + "tra_regcol_affl", + "tra_regcol_hz", + "id_installation", + "Element_0", + "Element_7", + "tra_vm_geomembrane" + ] + } + ] + } + }, + "update":{ + "name":"anc_saisie_anc_traitement-form", + "title":"SUIVI_PROD_IMMO_ILOT_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"text", + "name":"nom_ilot", + "label":"Nom de l'îlot", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"Element_6_1_2" + }, + { + "type":"select", + "name":"id_operation", + "label":"Opération", + "required":true, + "nb_cols":3, + "id":"Element_6_1_2", + "datasource":{ + "datasource_id":"datasource_38", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_operation", + "order_by":"nom_operation", + "id_key":"id_operation", + "attributs":"id_operation|nom_operation" + }, + "id_from":"Element_6_1_2_from" + }, + { + "type":"select", + "name":"id_controle", + "label":"Identifiant de contrôle", + "nb_cols":3, + "id":"Element_0_1_1", + "required":true, + "datasource":{ + "datasource_id":"datasource_13", + "sort_order":"ASC", + "distinct":"true", + "label_key":"id_controle", + "order_by":"id_controle", + "id_key":"id_controle", + "attributs":"id_controle|id_controle", + "parents":[ + { + "name":"id_installation", + "filter_attr":"id_installation", + "filter_equality":"=", + "wait_for_parent":true + } + ] + }, + "id_from":"Element_0_1_1_from" + }, + { + "type":"select", + "name":"tra_type", + "label":"Type de traitement", + "required":true, + "nb_cols":3, + "id":"Element_0_1_2", + "id_from":"Element_0_1_2_from", + "datasource":{ + "datasource_id":"datasource_1", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Dimensionnement", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_nb", + "label":"Nombre de tranchées", + "required":false, + "nb_cols":4, + "id":"Element_1_3_1", + "id_from":"Element_1_3_1_from", + "datasource":{ + "datasource_id":"datasource_2", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"number", + "name":"tra_long", + "label":"Longueur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_2" + }, + { + "type":"number", + "name":"tra_longueur", + "label":"Longueur de chaque tranchée (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_4" + }, + { + "type":"number", + "name":"tra_larg", + "label":"Largeur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_3" + }, + { + "type":"number", + "name":"tra_surf", + "label":"Surface (en m²)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_2" + }, + { + "type":"number", + "name":"tra_tot_lin", + "label":"Linéaire total (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_largeur", + "label":"Largeur des tranchées", + "required":false, + "nb_cols":4, + "id":"Element_1_4_3", + "id_from":"Element_1_4_3_from", + "datasource":{ + "datasource_id":"datasource_40", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"number", + "name":"tra_profond", + "label":"Profondeur des tranchées (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_3" + }, + { + "type":"number", + "name":"tra_profondeur", + "label":"Profondeur (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_2" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"tra_hauteur", + "label":"Hauteur", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"Element_1_5_1" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Implantation", + "nb_cols":12, + "id":"Element_1_6_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_hab", + "label":"Distance habitation > 5m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_1", + "id_from":"Element_2_7_1_from", + "datasource":{ + "datasource_id":"datasource_3", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_lim_parc", + "label":"Limite parcelle > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_2", + "id_from":"Element_2_7_2_from", + "datasource":{ + "datasource_id":"datasource_4", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_veget", + "label":"Distance végétation > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_1", + "id_from":"Element_2_8_1_from", + "datasource":{ + "datasource_id":"datasource_5", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_puit", + "label":"Distance puit 35m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_2", + "id_from":"Element_2_8_2_from", + "datasource":{ + "datasource_id":"datasource_6", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_2", + "label":"Vérification des matériaux", + "nb_cols":12, + "id":"Element_2_9_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_racine", + "label":"Présence d'un film anti-racine", + "nb_cols":4, + "id":"Element_3_10_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_14", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_1_from" + }, + { + "type":"select", + "name":"tra_vm_humidite", + "label":"Présence d'un film anti-humidité", + "nb_cols":4, + "id":"Element_3_10_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_15", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_2_from" + }, + { + "type":"select", + "name":"tra_vm_imper", + "label":"Présence d'un film imperméable", + "nb_cols":4, + "id":"Element_3_10_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_16", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_geomembrane", + "label":"Présence d'une géomembrane", + "nb_cols":4, + "id":"Element_3_11_0", + "datasource":{ + "datasource_id":"datasource_41", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_0_from" + }, + { + "type":"select", + "name":"tra_vm_geogrille", + "label":"Présence d'une géo-grille", + "nb_cols":4, + "id":"Element_3_11_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_17", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_1_from" + }, + { + "type":"select", + "name":"tra_vm_grav_qual", + "label":"Graviers de qualité conforme aux filières d'assainissement non collectif", + "nb_cols":8, + "id":"Element_3_11_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_18", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_2_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_grav_ep", + "label":"Epaisseur conforme des graviers", + "nb_cols":4, + "id":"Element_3_11_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_19", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_3_from" + }, + { + "type":"select", + "name":"tra_vm_geo_text", + "label":"Présence d'un géotextile", + "nb_cols":4, + "id":"Element_3_12_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_20", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_1_from" + }, + { + "type":"select", + "name":"tra_vm_ht_terre_veget", + "label":"Hauteur de terre vegetale de 20 cm au-dessus des drains", + "nb_cols":4, + "id":"Element_3_12_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "id_from":"Element_3_12_2_from", + "datasource":{ + "datasource_id":"datasource_7", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_tuy_perf", + "label":"Les tuyaux d'épandage mis en place sont-ils des tuyaux rigides perforés prévus pour l'assainissement non collectif, orifices dirigés vers le bas", + "nb_cols":12, + "id":"Element_3_12_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_22", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_bon_mat", + "label":"Les bons de matériaux ont-ils été fournis", + "nb_cols":4, + "id":"Element_3_13_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_23", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_1_from" + }, + { + "type":"select", + "name":"tra_vm_sab_qual", + "label":"Sable de qualité conforme", + "nb_cols":4, + "id":"Element_3_13_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_25", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_3_from" + }, + { + "type":"select", + "name":"tra_vm_sab_ep", + "label":"Epaisseur de sable de 0.7", + "nb_cols":4, + "id":"Element_3_13_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_24", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_3", + "label":"Regard de repartition", + "nb_cols":12, + "id":"Element_3_15_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_mat", + "label":"Matériau du regard de répartition", + "nb_cols":4, + "id":"Element_4_16_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_26", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_16_1_from" + }, + { + "type":"select", + "name":"tra_regrep_affl", + "label":"Affleure-t-il le niveau du sol", + "required":false, + "nb_cols":4, + "id":"Element_4_16_2", + "id_from":"Element_4_16_2_from", + "datasource":{ + "datasource_id":"datasource_8", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regrep_equi", + "label":"Equirépartition des eaux", + "required":false, + "nb_cols":4, + "id":"Element_4_16_3", + "id_from":"Element_4_16_3_from", + "datasource":{ + "datasource_id":"datasource_9", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_perf", + "label":"Les tuyaux de répartition sont-ils non perforés", + "nb_cols":12, + "id":"Element_4_17_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_29", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_1_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_5", + "label":"Regard de bouclage", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_mat", + "label":"Matériau du regard de bouclage", + "required":false, + "nb_cols":4, + "id":"Element_6_19_1", + "id_from":"Element_6_19_1_from", + "datasource":{ + "datasource_id":"datasource_10", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regbl_affl", + "label":"Affleure-t-il le niveau de sol", + "nb_cols":4, + "id":"Element_6_19_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_2_from" + }, + { + "type":"select", + "name":"tra_regbl_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_6_19_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_32", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_epand", + "label":"Les tuyaux d'épandage sont raccordés de manière indépendante au regard de bouclage", + "nb_cols":8, + "id":"Element_4_17_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_33", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_2_from" + }, + { + "type":"select", + "name":"tra_regbl_perf", + "label":"Les tuyaux de bouclage sont-ils perforés", + "nb_cols":4, + "id":"Element_6_20_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_34", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_20_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Regard de collecte", + "nb_cols":12, + "id":"Element_4_22_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regcol_mat", + "label":"Matériau du regard de collecte", + "required":false, + "nb_cols":4, + "id":"Element_6_22_1", + "id_from":"Element_6_22_1_from", + "datasource":{ + "datasource_id":"datasource_11", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regcol_affl", + "label":"Affleure-t-il le niveau du sol", + "nb_cols":4, + "id":"Element_7_22_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_7_22_2_from" + }, + { + "type":"select", + "name":"tra_regcol_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_8_22_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_37", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_6", + "label":"Suivi", + "nb_cols":12, + "id":"Element_6_23_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"create", + "label":"Auteur", + "nb_cols":6, + "id":"Element_0_3_1" + }, + { + "type":"label", + "name":"create_date", + "label":"Date de création", + "nb_cols":6, + "id":"Element_0_3_2" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"maj", + "label":"Mise à jour", + "nb_cols":6, + "id":"Element_0_3_2" + }, + { + "type":"label", + "name":"maj_date", + "label":"Date de mise à jour", + "nb_cols":6, + "id":"Element_0_3_3" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_7", + "label":"Documents", + "nb_cols":12, + "id":"Element_7_26_1" + } + ] + }, + { + "fields":[ + { + "type":"image_wsdata", + "name":"photos_f", + "label":"Photos", + "nb_cols":12, + "id":"Element_0_2_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"fiche_f", + "label":"Fiche Entretien", + "nb_cols":12, + "id":"Element_0_3_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"schema_f", + "label":"Schéma de principe", + "nb_cols":12, + "id":"Element_0_4_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"documents_f", + "label":"Documents", + "nb_cols":12, + "id":"Element_0_5_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"plan_f", + "label":"Plan de recolement", + "nb_cols":12, + "id":"Element_0_6_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "nom_ilot", + "id_operation" + ] + } + ] + } + }, + "datasources":{ + "datasource_38":{ + "type":"web_service", + "dataType":"tableValue", + "name":"operation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"operation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_38" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.json new file mode 100644 index 0000000000000000000000000000000000000000..790fb14dd912a7d6fc5a93746665b33a730a8eed --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.json @@ -0,0 +1,797 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":true, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"nom_operation", + "label":"Nom de l'opération", + "nb_cols":8, + "id":"nom_operation" + }, + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":2, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"communes_label", + "label":"Commune(s)", + "nb_cols":12, + "id":"communes_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_perimetre", + "label":"Périmètre projet urbain", + "nb_cols":12, + "id":"nom_perimetre" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"ctms_label", + "label":"Conférence(s) Territoriale(s) des Maires", + "nb_cols":12, + "id":"ctms_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"surface", + "label":"Surface (Ha)", + "nb_cols":1, + "id":"surface" + } + ] + }, + { + "fields": [ + { + "type": "map_osm", + "name": "geom", + "label": "Périmètre", + "required": false, + "nb_cols": 12, + "id": "pop90_3_1", + "style": { + "height": "250px" + }, + "map_options": { + "proj": "EPSG:2154", + "type": "OSM", + "output_format": "ewkt", + "center": { + "extent": [ + 828118.6537970116, + 6512133.97777543, + 862347.0524710228, + 6524271.707801675 + ], + "coord": [ + 845232.8531340172, + 6518202.842788553 + ], + "scale": 183342 + }, + "controls": { + "MP": false, + "ZO": true, + "SL": true, + "CP": false + }, + "layers": [], + "interactions": { + "multi_geometry": false, + "full_screen": false, + "RA": false, + "RO": false, + "ED": false, + "DP": false, + "DL": false, + "DPol": false, + "SE": true + }, + "draw_color": "rgba(54,184,255,0.6)", + "contour_color": "rgba(0,0,0,0.4)", + "contour_size": 2, + "circle_radius": 6, + "features": [], + "coord_accuracy": 8 + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Commentaire à l'échelle de l'opération", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"commentaire_operation", + "label":"", + "nb_cols":12, + "id":"commentaire_operation" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "nom_operation", + "communes_label", + "nom_perimetre", + "ctms_label", + "surface", + "geom", + "date_mise_a_jour", + "Element_1", + "commentaire_operation" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_SAISIE_OPERATION", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"id_operation", + "label":"Identifiant", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"id_operation" + }, + { + "type":"text", + "name":"nom_operation", + "label":"Nom", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_operation" + }, + { + "type":"select", + "name":"id_commune", + "label":"Commune principale", + "required":false, + "nb_cols":2, + "id":"id_commune", + "datasource":{ + "datasource_id":"datasource_id_commune", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_commune", + "order_by":"nom_commune", + "id_key":"id_commune", + "attributs":"id_commune|nom_commune" + }, + "id_from":"id_commune_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_avancement", + "label":"État d'avancement", + "required":false, + "nb_cols":3, + "id":"code_avancement", + "datasource":{ + "datasource_id":"datasource_code_avancement", + "sort_order":"ASC", + "distinct":"true", + "label_key":"avancement", + "order_by":"avancement", + "id_key":"code_avancement", + "attributs":"code_avancement|avancement" + }, + "id_from":"code_avancement_from" + }, + { + "type":"number", + "name":"annee_init", + "label":"Année d'initialisation", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_init" + }, + { + "type":"number", + "name":"annee_achevement", + "label":"Année d'achèvement", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_achevement" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"cdp_mo", + "label":"Nom du chef de projet 'Maîtrise d'ouvrage'", + "required":false, + "nb_cols":2, + "id":"cdp_mo", + "datasource":{ + "datasource_id":"datasource_cdp_mo", + "sort_order":"ASC", + "distinct":"true", + "label_key":"cdp_mo", + "order_by":"cdp_mo", + "id_key":"cdp_mo", + "attributs":"cdp_mo|cdp_mo" + }, + "id_from":"cdp_mo_from" + }, + { + "type":"select", + "name":"nom_amenageur", + "label":"Nom de l'aménageur ou du partenaire", + "required":false, + "nb_cols":3, + "id":"nom_amenageur", + "datasource":{ + "datasource_id":"datasource_nom_amenageur", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_amenageur", + "order_by":"nom_amenageur", + "id_key":"nom_amenageur", + "attributs":"nom_amenageur|nom_amenageur" + }, + "id_from":"nom_amenageur_from" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_moe", + "label":"Nom du maître d'oeuvre mandataire", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"nom_moe" + }, + { + "type":"text", + "name":"architecte_moe", + "label":"Nom de l'architecte-urbaniste", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"architecte_moe" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_contexte_urbain", + "label":"Contexte urbain", + "required":false, + "nb_cols":4, + "id":"code_contexte_urbain", + "datasource":{ + "datasource_id":"datasource_code_contexte_urbain", + "sort_order":"ASC", + "distinct":"true", + "label_key":"contexte_urbain", + "order_by":"contexte_urbain", + "id_key":"code_contexte_urbain", + "attributs":"code_contexte_urbain|contexte_urbain" + }, + "id_from":"code_contexte_urbain_from" + }, + { + "type":"select", + "name":"code_suivi", + "label":"Suivi", + "required":false, + "nb_cols":3, + "id":"code_suivi", + "datasource":{ + "datasource_id":"datasource_code_suivi", + "sort_order":"ASC", + "distinct":"true", + "label_key":"suivi", + "order_by":"suivi", + "id_key":"code_suivi", + "attributs":"code_suivi|suivi" + }, + "id_from":"code_suivi_from" + }, + { + "type":"select", + "name":"code_procedure_amenagement", + "label":"Procédure d'aménagement", + "required":false, + "nb_cols":3, + "id":"code_procedure_amenagement", + "datasource":{ + "datasource_id":"datasource_code_procedure_amenagement", + "sort_order":"ASC", + "distinct":"true", + "label_key":"procedure_amenagement", + "order_by":"procedure_amenagement", + "id_key":"code_procedure_amenagement", + "attributs":"code_procedure_amenagement|procedure_amenagement" + }, + "id_from":"code_procedure_amenagement_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_vocation", + "label":"Vocation dominante", + "required":false, + "nb_cols":3, + "id":"code_vocation", + "datasource":{ + "datasource_id":"datasource_code_vocation", + "sort_order":"ASC", + "distinct":"true", + "label_key":"vocation", + "order_by":"vocation", + "id_key":"code_vocation", + "attributs":"code_vocation|vocation" + }, + "id_from":"code_vocation_from" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-xs", + "nb_cols":12, + "name":"search_button", + "id":"search_button", + "buttons":[ + { + "type":"button", + "name":"search", + "label":"FORM_SEARCH_BUTTON", + "class":"btn-primary", + "event":"setGridFilter()" + }, + { + "type":"reset", + "name":"reset", + "label":"FORM_RESET_BUTTON", + "class":"btn-primary", + "event":"resetGridFilter()" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "search_button", + "id_operation", + "nom_operation", + "cdp_mo", + "nom_amenageur", + "nom_moe", + "architecte_moe", + "nom_amenageur", + "annee_init", + "annee_achevement", + "code_avancement", + "code_contexte_urbain", + "code_suivi", + "code_procedure_amenagement", + "code_vocation", + "id_commune" + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"text", + "name":"nom_operation", + "label":"Nom de l'opération", + "required":false, + "pattern":"", + "nb_cols":8, + "id":"nom_operation" + }, + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":2, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"surface", + "label":"Surface en hectare", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"surface" + } + ] + }, + { + "fields": [ + { + "type": "double_select", + "name": "communes", + "label": "Communes de l'opération", + "required": false, + "nb_cols": 4, + "id": "Element_0_4_1", + "name_to": "communes", + "name_from": "communes_from", + "size": 6, + "label_from": "communes non associées", + "label_to": "communes associées à l'opération", + "web_service": { + "ressource_id": "suivi_prod_immo/communes", + "id_key": "id_commune", + "label_key": "nom_commune", + "parameters": { + "order_by": "nom_commune" + } + } + } + ] + }, + { + "fields": [ + { + "type": "double_select", + "name": "ctms", + "label": "Conférences territoriales des maires de l'opération (CTM)", + "required": false, + "nb_cols": 4, + "id": "Element_0_4_1", + "name_to": "ctms", + "name_from": "ctms_from", + "size": 6, + "label_from": "CTM non associées", + "label_to": "CTM associées à l'opération", + "web_service": { + "ressource_id": "suivi_prod_immo/ctms", + "id_key": "id_ctm", + "label_key": "nom_ctm", + "parameters": { + "order_by": "nom_ctm" + } + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"id_perimetre", + "label":"Périmètre projets urbains", + "required":false, + "nb_cols":4, + "id":"id_perimetre", + "id_from":"id_perimetre_from", + "datasource":{ + "datasource_id":"datasource_perimetre", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_perimetre", + "order_by":"nom_perimetre", + "id_key":"id_perimetre", + "attributs":"id_perimetre|nom_perimetre" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"title", + "label":"Commentaires à l'échelle de l'opération", + "nb_cols":12, + "id":"Element_2_9_2" + } + ] + }, + { + "fields":[ + { + "type":"textarea", + "name":"commentaire_operation", + "label":"", + "required":false, + "pattern":"", + "nb_cols":12, + "id":"commentaire_operation" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "title", + "nom_operation", + "surface", + "date_mise_a_jour", + "communes", + "ctms", + "id_perimetre", + "commentaire_operation" + ] + } + ] + } + }, + "datasources":{ + "datasource_perimetre":{ + "type":"web_service", + "dataType":"tableValue", + "name":"perimetre", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"perimetre" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_perimetre" + }, + "datasource_code_avancement":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_avancement", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_avancement" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_avancement" + }, + "datasource_code_contexte_urbain":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_contexte_urbain", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_contexte_urbain" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_contexte_urbain" + }, + "datasource_code_suivi":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_suivi", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_suivi" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_suivi" + }, + "datasource_code_procedure_amenagement":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_procedure_amenagement", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_procedure_amenagement" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_procedure_amenagement" + }, + "datasource_code_vocation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_vocation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_vocation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_vocation" + }, + "datasource_nom_amenageur":{ + "type":"web_service", + "dataType":"tableValue", + "name":"nom_amenageur", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"operation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_nom_amenageur" + }, + "datasource_cdp_mo":{ + "type":"web_service", + "dataType":"tableValue", + "name":"cdp_mo", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"operation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_cdp_mo" + }, + "datasource_id_commune":{ + "type":"web_service", + "dataType":"tableValue", + "name":"commune", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"commune" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_id_commune" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.old.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.old.json new file mode 100644 index 0000000000000000000000000000000000000000..33663d5a5bf7ddc040034aff0a65092deab6a2bd --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.old.json @@ -0,0 +1,3542 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"nom_operation", + "label":"Nom de l'opération", + "nb_cols":6, + "id":"nom_operation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"communes_label", + "label":"Commune(s)", + "nb_cols":12, + "id":"communes_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"ctms_label", + "label":"Conférence(s) Territoriale(s) des Maires", + "nb_cols":12, + "id":"ctms_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"surface", + "label":"Surface (Ha)", + "nb_cols":1, + "id":"surface" + } + ] + }, + { + "fields": [ + { + "type": "map_osm", + "name": "geom", + "label": "Périmètre", + "required": false, + "nb_cols": 12, + "id": "pop90_3_1", + "style": { + "height": "250px" + }, + "map_options": { + "proj": "EPSG:2154", + "type": "OSM", + "output_format": "ewkt", + "center": { + "extent": [ + 828118.6537970116, + 6512133.97777543, + 862347.0524710228, + 6524271.707801675 + ], + "coord": [ + 845232.8531340172, + 6518202.842788553 + ], + "scale": 183342 + }, + "controls": { + "MP": false, + "ZO": true, + "SL": true, + "CP": false + }, + "layers": [], + "interactions": { + "multi_geometry": false, + "full_screen": false, + "RA": false, + "RO": false, + "ED": false, + "DP": false, + "DL": false, + "DPol": false, + "SE": true + }, + "draw_color": "rgba(54,184,255,0.6)", + "contour_color": "rgba(0,0,0,0.4)", + "contour_size": 2, + "circle_radius": 6, + "features": [], + "coord_accuracy": 8 + } + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":2, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Acteurs", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_mo", + "label":"Nom de la structure Maîtrise d'ouvrage (Métropole, EPCI, Collectivité, ...)", + "nb_cols":6, + "id":"nom_mo" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cdp_mo", + "label":"Nom / Contact du chef de projet", + "nb_cols":6, + "id":"cdp_mo" + }, + { + "type":"label", + "name":"direction_mo", + "label":"Direction maîtrise d'ouvrage", + "nb_cols":6, + "id":"direction_mo" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_amenageur", + "label":"Nom de la structure de l'aménageur public ou privé, si gestion déléguée du suivi et de la réalisation de l'opération", + "nb_cols":6, + "id":"nom_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cdp_amenageur", + "label":"Nom / Contact du chef de projet côté aménageur", + "nb_cols":6, + "id":"cdp_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_moe", + "label":"Nom du maître d'oeuvre mandataire (cabinet archi-urba ou groupement)", + "nb_cols":6, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"architecte_moe", + "label":"Nom de l'architecte-urbaniste en chef de l'opération", + "nb_cols":6, + "id":"architecte_moe" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Avancement", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"avancement", + "label":"État d'avancement de l'opération", + "nb_cols":10, + "id":"avancement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_period", + "label":"Période de réalisation de l'opération", + "nb_cols":2, + "id":"Element_0_2_2" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_init", + "label":"Année initialisation", + "nb_cols":1, + "id":"annee_init" + }, + { + "type":"label", + "name":"annee_achevement", + "label":"Année achèvement", + "nb_cols":1, + "id":"annee_achevement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nb_phase", + "label":"Nombre de phases", + "nb_cols":1, + "id":"nb_phase" + }, + { + "type":"label", + "name":"commentaire_phase", + "label":"Commentaire explicitant les phases", + "nb_cols":11, + "id":"commentaire_phase" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Mode opératoire", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"contexte_urbain", + "label":"Contexte urbain de l'opération", + "nb_cols":5, + "id":"contexte_urbain" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"suivi", + "label":"Suivi de l'opération", + "nb_cols":3, + "id":"suivi" + }, + { + "type":"label", + "name":"commentaire_operation_mixte", + "label":"Commentaire pour une opération mixte", + "nb_cols":9, + "id":"commentaire_operation_mixte" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"procedure_amenagement", + "label":"Procédure d'aménagement", + "nb_cols":5, + "id":"procedure_amenagement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"mode_financements_label", + "label":"Mode de financement des équipements publics", + "nb_cols":12, + "id":"mode_financements_label" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Programmation prévisionnelle - Densités", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"vocation", + "label":"Vocation dominante de l'opération", + "nb_cols":10, + "id":"vocation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_sdp", + "label":"Répartition prévisionnelle programmatique (annoncée)", + "nb_cols":2, + "id":"Element_5_2_3" + }, + { + "type":"label", + "name":"sdp", + "label":"SDP en m²", + "nb_cols":2, + "id":"sdp" + }, + { + "type":"label", + "name":"label_sdp2", + "label":"Surface de plancher globale de l'opération", + "nb_cols":2, + "id":"Element_5_2_4" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_activite", + "label":"Activités", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"sdp_bureau", + "label":"SDP programmée en bureaux en m²", + "nb_cols":2, + "id":"sdp_bureau" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_equipement", + "label":"Équipements", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"label", + "name":"sdp_equipement", + "label":"SDP globale programmée en équipements en m²", + "nb_cols":2, + "id":"sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"sdp_commerce_service", + "label":"SDP programmée en commerces et services en m²", + "nb_cols":2, + "id":"sdp_commerce_service" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"commentaire_sdp_equipement", + "label":"Commentaires - liste des équipements", + "nb_cols":3, + "id":"commentaire_sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_7" + }, + { + "type":"label", + "name":"sdp_loisir", + "label":"SDP programmée en loisirs marchands en m²", + "nb_cols":2, + "id":"sdp_loisir" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_espace_public_vert", + "label":"Espaces publics, espaces verts", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"label", + "name":"emprise_espace_public_vert", + "label":"Emprise en m² totale programmée", + "nb_cols":2, + "id":"emprise_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_8" + }, + { + "type":"label", + "name":"sdp_hotel", + "label":"SDP programmée en hôtellerie en m²", + "nb_cols":2, + "id":"sdp_hotel" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"commentaire_espace_public_vert", + "label":"Commentaires - liste / détails des espaces", + "nb_cols":3, + "id":"commentaire_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_9" + }, + { + "type":"label", + "name":"sdp_locaux", + "label":"SDP programmée en locaux d'activités en m²", + "nb_cols":2, + "id":"sdp_locaux" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_logement", + "label":"Logements", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"sdp_logement", + "label":"SDP globale programmée en logements en m²", + "nb_cols":2, + "id":"sdp_logement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"nb_logement", + "label":"Nombre prévisionnel total de logements", + "nb_cols":2, + "id":"nb_logement" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"nb_lgt_fam", + "label":"Total nombre de logements familiaux", + "nb_cols":2, + "id":"nb_lgt_fam" + }, + { + "type":"label", + "name":"nb_lgt_spe", + "label":"Total nombre de logements spécifiques", + "nb_cols":2, + "id":"nb_lgt_spe" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nb_lgt_hectare", + "label":"Nombre de logements à l'hectare", + "nb_cols":3, + "id":"nb_lgt_hectare" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"coef_emprise_sol_moyen", + "label":"Coefficient d'emprise au sol moyen net (CES)", + "nb_cols":3, + "id":"coef_emprise_sol_moyen" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"densite_batie", + "label":"Densité bâtie", + "nb_cols":3, + "id":"densite_batie" + } + ] + }, + + + "nb_lgt_hectare", + "coef_emprise_sol_moyen", + "densite_batie", + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Aspects financiers - Coûts", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"depense_globale", + "label":"Dépenses", + "nb_cols":1, + "id":"depense_globale" + }, + { + "type":"label", + "name":"label_depense_globale", + "label":"Montant global prévisionnel du coût de l'opération en M€ HT (ontégrant études, foncier, travaux prévisionnels, divers frais, marges, ...)", + "nb_cols":5, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_2" + }, + { + "type":"label", + "name":"label_depense_cout_foncier", + "label":"Dont coût affecté au Foncier (procédures et acquisitions)", + "nb_cols":2, + "id":"Element_0_2_3" + }, + { + "type":"label", + "name":"pourc_depense_cout_foncier", + "label":"% par rapport au montant global", + "nb_cols":2, + "id":"pourc_depense_cout_foncier" + }, + { + "type":"label", + "name":"depense_cout_foncier", + "label":"M€ HT", + "nb_cols":2, + "id":"depense_cout_foncier" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_4" + }, + { + "type":"label", + "name":"label_depense_mise_etat_sol", + "label":"Dont mise en état des sols par l'aménageur ou collectivité (dépollution, démolition, ...)", + "nb_cols":4, + "id":"Element_0_2_5" + }, + { + "type":"label", + "name":"depense_mise_etat_sol", + "label":"M€ HT", + "nb_cols":2, + "id":"depense_mise_etat_sol" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"recette_globale", + "label":"Recettes", + "nb_cols":1, + "id":"recette_globale" + }, + { + "type":"label", + "name":"label_recette_globale", + "label":"Montant global des recettes de l'opération en M€ HT", + "nb_cols":5, + "id":"Element_0_2_6" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_7" + }, + { + "type":"label", + "name":"label_recette_cession", + "label":"Dont cessions de droits à construire sur des lots-foncier maitrisés par le public", + "nb_cols":2, + "id":"Element_0_2_8" + }, + { + "type":"label", + "name":"pourc_recette_cession", + "label":"% par rapport au montant global des recettes", + "nb_cols":2, + "id":"pourc_recette_cession" + }, + { + "type":"label", + "name":"recette_cession", + "pattern":"", + "nb_cols":2, + "id":"recette_cession" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_9" + }, + { + "type":"label", + "name":"label_recette_part_privee", + "label":"Dont participations privées des constructeurs sur les lots maîtrisés par des privés", + "nb_cols":2, + "id":"Element_0_2_10" + }, + { + "type":"label", + "name":"pourc_recette_part_privee", + "label":"% par rapport au montant global des recettes", + "nb_cols":2, + "id":"pourc_recette_part_privee" + }, + { + "type":"label", + "name":"recette_part_privee", + "label":"M€ HT", + "nb_cols":2, + "id":"recette_part_privee" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_recette_part_publique", + "label":"Dont participations publiques des collectivités (Métropoles-Villes, ANRU, État, ...)", + "nb_cols":2, + "id":"Element_0_2_12" + }, + { + "type":"label", + "name":"pourc_recette_part_publique", + "label":"% par rapport au montant global des recettes", + "nb_cols":2, + "id":"pourc_recette_part_publique" + }, + { + "type":"label", + "name":"recette_part_publique", + "label":"M€ HT", + "nb_cols":2, + "id":"recette_part_publique" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_13" + }, + { + "type":"label", + "name":"label_recette_part_publique_mdl", + "label":"dont Métropoles", + "nb_cols":2, + "id":"Element_0_2_14" + }, + { + "type":"label", + "name":"recette_part_publique_mdl", + "label":"M€ HT", + "nb_cols":2, + "id":"recette_part_publique_mdl" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_ville", + "label":"dont Ville(s)", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"label", + "name":"recette_part_publique_ville", + "label":"M€ HT", + "nb_cols":2, + "id":"recette_part_publique_ville" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_anru", + "label":"dont ANRU", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"label", + "name":"recette_part_publique_anru", + "label":"M€ HT", + "nb_cols":2, + "id":"recette_part_publique_anru" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Commentaire à l'échelle de l'opération", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"commentaire_operation", + "label":"", + "nb_cols":12, + "id":"commentaire_operation" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "nom_operation", + "communes_label", + "ctms_label", + "surface", + "geom", + "date_mise_a_jour", + "Element_0", + "nom_mo", + "cdp_mo", + "direction_mo", + "nom_amenageur", + "cdp_amenageur", + "nom_moe", + "architecte_moe", + "code_avacement", + "Element_1", + "avancement", + "label_period", + "annee_init", + "annee_achevement", + "nb_phase", + "commentaire_phase", + "contexte_urbain", + "suivi", + "commentaire_operation_mixte", + "procedure_amenagement", + "mode_financements_label", + "vocation", + "label_sdp", + "label_sdp2", + "sdp", + "label_activite", + "sdp_bureau", + "sdp_commerce_service", + "sdp_loisir", + "sdp_hotel", + "sdp_locaux", + "label_equipement", + "sdp_equipement", + "commentaire_sdp_equipement", + "label_espace_public_vert", + "emprise_espace_public_vert", + "commentaire_espace_public_vert", + "label_logement", + "sdp_logement", + "nb_logement", + "nb_lgt_fam", + "nb_lgt_spe", + "repartition_type_logement", + "nb_lgt_hectare", + "coef_emprise_sol_moyen", + "densite_batie", + "depense_globale", + "label_depense_globale", + "pourc_depense_cout_foncier", + "depense_cout_foncier", + "label_depense_cout_foncier", + "depense_mise_etat_sol", + "label_depense_mise_etat_sol", + "recette_globale", + "label_recette_globale", + "pourc_recette_cession", + "recette_cession", + "label_recette_cession", + "pourc_recette_part_privee", + "recette_part_privee", + "label_recette_part_privee", + "pourc_recette_part_publique", + "recette_part_publique", + "label_recette_part_publique", + "recette_part_publique_mdl", + "label_recette_part_publique_mdl", + "label_recette_part_publique_ville", + "recette_part_publique_ville", + "label_recette_part_publique_ville", + "recette_part_publique_anru", + "label_recette_part_publique_anru", + "commentaire_operation" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_SAISIE_OPERATION", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"id_operation", + "label":"Identifiant", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"id_operation" + }, + { + "type":"text", + "name":"nom_operation", + "label":"Nom", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_operation" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-xs", + "nb_cols":12, + "name":"search_button", + "id":"search_button", + "buttons":[ + { + "type":"button", + "name":"search", + "label":"FORM_SEARCH_BUTTON", + "class":"btn-primary", + "event":"setGridFilter()" + }, + { + "type":"reset", + "name":"reset", + "label":"FORM_RESET_BUTTON", + "class":"btn-primary", + "event":"resetGridFilter()" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "search_button", + "id_operation", + "nom_operation" + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"id_installation", + "label":"Installation", + "required":true, + "nb_cols":4, + "id":"id_installation", + "datasource":{ + "datasource_id":"datasource_38", + "sort_order":"ASC", + "distinct":"true", + "label_key":"num_dossier", + "order_by":"num_dossier", + "id_key":"id_installation", + "attributs":"id_installation|num_dossier" + }, + "id_from":"id_installation_from" + }, + { + "type":"select", + "name":"id_controle", + "label":"Contrôle", + "required":true, + "nb_cols":4, + "id":"id_controle_2_1", + "datasource":{ + "datasource_id":"datasource_39", + "sort_order":"ASC", + "distinct":"true", + "label_key":"id_controle", + "order_by":"id_controle", + "id_key":"id_controle", + "attributs":"id_controle|id_controle", + "parents":[ + { + "name":"id_installation", + "filter_attr":"id_installation", + "filter_equality":"=", + "wait_for_parent":true + } + ] + }, + "id_from":"id_controle_2_1_from" + }, + { + "type":"select", + "name":"tra_type", + "label":"Type de traitement", + "required":true, + "nb_cols":4, + "id":"Element_0_1_2", + "id_from":"Element_0_1_2_from", + "datasource":{ + "datasource_id":"datasource_1", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_contexte", + "label":"Contexte urbain de l'opération", + "required":true, + "nb_cols":4, + "id":"Element_0_1_3", + "id_from":"Element_0_1_3_from", + "datasource":{ + "datasource_id":"datasource_2", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Dimensionnement", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"tra_long", + "label":"Longueur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_2" + }, + { + "type":"number", + "name":"tra_longueur", + "label":"Longueur de chaque tranchée (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_4" + }, + { + "type":"number", + "name":"tra_larg", + "label":"Largeur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_3" + }, + { + "type":"number", + "name":"tra_surf", + "label":"Surface (en m²)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_2" + }, + { + "type":"number", + "name":"tra_tot_lin", + "label":"Linéaire total (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_largeur", + "label":"Largeur des tranchées", + "required":false, + "nb_cols":4, + "id":"Element_1_4_3", + "id_from":"Element_1_4_3_from", + "datasource":{ + "datasource_id":"datasource_40", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"number", + "name":"tra_profond", + "label":"Profondeur des tranchées (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_3" + }, + { + "type":"number", + "name":"tra_profondeur", + "label":"Profondeur (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_2" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"tra_hauteur", + "label":"Hauteur", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"Element_1_5_1" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Implantation", + "nb_cols":12, + "id":"Element_1_6_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_hab", + "label":"Distance habitation > 5m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_1", + "id_from":"Element_2_7_1_from", + "datasource":{ + "datasource_id":"datasource_3", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_lim_parc", + "label":"Limite parcelle > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_2", + "id_from":"Element_2_7_2_from", + "datasource":{ + "datasource_id":"datasource_4", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_veget", + "label":"Distance végétation > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_1", + "id_from":"Element_2_8_1_from", + "datasource":{ + "datasource_id":"datasource_5", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_puit", + "label":"Distance puit 35m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_2", + "id_from":"Element_2_8_2_from", + "datasource":{ + "datasource_id":"datasource_6", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_2", + "label":"Vérification des matériaux", + "nb_cols":12, + "id":"Element_2_9_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_racine", + "label":"Présence d'un film anti-racine", + "nb_cols":4, + "id":"Element_3_10_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_14", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_1_from" + }, + { + "type":"select", + "name":"tra_vm_humidite", + "label":"Présence d'un film anti-humidité", + "nb_cols":4, + "id":"Element_3_10_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_15", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_2_from" + }, + { + "type":"select", + "name":"tra_vm_imper", + "label":"Présence d'un film imperméable", + "nb_cols":4, + "id":"Element_3_10_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_16", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_geomembrane", + "label":"Présence d'une géomembrane", + "nb_cols":4, + "id":"Element_3_11_0", + "datasource":{ + "datasource_id":"datasource_41", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_0_from" + }, + { + "type":"select", + "name":"tra_vm_geogrille", + "label":"Présence d'une géo-grille", + "nb_cols":4, + "id":"Element_3_11_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_17", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_1_from" + }, + { + "type":"select", + "name":"tra_vm_grav_qual", + "label":"Graviers de qualité conforme aux filières d'assainissement non collectif", + "nb_cols":8, + "id":"Element_3_11_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_18", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_2_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_grav_ep", + "label":"Epaisseur conforme des graviers", + "nb_cols":4, + "id":"Element_3_11_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_19", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_3_from" + }, + { + "type":"select", + "name":"tra_vm_geo_text", + "label":"Présence d'un géotextile", + "nb_cols":4, + "id":"Element_3_12_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_20", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_1_from" + }, + { + "type":"select", + "name":"tra_vm_ht_terre_veget", + "label":"Hauteur de terre vegetale de 20 cm au-dessus des drains", + "nb_cols":4, + "id":"Element_3_12_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "id_from":"Element_3_12_2_from", + "datasource":{ + "datasource_id":"datasource_7", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_tuy_perf", + "label":"Les tuyaux d'épandage mis en place sont-ils des tuyaux rigides perforés prévus pour l'assainissement non collectif, orifices dirigés vers le bas", + "nb_cols":12, + "id":"Element_3_12_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_22", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_bon_mat", + "label":"Les bons de matériaux ont-ils été fournis", + "nb_cols":4, + "id":"Element_3_13_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_23", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_1_from" + }, + { + "type":"select", + "name":"tra_vm_sab_qual", + "label":"Sable de qualité conforme", + "nb_cols":4, + "id":"Element_3_13_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_25", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_3_from" + }, + { + "type":"select", + "name":"tra_vm_sab_ep", + "label":"Epaisseur de sable de 0.7", + "nb_cols":4, + "id":"Element_3_13_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_24", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_3", + "label":"Regard de repartition", + "nb_cols":12, + "id":"Element_3_15_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_mat", + "label":"Matériau du regard de répartition", + "nb_cols":4, + "id":"Element_4_16_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_26", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_16_1_from" + }, + { + "type":"select", + "name":"tra_regrep_affl", + "label":"Affleure-t-il le niveau du sol", + "required":false, + "nb_cols":4, + "id":"Element_4_16_2", + "id_from":"Element_4_16_2_from", + "datasource":{ + "datasource_id":"datasource_8", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regrep_equi", + "label":"Equirépartition des eaux", + "required":false, + "nb_cols":4, + "id":"Element_4_16_3", + "id_from":"Element_4_16_3_from", + "datasource":{ + "datasource_id":"datasource_9", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_perf", + "label":"Les tuyaux de répartition sont-ils non perforés", + "nb_cols":12, + "id":"Element_4_17_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_29", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_1_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_5", + "label":"Regard de bouclage", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_mat", + "label":"Matériau du regard de bouclage", + "required":false, + "nb_cols":4, + "id":"Element_6_19_1", + "id_from":"Element_6_19_1_from", + "datasource":{ + "datasource_id":"datasource_10", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regbl_affl", + "label":"Affleure-t-il le niveau de sol", + "nb_cols":4, + "id":"Element_6_19_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_2_from" + }, + { + "type":"select", + "name":"tra_regbl_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_6_19_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_32", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_epand", + "label":"Les tuyaux d'épandage sont raccordés de manière indépendante au regard de bouclage", + "nb_cols":8, + "id":"Element_4_17_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_33", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_2_from" + }, + { + "type":"select", + "name":"tra_regbl_perf", + "label":"Les tuyaux de bouclage sont-ils perforés", + "nb_cols":4, + "id":"Element_6_20_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_34", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_20_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Regard de collecte", + "nb_cols":12, + "id":"Element_4_22_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regcol_mat", + "label":"Matériau du regard de collecte", + "required":false, + "nb_cols":4, + "id":"Element_6_22_1", + "id_from":"Element_6_22_1_from", + "datasource":{ + "datasource_id":"datasource_11", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regcol_affl", + "label":"Affleure-t-il le niveau du sol", + "nb_cols":4, + "id":"Element_7_22_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_7_22_2_from" + }, + { + "type":"select", + "name":"tra_regcol_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_8_22_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_37", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_7", + "label":"Documents", + "nb_cols":12, + "id":"Element_7_26_1" + } + ] + }, + { + "fields":[ + { + "type":"image_wsdata", + "name":"photos_f", + "label":"Photos", + "nb_cols":12, + "id":"Element_0_2_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"fiche_f", + "label":"Fiche Entretien", + "nb_cols":12, + "id":"Element_0_3_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"schema_f", + "label":"Schéma de principe", + "nb_cols":12, + "id":"Element_0_4_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"documents_f", + "label":"Documents", + "nb_cols":12, + "id":"Element_0_5_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"plan_f", + "label":"Plan de recolement", + "nb_cols":12, + "id":"Element_0_6_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"insert_button", + "id":"insert_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_CREATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "insert_button", + "id_controle", + "tra_type", + "id_traitement", + "tra_nb", + "tra_long", + "tra_longueur", + "tra_larg", + "tra_tot_lin", + "tra_surf", + "tra_largeur", + "tra_hauteur", + "tra_profondeur", + "tra_profond", + "Element_1", + "tra_dist_hab", + "tra_dist_lim_parc", + "tra_dist_veget", + "tra_dist_puit", + "Element_2", + "tra_vm_racine", + "tra_vm_humidite", + "tra_vm_imper", + "tra_vm_geogrille", + "tra_vm_grav_qual", + "tra_vm_grav_ep", + "tra_vm_geo_text", + "tra_vm_ht_terre_veget", + "tra_vm_tuy_perf", + "tra_vm_bon_mat", + "tra_vm_sab_ep", + "tra_vm_sab_qual", + "Element_3", + "tra_regrep_mat", + "tra_regrep_affl", + "tra_regrep_equi", + "tra_regrep_perf", + "tra_regbl_epand", + "Element_5", + "tra_regbl_mat", + "tra_regbl_affl", + "tra_regbl_hz", + "tra_regbl_perf", + "Element_4", + "tra_regcol_mat", + "tra_regcol_affl", + "tra_regcol_hz", + "id_installation", + "Element_0", + "Element_7", + "tra_vm_geomembrane" + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"text", + "name":"nom_operation", + "label":"Nom de l'opération", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_operation" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"surface", + "label":"Surface en hectare", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"surface" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":2, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields": [ + { + "type": "double_select", + "name": "communes", + "label": "Communes de l'opération", + "required": false, + "nb_cols": 4, + "id": "Element_0_4_1", + "name_to": "communes", + "name_from": "communes_from", + "size": 4, + "label_from": "communes non associées", + "label_to": "communes associées à l'opération", + "web_service": { + "ressource_id": "suivi_prod_immo/communes", + "id_key": "id_commune", + "label_key": "nom_commune", + "parameters": { + "order_by": "nom_commune" + } + } + } + ] + }, + { + "fields": [ + { + "type": "double_select", + "name": "ctms", + "label": "Conférences territoriales des maires de l'opération (CTM)", + "required": false, + "nb_cols": 4, + "id": "Element_0_4_1", + "name_to": "ctms", + "name_from": "ctms_from", + "size": 4, + "label_from": "CTM non associées", + "label_to": "CTM associées à l'opération", + "web_service": { + "ressource_id": "suivi_prod_immo/ctms", + "id_key": "id_ctm", + "label_key": "nom_ctm", + "parameters": { + "order_by": "nom_ctm" + } + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"title", + "label":"Acteurs", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_mo", + "label":"Nom de la structure Maîtrise d'ouvrage (Métropole, EPCI, Collectivité, ...)", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_mo" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"cdp_mo", + "label":"Nom / Contact du chef de projet", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"cdp_mo" + }, + { + "type":"text", + "name":"direction_mo", + "label":"Direction maîtrise d'ouvrage", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"direction_mo" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_amenageur", + "label":"Nom de la structure de l'aménageur public ou privé, si gestion déléguée du suivi et de la réalisation de l'opération", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"cdp_amenageur", + "label":"Nom / Contact du chef de projet côté aménageur", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"cdp_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_moe", + "label":"Nom du maître d'oeuvre mandataire (cabinet archi-urba ou groupement)", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"architecte_moe", + "label":"Nom de l'architecte-urbaniste en chef de l'opération", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"architecte_moe" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"title", + "label":"Avancement", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_avancement", + "label":"État d'avancement de l'opération", + "required":false, + "nb_cols":4, + "id":"code_avancement", + "id_from":"code_avancement_from", + "datasource":{ + "datasource_id":"datasource_code_avancement", + "sort_order":"ASC", + "distinct":"true", + "label_key":"avancement", + "order_by":"avancement", + "id_key":"code_avancement", + "attributs":"code_avancement|avancement" + } + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_period", + "label":"Période de réalisation de l'opération", + "nb_cols":2, + "id":"Element_0_2_2" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"annee_init", + "label":"Année initialisation", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_init" + }, + { + "type":"number", + "name":"annee_achevement", + "label":"Année achèvement", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_achevement" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"nb_phase", + "label":"Nombre de phases", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"nb_phase" + }, + { + "type":"text", + "name":"commentaire_phase", + "label":"Commentaires explicitant les phases", + "required":false, + "pattern":"", + "nb_cols":10, + "id":"commentaire_phase" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"title", + "label":"Mode opératoire", + "nb_cols":12, + "id":"Element_0_2_2" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_contexte_urbain", + "label":"Contexte urbain de l'opération", + "required":false, + "nb_cols":4, + "id":"code_contexte_urbain", + "id_from":"code_contexte_urbain_from", + "datasource":{ + "datasource_id":"datasource_code_contexte_urbain", + "sort_order":"ASC", + "distinct":"true", + "label_key":"contexte_urbain", + "order_by":"contexte_urbain", + "id_key":"code_contexte_urbain", + "attributs":"code_contexte_urbain|contexte_urbain" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_suivi", + "label":"Suivi de l'opération", + "required":false, + "nb_cols":4, + "id":"code_suivi", + "id_from":"code_suivi_from", + "datasource":{ + "datasource_id":"datasource_code_suivi", + "sort_order":"ASC", + "distinct":"true", + "label_key":"suivi", + "order_by":"suivi", + "id_key":"code_suivi", + "attributs":"code_suivi|suivi" + } + }, + { + "type":"text", + "name":"commentaire_operation_mixte", + "label":"Commentaire pour une opération mixte", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"commentaire_operation_mixte" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_procedure_amenagement", + "label":"Procédure de l'aménagement", + "required":false, + "nb_cols":3, + "id":"code_contexte_urbain", + "id_from":"code_procedure_amenagement_from", + "datasource":{ + "datasource_id":"datasource_code_procedure_amenagement", + "sort_order":"ASC", + "distinct":"true", + "label_key":"procedure_amenagement", + "order_by":"procedure_amenagement", + "id_key":"code_procedure_amenagement", + "attributs":"code_procedure_amenagement|procedure_amenagement" + } + } + ] + }, + { + "fields": [ + { + "type": "double_select", + "name": "mode_financements", + "label": "Modes de financement des équipements publics", + "required": false, + "nb_cols": 8, + "id": "Element_0_4_2", + "name_to": "mode_financements", + "name_from": "mode_financements_from", + "size": 4, + "label_from": "modes de financement non associées", + "label_to": "modes de financement associées à l'opération", + "web_service": { + "ressource_id": "suivi_prod_immo/mode_financements", + "id_key": "code_financement_equ_public", + "label_key": "financement_equ_public", + "parameters": { + "order_by": "financement_equ_public" + } + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"title", + "label":"Programmation prévisionnelle - densités", + "nb_cols":12, + "id":"Element_1_6_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_vocation", + "label":"Vocation dominante de l'opération", + "required":false, + "nb_cols":3, + "id":"code_contexte_urbain", + "id_from":"code_vocation", + "datasource":{ + "datasource_id":"datasource_code_vocation", + "sort_order":"ASC", + "distinct":"true", + "label_key":"vocation", + "order_by":"vocation", + "id_key":"code_vocation", + "attributs":"code_vocation|vocation" + } + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_sdp", + "label":"Répartition prévisionnelle programmatique (annoncée)", + "nb_cols":2, + "id":"Element_5_2_3" + }, + { + "type":"text", + "name":"sdp", + "label":"SDP en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp" + }, + { + "type":"label", + "name":"label_sdp2", + "label":"Surface de plancher globale de l'opération", + "nb_cols":2, + "id":"Element_5_2_4" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_activite", + "label":"Activités", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"sdp_bureau", + "label":"SDP programmée en bureaux en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_bureau" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_equipement", + "label":"Équipements", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"text", + "name":"sdp_equipement", + "label":"SDP globale programmée en équipements en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_6" + }, + { + "type":"text", + "name":"sdp_commerce_service", + "label":"SDP programmée en commerces et services en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_commerce_service" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"textarea", + "name":"commentaire_sdp_equipement", + "label":"Commentaires - liste des équipements", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"commentaire_sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_7" + }, + { + "type":"text", + "name":"sdp_loisir", + "label":"SDP programmée en loisirs marchands en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_loisir" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_espace_public_vert", + "label":"Espaces publics, espaces verts", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"text", + "name":"emprise_espace_public_vert", + "label":"Emprise en m² totale programmée", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"emprise_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_8" + }, + { + "type":"text", + "name":"sdp_hotel", + "label":"SDP programmée en hôtellerie en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_hotel" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"textarea", + "name":"commentaire_espace_public_vert", + "label":"Commentaires - liste / détails des espaces", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"commentaire_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_9" + }, + { + "type":"text", + "name":"sdp_locaux", + "label":"SDP programmée en locaux d'activités en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_locaux" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_logement", + "label":"Logements", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"sdp_logement", + "label":"SDP globale programmée en logements en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_logement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"nb_logement", + "label":"Nombre prévisionnel total de logements", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"nb_logement" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"nb_lgt_fam", + "label":"Total nombre de logements familiaux", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"nb_lgt_fam" + }, + { + "type":"text", + "name":"nb_lgt_spe", + "label":"Total nombre de logements spécifiques", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"nb_lgt_spe" + } + ] + }, + + { + "fields":[ + { + "type":"title", + "name":"title", + "label":"Aspects financiers - coûts", + "nb_cols":12, + "id":"Element_2_9_1" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"depense_globale", + "label":"Dépenses", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"depense_globale" + }, + { + "type":"label", + "name":"label_depense_globale", + "label":"Montant global prévisionnel du coût de l'opération en M€ HT (ontégrant études, foncier, travaux prévisionnels, divers frais, marges, ...)", + "nb_cols":5, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_2" + }, + { + "type":"label", + "name":"label_depense_cout_foncier", + "label":"Dont coût affecté au Foncier (procédures et acquisitions)", + "nb_cols":2, + "id":"Element_0_2_3" + }, + { + "type":"text", + "name":"pourc_depense_cout_foncier", + "label":"% par rapport au montant global", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_depense_cout_foncier" + }, + { + "type":"text", + "name":"depense_cout_foncier", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"depense_cout_foncier" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_4" + }, + { + "type":"label", + "name":"label_depense_mise_etat_sol", + "label":"Dont mise en état des sols par l'aménageur ou collectivité (dépollution, démolition, ...)", + "nb_cols":4, + "id":"Element_0_2_5" + }, + { + "type":"text", + "name":"depense_mise_etat_sol", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"depense_mise_etat_sol" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"recette_globale", + "label":"Recettes", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"recette_globale" + }, + { + "type":"label", + "name":"label_recette_globale", + "label":"Montant global des recettes de l'opération en M€ HT", + "nb_cols":5, + "id":"Element_0_2_6" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_7" + }, + { + "type":"label", + "name":"label_recette_cession", + "label":"Dont cessions de droits à construire sur des lots-foncier maitrisés par le public", + "nb_cols":2, + "id":"Element_0_2_8" + }, + { + "type":"text", + "name":"pourc_recette_cession", + "label":"% par rapport au montant global des recettes", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_recette_cession" + }, + { + "type":"text", + "name":"recette_cession", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_cession" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_9" + }, + { + "type":"label", + "name":"label_recette_part_privee", + "label":"Dont participations privées des constructeurs sur les lots maîtrisés par des privés", + "nb_cols":2, + "id":"Element_0_2_10" + }, + { + "type":"text", + "name":"pourc_recette_part_privee", + "label":"% par rapport au montant global des recettes", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_recette_part_privee" + }, + { + "type":"text", + "name":"recette_part_privee", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_privee" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_recette_part_publique", + "label":"Dont participations publiques des collectivités (Métropoles-Villes, ANRU, État, ...)", + "nb_cols":2, + "id":"Element_0_2_12" + }, + { + "type":"text", + "name":"pourc_recette_part_publique", + "label":"% par rapport au montant global des recettes", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_recette_part_publique" + }, + { + "type":"text", + "name":"recette_part_publique", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_13" + }, + { + "type":"label", + "name":"label_recette_part_publique_mdl", + "label":"dont Métropoles", + "nb_cols":2, + "id":"Element_0_2_14" + }, + { + "type":"text", + "name":"recette_part_publique_mdl", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique_mdl" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_ville", + "label":"dont Ville(s)", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"text", + "name":"recette_part_publique_ville", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique_ville" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_anru", + "label":"dont ANRU", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"text", + "name":"recette_part_publique_anru", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique_anru" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"title", + "label":"Commentaires à l'échelle de l'opération", + "nb_cols":12, + "id":"Element_2_9_2" + } + ] + }, + { + "fields":[ + { + "type":"textarea", + "name":"commentaire_operation", + "label":"", + "required":false, + "pattern":"", + "nb_cols":12, + "id":"commentaire_operation" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "title", + "nom_operation", + "surface", + "date_mise_a_jour", + "communes", + "ctms", + "nom_mo", + "cdp_mo", + "direction_mo", + "nom_amenageur", + "cdp_amenageur", + "nom_moe", + "architecte_moe", + "code_avacement", + "code_avancement", + "label_period", + "annee_init", + "annee_achevement", + "nb_phase", + "commentaire_phase", + "code_contexte_urbain", + "code_suivi", + "commentaire_operation_mixte", + "code_procedure_amenagement", + "mode_financements", + "code_vocation", + "label_sdp", + "label_sdp2", + "sdp", + "label_activite", + "sdp_bureau", + "sdp_commerce_service", + "sdp_loisir", + "sdp_hotel", + "sdp_locaux", + "label_equipement", + "sdp_equipement", + "commentaire_sdp_equipement", + "label_espace_public_vert", + "emprise_espace_public_vert", + "commentaire_espace_public_vert", + "label_logement", + "sdp_logement", + "nb_logement", + "nb_lgt_fam", + "nb_lgt_spe", + "depense_globale", + "label_depense_globale", + "pourc_depense_cout_foncier", + "depense_cout_foncier", + "label_depense_cout_foncier", + "label_depense_mise_etat_sol", + "depense_mise_etat_sol", + "recette_globale", + "label_recette_globale", + "label_recette_cession", + "pourc_recette_cession", + "recette_cession", + "label_recette_part_privee", + "pourc_recette_part_privee", + "recette_part_privee", + "label_recette_part_publique", + "pourc_recette_part_publique", + "recette_part_publique", + "label_recette_part_publique_mdl", + "recette_part_publique_mdl", + "label_recette_part_publique_ville", + "recette_part_publique_ville", + "label_recette_part_publique_anru", + "recette_part_publique_anru", + "commentaire_operation" + ] + } + ] + } + }, + "datasources":{ + "datasource_code_avancement":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_avancement", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_avancement" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_avancement" + }, + "datasource_code_contexte_urbain":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_contexte_urbain", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_contexte_urbain" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_contexte_urbain" + }, + "datasource_code_suivi":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_suivi", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_suivi" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_contexte_urbain" + }, + "datasource_code_procedure_amenagement":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_procedure_amenagement", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_procedure_amenagement" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_procedure_amenagement" + }, + "datasource_code_vocation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_vocation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_vocation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_vocation" + }, + + + + "datasource_41":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_geomembrane", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_geomembrane"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_41" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur.json new file mode 100644 index 0000000000000000000000000000000000000000..8f489a2b57d530e8dd57d421e29a7ad3d4dc351c --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur.json @@ -0,0 +1,310 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_ACTEUR_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"nom_mo", + "label":"Nom de la structure Maîtrise d'ouvrage (Métropole, EPCI, Collectivité, ...)", + "nb_cols":6, + "id":"nom_mo" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cdp_mo", + "label":"Nom / Contact du chef de projet", + "nb_cols":6, + "id":"cdp_mo" + }, + { + "type":"label", + "name":"direction_mo", + "label":"Direction maîtrise d'ouvrage", + "nb_cols":6, + "id":"direction_mo" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_amenageur", + "label":"Nom de la structure de l'aménageur public ou privé, si gestion déléguée du suivi et de la réalisation de l'opération", + "nb_cols":6, + "id":"nom_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cdp_amenageur", + "label":"Nom / Contact du chef de projet côté aménageur", + "nb_cols":6, + "id":"cdp_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_moe", + "label":"Nom du maître d'oeuvre mandataire (cabinet archi-urba ou groupement)", + "nb_cols":6, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"architecte_moe", + "label":"Nom de l'architecte-urbaniste en chef de l'opération", + "nb_cols":6, + "id":"architecte_moe" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "nom_mo", + "cdp_mo", + "direction_mo", + "nom_amenageur", + "cdp_amenageur", + "nom_moe", + "architecte_moe" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur-form", + "title":"SUIVI_PROD_IMMO_SAISIE_OPERATION", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_ACTEUR_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_ACTEUR_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"text", + "name":"nom_mo", + "label":"Nom de la structure Maîtrise d'ouvrage (Métropole, EPCI, Collectivité, ...)", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_mo" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"cdp_mo", + "label":"Nom / Contact du chef de projet", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"cdp_mo" + }, + { + "type":"text", + "name":"direction_mo", + "label":"Direction maîtrise d'ouvrage", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"direction_mo" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_amenageur", + "label":"Nom de la structure de l'aménageur public ou privé, si gestion déléguée du suivi et de la réalisation de l'opération", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"cdp_amenageur", + "label":"Nom / Contact du chef de projet côté aménageur", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"cdp_amenageur" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_moe", + "label":"Nom du maître d'oeuvre mandataire (cabinet archi-urba ou groupement)", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"architecte_moe", + "label":"Nom de l'architecte-urbaniste en chef de l'opération", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"architecte_moe" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "nom_mo", + "cdp_mo", + "direction_mo", + "nom_amenageur", + "cdp_amenageur", + "nom_moe", + "architecte_moe" + ] + } + ] + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement.json new file mode 100644 index 0000000000000000000000000000000000000000..169c12886f7cbba5bb40b3437e00a8181d943ab8 --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement.json @@ -0,0 +1,298 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_AVANCEMENT_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"avancement", + "label":"État d'avancement de l'opération", + "nb_cols":10, + "id":"avancement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_period", + "label":"Période de réalisation de l'opération", + "nb_cols":2, + "id":"Element_0_2_2" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_init", + "label":"Année initialisation", + "nb_cols":1, + "id":"annee_init" + }, + { + "type":"label", + "name":"annee_achevement", + "label":"Année achèvement", + "nb_cols":1, + "id":"annee_achevement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nb_phase", + "label":"Nombre de phases", + "nb_cols":1, + "id":"nb_phase" + }, + { + "type":"label", + "name":"commentaire_phase", + "label":"Commentaire explicitant les phases", + "nb_cols":11, + "id":"commentaire_phase" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "avancement", + "label_period", + "annee_init", + "annee_achevement", + "nb_phase", + "commentaire_phase" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement-form", + "title":"SUIVI_PROD_IMMO_SAISIE_OPERATION", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_AVANCEMENT_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_AVANCEMENT_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"code_avancement", + "label":"État d'avancement de l'opération", + "required":false, + "nb_cols":4, + "id":"code_avancement", + "id_from":"code_avancement_from", + "datasource":{ + "datasource_id":"datasource_code_avancement", + "sort_order":"ASC", + "distinct":"true", + "label_key":"avancement", + "order_by":"avancement", + "id_key":"code_avancement", + "attributs":"code_avancement|avancement" + } + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_period", + "label":"Période de réalisation de l'opération", + "nb_cols":2, + "id":"Element_0_2_2" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"annee_init", + "label":"Année initialisation", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_init" + }, + { + "type":"number", + "name":"annee_achevement", + "label":"Année achèvement", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_achevement" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"nb_phase", + "label":"Nombre de phases", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"nb_phase" + }, + { + "type":"text", + "name":"commentaire_phase", + "label":"Commentaires explicitant les phases", + "required":false, + "pattern":"", + "nb_cols":10, + "id":"commentaire_phase" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "title", + "code_avancement", + "label_period", + "annee_init", + "annee_achevement", + "nb_phase", + "commentaire_phase" + ] + } + ] + } + }, + "datasources":{ + "datasource_code_avancement":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_avancement", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_avancement" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_avancement" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier.json new file mode 100644 index 0000000000000000000000000000000000000000..0c8ba463ffbb88d027d73721aa57e26338d17217 --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier.json @@ -0,0 +1,872 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_FINANCIER_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"depense_globale", + "label":"Dépenses", + "nb_cols":1, + "id":"depense_globale" + }, + { + "type":"label", + "name":"label_depense_globale", + "label":"Montant global prévisionnel du coût de l'opération en M€ HT (ontégrant études, foncier, travaux prévisionnels, divers frais, marges, ...)", + "nb_cols":5, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_2" + }, + { + "type":"label", + "name":"label_depense_cout_foncier", + "label":"Dont coût affecté au Foncier (procédures et acquisitions)", + "nb_cols":2, + "id":"Element_0_2_3" + }, + { + "type":"label", + "name":"pourc_depense_cout_foncier", + "label":"% par rapport au montant global", + "nb_cols":2, + "id":"pourc_depense_cout_foncier" + }, + { + "type":"label", + "name":"depense_cout_foncier", + "label":"M€ HT", + "nb_cols":2, + "id":"depense_cout_foncier" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_4" + }, + { + "type":"label", + "name":"label_depense_mise_etat_sol", + "label":"Dont mise en état des sols par l'aménageur ou collectivité (dépollution, démolition, ...)", + "nb_cols":4, + "id":"Element_0_2_5" + }, + { + "type":"label", + "name":"depense_mise_etat_sol", + "label":"M€ HT", + "nb_cols":2, + "id":"depense_mise_etat_sol" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"recette_globale", + "label":"Recettes", + "nb_cols":1, + "id":"recette_globale" + }, + { + "type":"label", + "name":"label_recette_globale", + "label":"Montant global des recettes de l'opération en M€ HT", + "nb_cols":5, + "id":"Element_0_2_6" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_7" + }, + { + "type":"label", + "name":"label_recette_cession", + "label":"Dont cessions de droits à construire sur des lots-foncier maitrisés par le public", + "nb_cols":2, + "id":"Element_0_2_8" + }, + { + "type":"label", + "name":"pourc_recette_cession", + "label":"% par rapport au montant global des recettes", + "nb_cols":2, + "id":"pourc_recette_cession" + }, + { + "type":"label", + "name":"recette_cession", + "pattern":"", + "nb_cols":2, + "id":"recette_cession" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_9" + }, + { + "type":"label", + "name":"label_recette_part_privee", + "label":"Dont participations privées des constructeurs sur les lots maîtrisés par des privés", + "nb_cols":2, + "id":"Element_0_2_10" + }, + { + "type":"label", + "name":"pourc_recette_part_privee", + "label":"% par rapport au montant global des recettes", + "nb_cols":2, + "id":"pourc_recette_part_privee" + }, + { + "type":"label", + "name":"recette_part_privee", + "label":"M€ HT", + "nb_cols":2, + "id":"recette_part_privee" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_recette_part_publique", + "label":"Dont participations publiques des collectivités (Métropoles-Villes, ANRU, État, ...)", + "nb_cols":2, + "id":"Element_0_2_12" + }, + { + "type":"label", + "name":"pourc_recette_part_publique", + "label":"% par rapport au montant global des recettes", + "nb_cols":2, + "id":"pourc_recette_part_publique" + }, + { + "type":"label", + "name":"recette_part_publique", + "label":"M€", + "nb_cols":1, + "id":"recette_part_publique" + }, + { + "type":"label", + "name":"recette_part_publique_ttc_label", + "label":"", + "nb_cols":1, + "id":"recette_part_publique_ttc_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_13" + }, + { + "type":"label", + "name":"label_recette_part_publique_mdl", + "label":"dont Métropoles", + "nb_cols":2, + "id":"Element_0_2_14" + }, + { + "type":"label", + "name":"recette_part_publique_mdl", + "label":"M€", + "nb_cols":1, + "id":"recette_part_publique_mdl" + }, + { + "type":"label", + "name":"recette_part_publique_ttc_label", + "label":"", + "nb_cols":1, + "id":"recette_part_publique_ttc_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_ville", + "label":"dont Ville(s)", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"label", + "name":"recette_part_publique_ville", + "label":"M€", + "nb_cols":1, + "id":"recette_part_publique_ville" + }, + { + "type":"label", + "name":"recette_part_publique_ttc_label", + "label":"", + "nb_cols":1, + "id":"recette_part_publique_ttc_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_anru", + "label":"dont ANRU", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"label", + "name":"recette_part_publique_anru", + "label":"M€", + "nb_cols":1, + "id":"recette_part_publique_anru" + }, + { + "type":"label", + "name":"recette_part_publique_ttc_label", + "label":"", + "nb_cols":1, + "id":"recette_part_publique_ttc_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_autre", + "label":"dont autres", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"label", + "name":"recette_part_publique_autre", + "label":"M€", + "nb_cols":1, + "id":"recette_part_publique_autre" + }, + { + "type":"label", + "name":"recette_part_publique_ttc_label", + "label":"", + "nb_cols":1, + "id":"recette_part_publique_ttc_label" + }, + { + "type":"label", + "name":"recette_part_publique_autre_commentaire", + "label":"Commentaires", + "nb_cols":4, + "id":"recette_part_publique_autre_commentaire" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "depense_globale", + "label_depense_globale", + "pourc_depense_cout_foncier", + "depense_cout_foncier", + "label_depense_cout_foncier", + "depense_mise_etat_sol", + "label_depense_mise_etat_sol", + "recette_globale", + "label_recette_globale", + "pourc_recette_cession", + "recette_cession", + "label_recette_cession", + "pourc_recette_part_privee", + "recette_part_privee", + "label_recette_part_privee", + "pourc_recette_part_publique", + "recette_part_publique", + "recette_part_publique_ttc_label", + "label_recette_part_publique", + "recette_part_publique_mdl", + "label_recette_part_publique_mdl", + "label_recette_part_publique_ville", + "recette_part_publique_ville", + "label_recette_part_publique_ville", + "recette_part_publique_anru", + "label_recette_part_publique_anru", + "recette_part_publique_autre", + "label_recette_part_publique_autre", + "recette_part_publique_autre_commentaire" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier-form", + "title":"SUIVI_PROD_IMMO_SAISIE_OPERATION", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_FINANCIER_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_FINANCIER_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"depense_globale", + "label":"Dépenses", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"depense_globale" + }, + { + "type":"label", + "name":"label_depense_globale", + "label":"Montant global prévisionnel du coût de l'opération en M€ HT (ontégrant études, foncier, travaux prévisionnels, divers frais, marges, ...)", + "nb_cols":5, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_2" + }, + { + "type":"label", + "name":"label_depense_cout_foncier", + "label":"Dont coût affecté au Foncier (procédures et acquisitions)", + "nb_cols":2, + "id":"Element_0_2_3" + }, + { + "type":"text", + "name":"pourc_depense_cout_foncier", + "label":"% par rapport au montant global", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_depense_cout_foncier" + }, + { + "type":"text", + "name":"depense_cout_foncier", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"depense_cout_foncier" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_4" + }, + { + "type":"label", + "name":"label_depense_mise_etat_sol", + "label":"Dont mise en état des sols par l'aménageur ou collectivité (dépollution, démolition, ...)", + "nb_cols":4, + "id":"Element_0_2_5" + }, + { + "type":"text", + "name":"depense_mise_etat_sol", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"depense_mise_etat_sol" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"recette_globale", + "label":"Recettes", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"recette_globale" + }, + { + "type":"label", + "name":"label_recette_globale", + "label":"Montant global des recettes de l'opération en M€ HT", + "nb_cols":5, + "id":"Element_0_2_6" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_7" + }, + { + "type":"label", + "name":"label_recette_cession", + "label":"Dont cessions de droits à construire sur des lots-foncier maitrisés par le public", + "nb_cols":2, + "id":"Element_0_2_8" + }, + { + "type":"text", + "name":"pourc_recette_cession", + "label":"% par rapport au montant global des recettes", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_recette_cession" + }, + { + "type":"text", + "name":"recette_cession", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_cession" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_9" + }, + { + "type":"label", + "name":"label_recette_part_privee", + "label":"Dont participations privées des constructeurs sur les lots maîtrisés par des privés", + "nb_cols":2, + "id":"Element_0_2_10" + }, + { + "type":"text", + "name":"pourc_recette_part_privee", + "label":"% par rapport au montant global des recettes", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_recette_part_privee" + }, + { + "type":"text", + "name":"recette_part_privee", + "label":"M€ HT", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_privee" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_recette_part_publique", + "label":"Dont participations publiques des collectivités (Métropoles-Villes, ANRU, État, ...)", + "nb_cols":2, + "id":"Element_0_2_12" + }, + { + "type":"text", + "name":"pourc_recette_part_publique", + "label":"% par rapport au montant global des recettes", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"pourc_recette_part_publique" + }, + { + "type":"text", + "name":"recette_part_publique", + "label":"M€", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique" + }, + { + "type":"radio", + "name":"recette_part_publique_ttc", + "label":"", + "nb_cols":2, + "id":"recette_part_publique_ttc", + "options":{ + "choices":[ + { + "label":"TTC", + "value":true + }, + { + "label":"HT", + "value":false + } + ] + }, + "visible": true + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_13" + }, + { + "type":"label", + "name":"label_recette_part_publique_mdl", + "label":"dont Métropoles", + "nb_cols":2, + "id":"Element_0_2_14" + }, + { + "type":"text", + "name":"recette_part_publique_mdl", + "label":"M€", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique_mdl" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_ville", + "label":"dont Ville(s)", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"text", + "name":"recette_part_publique_ville", + "label":"M€", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique_ville" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_anru", + "label":"dont ANRU", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"text", + "name":"recette_part_publique_anru", + "label":"M€", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique_anru" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_0_2_15" + }, + { + "type":"label", + "name":"label_recette_part_publique_autre", + "label":"dont autres", + "nb_cols":2, + "id":"Element_0_2_16" + }, + { + "type":"text", + "name":"recette_part_publique_autre", + "label":"M€", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"recette_part_publique_autre" + }, + { + "type":"text", + "name":"recette_part_publique_autre_commentaire", + "label":"Commentaires", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"recette_part_publique_autre_commentaire" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "title", + "depense_globale", + "label_depense_globale", + "pourc_depense_cout_foncier", + "depense_cout_foncier", + "label_depense_cout_foncier", + "label_depense_mise_etat_sol", + "depense_mise_etat_sol", + "recette_globale", + "label_recette_globale", + "label_recette_cession", + "pourc_recette_cession", + "recette_cession", + "label_recette_part_privee", + "pourc_recette_part_privee", + "recette_part_privee", + "label_recette_part_publique", + "pourc_recette_part_publique", + "recette_part_publique", + "recette_part_publique_ttc", + "label_recette_part_publique_mdl", + "recette_part_publique_mdl", + "label_recette_part_publique_ville", + "recette_part_publique_ville", + "label_recette_part_publique_anru", + "recette_part_publique_anru", + "label_recette_part_publique_autre", + "recette_part_publique_autre", + "recette_part_publique_autre_commentaire" + ] + } + ] + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire.json new file mode 100644 index 0000000000000000000000000000000000000000..db38c869ad0b079176c1b8c7519a444fd484863b --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire.json @@ -0,0 +1,347 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_MODE_OPERATOIRE_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"contexte_urbain", + "label":"Contexte urbain de l'opération", + "nb_cols":5, + "id":"contexte_urbain" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"suivi", + "label":"Suivi de l'opération", + "nb_cols":3, + "id":"suivi" + }, + { + "type":"label", + "name":"commentaire_operation_mixte", + "label":"Commentaire pour une opération mixte", + "nb_cols":9, + "id":"commentaire_operation_mixte" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"procedure_amenagement", + "label":"Procédure d'aménagement", + "nb_cols":5, + "id":"procedure_amenagement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"mode_financements_label", + "label":"Mode de financement des équipements publics", + "nb_cols":12, + "id":"mode_financements_label" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initSuiviProdImmoOperationModeOperatoireForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "contexte_urbain", + "suivi", + "commentaire_operation_mixte", + "procedure_amenagement", + "mode_financements_label" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire-form", + "title":"SUIVI_PROD_IMMO_SAISIE_OPERATION", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_MODE_OPERATOIRE_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_MODE_OPERATOIRE_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"code_contexte_urbain", + "label":"Contexte urbain de l'opération", + "required":false, + "nb_cols":4, + "id":"code_contexte_urbain", + "id_from":"code_contexte_urbain_from", + "datasource":{ + "datasource_id":"datasource_code_contexte_urbain", + "sort_order":"ASC", + "distinct":"true", + "label_key":"contexte_urbain", + "order_by":"contexte_urbain", + "id_key":"code_contexte_urbain", + "attributs":"code_contexte_urbain|contexte_urbain" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_suivi", + "label":"Suivi de l'opération", + "required":false, + "nb_cols":4, + "id":"code_suivi", + "id_from":"code_suivi_from", + "datasource":{ + "datasource_id":"datasource_code_suivi", + "sort_order":"ASC", + "distinct":"true", + "label_key":"suivi", + "order_by":"suivi", + "id_key":"code_suivi", + "attributs":"code_suivi|suivi" + } + }, + { + "type":"text", + "name":"commentaire_operation_mixte", + "label":"Commentaire pour une opération mixte", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"commentaire_operation_mixte" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_procedure_amenagement", + "label":"Procédure de l'aménagement", + "required":false, + "nb_cols":3, + "id":"code_contexte_urbain", + "id_from":"code_procedure_amenagement_from", + "datasource":{ + "datasource_id":"datasource_code_procedure_amenagement", + "sort_order":"ASC", + "distinct":"true", + "label_key":"procedure_amenagement", + "order_by":"procedure_amenagement", + "id_key":"code_procedure_amenagement", + "attributs":"code_procedure_amenagement|procedure_amenagement" + } + } + ] + }, + { + "fields": [ + { + "type": "double_select", + "name": "mode_financements", + "label": "Modes de financement des équipements publics", + "required": false, + "nb_cols": 8, + "id": "Element_0_4_2", + "name_to": "mode_financements", + "name_from": "mode_financements_from", + "size": 4, + "label_from": "modes de financement non associées", + "label_to": "modes de financement associées à l'opération", + "web_service": { + "ressource_id": "suivi_prod_immo/mode_financements", + "id_key": "code_financement_equ_public", + "label_key": "financement_equ_public", + "parameters": { + "order_by": "financement_equ_public" + } + } + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "title", + "code_contexte_urbain", + "code_suivi", + "commentaire_operation_mixte", + "code_procedure_amenagement", + "mode_financements" + ] + } + ] + } + }, + "datasources":{ + "datasource_code_contexte_urbain":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_contexte_urbain", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_contexte_urbain" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_contexte_urbain" + }, + "datasource_code_suivi":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_suivi", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_suivi" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_suivi" + }, + "datasource_code_procedure_amenagement":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_procedure_amenagement", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_procedure_amenagement" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_procedure_amenagement" + }, + "datasource_code_vocation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_vocation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_vocation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_vocation" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation.json new file mode 100644 index 0000000000000000000000000000000000000000..ff73b9dda5dbffc62fd092f00f2bcade6c7128eb --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation.json @@ -0,0 +1,775 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_PROGRAMMATION_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"vocation", + "label":"Vocation dominante de l'opération", + "nb_cols":10, + "id":"vocation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_sdp", + "label":"Répartition prévisionnelle programmatique (annoncée)", + "nb_cols":2, + "id":"Element_5_2_3" + }, + { + "type":"label", + "name":"sdp", + "label":"SDP en m²", + "nb_cols":2, + "id":"sdp" + }, + { + "type":"label", + "name":"label_sdp2", + "label":"Surface de plancher globale de l'opération", + "nb_cols":2, + "id":"Element_5_2_4" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_activite", + "label":"Activités", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"sdp_bureau", + "label":"SDP programmée en bureaux en m²", + "nb_cols":2, + "id":"sdp_bureau" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_equipement", + "label":"Équipements", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"label", + "name":"sdp_equipement", + "label":"SDP globale programmée en équipements en m²", + "nb_cols":2, + "id":"sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"sdp_commerce_service", + "label":"SDP programmée en commerces et services en m²", + "nb_cols":2, + "id":"sdp_commerce_service" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"commentaire_sdp_equipement", + "label":"Commentaires - liste des équipements", + "nb_cols":3, + "id":"commentaire_sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_7" + }, + { + "type":"label", + "name":"sdp_loisir", + "label":"SDP programmée en loisirs marchands en m²", + "nb_cols":2, + "id":"sdp_loisir" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_espace_public_vert", + "label":"Espaces publics, espaces verts", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"label", + "name":"emprise_espace_public_vert", + "label":"Emprise en m² totale programmée", + "nb_cols":2, + "id":"emprise_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_8" + }, + { + "type":"label", + "name":"sdp_hotel", + "label":"SDP programmée en hôtellerie en m²", + "nb_cols":2, + "id":"sdp_hotel" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"commentaire_espace_public_vert", + "label":"Commentaires - liste / détails des espaces", + "nb_cols":3, + "id":"commentaire_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_9" + }, + { + "type":"label", + "name":"sdp_locaux", + "label":"SDP programmée en locaux d'activités en m²", + "nb_cols":2, + "id":"sdp_locaux" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_logement", + "label":"Logements", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"sdp_logement", + "label":"SDP globale programmée en logements en m²", + "nb_cols":2, + "id":"sdp_logement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"nb_logement", + "label":"Nombre prévisionnel total de logements", + "nb_cols":2, + "id":"nb_logement" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"label", + "name":"nb_lgt_fam", + "label":"Total nombre de logements familiaux", + "nb_cols":2, + "id":"nb_lgt_fam" + }, + { + "type":"label", + "name":"nb_lgt_spe", + "label":"Total nombre de logements spécifiques", + "nb_cols":2, + "id":"nb_lgt_spe" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nb_lgt_hectare", + "label":"Nombre de logements à l'hectare", + "nb_cols":3, + "id":"nb_lgt_hectare" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"coef_emprise_sol_moyen", + "label":"Coefficient d'emprise au sol moyen net (CES)", + "nb_cols":3, + "id":"coef_emprise_sol_moyen" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"densite_batie", + "label":"Densité bâtie", + "nb_cols":3, + "id":"densite_batie" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "vocation", + "label_sdp", + "label_sdp2", + "sdp", + "label_activite", + "sdp_bureau", + "sdp_commerce_service", + "sdp_loisir", + "sdp_hotel", + "sdp_locaux", + "label_equipement", + "sdp_equipement", + "commentaire_sdp_equipement", + "label_espace_public_vert", + "emprise_espace_public_vert", + "commentaire_espace_public_vert", + "label_logement", + "sdp_logement", + "nb_logement", + "nb_lgt_fam", + "nb_lgt_spe", + "repartition_type_logement", + "nb_lgt_hectare", + "coef_emprise_sol_moyen", + "densite_batie" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation-form", + "title":"SUIVI_PROD_IMMO_SAISIE_OPERATION", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_PROGRAMMATION_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation-form", + "title":"SUIVI_PROD_IMMO_OPERATION_OPERATION_PROGRAMMATION_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"code_vocation", + "label":"Vocation dominante de l'opération", + "required":false, + "nb_cols":3, + "id":"code_contexte_urbain", + "id_from":"code_vocation", + "datasource":{ + "datasource_id":"datasource_code_vocation", + "sort_order":"ASC", + "distinct":"true", + "label_key":"vocation", + "order_by":"vocation", + "id_key":"code_vocation", + "attributs":"code_vocation|vocation" + } + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_sdp", + "label":"Répartition prévisionnelle programmatique (annoncée)", + "nb_cols":2, + "id":"Element_5_2_3" + }, + { + "type":"text", + "name":"sdp", + "label":"SDP en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp" + }, + { + "type":"label", + "name":"label_sdp2", + "label":"Surface de plancher globale de l'opération", + "nb_cols":2, + "id":"Element_5_2_4" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_activite", + "label":"Activités", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"sdp_bureau", + "label":"SDP programmée en bureaux en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_bureau" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_equipement", + "label":"Équipements", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"text", + "name":"sdp_equipement", + "label":"SDP globale programmée en équipements en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_6" + }, + { + "type":"text", + "name":"sdp_commerce_service", + "label":"SDP programmée en commerces et services en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_commerce_service" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"textarea", + "name":"commentaire_sdp_equipement", + "label":"Commentaires - liste des équipements", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"commentaire_sdp_equipement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_7" + }, + { + "type":"text", + "name":"sdp_loisir", + "label":"SDP programmée en loisirs marchands en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_loisir" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":3, + "id":"Element_5_2_6" + }, + { + "type":"label", + "name":"label_espace_public_vert", + "label":"Espaces publics, espaces verts", + "nb_cols":1, + "id":"Element_5_2_3" + }, + { + "type":"text", + "name":"emprise_espace_public_vert", + "label":"Emprise en m² totale programmée", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"emprise_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_8" + }, + { + "type":"text", + "name":"sdp_hotel", + "label":"SDP programmée en hôtellerie en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_hotel" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":4, + "id":"Element_5_2_6" + }, + { + "type":"textarea", + "name":"commentaire_espace_public_vert", + "label":"Commentaires - liste / détails des espaces", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"commentaire_espace_public_vert" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_9" + }, + { + "type":"text", + "name":"sdp_locaux", + "label":"SDP programmée en locaux d'activités en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_locaux" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_logement", + "label":"Logements", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"sdp_logement", + "label":"SDP globale programmée en logements en m²", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"sdp_logement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"nb_logement", + "label":"Nombre prévisionnel total de logements", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"nb_logement" + }, + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_5_2_5" + }, + { + "type":"text", + "name":"nb_lgt_fam", + "label":"Total nombre de logements familiaux", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"nb_lgt_fam" + }, + { + "type":"text", + "name":"nb_lgt_spe", + "label":"Total nombre de logements spécifiques", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"nb_lgt_spe" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "title", + "code_vocation", + "label_sdp", + "label_sdp2", + "sdp", + "label_activite", + "sdp_bureau", + "sdp_commerce_service", + "sdp_loisir", + "sdp_hotel", + "sdp_locaux", + "label_equipement", + "sdp_equipement", + "commentaire_sdp_equipement", + "label_espace_public_vert", + "emprise_espace_public_vert", + "commentaire_espace_public_vert", + "label_logement", + "sdp_logement", + "nb_logement", + "nb_lgt_fam", + "nb_lgt_spe" + ] + } + ] + } + }, + "datasources":{ + "datasource_code_vocation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_vocation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_vocation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_vocation" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.json new file mode 100644 index 0000000000000000000000000000000000000000..e6cbde3155bfe5ae3d35d3e1b1a2fc267e2adea3 --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.json @@ -0,0 +1,593 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"nom_programme", + "label":"Nom commercial", + "nb_cols":10, + "id":"nom_programme" + }, + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":2, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_operation", + "label":"Nom de l'opération", + "nb_cols":3, + "id":"nom_operation" + }, + { + "type":"label", + "name":"nom_ilot", + "label":"Nom de l'ilot", + "nb_cols":2, + "id":"nom_ilot" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"adresse_programme", + "label":"Adresse", + "nb_cols":8, + "id":"adresse_programme" + }, + { + "type":"label", + "name":"nom_commune", + "label":"Commune", + "nb_cols":2, + "id":"nom_commune" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"numero_pc", + "label":"Référence du Permis de Construire (Numéro de PC)", + "nb_cols":2, + "id":"numero_pc" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"surface", + "label":"Superficie (m²)", + "nb_cols":2, + "id":"surface" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"aire_influence_tc", + "label":"Programme immobilier intégré dans une aire d'influence de Transports Collectifs", + "nb_cols":10, + "id":"aire_influence_tc" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Commentaires à l'échelle du programme immobilier", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"commentaire_programme", + "label":"", + "nb_cols":12, + "id":"commentaire_programme" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "id_programme", + "nom_programme", + "nom_operation", + "nom_ilot", + "nom_commune", + "date_mise_a_jour", + "adresse_programme", + "numero_pc", + "surface", + "aire_influence_tc", + "Element_4", + "commentaire_programme" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme-form", + "title":"SUIVI_PROD_IMMO_SAISIE_PROGRAMME", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"id_programme", + "label":"Identifiant", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"id_programme" + }, + { + "type":"text", + "name":"nom_programme", + "label":"Nom", + "required":false, + "pattern":"", + "nb_cols":5, + "id":"nom_programme" + }, + { + "type":"text", + "name":"numero_pc", + "label":"Numéro de PC", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"numero_pc" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"adresse_programme", + "label":"Adresse", + "required":false, + "pattern":"", + "nb_cols":5, + "id":"adresse_programme" + }, + { + "type":"select", + "name":"id_commune", + "label":"Commune", + "required":false, + "nb_cols":2, + "id":"id_commune", + "datasource":{ + "datasource_id":"datasource_id_commune", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_commune", + "order_by":"nom_commune", + "id_key":"id_commune", + "attributs":"id_commune|nom_commune" + }, + "id_from":"id_commune_from" + }, + { + "type":"text", + "name":"annee_debut", + "label":"Année de début", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_debut" + }, + { + "type":"text", + "name":"annee_fin", + "label":"Année de livraison", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"annee_fin" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_demandeur", + "label":"Nom de la société MOA", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"nom_demandeur" + }, + { + "type":"text", + "name":"nom_moe", + "label":"Nom du Maître d'OEuvre", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"nom_moe" + }, + { + "type":"select", + "name":"code_consultation", + "label":"Mode de consultation", + "required":false, + "nb_cols":3, + "id":"code_consultation", + "datasource":{ + "datasource_id":"datasource_code_consultation", + "sort_order":"ASC", + "distinct":"true", + "label_key":"consultation", + "order_by":"consultation", + "id_key":"code_consultation", + "attributs":"code_consultation|consultation" + }, + "id_from":"code_consultation_from" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-xs", + "nb_cols":12, + "name":"search_button", + "id":"search_button", + "buttons":[ + { + "type":"button", + "name":"search", + "label":"FORM_SEARCH_BUTTON", + "class":"btn-primary", + "event":"setGridFilter()" + }, + { + "type":"reset", + "name":"reset", + "label":"FORM_RESET_BUTTON", + "class":"btn-primary", + "event":"resetGridFilter()" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "search_button", + "id_programme", + "id_operation", + "nom_programme", + "id_commune", + "adresse_programme", + "numero_pc", + "nom_demandeur", + "nom_moe", + "annee_debut", + "annee_fin", + "code_consultation" + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + ], + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"text", + "name":"nom_programme", + "label":"Nom commercial", + "required":false, + "pattern":"", + "nb_cols":8, + "id":"nom_programme" + }, + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":2, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_operation", + "label":"Nom de l'opération", + "nb_cols":3, + "id":"nom_operation" + }, + { + "type":"label", + "name":"nom_ilot", + "label":"Nom de l'ilot", + "nb_cols":2, + "id":"nom_ilot" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"adresse_programme", + "label":"Adresse", + "required":false, + "pattern":"", + "nb_cols":8, + "id":"adresse_programme" + }, + { + "type":"select", + "name":"id_commune", + "label":"Commune", + "required":false, + "nb_cols":2, + "id":"id_commune", + "id_from":"id_commune_from", + "datasource":{ + "datasource_id":"datasource_id_commune", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_commune", + "order_by":"nom_commune", + "id_key":"id_commune", + "attributs":"id_commune|nom_commune" + } + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"numero_pc", + "label":"Référence du Permis de Construire (Numéro de PC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"numero_pc" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"surface", + "label":"Superficie (m²)", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"surface" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"aire_influence_tc", + "label":"Programme immobilier intégré dans une aire d'influence de Transports Collectifs", + "nb_cols":10, + "id":"aire_influence_tc" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Commentaires à l'échelle du programme immobilier", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"textarea", + "name":"commentaire_programme", + "label":"", + "required":false, + "pattern":"", + "nb_cols":12, + "id":"commentaire_programme" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "id_programme", + "nom_programme", + "nom_operation", + "nom_ilot", + "id_commune", + "date_mise_a_jour", + "adresse_programme", + "numero_pc", + "surface", + "aire_influence_tc", + "Element_4", + "commentaire_programme" + ] + } + ] + } + }, + "datasources":{ + "datasource_id_commune":{ + "type":"web_service", + "dataType":"tableValue", + "name":"id_commune", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"commune" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_id_commune" + }, + "datasource_code_consultation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_consultation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_consultation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_consultation" + }, + "datasource_id_operation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"operation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"operation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_38" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.old.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.old.json new file mode 100644 index 0000000000000000000000000000000000000000..e659d5fecdadecca77da3bacecf6c267cfa5f154 --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.old.json @@ -0,0 +1,2984 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"nom_programme", + "label":"Nom commercial", + "nb_cols":10, + "id":"nom_programme" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_operation", + "label":"Nom de l'opération", + "nb_cols":3, + "id":"nom_operation" + }, + { + "type":"label", + "name":"nom_ilot", + "label":"Nom de l'ilot", + "nb_cols":2, + "id":"nom_ilot" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"adresse_programme", + "label":"Adresse", + "nb_cols":8, + "id":"adresse_programme" + }, + { + "type":"label", + "name":"nom_commune", + "label":"Commune", + "nb_cols":2, + "id":"nom_commune" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"numero_pc", + "label":"Référence du Permis de Construire (Numéro de PC)", + "nb_cols":2, + "id":"numero_pc" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"surface", + "label":"Superficie (m²)", + "nb_cols":2, + "id":"surface" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":1, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"aire_influence_tc", + "label":"Programme immobilier intégré dans une aire d'influence de Transports Collectifs", + "nb_cols":10, + "id":"aire_influence_tc" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Dates - acteurs", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"type_operateur", + "label":"Type d'opérateur (demandeur)", + "nb_cols":10, + "id":"type_operateur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_demandeur", + "label":"Nom de la société MOA : promoteur, bailleur, ... ou autre", + "nb_cols":10, + "id":"nom_demandeur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_moe", + "label":"Nom du Maître d'OEuvre (cabinet architecte, ...)", + "nb_cols":10, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_debut", + "label":"Année de début (autorisation du PC)", + "nb_cols":10, + "id":"annee_debut" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_fin", + "label":"Année de livraison (prévue)", + "nb_cols":10, + "id":"annee_fin" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_achat_terrain_operateur", + "label":"Année d'achat du terrain par l'opératuer (acte authentique de vente lié au PC)", + "nb_cols":10, + "id":"annee_achat_terrain_operateur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_debut_commercialisation", + "label":"Date de début de commercialisation", + "nb_cols":10, + "id":"date_debut_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_fin_commercialisation", + "label":"Date de fin de commercialisation", + "nb_cols":10, + "id":"date_fin_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"tx_ecoulement_commercialisation", + "label":"Taux d'écoulement de commercialisation en % p/r au nombre de logements total du programme", + "nb_cols":10, + "id":"tx_ecoulement_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Encadrement du programme immobilier", + "nb_cols":12, + "id":"Element_1_6_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"consultation", + "label":"Mode de consultation", + "nb_cols":10, + "id":"consultation" + } + ] + }, + + { + "fields":[ + { + "type":"label", + "name":"cahier_prescription_archi_urb_paysagere_label", + "label":"Programme encadré par un Cahier de Prescriptions architecturales, urbaines et paysagères", + "nb_cols":10, + "id":"cahier_prescription_archi_urb_paysagere_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"charge_fonciere_imposee_fixee_label", + "label":"(CFi) Charge foncière 'imposée-fixée' (Vente de CF-encadrement via CCCT)", + "nb_cols":10, + "id":"charge_fonciere_imposee_fixee_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"prix_sortie_encadree_label", + "label":"Niveau de prix de sortie encadré (par exemple sur le logement abordable)", + "nb_cols":10, + "id":"prix_sortie_encadree_label" + } + ] + }, + + { + "fields":[ + { + "type":"title", + "name":"Element_2", + "label":"Coûts (indicateurs au programme immobilier)", + "nb_cols":12, + "id":"Element_2_9_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cout_total_programme", + "label":"Cout total estimé du programme immobilier (€ TTC)", + "nb_cols":10, + "id":"cout_total_programme" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_charge_fonciere_nette", + "label":"Dont :", + "nb_cols":1, + "id":"label_charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"charge_fonciere_nette", + "label":"Charge foncière nette (€/m² TTC)", + "nb_cols":10, + "id":"charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_cout_foncier_brut", + "label":"Dont :", + "nb_cols":1, + "id":"label_cout_foncier_brut" + }, + { + "type":"label", + "name":"cout_foncier_brut", + "label":"Coût du foncier brut (acquisition du terrain en €/m² TTC)", + "nb_cols":5, + "id":"cout_foncier_brut" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"cout_depol_demol", + "label":"Frais de préparation du terrain : démolition, dépollution, …", + "nb_cols":10, + "id":"cout_depol_demol" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_3", + "label":"Synthèse - éléments principaux du programme immobilier (surfaces, charges foncières, prix de sortie, ...)", + "nb_cols":12, + "id":"Element_3_15_1" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"surface_moy_logement", + "label":"Surface /Taille moyenne de logements familiaux (m²/logement)", + "nb_cols":10, + "id":"surface_moy_logement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cout_construction_moyen", + "label":"Coût de construction moyen (€ TTC/m² SDP)", + "nb_cols":10, + "id":"cout_construction_moyen" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"charge_fonciere_moy", + "label":"Charge foncière nette moyenne (€ TTC/m² SDP)", + "nb_cols":10, + "id":"charge_fonciere_moy" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"prix_commercial_moyen", + "label":"Prix moyen de commercialisation initial (€ TTC/m² SHAB)", + "nb_cols":10, + "id":"prix_commercial_moyen" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Commentaires à l'échelle du programme immobilier", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"commentaire_programme", + "label":"", + "nb_cols":12, + "id":"commentaire_programme" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "id_programme", + "nom_programme", + "nom_operation", + "nom_ilot", + "nom_commune", + "date_mise_a_jour", + "adresse_programme", + "numero_pc", + "surface", + "aire_influence_tc", + "Element_0", + "type_operateur", + "nom_demandeur", + "nom_moe", + "annee_debut", + "annee_fin", + "annee_achat_terrain_operateur", + "date_debut_commercialisation", + "date_fin_commercialisation", + "tx_ecoulement_commercialisation", + "Element_1", + "consultation", + "cahier_prescription_archi_urb_paysagere_label", + "charge_fonciere_imposee_fixee_label", + "prix_sortie_encadree_label", + "Element_2", + "cout_total_programme", + "label_cout_foncier_brut", + "cout_foncier_brut", + "label_charge_fonciere_nette", + "charge_fonciere_nette", + "cout_depol_demol", + "Element_3", + "surface_moy_logement", + "cout_construction_moyen", + "charge_fonciere_moy", + "prix_commercial_moyen", + "Element_4", + "commentaire_programme" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme-form", + "title":"SUIVI_PROD_IMMO_SAISIE_PROGRAMME", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"id_programme", + "label":"Identifiant", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"id_programme" + }, + { + "type":"text", + "name":"nom_programme", + "label":"Nom", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"nom_programme" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-xs", + "nb_cols":12, + "name":"search_button", + "id":"search_button", + "buttons":[ + { + "type":"button", + "name":"search", + "label":"FORM_SEARCH_BUTTON", + "class":"btn-primary", + "event":"setGridFilter()" + }, + { + "type":"reset", + "name":"reset", + "label":"FORM_RESET_BUTTON", + "class":"btn-primary", + "event":"resetGridFilter()" + } + ] + } + ] + } + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "search_button", + "id_programme", + "nom_programme" + ] + } + ] + } + }, + "insert":{ + "name":"anc_saisie_anc_traitement-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"id_installation", + "label":"Installation", + "required":true, + "nb_cols":4, + "id":"id_installation", + "datasource":{ + "datasource_id":"datasource_38", + "sort_order":"ASC", + "distinct":"true", + "label_key":"num_dossier", + "order_by":"num_dossier", + "id_key":"id_installation", + "attributs":"id_installation|num_dossier" + }, + "id_from":"id_installation_from" + }, + { + "type":"select", + "name":"id_controle", + "label":"Contrôle", + "required":true, + "nb_cols":4, + "id":"id_controle_2_1", + "datasource":{ + "datasource_id":"datasource_39", + "sort_order":"ASC", + "distinct":"true", + "label_key":"id_controle", + "order_by":"id_controle", + "id_key":"id_controle", + "attributs":"id_controle|id_controle", + "parents":[ + { + "name":"id_installation", + "filter_attr":"id_installation", + "filter_equality":"=", + "wait_for_parent":true + } + ] + }, + "id_from":"id_controle_2_1_from" + }, + { + "type":"select", + "name":"tra_type", + "label":"Type de traitement", + "required":true, + "nb_cols":4, + "id":"Element_0_1_2", + "id_from":"Element_0_1_2_from", + "datasource":{ + "datasource_id":"datasource_1", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Dimensionnement", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_nb", + "label":"Nombre de tranchées", + "required":false, + "nb_cols":4, + "id":"Element_1_3_1", + "id_from":"Element_1_3_1_from", + "datasource":{ + "datasource_id":"datasource_2", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"number", + "name":"tra_long", + "label":"Longueur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_2" + }, + { + "type":"number", + "name":"tra_longueur", + "label":"Longueur de chaque tranchée (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_4" + }, + { + "type":"number", + "name":"tra_larg", + "label":"Largeur (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_3_3" + }, + { + "type":"number", + "name":"tra_surf", + "label":"Surface (en m²)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_2" + }, + { + "type":"number", + "name":"tra_tot_lin", + "label":"Linéaire total (en m)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_4_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_largeur", + "label":"Largeur des tranchées", + "required":false, + "nb_cols":4, + "id":"Element_1_4_3", + "id_from":"Element_1_4_3_from", + "datasource":{ + "datasource_id":"datasource_40", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"number", + "name":"tra_profond", + "label":"Profondeur des tranchées (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_3" + }, + { + "type":"number", + "name":"tra_profondeur", + "label":"Profondeur (en cm)", + "required":false, + "pattern":"", + "nb_cols":4, + "id":"Element_1_5_2" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"tra_hauteur", + "label":"Hauteur", + "required":false, + "pattern":"", + "nb_cols":6, + "id":"Element_1_5_1" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Implantation", + "nb_cols":12, + "id":"Element_1_6_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_hab", + "label":"Distance habitation > 5m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_1", + "id_from":"Element_2_7_1_from", + "datasource":{ + "datasource_id":"datasource_3", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_lim_parc", + "label":"Limite parcelle > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_7_2", + "id_from":"Element_2_7_2_from", + "datasource":{ + "datasource_id":"datasource_4", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_dist_veget", + "label":"Distance végétation > 3m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_1", + "id_from":"Element_2_8_1_from", + "datasource":{ + "datasource_id":"datasource_5", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_dist_puit", + "label":"Distance puit 35m", + "required":false, + "nb_cols":6, + "id":"Element_2_8_2", + "id_from":"Element_2_8_2_from", + "datasource":{ + "datasource_id":"datasource_6", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_2", + "label":"Vérification des matériaux", + "nb_cols":12, + "id":"Element_2_9_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_racine", + "label":"Présence d'un film anti-racine", + "nb_cols":4, + "id":"Element_3_10_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_14", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_1_from" + }, + { + "type":"select", + "name":"tra_vm_humidite", + "label":"Présence d'un film anti-humidité", + "nb_cols":4, + "id":"Element_3_10_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_15", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_2_from" + }, + { + "type":"select", + "name":"tra_vm_imper", + "label":"Présence d'un film imperméable", + "nb_cols":4, + "id":"Element_3_10_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_16", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_10_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_geomembrane", + "label":"Présence d'une géomembrane", + "nb_cols":4, + "id":"Element_3_11_0", + "datasource":{ + "datasource_id":"datasource_41", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_0_from" + }, + { + "type":"select", + "name":"tra_vm_geogrille", + "label":"Présence d'une géo-grille", + "nb_cols":4, + "id":"Element_3_11_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_17", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_1_from" + }, + { + "type":"select", + "name":"tra_vm_grav_qual", + "label":"Graviers de qualité conforme aux filières d'assainissement non collectif", + "nb_cols":8, + "id":"Element_3_11_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_18", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_2_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_grav_ep", + "label":"Epaisseur conforme des graviers", + "nb_cols":4, + "id":"Element_3_11_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_19", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_11_3_from" + }, + { + "type":"select", + "name":"tra_vm_geo_text", + "label":"Présence d'un géotextile", + "nb_cols":4, + "id":"Element_3_12_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_20", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_1_from" + }, + { + "type":"select", + "name":"tra_vm_ht_terre_veget", + "label":"Hauteur de terre vegetale de 20 cm au-dessus des drains", + "nb_cols":4, + "id":"Element_3_12_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "id_from":"Element_3_12_2_from", + "datasource":{ + "datasource_id":"datasource_7", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_tuy_perf", + "label":"Les tuyaux d'épandage mis en place sont-ils des tuyaux rigides perforés prévus pour l'assainissement non collectif, orifices dirigés vers le bas", + "nb_cols":12, + "id":"Element_3_12_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_22", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_12_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_vm_bon_mat", + "label":"Les bons de matériaux ont-ils été fournis", + "nb_cols":4, + "id":"Element_3_13_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_23", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_1_from" + }, + { + "type":"select", + "name":"tra_vm_sab_qual", + "label":"Sable de qualité conforme", + "nb_cols":4, + "id":"Element_3_13_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_25", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_3_from" + }, + { + "type":"select", + "name":"tra_vm_sab_ep", + "label":"Epaisseur de sable de 0.7", + "nb_cols":4, + "id":"Element_3_13_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_24", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_3_13_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_3", + "label":"Regard de repartition", + "nb_cols":12, + "id":"Element_3_15_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_mat", + "label":"Matériau du regard de répartition", + "nb_cols":4, + "id":"Element_4_16_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_26", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_16_1_from" + }, + { + "type":"select", + "name":"tra_regrep_affl", + "label":"Affleure-t-il le niveau du sol", + "required":false, + "nb_cols":4, + "id":"Element_4_16_2", + "id_from":"Element_4_16_2_from", + "datasource":{ + "datasource_id":"datasource_8", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regrep_equi", + "label":"Equirépartition des eaux", + "required":false, + "nb_cols":4, + "id":"Element_4_16_3", + "id_from":"Element_4_16_3_from", + "datasource":{ + "datasource_id":"datasource_9", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regrep_perf", + "label":"Les tuyaux de répartition sont-ils non perforés", + "nb_cols":12, + "id":"Element_4_17_1", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_29", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_1_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_5", + "label":"Regard de bouclage", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_mat", + "label":"Matériau du regard de bouclage", + "required":false, + "nb_cols":4, + "id":"Element_6_19_1", + "id_from":"Element_6_19_1_from", + "datasource":{ + "datasource_id":"datasource_10", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regbl_affl", + "label":"Affleure-t-il le niveau de sol", + "nb_cols":4, + "id":"Element_6_19_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_2_from" + }, + { + "type":"select", + "name":"tra_regbl_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_6_19_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_32", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_19_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regbl_epand", + "label":"Les tuyaux d'épandage sont raccordés de manière indépendante au regard de bouclage", + "nb_cols":8, + "id":"Element_4_17_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_33", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_4_17_2_from" + }, + { + "type":"select", + "name":"tra_regbl_perf", + "label":"Les tuyaux de bouclage sont-ils perforés", + "nb_cols":4, + "id":"Element_6_20_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_34", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_6_20_2_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Regard de collecte", + "nb_cols":12, + "id":"Element_4_22_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"tra_regcol_mat", + "label":"Matériau du regard de collecte", + "required":false, + "nb_cols":4, + "id":"Element_6_22_1", + "id_from":"Element_6_22_1_from", + "datasource":{ + "datasource_id":"datasource_11", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + } + }, + { + "type":"select", + "name":"tra_regcol_affl", + "label":"Affleure-t-il le niveau du sol", + "nb_cols":4, + "id":"Element_7_22_2", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_36", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_7_22_2_from" + }, + { + "type":"select", + "name":"tra_regcol_hz", + "label":"Est-il posé horizontalement", + "nb_cols":4, + "id":"Element_8_22_3", + "options":{ + "choices":[ + { + "label":"Oui", + "value":true + }, + { + "label":"Non", + "value":false + } + ] + }, + "datasource":{ + "datasource_id":"datasource_37", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_7", + "label":"Documents", + "nb_cols":12, + "id":"Element_7_26_1" + } + ] + }, + { + "fields":[ + { + "type":"image_wsdata", + "name":"photos_f", + "label":"Photos", + "nb_cols":12, + "id":"Element_0_2_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"fiche_f", + "label":"Fiche Entretien", + "nb_cols":12, + "id":"Element_0_3_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"schema_f", + "label":"Schéma de principe", + "nb_cols":12, + "id":"Element_0_4_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"documents_f", + "label":"Documents", + "nb_cols":12, + "id":"Element_0_5_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"file_wsdata", + "name":"plan_f", + "label":"Plan de recolement", + "nb_cols":12, + "id":"Element_0_6_1", + "displayOnly":false + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"insert_button", + "id":"insert_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_CREATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "insert_button", + "id_controle", + "tra_type", + "id_traitement", + "tra_nb", + "tra_long", + "tra_longueur", + "tra_larg", + "tra_tot_lin", + "tra_surf", + "tra_largeur", + "tra_hauteur", + "tra_profondeur", + "tra_profond", + "Element_1", + "tra_dist_hab", + "tra_dist_lim_parc", + "tra_dist_veget", + "tra_dist_puit", + "Element_2", + "tra_vm_racine", + "tra_vm_humidite", + "tra_vm_imper", + "tra_vm_geogrille", + "tra_vm_grav_qual", + "tra_vm_grav_ep", + "tra_vm_geo_text", + "tra_vm_ht_terre_veget", + "tra_vm_tuy_perf", + "tra_vm_bon_mat", + "tra_vm_sab_ep", + "tra_vm_sab_qual", + "Element_3", + "tra_regrep_mat", + "tra_regrep_affl", + "tra_regrep_equi", + "tra_regrep_perf", + "tra_regbl_epand", + "Element_5", + "tra_regbl_mat", + "tra_regbl_affl", + "tra_regbl_hz", + "tra_regbl_perf", + "Element_4", + "tra_regcol_mat", + "tra_regcol_affl", + "tra_regcol_hz", + "id_installation", + "Element_0", + "Element_7", + "tra_vm_geomembrane" + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"text", + "name":"nom_programme", + "label":"Nom commercial", + "required":false, + "pattern":"", + "nb_cols":8, + "id":"nom_programme" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_operation", + "label":"Nom de l'opération", + "nb_cols":3, + "id":"nom_operation" + }, + { + "type":"label", + "name":"nom_ilot", + "label":"Nom de l'ilot", + "nb_cols":2, + "id":"nom_ilot" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"adresse_programme", + "label":"Adresse", + "required":false, + "pattern":"", + "nb_cols":8, + "id":"adresse_programme" + }, + { + "type":"select", + "name":"id_commune", + "label":"Commune", + "required":false, + "nb_cols":2, + "id":"id_commune", + "id_from":"id_commune_from", + "datasource":{ + "datasource_id":"datasource_id_commune", + "sort_order":"ASC", + "distinct":"true", + "label_key":"nom_commune", + "order_by":"nom_commune", + "id_key":"id_commune", + "attributs":"id_commune|nom_commune" + } + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"numero_pc", + "label":"Référence du Permis de Construire (Numéro de PC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"numero_pc" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"surface", + "label":"Superficie (m²)", + "required":false, + "pattern":"", + "nb_cols":1, + "id":"surface" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_mise_a_jour", + "label":"Date de mise à jour", + "nb_cols":1, + "id":"date_mise_a_jour" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"aire_influence_tc", + "label":"Programme immobilier intégré dans une aire d'influence de Transports Collectifs", + "nb_cols":10, + "id":"aire_influence_tc" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_0", + "label":"Date - acteurs", + "nb_cols":12, + "id":"Element_0_2_1" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"code_type_operateur", + "label":"Type d'opérateur du programme immobilier (demandeur)", + "required":false, + "nb_cols":3, + "id":"code_type_operateur", + "id_from":"code_type_operateur_from", + "datasource":{ + "datasource_id":"datasource_code_type_operateur", + "sort_order":"ASC", + "distinct":"true", + "label_key":"type_operateur", + "order_by":"type_operateur", + "id_key":"code_type_operateur", + "attributs":"code_type_operateur|type_operateur" + } + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_demandeur", + "label":"Nom de la société MOA : promoteur, bailleur, ... ou autre", + "required":false, + "pattern":"", + "nb_cols":5, + "id":"nom_demandeur" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_moe", + "label":"Nom du Maître d'OEuvre (cabinet architecte, ...)", + "required":false, + "pattern":"", + "nb_cols":5, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"annee_debut", + "label":"Année de début (autorisation du PC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"annee_debut" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"annee_fin", + "label":"Année de livraison (prévue)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"annee_fin" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"annee_achat_terrain_operateur", + "label":"Année d'achat du terrain par l'opératuer (acte authentique de vente lié au PC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"annee_achat_terrain_operateur" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"date_debut_commercialisation", + "label":"Année de début de commercialisation", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"date_debut_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"date_fin_commercialisation", + "label":"Année de fin de commercialisation", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"date_fin_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"tx_ecoulement_commercialisation", + "label":"Taux d'écoulement de commercialisation en % p/r au nombre de logements total du programme", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"tx_ecoulement_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_1", + "label":"Encadrement du programme immobilier", + "nb_cols":12, + "id":"Element_1_6_1" + } + ] + }, + + { + "fields":[ + { + "type":"select", + "name":"code_consultation", + "label":"Mode de consultation", + "required":false, + "nb_cols":4, + "id":"code_consultation", + "id_from":"code_consultation_from", + "datasource":{ + "datasource_id":"datasource_code_consultation", + "sort_order":"ASC", + "distinct":"true", + "label_key":"consultation", + "order_by":"consultation", + "id_key":"code_consultation", + "attributs":"code_consultation|consultation" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"cahier_prescription_archi_urb_paysagere", + "label":"Programme encadré par un Cahier de Prescriptions architecturales, urbaines et paysagères", + "required":false, + "nb_cols":4, + "id":"Element_8_22_3", + "datasource":{ + "datasource_id":"datasource_cahier_prescription_archi_urb_paysagere", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"charge_fonciere_imposee_fixee", + "label":"(CFi) Charge foncière 'imposée-fixée' (Vente de CF-encadrement via CCCT)", + "required":false, + "nb_cols":4, + "id":"Element_8_22_3", + "datasource":{ + "datasource_id":"datasource_charge_fonciere_imposee_fixee", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"prix_sortie_encadree", + "label":"Niveau de prix de sortie encadré", + "required":false, + "nb_cols":4, + "id":"Element_8_22_3", + "datasource":{ + "datasource_id":"datasource_prix_sortie_encadree", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_2", + "label":"Coûts (indicateurs du programme immobilier)", + "nb_cols":12, + "id":"Element_2_9_1" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"cout_total_programme", + "label":"Cout total estimé du programme immobilier (€ TTC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"cout_total_programme" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_charge_fonciere_nette", + "label":"Dont :", + "nb_cols":1, + "id":"label_charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"charge_fonciere_nette", + "label":"Charge foncière nette (€/m² TTC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_cout_foncier_brut", + "label":"Dont :", + "nb_cols":1, + "id":"label_cout_foncier_brut" + }, + { + "type":"number", + "name":"cout_foncier_brut", + "label":"Coût du foncier brut (acquisition du terrain en €/m² TTC)", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"cout_foncier_brut" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_0_2_11" + }, + { + "type":"number", + "name":"cout_depol_demol", + "label":"Frais de préparation du terrain : démolition, dépollution, …", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"cout_depol_demol" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_3", + "label":"Synthèse - éléments principaux du programme immobilier (surfaces, charges foncièrès, prix de sortie, …)", + "nb_cols":12, + "id":"Element_3_15_1" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"surface_moy_logement", + "label":"Surface /Taille moyenne de logements familiaux (m²/logement)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"surface_moy_logement" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"cout_construction_moyen", + "label":"Coût de construction moyen (€ TTC/m² SDP)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"cout_construction_moyen" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"charge_fonciere_moy", + "label":"Charge foncière nette moyenne (€ TTC/m² SDP)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"charge_fonciere_moy" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"prix_commercial_moyen", + "label":"Prix moyen de commercialisation initial (€ TTC/m² SHAB)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"prix_commercial_moyen" + } + ] + }, + { + "fields":[ + { + "type":"title", + "name":"Element_4", + "label":"Commentaires à l'échelle du programme immobilier", + "nb_cols":12, + "id":"Element_5_17_3" + } + ] + }, + { + "fields":[ + { + "type":"textarea", + "name":"commentaire_programme", + "label":"", + "required":false, + "pattern":"", + "nb_cols":12, + "id":"commentaire_programme" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "initEvent": "initAncTraitementForm()", + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "id_programme", + "nom_programme", + "nom_operation", + "nom_ilot", + "id_commune", + "date_mise_a_jour", + "adresse_programme", + "numero_pc", + "surface", + "aire_influence_tc", + "Element_0", + "code_type_operateur", + "nom_demandeur", + "nom_moe", + "annee_debut", + "annee_fin", + "annee_achat_terrain_operateur", + "date_debut_commercialisation", + "date_fin_commercialisation", + "tx_ecoulement_commercialisation", + "Element_1", + "code_consultation", + "cahier_prescription_archi_urb_paysagere", + "charge_fonciere_imposee_fixee", + "prix_sortie_encadree", + "Element_2", + "cout_total_programme", + "label_cout_foncier_brut", + "cout_foncier_brut", + "label_charge_fonciere_nette", + "charge_fonciere_nette", + "cout_depol_demol", + "Element_3", + "surface_moy_logement", + "cout_construction_moyen", + "charge_fonciere_moy", + "prix_commercial_moyen", + "Element_4", + "commentaire_programme" + ] + } + ] + } + }, + "datasources":{ + "datasource_id_commune":{ + "type":"web_service", + "dataType":"tableValue", + "name":"id_commune", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"commune" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_id_commune" + }, + "datasource_code_type_operateur":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_type_operateur", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_type_operateur" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_type_operateur" + }, + "datasource_code_consultation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_consultation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_consultation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_consultation" + }, + "datasource_cahier_prescription_archi_urb_paysagere":{ + "type":"web_service", + "dataType":"tableValue", + "name":"cahier_prescription_archi_urb_paysagere", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"param_liste", + "filter": {"id_nom_table": "programme_immobilier", "nom_liste": "cahier_prescription_archi_urb_paysagere"} + }, + "ressource_id":"vitis/genericquerys" + }, + "datasource_charge_fonciere_imposee_fixee":{ + "type":"web_service", + "dataType":"tableValue", + "name":"charge_fonciere_imposee_fixee", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"param_liste", + "filter": {"id_nom_table": "programme_immobilier", "nom_liste": "charge_fonciere_imposee_fixee"} + }, + "ressource_id":"vitis/genericquerys" + }, + "datasource_prix_sortie_encadree":{ + "type":"web_service", + "dataType":"tableValue", + "name":"prix_sortie_encadree", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"param_liste", + "filter": {"id_nom_table": "programme_immobilier", "nom_liste": "prix_sortie_encadree"} + }, + "ressource_id":"vitis/genericquerys" + }, + + + "datasource_3":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_dist_hab", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_dist_hab"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_3" + }, + "datasource_4":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_dist_lim_parc", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_dist_lim_parc"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_4" + }, + "datasource_5":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_dist_veget", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_dist_veget"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_5" + }, + "datasource_6":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_dist_puit", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_dist_puit"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_6" + }, + "datasource_7":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_ht_terre_veget", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_ht_terre_veget"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_7" + }, + "datasource_8":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regrep_affl", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regrep_affl"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_8" + }, + "datasource_9":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regrep_equi", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regrep_equi"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_9" + }, + "datasource_10":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regbl_mat", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regbl_mat"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_10" + }, + "datasource_11":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regcol_mat", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"param_liste", + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regcol_mat"} + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_11" + }, + "datasource_12":{ + "type":"web_service", + "dataType":"tableValue", + "name":"installation", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"v_installation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_12" + }, + "datasource_13":{ + "type":"web_service", + "dataType":"tableValue", + "name":"controle", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"v_controle" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_13" + }, + "datasource_14":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_racine", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_racine"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_14" + }, + "datasource_15":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_humidite", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_humidite"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_15" + }, + "datasource_16":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_imper", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_imper"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_16" + }, + "datasource_17":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_geogrille", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_geogrille"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_17" + }, + "datasource_18":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_grav_qual", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_grav_qual"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_18" + }, + "datasource_19":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_grav_ep", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_grav_ep"}, + "database":"", + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_19" + }, + "datasource_20":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_geo_text", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_geo_text"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_20" + }, + "datasource_21":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_ht_terre_veget", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_ht_terre_veget"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_21" + }, + "datasource_22":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_tuy_perf", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_tuy_perf"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_22" + }, + "datasource_23":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_bon_mat", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_bon_mat"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_23" + }, + "datasource_24":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_sab_ep", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_sab_ep"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_24" + }, + "datasource_25":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_sab_qual", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_sab_qual"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_25" + }, + "datasource_26":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regrep_mat", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regrep_mat"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_26" + }, + "datasource_27":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regrep_affl", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regrep_affl"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_27" + }, + "datasource_28":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regrep_equi", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regrep_equi"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_28" + }, + "datasource_29":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regrep_perf", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regrep_perf"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_29" + }, + "datasource_30":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regbl_mat", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regbl_mat"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_30" + }, + "datasource_31":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regbl_affl", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regbl_affl"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_31" + }, + "datasource_32":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regbl_hz", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regbl_hz"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_32" + }, + "datasource_33":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regbl_epand", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regbl_epand"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_33" + }, + "datasource_34":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regbl_perf", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regbl_perf"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_34" + }, + "datasource_35":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regcol_mat", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regcol_mat"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_35" + }, + "datasource_36":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regcol_affl", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regcol_affl"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_36" + }, + "datasource_37":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_regcol_hz", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_regcol_hz"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_37" + }, + "datasource_38":{ + "type":"web_service", + "dataType":"tableValue", + "name":"installation", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"v_installation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_38" + }, + "datasource_39":{ + "type":"web_service", + "dataType":"tableValue", + "name":"controle", + "description":"", + "parameters":{ + "schema":"s_anc", + "table":"v_controle" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_3" + }, + "datasource_40":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_largeur", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_largeur"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_40" + }, + "datasource_41":{ + "type":"web_service", + "dataType":"tableValue", + "name":"tra_vm_geomembrane", + "description":"", + "parameters":{ + "filter": {"id_nom_table": "traitement", "nom_liste": "tra_vm_geomembrane"}, + "schema":"s_anc", + "table":"param_liste" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_41" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur.json new file mode 100644 index 0000000000000000000000000000000000000000..fd2d62336f83b535909f6d925b81d56cdd3d723d --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur.json @@ -0,0 +1,394 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ACTEUR_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"type_operateur", + "label":"Type d'opérateur (demandeur)", + "nb_cols":10, + "id":"type_operateur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_demandeur", + "label":"Nom de la société MOA : promoteur, bailleur, ... ou autre", + "nb_cols":10, + "id":"nom_demandeur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"nom_moe", + "label":"Nom du Maître d'OEuvre (cabinet architecte, ...)", + "nb_cols":10, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_debut", + "label":"Année de début (autorisation du PC)", + "nb_cols":10, + "id":"annee_debut" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_fin", + "label":"Année de livraison (prévue)", + "nb_cols":10, + "id":"annee_fin" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"annee_achat_terrain_operateur", + "label":"Année d'achat du terrain par l'opératuer (acte authentique de vente lié au PC)", + "nb_cols":10, + "id":"annee_achat_terrain_operateur" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_debut_commercialisation", + "label":"Date de début de commercialisation", + "nb_cols":10, + "id":"date_debut_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"date_fin_commercialisation", + "label":"Date de fin de commercialisation", + "nb_cols":10, + "id":"date_fin_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"tx_ecoulement_commercialisation", + "label":"Taux d'écoulement de commercialisation en % p/r au nombre de logements total du programme", + "nb_cols":10, + "id":"tx_ecoulement_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "type_operateur", + "nom_demandeur", + "nom_moe", + "annee_debut", + "annee_fin", + "annee_achat_terrain_operateur", + "date_debut_commercialisation", + "date_fin_commercialisation", + "tx_ecoulement_commercialisation" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur-form", + "title":"SUIVI_PROD_IMMO_SAISIE_PROGRAMME", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ACTEUR_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ACTEUR_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"code_type_operateur", + "label":"Type d'opérateur du programme immobilier (demandeur)", + "required":false, + "nb_cols":3, + "id":"code_type_operateur", + "id_from":"code_type_operateur_from", + "datasource":{ + "datasource_id":"datasource_code_type_operateur", + "sort_order":"ASC", + "distinct":"true", + "label_key":"type_operateur", + "order_by":"type_operateur", + "id_key":"code_type_operateur", + "attributs":"code_type_operateur|type_operateur" + } + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_demandeur", + "label":"Nom de la société MOA : promoteur, bailleur, ... ou autre", + "required":false, + "pattern":"", + "nb_cols":5, + "id":"nom_demandeur" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"nom_moe", + "label":"Nom du Maître d'OEuvre (cabinet architecte, ...)", + "required":false, + "pattern":"", + "nb_cols":5, + "id":"nom_moe" + } + ] + }, + { + "fields":[ + { + "type":"text", + "name":"annee_debut", + "label":"Année de début (autorisation du PC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"annee_debut" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"annee_fin", + "label":"Année de livraison (prévue)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"annee_fin" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"annee_achat_terrain_operateur", + "label":"Année d'achat du terrain par l'opératuer (acte authentique de vente lié au PC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"annee_achat_terrain_operateur" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"date_debut_commercialisation", + "label":"Année de début de commercialisation", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"date_debut_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"date_fin_commercialisation", + "label":"Année de fin de commercialisation", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"date_fin_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"tx_ecoulement_commercialisation", + "label":"Taux d'écoulement de commercialisation en % p/r au nombre de logements total du programme", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"tx_ecoulement_commercialisation" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "code_type_operateur", + "nom_demandeur", + "nom_moe", + "annee_debut", + "annee_fin", + "annee_achat_terrain_operateur", + "date_debut_commercialisation", + "date_fin_commercialisation", + "tx_ecoulement_commercialisation" + + ] + } + ] + } + }, + "datasources":{ + "datasource_code_type_operateur":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_type_operateur", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_type_operateur" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_type_operateur" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout.json new file mode 100644 index 0000000000000000000000000000000000000000..615b2034aa5225194dceb2e5237645bc2372b0ee --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout.json @@ -0,0 +1,308 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_COUT_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"cout_total_programme", + "label":"Cout total estimé du programme immobilier (€ TTC)", + "nb_cols":10, + "id":"cout_total_programme" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_charge_fonciere_nette", + "label":"Dont :", + "nb_cols":1, + "id":"label_charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"charge_fonciere_nette", + "label":"Charge foncière nette (€/m² TTC)", + "nb_cols":10, + "id":"charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_cout_foncier_brut", + "label":"Dont :", + "nb_cols":1, + "id":"label_cout_foncier_brut" + }, + { + "type":"label", + "name":"cout_foncier_brut", + "label":"Coût du foncier brut (acquisition du terrain en €/m² TTC)", + "nb_cols":5, + "id":"cout_foncier_brut" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"cout_depol_demol", + "label":"Frais de préparation du terrain : démolition, dépollution, …", + "nb_cols":10, + "id":"cout_depol_demol" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "cout_total_programme", + "label_cout_foncier_brut", + "cout_foncier_brut", + "label_charge_fonciere_nette", + "charge_fonciere_nette", + "cout_depol_demol" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout-form", + "title":"SUIVI_PROD_IMMO_SAISIE_PROGRAMME", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_COUT_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_COUT_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"cout_total_programme", + "label":"Cout total estimé du programme immobilier (€ TTC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"cout_total_programme" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"label_charge_fonciere_nette", + "label":"Dont :", + "nb_cols":1, + "id":"label_charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"charge_fonciere_nette", + "label":"Charge foncière nette (€/m² TTC)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"charge_fonciere_nette" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":1, + "id":"Element_0_2_11" + }, + { + "type":"label", + "name":"label_cout_foncier_brut", + "label":"Dont :", + "nb_cols":1, + "id":"label_cout_foncier_brut" + }, + { + "type":"number", + "name":"cout_foncier_brut", + "label":"Coût du foncier brut (acquisition du terrain en €/m² TTC)", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"cout_foncier_brut" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"alinea", + "label":"", + "nb_cols":2, + "id":"Element_0_2_11" + }, + { + "type":"number", + "name":"cout_depol_demol", + "label":"Frais de préparation du terrain : démolition, dépollution, …", + "required":false, + "pattern":"", + "nb_cols":3, + "id":"cout_depol_demol" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "cout_total_programme", + "label_cout_foncier_brut", + "cout_foncier_brut", + "label_charge_fonciere_nette", + "charge_fonciere_nette", + "cout_depol_demol" + ] + } + ] + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_encadrement.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_encadrement.json new file mode 100644 index 0000000000000000000000000000000000000000..f9934343c6b921e71975702c46f32dd04c66a33b --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_encadrement.json @@ -0,0 +1,350 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_encadrement-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ENCADREMENT_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"consultation", + "label":"Mode de consultation", + "nb_cols":10, + "id":"consultation" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cahier_prescription_archi_urb_paysagere_label", + "label":"Programme encadré par un Cahier de Prescriptions architecturales, urbaines et paysagères", + "nb_cols":10, + "id":"cahier_prescription_archi_urb_paysagere_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"encadrement_plu", + "label":"Encadrement via le PLU :", + "nb_cols":12, + "id":"encadrement_plu" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"charge_fonciere_imposee_fixee_label", + "label":"(CFi) Charge foncière 'imposée-fixée' (Vente de CF-encadrement via CCCT)", + "nb_cols":10, + "id":"charge_fonciere_imposee_fixee_label" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"prix_sortie_encadree_label", + "label":"Niveau de prix de sortie encadré (par exemple sur le logement abordable)", + "nb_cols":10, + "id":"prix_sortie_encadree_label" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "consultation", + "cahier_prescription_archi_urb_paysagere_label", + "encadrement_plu", + "charge_fonciere_imposee_fixee_label", + "prix_sortie_encadree_label" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_encadrement-form", + "title":"SUIVI_PROD_IMMO_SAISIE_PROGRAMME", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_encadrement-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ENCADREMENT_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_encadrement-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ENCADREMENT_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"select", + "name":"code_consultation", + "label":"Mode de consultation", + "required":false, + "nb_cols":4, + "id":"code_consultation", + "id_from":"code_consultation_from", + "datasource":{ + "datasource_id":"datasource_code_consultation", + "sort_order":"ASC", + "distinct":"true", + "label_key":"consultation", + "order_by":"consultation", + "id_key":"code_consultation", + "attributs":"code_consultation|consultation" + } + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"cahier_prescription_archi_urb_paysagere", + "label":"Programme encadré par un Cahier de Prescriptions architecturales, urbaines et paysagères", + "required":false, + "nb_cols":4, + "id":"Element_8_22_3", + "datasource":{ + "datasource_id":"datasource_cahier_prescription_archi_urb_paysagere", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"encadrement_plu", + "label":"Encadrement via le PLU :", + "nb_cols":12, + "id":"encadrement_plu" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"charge_fonciere_imposee_fixee", + "label":"(CFi) Charge foncière 'imposée-fixée' (Vente de CF-encadrement via CCCT)", + "required":false, + "nb_cols":4, + "id":"Element_8_22_3", + "datasource":{ + "datasource_id":"datasource_charge_fonciere_imposee_fixee", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"select", + "name":"prix_sortie_encadree", + "label":"Niveau de prix de sortie encadré", + "required":false, + "nb_cols":4, + "id":"Element_8_22_3", + "datasource":{ + "datasource_id":"datasource_prix_sortie_encadree", + "sort_order":"ASC", + "distinct":"true", + "label_key":"alias", + "order_by":"alias", + "id_key":"valeur", + "attributs":"valeur|alias" + }, + "id_from":"Element_8_22_3_from" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "code_consultation", + "cahier_prescription_archi_urb_paysagere", + "encadrement_plu", + "charge_fonciere_imposee_fixee", + "prix_sortie_encadree" + ] + } + ] + } + }, + "datasources":{ + "datasource_code_consultation":{ + "type":"web_service", + "dataType":"tableValue", + "name":"code_consultation", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"tr_consultation" + }, + "ressource_id":"vitis/genericquerys", + "id":"datasource_code_consultation" + }, + "datasource_cahier_prescription_archi_urb_paysagere":{ + "type":"web_service", + "dataType":"tableValue", + "name":"cahier_prescription_archi_urb_paysagere", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"param_liste", + "filter": {"id_nom_table": "programme_immobilier", "nom_liste": "cahier_prescription_archi_urb_paysagere"} + }, + "ressource_id":"vitis/genericquerys" + }, + "datasource_charge_fonciere_imposee_fixee":{ + "type":"web_service", + "dataType":"tableValue", + "name":"charge_fonciere_imposee_fixee", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"param_liste", + "filter": {"id_nom_table": "programme_immobilier", "nom_liste": "charge_fonciere_imposee_fixee"} + }, + "ressource_id":"vitis/genericquerys" + }, + "datasource_prix_sortie_encadree":{ + "type":"web_service", + "dataType":"tableValue", + "name":"prix_sortie_encadree", + "description":"", + "parameters":{ + "schema":"prod_immo", + "table":"param_liste", + "filter": {"id_nom_table": "programme_immobilier", "nom_liste": "prix_sortie_encadree"} + }, + "ressource_id":"vitis/genericquerys" + } + } +} diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese.json new file mode 100644 index 0000000000000000000000000000000000000000..0b8bc8f2341753bcf49999bb6c3fee736ad95266 --- /dev/null +++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese.json @@ -0,0 +1,238 @@ +{ + "display":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_SYNTHESE_TITLE_DISPLAY", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"label", + "name":"surface_moy_logement", + "label":"Surface /Taille moyenne de logements familiaux (m²/logement)", + "nb_cols":10, + "id":"surface_moy_logement" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"cout_construction_moyen", + "label":"Coût de construction moyen (€ TTC/m² SDP)", + "nb_cols":10, + "id":"cout_construction_moyen" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"charge_fonciere_moy", + "label":"Charge foncière nette moyenne (€ TTC/m² SDP)", + "nb_cols":10, + "id":"charge_fonciere_moy" + } + ] + }, + { + "fields":[ + { + "type":"label", + "name":"prix_commercial_moyen", + "label":"Prix moyen de commercialisation initial (€ TTC/m² SHAB)", + "nb_cols":10, + "id":"prix_commercial_moyen" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"display_button", + "id":"display_button", + "buttons":[ + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "display_button", + "alinea", + "surface_moy_logement", + "cout_construction_moyen", + "charge_fonciere_moy", + "prix_commercial_moyen" + ] + } + ] + } + }, + "search":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese-form", + "title":"SUIVI_PROD_IMMO_SAISIE_PROGRAMME", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + + ], + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + + ] + } + ] + } + }, + "insert":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_SYNTHESE_TITLE_INSERT", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + ], + "event":"sendSimpleForm()", + "afterEvent":"editSectionForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + ] + } + ] + } + }, + "update":{ + "name":"suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese-form", + "title":"SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_SYNTHESE_TITLE_UPDATE", + "input_size":"xxs", + "nb_cols":12, + "javascript":false, + "rows":[ + { + "fields":[ + { + "type":"number", + "name":"surface_moy_logement", + "label":"Surface /Taille moyenne de logements familiaux (m²/logement)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"surface_moy_logement" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"cout_construction_moyen", + "label":"Coût de construction moyen (€ TTC/m² SDP)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"cout_construction_moyen" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"charge_fonciere_moy", + "label":"Charge foncière nette moyenne (€ TTC/m² SDP)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"charge_fonciere_moy" + } + ] + }, + { + "fields":[ + { + "type":"number", + "name":"prix_commercial_moyen", + "label":"Prix moyen de commercialisation initial (€ TTC/m² SHAB)", + "required":false, + "pattern":"", + "nb_cols":2, + "id":"prix_commercial_moyen" + } + ] + }, + { + "fields":[ + { + "type":"button", + "class":"btn-ungroup btn-group-sm", + "nb_cols":12, + "name":"update_button", + "id":"update_button", + "buttons":[ + { + "type":"submit", + "name":"form_submit", + "label":"FORM_UPDATE", + "class":"btn-primary" + }, + { + "type":"button", + "name":"return_list", + "label":"FORM_RETURN_LIST", + "class":"btn-primary", + "event":"setMode(\"search\")" + } + ] + } + ] + } + ], + "event":"sendSimpleForm()", + "tabs":{ + "position":"top", + "list":[ + { + "label":"Tab 0", + "elements":[ + "update_button", + "alinea", + "surface_moy_logement", + "cout_construction_moyen", + "charge_fonciere_moy", + "prix_commercial_moyen" + ] + } + ] + } + } +} diff --git a/src/module_suivi_prod_immo/module/index_dashboard.html b/src/module_suivi_prod_immo/module/index_dashboard.html new file mode 100644 index 0000000000000000000000000000000000000000..79f7b8de92291a277115bd43dd6a3262830d6a8a --- /dev/null +++ b/src/module_suivi_prod_immo/module/index_dashboard.html @@ -0,0 +1 @@ +<div app-dashboard id="app-dashboard"></div> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/module/javascript/script_module.js b/src/module_suivi_prod_immo/module/javascript/script_module.js new file mode 100644 index 0000000000000000000000000000000000000000..2e67c539cb9c29796665d49f5afa3f2e91773f57 --- /dev/null +++ b/src/module_suivi_prod_immo/module/javascript/script_module.js @@ -0,0 +1,64 @@ +/* global vitisApp, goog, angular, bootbox, oVFB */ + +'use strict'; +goog.provide('vmap.suivi_prod_immo.script_module'); +goog.require('vmap.suivi_prod_immo.dashboard'); +vitisApp.on('appMainDrtvLoaded', function () { + + /** + * loadSuiviProdImmoRepartitionLogControl function. + * Chargement de la section "Prétraitement" de l'onglet "Contrôle". + */ + angular.element(vitisApp.appMainDrtv).scope()["loadSuiviProdImmoRepartitionLogControl"] = function () { + // Injection des services. + var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]); + var $rootScope = angular.element(vitisApp.appMainDrtv).injector().get(["$rootScope"]); + var $translate = angular.element(vitisApp.appMainDrtv).injector().get(["$translate"]); + var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]); + // + $log.info("loadSuiviProdImmoRepartitionLogControl"); + // Sauve certaines données de la liste. + var sSortedBy = envSrvc["oSelectedObject"]["sorted_by"]; + var sSortedDir = envSrvc["oSelectedObject"]["sorted_dir"]; + var sEditColumn = envSrvc["oSelectedObject"]["edit_column"]; + var sShowColumn = envSrvc["oSelectedObject"]["show_column"]; + // Colonne et sens de tri. + envSrvc["oSelectedObject"]["sorted_by"] = "id_traitement"; + envSrvc["oSelectedObject"]["sorted_dir"] = "ASC"; + envSrvc["oSelectedObject"]["edit_column"] = "editModalSectionForm"; + envSrvc["oSelectedObject"]["show_column"] = "showModalSectionForm"; + // "sIdField" pour les boutons du mode "update" et "display". + envSrvc["oSelectedObject"]["sIdField"] = "id_controle"; + // Affiche la liste des prétraitements du contrôle. + $translate(["GRID_TITLE_ANC_SAISIE_ANC_CONTROLE_CONTROLE_TRAITEMENT"]).then(function (oTranslations) { + // Paramètres de la liste + boutons. + var oGridOptions = { + "appHeader": true, + "appHeaderSearchForm": false, + "appGridTitle": oTranslations["GRID_TITLE_ANC_SAISIE_ANC_CONTROLE_CONTROLE_TRAITEMENT"], + "appShowActions": true, + "appIdField": "id_traitement" + }; + // + $rootScope["loadSectionList"](oGridOptions); + }); + // Attends que les boutons du "header" soient ajoutés. + var clearListener = $rootScope.$on('workspaceListHeaderActionsAdded', function (event, oGridOptions) { + // Supprime le "listener". + clearListener(); + // Restaure les données originales de la liste. + envSrvc["oSelectedObject"]["sorted_by"] = sSortedBy; + envSrvc["oSelectedObject"]["sorted_dir"] = sSortedDir; + envSrvc["oSelectedObject"]["edit_column"] = sEditColumn; + envSrvc["oSelectedObject"]["show_column"] = sShowColumn; + // Boutons d'ajout et de suppression d'un traitement. + for (var i = 0; i < oGridOptions["appActions"].length; i++) { + if (oGridOptions["appActions"][i]["name"].indexOf("_add") != -1) + oGridOptions["appActions"][i]["event"] = "addModalSectionForm()"; + else if (oGridOptions["appActions"][i]["name"].indexOf("_delete") != -1) + oGridOptions["appActions"][i]["event"] = "DeleteSelection({'sIdField':'id_traitement'})"; + } + }); + }; + +}); \ No newline at end of file diff --git a/src/module_suivi_prod_immo/module/lang/lang-en.json b/src/module_suivi_prod_immo/module/lang/lang-en.json new file mode 100644 index 0000000000000000000000000000000000000000..2aa13bbe59b0113eef12ed39b9e680ebbaf51a60 --- /dev/null +++ b/src/module_suivi_prod_immo/module/lang/lang-en.json @@ -0,0 +1,6 @@ +{ + "TEXT_MODE_SUIVI_PROD_IMMO_SAISIE" : "Suivi de la production immobilière dans les opérations d'aménagement sous pilotage de la Métropole de Lyon", + "TITLE_MODE_SUIVI_PROD_IMMO_SAISIE" : "Suivi de la production immobilière", + "TEXT_MODE_SUIVI_PROD_IMMO_BI" : "Indicateurs sur le suivi de la production immobilière", + "TITLE_MODE_SUIVI_PROD_IMMO_BI" : "Indicateurs de la production immobilière" +} diff --git a/src/module_suivi_prod_immo/module/lang/lang-fr.json b/src/module_suivi_prod_immo/module/lang/lang-fr.json new file mode 100644 index 0000000000000000000000000000000000000000..a00c0741a87e90d7766b9247dd04ecb5e7661cba --- /dev/null +++ b/src/module_suivi_prod_immo/module/lang/lang-fr.json @@ -0,0 +1,46 @@ +{ + "TEXT_MODE_SUIVI_PROD_IMMO_SAISIE" : "Suivi de la production immobilière dans les opérations d'aménagement sous pilotage de la Métropole de Lyon", + "TITLE_MODE_SUIVI_PROD_IMMO_SAISIE" : "Suivi de la production immobilière", + "TEXT_MODE_SUIVI_PROD_IMMO_BI" : "Indicateurs sur le suivi de la production immobilière", + "TITLE_MODE_SUIVI_PROD_IMMO_BI" : "Indicateurs sur la production immobilière", + "SUIVI_PROD_IMMO_SAISIE_OPERATION_TITLE" : "", + "SUIVI_PROD_IMMO_SAISIE_OPERATION_TITLE_INSERT" : "Opération", + "SUIVI_PROD_IMMO_SAISIE_OPERATION_TITLE_UPDATE" : "Opération {{nom_operation}}", + "SUIVI_PROD_IMMO_SAISIE_OPERATION_TITLE_DISPLAY" : "Opération {{nom_operation}}", + "SUIVI_PROD_IMMO_SAISIE_OPERATION_FORM_ID_OPERATION" : "id_operation", + "SUIVI_PROD_IMMO_SAISIE_OPERATION_FORM_NOM_OPERATION" : "nom_operation", + + "SUIVI_PROD_IMMO_OPERATION_TITLE_DISPLAY" : "Opération n°{{id_operation}}", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_ACTEUR_TITLE_DISPLAY" : "Acteurs", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_AVANCEMENT_TITLE_DISPLAY" : "Avancement", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_MODE_OPERATOIRE_TITLE_DISPLAY" : "Mode opératoire", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_PROGRAMMATION_TITLE_DISPLAY" : "Programmation prévisionnelle - densités", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_FINANCIER_TITLE_DISPLAY" : "Aspects financier - coûts", + "SECTION_DISPLAY_TITLE_SUIVI_PROD_IMMO_SAISIE_SUIVI_PROD_IMMO_OPERATION" : "Opération", + "SUIVI_PROD_IMMO_OPERATION_TITLE_INSERT" : "Opération", + "SUIVI_PROD_IMMO_OPERATION_TITLE_UPDATE" : "Opération n°{{id_operation}}", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_ACTEUR_TITLE_UPDATE" : "Acteurs", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_AVANCEMENT_TITLE_UPDATE" : "Avancement", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_MODE_OPERATOIRE_TITLE_UPDATE" : "Mode opératoire", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_PROGRAMMATION_TITLE_UPDATE" : "Programmation prévisionnelle - densités", + "SUIVI_PROD_IMMO_OPERATION_OPERATION_FINANCIER_TITLE_UPDATE" : "Aspects financier - coûts", + "SECTION_UPDATE_TITLE_SUIVI_PROD_IMMO_SAISIE_SUIVI_PROD_IMMO_OPERATION" : "Opération", + + "SUIVI_PROD_IMMO_ILOT_TITLE_INSERT" : "Îlot", + "SUIVI_PROD_IMMO_ILOT_TITLE_UPDATE" : "Îlot n°{{id_ilot}}", + "SUIVI_PROD_IMMO_ILOT_TITLE_DISPLAY" : "Îlot n°{{id_ilot}}", + + "SUIVI_PROD_IMMO_PROGRAMME_TITLE_DISPLAY" : "Programme n°{{id_programme}}", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ACTEUR_TITLE_DISPLAY" : "Dates - acteurs", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ENCADREMENT_TITLE_DISPLAY" : "Encadrement du programme immobilier", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_COUT_TITLE_DISPLAY" : "Coûts (indicateurs au programme immobilier)", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_SYNTHESE_TITLE_DISPLAY" : "Synthèse - éléments principaux du programme immobilier (surfaces, charges foncières, prix de sortie, ...)", + "SECTION_DISPLAY_TITLE_SUIVI_PROD_IMMO_SAISIE_SUIVI_PROD_IMMO_PROGRAMME" : "Programme", + "SUIVI_PROD_IMMO_PROGRAMME_TITLE_INSERT" : "Programme", + "SUIVI_PROD_IMMO_PROGRAMME_TITLE_UPDATE" : "Programme n°{{id_programme}}", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ACTEUR_TITLE_UPDATE" : "Dates - acteurs", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_ENCADREMENT_TITLE_UPDATE" : "Encadrement du programme immobilier", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_COUT_TITLE_UPDATE" : "Coûts (indicateurs au programme immobilier)", + "SUIVI_PROD_IMMO_PROGRAMME_PROGRAMME_SYNTHESE_TITLE_UPDATE" : "Synthèse - éléments principaux du programme immobilier (surfaces, charges foncières, prix de sortie, ...)", + "SECTION_UPDATE_TITLE_SUIVI_PROD_IMMO_SAISIE_SUIVI_PROD_IMMO_PROGRAMME" : "Programme" +} diff --git a/src/module_suivi_prod_immo/module/less/main.less b/src/module_suivi_prod_immo/module/less/main.less new file mode 100644 index 0000000000000000000000000000000000000000..dc471d4831a3c0aaa7c7eeb359791606edb7c91c --- /dev/null +++ b/src/module_suivi_prod_immo/module/less/main.less @@ -0,0 +1,5 @@ +@import '../component/dashboard/dashboard.less'; + +.icon-suivi_prod_immo_dashboard:before { + content: 'h'; +} \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc b/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..721f6370fb36e0ecb24256fe47f48f88524f7225 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc @@ -0,0 +1,45 @@ +<?php + +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc'; + +/** + * \file Suivi_prod_immo.class.inc + * \class Suivi_prod_immo + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Suivi_prod_immo php class + * + * This class defines commune for one Suivi_prod_immo + * + */ + +class Commune extends Suivi_prod_immo { + + public $oError; + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + * @param type $oConnection connection object + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $this->aProperties); + } + + /** + * get informations about commune + */ + function GET() { + $this->aFields = $this->getFields('prod_immo', "commune", "id_commune"); + } + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Communes.class.inc b/src/module_suivi_prod_immo/web_service/ws/Communes.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..65af9cd08baad0be69428b36edc54af245fff619 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Communes.class.inc @@ -0,0 +1,131 @@ +<?php + +/** + * \file Communes.class.inc + * \class Communes + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Communes php class + * + * This class defines Rest Api to Vitis Communes + * + */ +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once 'Commune.class.inc'; + + +class Communes extends Suivi_prod_immo { + /** + * @SWG\Definition( + * definition="/communes", + * allOf={ + * @SWG\Schema(ref="#/definitions/communes") + * } + * ) + * * @SWG\Tag( + * name="Communes", + * description="Communes about Communes" + * ) + */ + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $properties); + } + + /** + * @SWG\Get(path="/communes", + * tags={"Communes"}, + * summary="Get Communes", + * description="Request to get Communes", + * operationId="GET", + * produces={"application/xml", "application/json", "application/x-vm-json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Parameter( + * name="order_by", + * in="query", + * description="list of ordering fields", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="sort_order", + * in="query", + * description="sort_order", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="limit", + * in="query", + * description="number of element", + * required=false, + * type="integer", + * format="int32" + * ), + * @SWG\Parameter( + * name="offset", + * in="query", + * description="index of first element", + * required=false, + * type="string", + * format="int32" + * ), + * @SWG\Parameter( + * name="attributs", + * in="query", + * description="list of attributs", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="filter", + * in="query", + * description="filter results", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="distinct", + * in="query", + * description="delete duplicates", + * required=false, + * type="boolean" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/communes") + * ) + * ) + */ + + /** + * get Communes + * @return Communes + */ + function GET() { + $aReturn = $this->genericGet('prod_immo', "commune", "id_commune"); + $sMessage = $aReturn['sMessage']; + return $sMessage; + } + + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Ctm.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ctm.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..6de1a1a482fcd2cb76729b0f35b0583117610e96 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Ctm.class.inc @@ -0,0 +1,45 @@ +<?php + +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc'; + +/** + * \file Suivi_prod_immo.class.inc + * \class Suivi_prod_immo + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Suivi_prod_immo php class + * + * This class defines conference_territoriale_maire for one Suivi_prod_immo + * + */ + +class Ctm extends Suivi_prod_immo { + + public $oError; + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + * @param type $oConnection connection object + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $this->aProperties); + } + + /** + * get informations about conference_territoriale_maire + */ + function GET() { + $this->aFields = $this->getFields('prod_immo', "conference_territoriale_maire", "id_ctm"); + } + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Ctms.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ctms.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..e71c2675b1fba3147e41f87c71320f346a921a68 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Ctms.class.inc @@ -0,0 +1,130 @@ +<?php + +/** + * \file Ctms.class.inc + * \class Ctms + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the conference_territoriale_maire php class + * + * This class defines Rest Api to Vitis Ctms + * + */ +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once 'Ctm.class.inc'; + + +class Ctms extends Suivi_prod_immo { + /** + * @SWG\Definition( + * definition="/ctms", + * allOf={ + * @SWG\Schema(ref="#/definitions/ctms") + * } + * ) + * * @SWG\Tag( + * name="Ctms", + * description="Ctms about Ctms" + * ) + */ + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $properties); + } + + /** + * @SWG\Get(path="/ctms", + * tags={"Ctms"}, + * summary="Get Ctms", + * description="Request to get Ctms", + * operationId="GET", + * produces={"application/xml", "application/json", "application/x-vm-json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Parameter( + * name="order_by", + * in="query", + * description="list of ordering fields", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="sort_order", + * in="query", + * description="sort_order", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="limit", + * in="query", + * description="number of element", + * required=false, + * type="integer", + * format="int32" + * ), + * @SWG\Parameter( + * name="offset", + * in="query", + * description="index of first element", + * required=false, + * type="string", + * format="int32" + * ), + * @SWG\Parameter( + * name="attributs", + * in="query", + * description="list of attributs", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="filter", + * in="query", + * description="filter results", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="distinct", + * in="query", + * description="delete duplicates", + * required=false, + * type="boolean" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/ctms") + * ) + * ) + */ + + /** + * get Ctms + * @return Ctms + */ + function GET() { + $aReturn = $this->genericGet('prod_immo', "conference_territoriale_maire", "id_ctm"); + return $aReturn['sMessage']; + } + + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Ilot.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ilot.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..3232c8624b50de4f796bb82f70ea4599312649e4 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Ilot.class.inc @@ -0,0 +1,57 @@ +<?php + +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc'; + +/** + * \file Suivi_prod_immo.class.inc + * \class Suivi_prod_immo + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Suivi_prod_immo php class + * + * This class defines ilot for one Suivi_prod_immo + * + */ + +class Ilot extends Suivi_prod_immo { + + public $oError; + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + * @param type $oConnection connection object + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $this->aProperties); + } + + /** + * get informations about ilot + */ + function GET() { + $this->aFields = $this->getFields('prod_immo', "ilot", "id_ilot"); + } + + /** + * delete a ilot + */ + function DELETE() { + $this->oConnection->oBd->delete('prod_immo', 'ilot', 'id_ilot', $this->aValues["my_vitis_id"], 'integer'); + if ($this->oConnection->oBd->enErreur()) { + $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage()); + } else { + $this->aFields["id_ilot"] = $this->aValues["my_vitis_id"]; + } + } + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Ilots.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ilots.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..113033e12353b3ce2c2a70a3a376b487f37c4e2d --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Ilots.class.inc @@ -0,0 +1,274 @@ +<?php + +/** + * \file Ilots.class.inc + * \class Ilots + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Ilots php class + * + * This class defines Rest Api to Vitis Ilots + * + */ +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once 'Ilot.class.inc'; + + +class Ilots extends Suivi_prod_immo { + /** + * @SWG\Definition( + * definition="/ilots", + * allOf={ + * @SWG\Schema(ref="#/definitions/ilots") + * } + * ) + * * @SWG\Tag( + * name="Ilots", + * description="Ilots about Ilots" + * ) + */ + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $properties); + } + + /** + * @SWG\Get(path="/ilots", + * tags={"Ilots"}, + * summary="Get Ilots", + * description="Request to get Ilots", + * operationId="GET", + * produces={"application/xml", "application/json", "application/x-vm-json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Parameter( + * name="order_by", + * in="query", + * description="list of ordering fields", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="sort_order", + * in="query", + * description="sort_order", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="limit", + * in="query", + * description="number of element", + * required=false, + * type="integer", + * format="int32" + * ), + * @SWG\Parameter( + * name="offset", + * in="query", + * description="index of first element", + * required=false, + * type="string", + * format="int32" + * ), + * @SWG\Parameter( + * name="attributs", + * in="query", + * description="list of attributs", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="filter", + * in="query", + * description="filter results", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="distinct", + * in="query", + * description="delete duplicates", + * required=false, + * type="boolean" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/ilots") + * ) + * ) + */ + + /** + * get Ilots + * @return Ilots + */ + function GET() { + $aReturn = $this->genericGet('prod_immo', "ilot", "id_ilot"); + $sMessage = $aReturn['sMessage']; + return $sMessage; + } + + /** + * @SWG\Post(path="/ilots", + * tags={"Ilots"}, + * summary="Add traitement", + * description="Request to add Ilots", + * operationId="POST", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/ilots") + * ) + * ) + */ + + /** + * insert traitement + * @return id of the traitement created + */ + function POST() { + //$this->aValues['create'] = $_SESSION["ses_Login"]; + //$this->aValues['create_date'] = date('Y-m-d'); + $aReturn = $this->genericPost('prod_immo', 'ilot', 'prod_immo.ilot_id_ilot_seq', 'id_ilot'); + return $aReturn['sMessage']; + } + + /** + * @SWG\Put(path="/ilots/{id_ilot}", + * tags={"Ilots"}, + * summary="update Ilots", + * description="Request to update Ilots", + * operationId="PUT", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="Traitement token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="id_ilot", + * in="path", + * description="id of the Ilots", + * required=true, + * type="integer", + * format = "int32" + * ), + * @SWG\Response( + * response=200, + * description="Poprerties Response", + * @SWG\Schema(ref="#/definitions/ilots") + * ) + * ) + */ + + /** + * update ilots + * @return id of ilots updated or error object if a ilots is not updated + */ + function PUT() { + /*if (empty($this->aValues['maj'])) + $this->aValues['maj'] = $_SESSION["ses_Login"]; + if (empty($this->aValues['maj_date'])) + $this->aValues['maj_date'] = date('Y-m-d');*/ + $aReturn = $this->genericPut('prod_immo', 'ilot', 'id_ilot'); + return $aReturn['sMessage']; + } + + /** + * @SWG\Delete(path="/ilots", + * tags={"Ilots"}, + * summary="delete Ilots", + * description="Request to delete Ilots", + * operationId="DELETE", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="idList", + * in="query", + * description="id of the traitement", + * required=true, + * type="string" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/ilots") + * ) + * ) + */ + /** + * @SWG\Delete(path="/ilots/{id_ilot}", + * tags={"Ilots"}, + * summary="delete Ilots", + * description="Request to delete Ilots", + * operationId="DELETE", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="Traitement token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="id_ilot", + * in="path", + * description="id of the Ilots", + * required=true, + * type="integer", + * format = "int32" + * ), + * @SWG\Response( + * response=200, + * description="Poprerties Response", + * @SWG\Schema(ref="#/definitions/ilots") + * ) + * ) + */ + + /** + * delete ilots + * @return id of ilots deleted or error object if a ilots is not deleted + */ + function DELETE() { + $aReturn = $this->genericDelete('prod_immo', 'ilot', 'id_ilot'); + return $aReturn['sMessage']; + } + + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc b/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..2ca2732d4078f9e7f81ca961dd0028dce4c431e5 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc @@ -0,0 +1,45 @@ +<?php + +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc'; + +/** + * \file Suivi_prod_immo.class.inc + * \class Suivi_prod_immo + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Suivi_prod_immo php class + * + * This class defines mode financement for one Suivi_prod_immo + * + */ + +class Mode_financement extends Suivi_prod_immo { + + public $oError; + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + * @param type $oConnection connection object + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $this->aProperties); + } + + /** + * get informations about mode financement + */ + function GET() { + $this->aFields = $this->getFields('prod_immo', "tr_financement_equ_public", "code_financement_equ_public"); + } + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Mode_financements.class.inc b/src/module_suivi_prod_immo/web_service/ws/Mode_financements.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..e80fcc653883bf83f37433f407262937409ec8a5 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Mode_financements.class.inc @@ -0,0 +1,131 @@ +<?php + +/** + * \file Mode_financements.class.inc + * \class Mode_financements + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Mode_financements php class + * + * This class defines Rest Api to Vitis Mode_financements + * + */ +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once 'Mode_financement.class.inc'; + + +class Mode_financements extends Suivi_prod_immo { + /** + * @SWG\Definition( + * definition="/mode_financements", + * allOf={ + * @SWG\Schema(ref="#/definitions/mode_financements") + * } + * ) + * * @SWG\Tag( + * name="Mode_financements", + * description="Mode_financements about Mode_financements" + * ) + */ + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $properties); + } + + /** + * @SWG\Get(path="/mode_financements", + * tags={"Mode_financements"}, + * summary="Get Mode_financements", + * description="Request to get Mode_financements", + * operationId="GET", + * produces={"application/xml", "application/json", "application/x-vm-json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Parameter( + * name="order_by", + * in="query", + * description="list of ordering fields", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="sort_order", + * in="query", + * description="sort_order", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="limit", + * in="query", + * description="number of element", + * required=false, + * type="integer", + * format="int32" + * ), + * @SWG\Parameter( + * name="offset", + * in="query", + * description="index of first element", + * required=false, + * type="string", + * format="int32" + * ), + * @SWG\Parameter( + * name="attributs", + * in="query", + * description="list of attributs", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="filter", + * in="query", + * description="filter results", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="distinct", + * in="query", + * description="delete duplicates", + * required=false, + * type="boolean" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/mode_financements") + * ) + * ) + */ + + /** + * get Mode_financements + * @return Mode_financements + */ + function GET() { + $aReturn = $this->genericGet('prod_immo', "tr_financement_equ_public", "code_financement_equ_public"); + $sMessage = $aReturn['sMessage']; + return $sMessage; + } + + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Operation.class.inc b/src/module_suivi_prod_immo/web_service/ws/Operation.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..6a5cd28ffa2f45e28d986d007dfa32c8d3d7f647 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Operation.class.inc @@ -0,0 +1,247 @@ +<?php + +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc'; + +/** + * \file Suivi_prod_immo.class.inc + * \class Suivi_prod_immo + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Suivi_prod_immo php class + * + * This class defines operation for one Suivi_prod_immo + * + */ + +class Operation extends Suivi_prod_immo { + + public $oError; + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + * @param type $oConnection connection object + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $this->aProperties); + } + + /** + * get informations about operation + */ + function GET() { + $this->aFields = $this->getFields('prod_immo', "operation", "id_operation"); + $this->getCommunes(); + $this->getPerimetre(); + $this->getCTM(); + $this->getModeFinancement(); + $this->getAvancement(); + $this->getContexteUrbain(); + $this->getSuivi(); + $this->getProcedureAmenagement(); + $this->getVocation(); + //$this->getRepartitionTypeLogement(); + // Date de mise à jour + $date_mise_a_jour = new DateTime($this->aFields['date_mise_a_jour']); + $this->aFields['date_mise_a_jour'] = $date_mise_a_jour->format('d/m/Y'); + $this->aFields['recette_part_publique_ttc_label'] = $this->aFields['recette_part_publique_ttc'] == 'true' ? 'TTC' : 'HT'; + } + + /** + * get communes of operation + */ + function getCommunes() { + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationCommunes'], $aParams); + $sListCommuneId = ""; + $aListCommuneNom = array(); + while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) { + if ($sListCommuneId == "") { + $sListCommuneId = $aLigne["id_commune"]; + } else { + $sListCommuneId .= "|" . $aLigne["id_commune"]; + } + $aListCommuneNom[] = $aLigne["nom_commune"]; + } + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + $this->aFields['communes'] = $sListCommuneId; + $this->aFields['communes_label'] = implode(',', $aListCommuneNom); + + } + + /** + * get CTM of operation + */ + function getCTM() { + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationCTM'], $aParams); + $sListCTMId = ""; + $aListCTMNom = array(); + while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) { + if ($sListCTMId == "") { + $sListCTMId = $aLigne["id_ctm"]; + } else { + $sListCTMId .= "|" . $aLigne["id_ctm"]; + } + $aListCTMNom[] = $aLigne["nom_ctm"]; + } + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + $this->aFields['ctms'] = $sListCTMId; + $this->aFields['ctms_label'] = implode(',', $aListCTMNom); + } + + /** + * get Modes financement of operation + */ + function getModeFinancement() { + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationModesFinancement'], $aParams); + $sListCodeFinancement = ""; + $sListFinancement = array(); + while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) { + if ($sListCodeFinancement == "") { + $sListCodeFinancement = $aLigne["code_financement_equ_public"]; + } else { + $sListCodeFinancement .= "|" . $aLigne["code_financement_equ_public"]; + } + $sListFinancement[] = $aLigne["financement_equ_public"]; + } + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + $this->aFields['mode_financements'] = $sListCodeFinancement; + $this->aFields['mode_financements_label'] = implode(',', $sListFinancement); + } + + /** + * get perimetre projet urbain of programme + */ + function getPerimetre() { + if(isset($this->aFields['id_perimetre']) and !is_null($this->aFields['id_perimetre'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_perimetre'] = array('value' => $this->aFields['id_perimetre'], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getPerimetre'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['nom_perimetre'] = $aLigne["nom_perimetre"]." (".$aLigne["type_perimetre"].")"; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get avancement of programme + */ + function getAvancement() { + if(isset($this->aFields['code_avancement']) and !is_null($this->aFields['code_avancement'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_avancement'] = array('value' => $this->aFields['code_avancement'], 'type' => 'string'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getAvancement'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['avancement'] = $aLigne["avancement"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get contexte urbain of programme + */ + function getContexteUrbain() { + if(isset($this->aFields['code_contexte_urbain']) and !is_null($this->aFields['code_contexte_urbain'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_contexte_urbain'] = array('value' => $this->aFields['code_contexte_urbain'], 'type' => 'string'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getContexteUrbain'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['contexte_urbain'] = $aLigne["contexte_urbain"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get suivi of programme + */ + function getSuivi() { + if(isset($this->aFields['code_suivi']) and !is_null($this->aFields['code_suivi'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_suivi'] = array('value' => $this->aFields['code_suivi'], 'type' => 'string'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getSuivi'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['suivi'] = $aLigne["suivi"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get procedure d'amenagement of programme + */ + function getProcedureAmenagement() { + if(isset($this->aFields['code_procedure_amenagement']) and !is_null($this->aFields['code_procedure_amenagement'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_procedure_amenagement'] = array('value' => $this->aFields['code_procedure_amenagement'], 'type' => 'string'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getProcedureAmenagement'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['procedure_amenagement'] = $aLigne["procedure_amenagement"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get vocation of programme + */ + function getVocation() { + if(isset($this->aFields['code_vocation']) and !is_null($this->aFields['code_vocation'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_vocation'] = array('value' => $this->aFields['code_vocation'], 'type' => 'string'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getVocation'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['vocation'] = $aLigne["vocation"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get répartition type logement of programme DEPRECATED + */ + /*function getRepartitionTypeLogement(){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getRepartitionTypeLogement'], $aParams); + $aRepartition = array(); + while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) { + $aRepartition[] = $aLigne["type_logement"].' : '.$aLigne["repartition"]; + } + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + $this->aFields['repartition_type_logement'] = implode('<br>', $aRepartition); + }*/ + + /** + * delete a operation + */ + function DELETE() { + $this->oConnection->oBd->delete('prod_immo', 'operation', 'id_operation', $this->aValues["my_vitis_id"], 'integer'); + if ($this->oConnection->oBd->enErreur()) { + $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage()); + } else { + $this->aFields["id_operation"] = $this->aValues["my_vitis_id"]; + } + } + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Operations.class.inc b/src/module_suivi_prod_immo/web_service/ws/Operations.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..2a6a16d3b8a382badb8b57cbcd7f5ae6784ac17f --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Operations.class.inc @@ -0,0 +1,362 @@ +<?php + +/** + * \file Operations.class.inc + * \class Operations + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Operations php class + * + * This class defines Rest Api to Vitis Operations + * + */ +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once 'Operation.class.inc'; + + +class Operations extends Suivi_prod_immo { + /** + * @SWG\Definition( + * definition="/operations", + * allOf={ + * @SWG\Schema(ref="#/definitions/operations") + * } + * ) + * * @SWG\Tag( + * name="Operations", + * description="Operations about Operations" + * ) + */ + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + /*$properties2 = $properties; + $properties2['database']='suivi_prod_immo';*/ + $this->oConnection = new Connection($this->aValues, $properties); + } + + /** + * @SWG\Get(path="/operations", + * tags={"Operations"}, + * summary="Get Operations", + * description="Request to get Operations", + * operationId="GET", + * produces={"application/xml", "application/json", "application/x-vm-json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Parameter( + * name="order_by", + * in="query", + * description="list of ordering fields", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="sort_order", + * in="query", + * description="sort_order", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="limit", + * in="query", + * description="number of element", + * required=false, + * type="integer", + * format="int32" + * ), + * @SWG\Parameter( + * name="offset", + * in="query", + * description="index of first element", + * required=false, + * type="string", + * format="int32" + * ), + * @SWG\Parameter( + * name="attributs", + * in="query", + * description="list of attributs", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="filter", + * in="query", + * description="filter results", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="distinct", + * in="query", + * description="delete duplicates", + * required=false, + * type="boolean" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/operations") + * ) + * ) + */ + + /** + * get Operations + * @return Operations + */ + function GET() { + $aReturn = $this->genericGet('prod_immo', "v_operation", "id_operation"); + $sMessage = $aReturn['sMessage']; + $aOperations=json_decode($aReturn['sMessage'],true); + $aOperations2=array(); + foreach ($aOperations['operations'] as $aOperation){ + unset($aOperation['geom']); + $aOperation['nom_commune']= $this->getCommunes($aOperation['id_operation']); + $aOperations2[count($aOperations2)]=$aOperation; + } + $sOperations=json_encode(array("operations"=>$aOperations2,"list_count"=>$aOperations['list_count'],"total_row_number"=>$aOperations['total_row_number'],"status"=>$aOperations['status'])); + return $sOperations; + } + + /** + * get communes of operation + */ + function getCommunes($iId) { + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_operation'] = array('value' => $iId, 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationCommunes'], $aParams); + $aListCommuneNom = array(); + while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) { + $aListCommuneNom[] = $aLigne["nom_commune"]; + } + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + return implode(',', $aListCommuneNom); + + } + + /** + * @SWG\Post(path="/operations", + * tags={"Operations"}, + * summary="Add traitement", + * description="Request to add Operations", + * operationId="POST", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/operations") + * ) + * ) + */ + + /** + * insert traitement + * @return id of the traitement created + */ + function POST() { + $aReturn = $this->genericPost('prod_immo', 'operation', 'prod_immo.traitement_id_operation_seq', 'id_operation'); + return $aReturn['sMessage']; + } + + /** + * @SWG\Put(path="/operations/{id_operation}", + * tags={"Operations"}, + * summary="update Operations", + * description="Request to update Operations", + * operationId="PUT", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="Traitement token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="id_operation", + * in="path", + * description="id of the Operations", + * required=true, + * type="integer", + * format = "int32" + * ), + * @SWG\Response( + * response=200, + * description="Poprerties Response", + * @SWG\Schema(ref="#/definitions/operations") + * ) + * ) + */ + + /** + * update operations + * @return id of operations updated or error object if a operations is not updated + */ + function PUT() { + $aValues=$this->aValues; + if (isset($aValues["code_avancement"]) and $aValues["code_avancement"]=='') $aValues["code_avancement"]=null; + if (isset($aValues["code_contexte_urbain"]) and $aValues["code_contexte_urbain"]=='') $aValues["code_contexte_urbain"]=null; + if (isset($aValues["code_suivi"]) and $aValues["code_suivi"]=='') $aValues["code_suivi"]=null; + if (isset($aValues["code_procedure_amenagement"]) and $aValues["code_procedure_amenagement"]=='') $aValues["code_procedure_amenagement"]=null; + if (isset($aValues["code_vocation"]) and $aValues["code_vocation"]=='') $aValues["code_vocation"]=null; + $this->aValues=$aValues; + $aReturn = $this->genericPut('prod_immo', 'operation', 'id_operation'); + if ($aReturn['sStatus'] == 1) { + $aXmlRacineAttribute['status'] = 1; + $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']); + $oOperation = new Operation($this->aPath, $this->aValues, $this->aProperties, $this->oConnection); + $oOperation->GET(); + //***** communes *****// + // Le paramètre "communes" est passé dans la requête ? + if ($this->aValues['communes'] !== NULL) { + $this->oConnection->oBd->delete('prod_immo', 'operation_commune', 'id_operation', $this->aValues["my_vitis_id"]); + // Commune(s) à rattacher au groupe ? + if (!empty($this->aValues['communes'])) { + require $this->sRessourcesFile; + $aCommunes = explode('|', $this->aValues['communes']); + foreach ($aCommunes as $iCommuneId) { + $aParams = array(); + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_commune'] = array('value' => $iCommuneId, 'type' => 'number'); + $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['insertOperationCommunes'], $aParams); + } + } + } + //***** CTMs *****// + // Le paramètre "ctms" est passé dans la requête ? + if ($this->aValues['ctms'] !== NULL) { + $this->oConnection->oBd->delete('prod_immo', 'operation_ctm', 'id_operation', $this->aValues["my_vitis_id"]); + if (!empty($this->aValues['ctms'])) { + require $this->sRessourcesFile; + $aCTMs = explode('|', $this->aValues['ctms']); + foreach ($aCTMs as $iCTMId) { + $aParams = array(); + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_ctm'] = array('value' => $iCTMId, 'type' => 'number'); + $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['insertOperationCTM'], $aParams); + } + } + } + //***** Modes financement *****// + // Le paramètre "mode_financements" est passé dans la requête ? + //error_log($this->aValues['mode_financements']); + if ($this->aValues['mode_financements'] !== NULL) { + $this->oConnection->oBd->delete('prod_immo', 'operation_tr_financement_equ_public', 'id_operation', $this->aValues["my_vitis_id"]); + if (!empty($this->aValues['mode_financements'])) { + require $this->sRessourcesFile; + $aModesFinancement = explode('|', $this->aValues['mode_financements']); + foreach ($aModesFinancement as $cModeFinancementId) { + $aParams = array(); + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_financement_equ_public'] = array('value' => $cModeFinancementId, 'type' => 'string'); + $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['insertOperationModesFinancement'], $aParams); + } + } + } + } else { + $sMessage = $aReturn['sMessage']; + } + return $sMessage; + + return $aReturn['sMessage']; + } + + /** + * @SWG\Delete(path="/operations", + * tags={"Operations"}, + * summary="delete Operations", + * description="Request to delete Operations", + * operationId="DELETE", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="idList", + * in="query", + * description="id of the traitement", + * required=true, + * type="string" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/operations") + * ) + * ) + */ + /** + * @SWG\Delete(path="/operations/{id_operation}", + * tags={"Operations"}, + * summary="delete Operations", + * description="Request to delete Operations", + * operationId="DELETE", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="Traitement token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="id_operation", + * in="path", + * description="id of the Operations", + * required=true, + * type="integer", + * format = "int32" + * ), + * @SWG\Response( + * response=200, + * description="Poprerties Response", + * @SWG\Schema(ref="#/definitions/operations") + * ) + * ) + */ + + /** + * delete operations + * @return id of operations deleted or error object if a operations is not deleted + */ + function DELETE() { + $aReturn = $this->genericDelete('prod_immo', 'operation', 'id_operation'); + return $aReturn['sMessage']; + } + + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Programme.class.inc b/src/module_suivi_prod_immo/web_service/ws/Programme.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..67f3d6ba9ebe3d7b2cf18875a6e43f71c081a74d --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Programme.class.inc @@ -0,0 +1,149 @@ +<?php + +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc'; + +/** + * \file Suivi_prod_immo.class.inc + * \class Suivi_prod_immo + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Suivi_prod_immo php class + * + * This class defines programme for one Suivi_prod_immo + * + */ + +class Programme extends Suivi_prod_immo { + + public $oError; + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + * @param type $oConnection connection object + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $this->aProperties); + } + + /** + * get informations about programme + */ + function GET() { + $this->aFields = $this->getFields('prod_immo', "programme_immobilier", "id_programme"); + $this->getOperationIlot(); + $this->getCommune(); + $this->getTypeOperateur(); + $this->getModeConsultation(); + // Date de mise à jour + $date_mise_a_jour = new DateTime($this->aFields['date_mise_a_jour']); + $this->aFields['date_mise_a_jour'] = $date_mise_a_jour->format('d/m/Y'); + // Booléen + $this->aFields['aire_influence_tc'] = $this->aFields['aire_influence_tc'] ? 'Oui' : $this->aFields['aire_influence_tc']; + $this->aFields['aire_influence_tc'] = !$this->aFields['aire_influence_tc'] ? 'Non' : $this->aFields['aire_influence_tc']; + // + $this->aFields['cahier_prescription_archi_urb_paysagere_label']=$this->replaceOuiNonLes2($this->aFields['cahier_prescription_archi_urb_paysagere']); + $this->aFields['charge_fonciere_imposee_fixee_label']=$this->replaceOuiNonLes2($this->aFields['charge_fonciere_imposee_fixee']); + $this->aFields['prix_sortie_encadree_label']=$this->replaceOuiNonLes2($this->aFields['prix_sortie_encadree']); + } + + + /** + * get operation / ilot of programme + */ + function getOperationIlot() { + if(isset($this->aFields['id_ilot']) and !is_null($this->aFields['id_ilot'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_ilot'] = array('value' => $this->aFields['id_ilot'], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationIlot'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['nom_ilot'] = $aLigne["nom_ilot"]; + $this->aFields['nom_operation'] = $aLigne["nom_operation"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get commune of programme + */ + function getCommune() { + if(isset($this->aFields['id_commune']) and !is_null($this->aFields['id_commune'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_commune'] = array('value' => $this->aFields['id_commune'], 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getCommune'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['nom_commune'] = $aLigne["nom_commune"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get type opérateur of programme + */ + function getTypeOperateur() { + if(isset($this->aFields['code_type_operateur']) and !is_null($this->aFields['code_type_operateur'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_type_operateur'] = array('value' => $this->aFields['code_type_operateur'], 'type' => 'string'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getTypeOperateur'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['type_operateur'] = $aLigne["type_operateur"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + /** + * get mode consultation of programme + */ + function getModeConsultation() { + if(isset($this->aFields['code_consultation']) and !is_null($this->aFields['code_consultation'])){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['code_consultation'] = array('value' => $this->aFields['code_consultation'], 'type' => 'string'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getModeConsultation'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $this->aFields['consultation'] = $aLigne["consultation"]; + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + } + } + + function replaceOuiNonLes2($sValue){ + switch ($sValue) { + case 'O': + return 'Oui'; + break; + case 'N': + return 'Non'; + break; + case 'les 2': + return 'Les 2'; + break; + default: + return $sValue; + } + } + + /** + * delete a programme + */ + function DELETE() { + $this->oConnection->oBd->delete('prod_immo', 'programme_immobilier', 'id_programme', $this->aValues["my_vitis_id"], 'integer'); + if ($this->oConnection->oBd->enErreur()) { + $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage()); + } else { + $this->aFields["id_programme"] = $this->aValues["my_vitis_id"]; + } + } + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Programmes.class.inc b/src/module_suivi_prod_immo/web_service/ws/Programmes.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..1a70c95d76369f621d4932a0978cd3bad670972e --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Programmes.class.inc @@ -0,0 +1,336 @@ +<?php + +/** + * \file Programmes.class.inc + * \class Programmes + * + * \author Fabien Marty <f.marty@urbalyon.org>. + * + * \brief This file contains the Programmes php class + * + * This class defines Rest Api to Vitis Programmes + * + */ +require_once __DIR__ . '/Suivi_prod_immo.class.inc'; +require_once 'Programme.class.inc'; + + +class Programmes extends Suivi_prod_immo { + /** + * @SWG\Definition( + * definition="/programmes", + * allOf={ + * @SWG\Schema(ref="#/definitions/programmes") + * } + * ) + * * @SWG\Tag( + * name="Programmes", + * description="Programmes about Programmes" + * ) + */ + + /** + * construct + * @param type $aPath url of the request + * @param type $aValues parameters of the request + * @param type $properties properties + */ + function __construct($aPath, $aValues, $properties) { + $this->aValues = $aValues; + $this->aPath = $aPath; + $this->aProperties = $properties; + $this->oConnection = new Connection($this->aValues, $properties); + } + + /** + * @SWG\Get(path="/programmes", + * tags={"Programmes"}, + * summary="Get Programmes", + * description="Request to get Programmes", + * operationId="GET", + * produces={"application/xml", "application/json", "application/x-vm-json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Parameter( + * name="order_by", + * in="query", + * description="list of ordering fields", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="sort_order", + * in="query", + * description="sort_order", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="limit", + * in="query", + * description="number of element", + * required=false, + * type="integer", + * format="int32" + * ), + * @SWG\Parameter( + * name="offset", + * in="query", + * description="index of first element", + * required=false, + * type="string", + * format="int32" + * ), + * @SWG\Parameter( + * name="attributs", + * in="query", + * description="list of attributs", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="filter", + * in="query", + * description="filter results", + * required=false, + * type="string" + * ), + * @SWG\Parameter( + * name="distinct", + * in="query", + * description="delete duplicates", + * required=false, + * type="boolean" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/programmes") + * ) + * ) + */ + + /** + * get Programmes + * @return Programmes + */ + function GET() { + $aReturn = $this->genericGet('prod_immo', "programme_immobilier", "id_programme"); + $sMessage = $aReturn['sMessage']; + $aProgrammes=json_decode($aReturn['sMessage'],true); + $aProgrammes2=array(); + foreach ($aProgrammes['programmes'] as $aProgramme){ + unset($aProgramme['geom']); + $aProgramme['nom_commune']= $this->getCommune($aProgramme['id_commune']); + $aProgramme['nom_ilot']= $this->getIlot($aProgramme['id_ilot']); + $aProgramme['nom_operation']= $this->getOperation($aProgramme['id_ilot']); + $aProgrammes2[count($aProgrammes2)]=$aProgramme; + } + $sProgrammes=json_encode(array("programmes"=>$aProgrammes2,"list_count"=>$aProgrammes['list_count'],"total_row_number"=>$aProgrammes['total_row_number'],"status"=>$aProgrammes['status'])); + //error_log($sProgrammes); + return $sProgrammes; + } + + /** + * get commune of programme + */ + function getCommune($iId) { + if(isset($iId) and !is_null($iId)){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_commune'] = array('value' => $iId, 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getCommune'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + return $aLigne["nom_commune"]; + }else{ + return null; + } + } + + /** + * get ilot of programme + */ + function getIlot($iId) { + if(isset($iId) and !is_null($iId)){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_ilot'] = array('value' => $iId, 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getIlot'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + return $aLigne["nom_ilot"]; + }else{ + return null; + } + } + + /** + * get operation of programme + */ + function getOperation($iId) { + if(isset($iId) and !is_null($iId)){ + require $this->sRessourcesFile; + $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name'); + $aParams['id_ilot'] = array('value' => $iId, 'type' => 'number'); + $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationIlot'], $aParams); + $aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult); + $oPDOresult = $this->oConnection->oBd->fermeResultat(); + return $aLigne["nom_operation"]; + }else{ + return null; + } + } + + /** + * @SWG\Post(path="/programmes", + * tags={"Programmes"}, + * summary="Add traitement", + * description="Request to add Programmes", + * operationId="POST", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="user token", + * required=true, + * type="string" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/programmes") + * ) + * ) + */ + + /** + * insert traitement + * @return id of the traitement created + */ + function POST() { + //$this->aValues['create'] = $_SESSION["ses_Login"]; + //$this->aValues['create_date'] = date('Y-m-d'); + $aReturn = $this->genericPost('prod_immo', 'programme_immobilier', 'prod_immo.programme_immobilier_id_programme_seq', 'id_programme'); + return $aReturn['sMessage']; + } + + /** + * @SWG\Put(path="/programmes/{id_programme}", + * tags={"Programmes"}, + * summary="update Programmes", + * description="Request to update Programmes", + * operationId="PUT", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="Traitement token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="id_programme", + * in="path", + * description="id of the Programmes", + * required=true, + * type="integer", + * format = "int32" + * ), + * @SWG\Response( + * response=200, + * description="Poprerties Response", + * @SWG\Schema(ref="#/definitions/programmes") + * ) + * ) + */ + + /** + * update programmes + * @return id of programmes updated or error object if a programmes is not updated + */ + function PUT() { + /*if (empty($this->aValues['maj'])) + $this->aValues['maj'] = $_SESSION["ses_Login"]; + if (empty($this->aValues['maj_date'])) + $this->aValues['maj_date'] = date('Y-m-d');*/ + $aReturn = $this->genericPut('prod_immo', 'programme_immobilier', 'id_programme'); + return $aReturn['sMessage']; + } + + /** + * @SWG\Delete(path="/programmes", + * tags={"Programmes"}, + * summary="delete Programmes", + * description="Request to delete Programmes", + * operationId="DELETE", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="idList", + * in="query", + * description="id of the traitement", + * required=true, + * type="string" + * ), + * @SWG\Response( + * response=200, + * description="traitement Response", + * @SWG\Schema(ref="#/definitions/programmes") + * ) + * ) + */ + /** + * @SWG\Delete(path="/programmes/{id_programme}", + * tags={"Programmes"}, + * summary="delete Programmes", + * description="Request to delete Programmes", + * operationId="DELETE", + * produces={"application/xml", "application/json"}, + * @SWG\Parameter( + * name="token", + * in="query", + * description="Traitement token", + * required=true, + * type="string" + * ), + * * @SWG\Parameter( + * name="id_programme", + * in="path", + * description="id of the Programmes", + * required=true, + * type="integer", + * format = "int32" + * ), + * @SWG\Response( + * response=200, + * description="Poprerties Response", + * @SWG\Schema(ref="#/definitions/programmes") + * ) + * ) + */ + + /** + * delete programmes + * @return id of programmes deleted or error object if a programmes is not deleted + */ + function DELETE() { + $aReturn = $this->genericDelete('prod_immo', 'programme_immobilier', 'id_programme'); + return $aReturn['sMessage']; + } + + +} + +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc new file mode 100644 index 0000000000000000000000000000000000000000..ff0707ff0953a6e4e4c0de1f4f35046fa290d873 --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc @@ -0,0 +1,13 @@ +<?php + +require_once dirname($_SERVER['SCRIPT_FILENAME']) . "/class/vitis_lib/DbClass.class.inc"; +require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc'; +require_once 'vmlib/logUtil.inc'; + +class Suivi_prod_immo extends Vitis { + + //Chemin du fichier de ressources contenant les requêtes SQL + var $sRessourcesFile = 'ws/suivi_prod_immo/Suivi_prod_immo.class.sql.inc'; + +} +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc new file mode 100644 index 0000000000000000000000000000000000000000..c7e40aae2e7aed3cb647eb3df1a9766548b5cf4c --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc @@ -0,0 +1,45 @@ +<?php +//Définition des requêtes de l'api Vitis +$aSql['checkIP'] = "SELECT user_id, ip_constraint FROM [sSchemaFramework].user WHERE login ='[sLogin]'"; +$aSql['getGroups'] = "SELECT group_id FROM [sSchemaFramework].user_group WHERE user_id = [user_id]"; +$aSql['loginUnique'] = 'SELECT UPPER("login") FROM [sSchemaFramework]."user" WHERE UPPER("login")=UPPER(\'sLoginUser\')'; +$aSql['getLoginbyId'] = 'SELECT "login" FROM [sSchemaFramework]."user" WHERE user_id=[user_id]'; +$aSql['getTableColumn'] = 'SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = \'[sSchemaFramework]\' and table_name= \'[sTable]\''; +$aSql['getUserPrivileges'] = 'SELECT groname FROM pg_user s LEFT OUTER JOIN pg_group g on (s.usesysid = any(g.grolist) )inner join [sSchemaFramework].user on "user".login = usename WHERE user_id = [user_id]'; +$aSql['listDomain'] = 'SELECT distinct domain, alias FROM [sSchemaFramework].domain WHERE "type" = \'AD\''; +$aSql['createRolname'] = 'CREATE ROLE "vitis_[sDomain]" NOSUPERUSER INHERIT NOCREATEDB CREATEROLE;'; +$aSql['getInfoRolname'] = 'SELECT * FROM pg_catalog.pg_roles WHERE rolname = \'vitis_[sDomain]\''; +// Communes +$aSql['getOperationCommunes'] = "SELECT operation_commune.id_commune, \"commune\".nom_commune FROM [sSchemaFramework].operation_commune LEFT JOIN [sSchemaFramework].commune ON operation_commune.id_commune = \"commune\".id_commune WHERE operation_commune.id_operation = [id_operation]"; +$aSql['insertOperationCommunes'] = "INSERT INTO [sSchemaFramework].operation_commune(id_commune, id_operation) VALUES([id_commune], [id_operation])"; +// CTM +$aSql['getOperationCTM'] = "SELECT operation_ctm.id_ctm, \"conference_territoriale_maire\".nom_ctm FROM [sSchemaFramework].operation_ctm LEFT JOIN [sSchemaFramework].conference_territoriale_maire ON operation_ctm.id_ctm = \"conference_territoriale_maire\".id_ctm WHERE operation_ctm.id_operation = [id_operation]"; +$aSql['insertOperationCTM'] = "INSERT INTO [sSchemaFramework].operation_ctm(id_ctm, id_operation) VALUES([id_ctm], [id_operation])"; +// Modes financement +$aSql['getOperationModesFinancement'] = "SELECT operation_tr_financement_equ_public.code_financement_equ_public, \"tr_financement_equ_public\".financement_equ_public FROM [sSchemaFramework].operation_tr_financement_equ_public LEFT JOIN [sSchemaFramework].tr_financement_equ_public ON operation_tr_financement_equ_public.code_financement_equ_public = \"tr_financement_equ_public\".code_financement_equ_public WHERE operation_tr_financement_equ_public.id_operation = [id_operation]"; +$aSql['insertOperationModesFinancement'] = "INSERT INTO [sSchemaFramework].operation_tr_financement_equ_public(code_financement_equ_public, id_operation) VALUES([code_financement_equ_public], [id_operation])"; +// Commune +$aSql['getCommune'] = "SELECT \"commune\".id_commune, \"commune\".nom_commune FROM [sSchemaFramework].commune WHERE id_commune = [id_commune]"; +// Type opérateur +$aSql['getTypeOperateur'] = "SELECT \"tr_type_operateur\".code_type_operateur, \"tr_type_operateur\".type_operateur FROM [sSchemaFramework].tr_type_operateur WHERE code_type_operateur = [code_type_operateur]"; +// Mode consultation +$aSql['getModeConsultation'] = "SELECT \"tr_consultation\".code_consultation, \"tr_consultation\".consultation FROM [sSchemaFramework].tr_consultation WHERE code_consultation = [code_consultation]"; +// Opération / Ilot +$aSql['getOperationIlot'] = "SELECT nom_ilot, nom_operation FROM [sSchemaFramework].ilot INNER JOIN [sSchemaFramework].operation ON ilot.id_operation=operation.id_operation WHERE id_ilot=[id_ilot]"; +// Ilot +$aSql['getIlot'] = "SELECT nom_ilot FROM [sSchemaFramework].ilot WHERE id_ilot=[id_ilot]"; +// Perimetre projet urbain +$aSql['getPerimetre'] = "SELECT \"perimetre\".id_perimetre, \"perimetre\".nom_perimetre, \"perimetre\".type_perimetre FROM [sSchemaFramework].perimetre WHERE id_perimetre = [id_perimetre]"; +// Avancement +$aSql['getAvancement'] = "SELECT \"tr_avancement\".code_avancement, \"tr_avancement\".avancement FROM [sSchemaFramework].tr_avancement WHERE code_avancement = [code_avancement]"; +// Contexte urbain +$aSql['getContexteUrbain'] = "SELECT \"tr_contexte_urbain\".code_contexte_urbain, \"tr_contexte_urbain\".contexte_urbain FROM [sSchemaFramework].tr_contexte_urbain WHERE code_contexte_urbain = [code_contexte_urbain]"; +// Suivi de l'opération +$aSql['getSuivi'] = "SELECT \"tr_suivi\".code_suivi, \"tr_suivi\".suivi FROM [sSchemaFramework].tr_suivi WHERE code_suivi = [code_suivi]"; +// Procédure d'aménagement +$aSql['getProcedureAmenagement'] = "SELECT \"tr_procedure_amenagement\".code_procedure_amenagement, \"tr_procedure_amenagement\".procedure_amenagement FROM [sSchemaFramework].tr_procedure_amenagement WHERE code_procedure_amenagement = [code_procedure_amenagement]"; +// Vocation +$aSql['getVocation'] = "SELECT \"tr_vocation\".code_vocation, \"tr_vocation\".vocation FROM [sSchemaFramework].tr_vocation WHERE code_vocation = [code_vocation]"; +// Répartition type logement DEPRECATED +// $aSql['getRepartitionTypeLogement'] = "SELECT type_logement, repartition FROM [sSchemaFramework].v_repartion_type_logement WHERE id_operation=[id_operation]"; +?> \ No newline at end of file diff --git a/src/module_suivi_prod_immo/web_service/ws/overview.phtml b/src/module_suivi_prod_immo/web_service/ws/overview.phtml new file mode 100644 index 0000000000000000000000000000000000000000..040892fd61361e36e14a610a7db8e0b98e2536bb --- /dev/null +++ b/src/module_suivi_prod_immo/web_service/ws/overview.phtml @@ -0,0 +1,24 @@ +<?php +/** + * @SWG\Swagger( + * basePath="/[service_alias]/suivi_prod_immo", + * host="[server]", + * schemes={"[protocol]"}, + * produces={ + * "application/json", + "application/xml", + "text/html" + * }, + * @SWG\Info( + * version="1.0.0", + * title="Suivi prod immo Test Rest", + * description="All fetaures to access server operation for suivi_prod_immo", + * ) + * ) + */ +?> + +<h1 class="titleOverview">Service Suivi prod immo</h1> +<p> + <a class="linkOverview" href="javascript:sService='suivi_prod_immo';LoadApi()">Suivi prod immo</a>: this is the most comprehensive service which should be used as a preference when developing applications communicating with Suivi prod immo. Those services allow you to administrate Suivi prod immo applications. +</p> \ No newline at end of file diff --git a/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.eot b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.eot new file mode 100644 index 0000000000000000000000000000000000000000..2b5a1bda3d3a55871bbd84a130e1f8ae9d0f1ab9 Binary files /dev/null and b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.eot differ diff --git a/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.svg b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa79662fdba51b4425f58b37aec92a034f4f4aaa --- /dev/null +++ b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.svg @@ -0,0 +1,649 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg> +<metadata> +Created by FontForge 20120731 at Sun May 27 15:14:52 2018 + By www +URW Software, Copyright 1993 by URW +</metadata> +<defs> +<font id="Bauhaus93" horiz-adv-x="1024" > + <font-face + font-family="Bauhaus 93" + font-weight="400" + font-stretch="normal" + units-per-em="2048" + panose-1="4 3 9 5 2 11 2 2 12 2" + ascent="1638" + descent="-410" + x-height="983" + cap-height="1365" + bbox="-232 -512 2614 1841" + underline-thickness="214" + underline-position="-104" + unicode-range="U+0020-F002" + /> +<missing-glyph horiz-adv-x="512" +d="M51 0v1365h410v-1365h-410zM410 51v1263h-308v-1263h308z" /> + <glyph glyph-name=".notdef" horiz-adv-x="512" +d="M51 0v1365h410v-1365h-410zM410 51v1263h-308v-1263h308z" /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="512" + /> + <glyph glyph-name="space" unicode=" " horiz-adv-x="512" + /> + <glyph glyph-name="space" unicode=" " horiz-adv-x="512" + /> + <glyph glyph-name="exclam" unicode="!" horiz-adv-x="884" +d="M634 1365l-7 -847h-355l-21 847h383zM441 448q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5z" /> + <glyph glyph-name="quotedbl" unicode=""" +d="M400 818h-189l-76 547h343zM812 818h-189l-76 547h343z" /> + <glyph glyph-name="numbersign" unicode="#" horiz-adv-x="1383" +d="M962 364l-51 -364h-225l51 364h-202l-51 -364h-226l52 364h-189l31 220h189l28 203h-188l30 220h189l50 358h239l-50 -358h175l50 358h239l-50 -358h211l-31 -220h-211l-29 -203h211l-31 -220h-211zM797 787h-203l-28 -203h202z" /> + <glyph glyph-name="dollar" unicode="$" horiz-adv-x="1164" +d="M409 1525h379v-125q92 -18 151 -53v-355q-70 36 -118 36q-43 0 -71.5 -26t-28.5 -66q0 -46 47 -118q86 -132 114.5 -203t28.5 -153q0 -171 -123 -301v-313h-379v156q-95 15 -184 58v362q78 -20 107 -20q54 0 86.5 30t32.5 80q0 59 -58 141l-40 58q-86 122 -86 251 +q0 200 142 336v225z" /> + <glyph glyph-name="percent" unicode="%" horiz-adv-x="1897" +d="M487 1384q148 0 253 -104.5t105 -252.5q0 -149 -104.5 -253.5t-253.5 -104.5q-148 0 -252.5 105t-104.5 253q0 147 105 252t252 105zM488 1184q-65 0 -111 -46t-46 -111t46 -111t111 -46t111 46t46 111t-46 111t-111 46zM1278 1365l-551 -1365h-122l554 1365h119z +M1411 702q147 0 252 -105t105 -253t-105 -253t-252 -105q-148 0 -253 105t-105 253t105 253t253 105zM1411 502q-65 0 -111 -46t-46 -111q0 -66 46 -112t111 -46t111 46t46 112q0 65 -46 111t-111 46z" /> + <glyph glyph-name="ampersand" unicode="&" horiz-adv-x="1561" +d="M931 586h254q4 -47 4 -66q0 -121 -59 -228l192 -292h-356l-40 48q-117 -82 -244 -82q-184 0 -313.5 127.5t-129.5 308.5q0 205 178 351q-96 122 -96 251q0 163 114.5 279t275.5 116q159 0 274 -112t115 -266q0 -21 -2 -52h-309q-8 102 -71 102q-59 0 -59 -57 +q0 -20 17 -45zM607 494q-49 -36 -49 -84q0 -46 29.5 -78t72.5 -32q32 0 69 27z" /> + <glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="512" +d="M357 818h-202l-77 547h356z" /> + <glyph glyph-name="parenleft" unicode="(" horiz-adv-x="751" +d="M665 -259h-280q-136 221 -189.5 399t-53.5 413q0 232 54.5 414t188.5 398h279q-200 -421 -200 -808q0 -394 201 -816z" /> + <glyph glyph-name="parenright" unicode=")" horiz-adv-x="751" +d="M86 1365h279q137 -220 190.5 -398.5t53.5 -413.5q0 -232 -54.5 -414.5t-189.5 -397.5h-279q201 421 201 808q0 395 -201 816z" /> + <glyph glyph-name="asterisk" unicode="*" +d="M598 1190q39 7 59 7q92 0 178 -89l-179 -106q43 -64 43 -134q0 -58 -38 -130l-155 136q-70 -79 -170 -79q-25 0 -69 7l85 198q-139 45 -163 211l211 -19q8 138 151 207z" /> + <glyph glyph-name="plus" unicode="+" horiz-adv-x="1533" +d="M621 555h-366v282h366v384h290v-384h366v-282h-366v-383h-290v383z" /> + <glyph glyph-name="comma" unicode="," horiz-adv-x="763" +d="M376 -104v73q-100 6 -163 71t-63 161q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -115z" /> + <glyph glyph-name="hyphen" unicode="-" horiz-adv-x="457" +d="M457 738v-265h-457v265h457z" /> + <glyph glyph-name="hyphen" unicode="­" horiz-adv-x="457" +d="M457 738v-265h-457v265h457z" /> + <glyph glyph-name="period" unicode="." horiz-adv-x="775" +d="M386 448q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5z" /> + <glyph glyph-name="slash" unicode="/" horiz-adv-x="710" +d="M615 1365l-373 -1624h-182l372 1624h183z" /> + <glyph glyph-name="zero" unicode="0" horiz-adv-x="1164" +d="M95 533v300q0 262 130.5 414t355.5 152t356 -152t131 -414v-300q0 -262 -131 -414.5t-356 -152.5t-355.5 152.5t-130.5 414.5zM484 913v-460q0 -125 97 -125q98 0 98 125v460q0 125 -98 125q-97 0 -97 -125z" /> + <glyph glyph-name="one" unicode="1" horiz-adv-x="1164" +d="M776 1365v-1365h-387v1365h387z" /> + <glyph glyph-name="two" unicode="2" horiz-adv-x="1164" +d="M1065 395v-395h-882l438 822l15 28q18 33 18 65q0 81 -95 81q-37 0 -64.5 -27.5t-27.5 -64.5q0 -42 36 -76l-175 -312q-110 68 -169 173t-59 232q0 197 139 337.5t336 140.5q198 0 336.5 -139t138.5 -338q0 -114 -51 -212l-162 -315h228z" /> + <glyph glyph-name="three" unicode="3" horiz-adv-x="1164" +d="M220 1365h723l-223 -525q120 -81 174.5 -177.5t54.5 -228.5q0 -197 -145 -332.5t-357 -135.5q-117 0 -232 44v386q87 -54 151 -54q70 0 117.5 50t47.5 124q0 85 -71 135.5t-190 50.5l101 269h-151v394z" /> + <glyph glyph-name="four" unicode="4" horiz-adv-x="1164" +d="M1084 1365v-1365h-384v1042l-170 -338h84v-297h-533l404 958h599z" /> + <glyph glyph-name="five" unicode="5" horiz-adv-x="1164" +d="M953 1365v-392h-336l-18 -62q184 -53 272 -153q121 -136 121 -326q0 -201 -147.5 -333.5t-371.5 -132.5q-151 0 -298 79v336q117 -57 206 -57q92 0 145.5 42t53.5 114q0 81 -82.5 137t-203.5 56q-46 0 -122 -17l147 709h634z" /> + <glyph glyph-name="six" unicode="6" horiz-adv-x="1164" +d="M364 1405l359 -127l-266 -746q-12 -32 -12 -57q0 -54 40 -93t95 -39t93.5 39.5t38.5 95.5t-38.5 95t-93.5 39q-13 0 -39 -4l163 392q212 -92 305.5 -211.5t93.5 -296.5q0 -222 -151.5 -374t-371.5 -152q-208 0 -363.5 152.5t-155.5 356.5q0 94 73 296z" /> + <glyph glyph-name="seven" unicode="7" horiz-adv-x="1164" +d="M1043 1365l-397 -1365h-415l309 973h-418v392h921z" /> + <glyph glyph-name="eight" unicode="8" horiz-adv-x="1164" +d="M917 783q85 -88 117 -162t32 -180q0 -203 -138.5 -339t-345.5 -136q-208 0 -346.5 136t-138.5 339q0 103 33.5 180t115.5 162q-74 98 -74 218q0 173 115 285.5t293 112.5q180 0 295.5 -112t115.5 -287q0 -118 -74 -217zM577 1106q-45 0 -77.5 -33t-32.5 -77q0 -51 32 -84 +t82 -33q45 0 77.5 34t32.5 80q0 48 -33 80.5t-81 32.5zM580 597q-68 0 -116.5 -47.5t-48.5 -114.5q0 -73 47 -121.5t118 -48.5t118 48.5t47 121.5q0 66 -49 114t-116 48z" /> + <glyph glyph-name="nine" unicode="9" horiz-adv-x="1164" +d="M801 -40l-359 127l266 746q11 32 11 58q0 54 -40 93t-95 39t-93.5 -39.5t-38.5 -95.5q0 -57 38.5 -96t94.5 -39q12 0 38 4l-162 -392q-213 93 -306.5 212t-93.5 297q0 221 151.5 373t371.5 152q208 0 363.5 -152.5t155.5 -356.5q0 -95 -73 -296z" /> + <glyph glyph-name="colon" unicode=":" horiz-adv-x="775" +d="M386 448q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5zM386 1018q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5z" /> + <glyph glyph-name="semicolon" unicode=";" horiz-adv-x="775" +d="M381 -104v73q-100 6 -163 71t-63 161q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -115zM386 1018q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5z" /> + <glyph glyph-name="less" unicode="<" +d="M955 1329v-363l-501 -275l501 -275v-361l-887 485v305z" /> + <glyph glyph-name="equal" unicode="=" horiz-adv-x="1533" +d="M255 995h1022v-252h-1022v252zM255 650h1022v-252h-1022v252z" /> + <glyph glyph-name="greater" unicode=">" +d="M68 55v363l501 275l-500 275v361l886 -485v-305z" /> + <glyph glyph-name="question" unicode="?" horiz-adv-x="1087" +d="M721 501h-371v63q0 125 28 184.5t102 92.5l68 30q77 34 77 96q0 36 -25 61t-61 25q-98 0 -98 -136h-345q0 182 84 297q62 85 161 135t205 50q188 0 316.5 -124.5t128.5 -308.5q0 -227 -184 -319q-60 -30 -73 -52t-13 -94zM542 448q98 0 168.5 -71t70.5 -169t-70 -166.5 +t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5z" /> + <glyph glyph-name="at" unicode="@" horiz-adv-x="1533" +d="M1193 193l39 -156q-188 -64 -405 -64q-374 0 -575 224q-174 194 -174 473q0 307 206 514t511 207q286 0 473 -170.5t187 -430.5q0 -197 -119 -327.5t-299 -130.5q-96 0 -153.5 35.5t-57.5 95.5q0 28 11 72l38 145q4 17 4 39q0 81 -79 81q-49 0 -85.5 -37.5t-36.5 -86.5 +q0 -64 61 -64q29 0 56 10l-90 -248q-32 -5 -53 -5q-109 0 -173.5 64.5t-64.5 174.5q0 179 130.5 311.5t307.5 132.5q127 0 204.5 -65.5t77.5 -171.5q0 -44 -13 -97l-30 -121l-6 -21q-8 -29 -8 -50q0 -48 44 -48q68 0 124 97t56 215q0 199 -138.5 323t-361.5 124 +q-240 0 -396.5 -161.5t-156.5 -408.5q0 -213 122 -360q149 -180 460 -180q177 0 363 66z" /> + <glyph glyph-name="A" unicode="A" horiz-adv-x="1212" +d="M632 685v-360h-117v-325h-406v868q0 252 137.5 391.5t386.5 139.5q240 0 355 -126.5t115 -390.5v-882h-406v855q0 80 -19 111t-68 31q-95 0 -95 -142v-170h117z" /> + <glyph glyph-name="B" unicode="B" horiz-adv-x="1169" +d="M137 1365h496q441 0 441 -347q0 -172 -151 -286q219 -95 219 -339q0 -187 -129 -298q-63 -53 -135 -74t-194 -21h-77v351h69q61 0 86 15.5t25 54.5q0 66 -102 66h-78v364q112 0 112 77q0 71 -101 71h-75v-999h-406v1365z" /> + <glyph glyph-name="C" unicode="C" horiz-adv-x="1540" +d="M1060 667l425 -11q-42 -330 -228.5 -510t-486.5 -180q-305 0 -510.5 204.5t-205.5 507.5q0 305 209.5 513t516.5 208q302 0 504 -204q140 -141 198 -393l-435 -29q-73 224 -277 224q-130 0 -214.5 -90t-84.5 -229q0 -134 83 -221.5t210 -87.5q129 0 205.5 77t90.5 221z +" /> + <glyph glyph-name="D" unicode="D" horiz-adv-x="1499" +d="M543 973v-973h-406v1365h529q348 0 545 -158q234 -189 234 -513q0 -310 -200 -506t-515 -196q-37 0 -121 4v401h65q355 0 355 297q0 279 -349 279h-137z" /> + <glyph glyph-name="E" unicode="E" horiz-adv-x="987" +d="M865 834v-304h-265q-54 0 -76.5 -16t-22.5 -54q0 -43 23 -56.5t94 -13.5h273v-390h-319q-225 0 -344 107.5t-119 310.5v535q0 196 112.5 304t316.5 108h353v-392h-259q-105 0 -105 -68q0 -40 25 -55.5t89 -15.5h224z" /> + <glyph glyph-name="F" unicode="F" horiz-adv-x="986" +d="M650 722v-366h-135v-356h-406v847q0 239 147.5 395.5t371.5 156.5q247 0 413 -213l-333 -243q-28 78 -99 78q-94 0 -94 -130v-169h135z" /> + <glyph glyph-name="G" unicode="G" horiz-adv-x="1255" +d="M715 765h387q125 -155 125 -327q0 -200 -146.5 -336t-360.5 -136q-278 0 -472 211t-194 514q0 304 197.5 506t493.5 202q101 0 224 -41v-406q-96 45 -175 45q-143 0 -233.5 -89t-90.5 -231q0 -145 84 -230t227 -85q91 0 91 53q0 40 -60 40h-97v310z" /> + <glyph glyph-name="H" unicode="H" horiz-adv-x="1267" +d="M656 877v-360h-113v-517h-406v1365h406v-488h113zM1131 1365v-1365h-406v1365h406z" /> + <glyph glyph-name="I" unicode="I" horiz-adv-x="679" +d="M543 1365v-1365h-406v1365h406z" /> + <glyph glyph-name="J" unicode="J" horiz-adv-x="623" +d="M527 1365v-920q0 -208 -118 -343.5t-299 -135.5q-53 0 -124 23v393q30 -13 55 -13q80 0 80 129v867h406z" /> + <glyph glyph-name="K" unicode="K" horiz-adv-x="1321" +d="M1322 1365l-360 -619l358 -746h-456l-309 754l350 611h417zM543 1365v-1365h-406v1365h406z" /> + <glyph glyph-name="L" unicode="L" horiz-adv-x="687" +d="M109 1365h406v-811q0 -95 30.5 -126.5t120.5 -31.5h21v-396h-108q-222 0 -346 129.5t-124 359.5v876z" /> + <glyph glyph-name="M" unicode="M" horiz-adv-x="1663" +d="M109 0v984q0 183 111 299t288 116q210 0 323 -193q69 104 148 148.5t195 44.5q184 0 282 -116t98 -334v-949h-406v888q0 66 -10.5 87.5t-42.5 21.5q-60 0 -60 -102v-895h-406v888q0 65 -11 87t-43 22q-60 0 -60 -109v-888h-406z" /> + <glyph glyph-name="N" unicode="N" horiz-adv-x="1206" +d="M109 0v886q0 233 139.5 373t371.5 140q231 0 353.5 -136t122.5 -391v-872h-406v872q0 125 -89 125q-86 0 -86 -125v-872h-406z" /> + <glyph glyph-name="O" unicode="O" horiz-adv-x="1543" +d="M784 1399q290 0 497.5 -211t207.5 -505q0 -299 -209 -508t-508 -209q-297 0 -507 210t-210 507q0 300 211.5 508t517.5 208zM772 997q-125 0 -213 -92t-88 -222t88.5 -222t212.5 -92q126 0 213.5 91.5t87.5 222.5t-87.5 222.5t-213.5 91.5z" /> + <glyph glyph-name="P" unicode="P" horiz-adv-x="1151" +d="M581 472v358q123 0 123 94q0 86 -94 86q-95 0 -95 -118v-892h-406v850q0 132 26.5 216.5t90.5 157.5q72 81 180 128t223 47q208 0 349.5 -140t141.5 -347q0 -201 -127 -326q-116 -115 -350 -115z" /> + <glyph glyph-name="Q" unicode="Q" horiz-adv-x="1541" +d="M577 -126v119q-238 66 -380.5 255t-142.5 438q0 329 248 539q206 174 469 174q339 0 547 -245q168 -198 168 -457q0 -254 -149 -455q-134 -182 -374 -249v-119h-386zM591 576h359v-153q120 103 120 261q0 127 -89 220t-210 93q-122 0 -211 -93t-89 -220q0 -162 120 -261 +v153z" /> + <glyph glyph-name="R" unicode="R" horiz-adv-x="1225" +d="M543 998v-998h-406v1365h521q238 0 369 -118q146 -132 146 -335q0 -207 -181 -349l234 -563h-426l-197 440v351h32q128 0 128 110q0 97 -148 97h-72z" /> + <glyph glyph-name="S" unicode="S" horiz-adv-x="847" +d="M778 1371v-389q-44 15 -68 15q-46 0 -79 -34t-33 -82q0 -41 36 -104l31 -54q84 -146 84 -282q0 -199 -141.5 -337t-345.5 -138q-98 0 -194 45v395q58 -37 103 -37q53 0 88.5 30.5t35.5 76.5q0 30 -57 131q-91 160 -91 320q0 193 137.5 332.5t328.5 139.5q84 0 165 -28z +" /> + <glyph glyph-name="T" unicode="T" horiz-adv-x="1054" +d="M731 973v-973h-406v973h-311v392h1027v-392h-310z" /> + <glyph glyph-name="U" unicode="U" horiz-adv-x="1206" +d="M1096 1365v-885q0 -234 -139.5 -374t-371.5 -140q-231 0 -353.5 136t-122.5 391v872h406v-871q0 -125 89 -125q86 0 86 125v871h406z" /> + <glyph glyph-name="V" unicode="V" horiz-adv-x="1070" +d="M1118 1365l-595 -1443l-591 1443h470l125 -426l138 426h453z" /> + <glyph glyph-name="W" unicode="W" horiz-adv-x="1663" +d="M1554 1365v-983q0 -184 -111 -300t-287 -116q-212 0 -324 193q-69 -104 -148 -148.5t-195 -44.5q-184 0 -282 116t-98 334v949h406v-888q0 -66 10.5 -87t42.5 -21q60 0 60 101v895h406v-888q0 -64 11 -86t43 -22q60 0 60 108v888h406z" /> + <glyph glyph-name="X" unicode="X" horiz-adv-x="1020" +d="M1077 1365l-355 -664l367 -701h-427l-168 331l-142 -331h-420l375 690l-355 675h423l159 -310l128 310h415z" /> + <glyph glyph-name="Y" unicode="Y" horiz-adv-x="1030" +d="M1099 1365l-386 -607v-758h-406v758l-389 607h412l176 -281l189 281h404z" /> + <glyph glyph-name="Z" unicode="Z" horiz-adv-x="1059" +d="M1059 1365l-424 -973h419v-392h-1030l422 973h-446v392h1059z" /> + <glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="751" +d="M410 1119v-1132h250v-246h-569v1624h569v-246h-250z" /> + <glyph glyph-name="backslash" unicode="\" horiz-adv-x="710" +d="M96 1365h183l372 -1624h-182z" /> + <glyph glyph-name="bracketright" unicode="]" horiz-adv-x="751" +d="M340 -13v1132h-249v246h568v-1624h-568v246h249z" /> + <glyph glyph-name="asciicircum" unicode="^" +d="M338 698h-320l292 677h404l293 -677h-320l-174 430z" /> + <glyph glyph-name="underscore" unicode="_" +d="M0 -104h1024v-214h-1024v214z" /> + <glyph glyph-name="grave" unicode="`" +d="M457 1329l211 -232h-211l-237 232h237z" /> + <glyph glyph-name="a" unicode="a" horiz-adv-x="1204" +d="M663 374v-387q-46 -8 -84 -8q-225 0 -375 148t-150 371q0 217 151.5 368t368.5 151q242 0 381.5 -141.5t139.5 -386.5v-489h-374v462q0 79 -38.5 126t-103.5 47q-59 0 -102 -43t-43 -102q0 -62 39 -102t99 -40q49 0 91 26z" /> + <glyph glyph-name="b" unicode="b" horiz-adv-x="1185" +d="M461 1365v-817q0 -199 143 -199q61 0 103.5 41.5t42.5 100.5q0 61 -40 102.5t-98 41.5q-41 0 -94 -36v412q66 6 100 6q211 0 361.5 -152t150.5 -366q0 -219 -153 -369t-376 -150q-112 0 -218.5 49t-175.5 132q-120 144 -120 373v831h374z" /> + <glyph glyph-name="c" unicode="c" horiz-adv-x="1146" +d="M721 459l371 14q-16 -216 -161 -355t-353 -139q-220 0 -371.5 153t-151.5 375q0 211 153 361t367 150q187 0 330 -118t178 -301l-379 -14q-49 64 -124 64q-64 0 -105 -42t-41 -106q0 -65 43.5 -109t108.5 -44q95 0 135 111z" /> + <glyph glyph-name="d" unicode="d" horiz-adv-x="1185" +d="M723 1365h374v-831q0 -229 -120 -373q-69 -83 -175.5 -132t-218.5 -49q-223 0 -376 150t-153 368q0 211 152 365t360 154q33 0 100 -6v-412q-46 36 -92 36q-58 0 -99.5 -42.5t-41.5 -102.5q0 -58 43 -99.5t103 -41.5q144 0 144 199v817z" /> + <glyph glyph-name="e" unicode="e" horiz-adv-x="1135" +d="M1089 438h-567q-13 43 -13 79q0 50 18 98h190q-20 111 -125 111q-70 0 -114 -59.5t-44 -152.5q0 -97 42.5 -157t111.5 -60q56 0 108 56l213 -256q-149 -117 -331 -117q-222 0 -373 149t-151 369q0 219 152.5 370t374.5 151q217 0 364.5 -147.5t147.5 -363.5q0 -22 -4 -70 +z" /> + <glyph glyph-name="f" unicode="f" horiz-adv-x="705" +d="M650 776v-392h-167v-384h-374v847q0 143 49 244q62 129 188.5 210.5t263.5 81.5l40 -1v-392q-13 1 -19 1q-71 0 -109.5 -47t-38.5 -134v-34h167z" /> + <glyph glyph-name="g" unicode="g" horiz-adv-x="1181" +d="M641 411v-343q-81 -30 -155 -30q-181 0 -306.5 137t-125.5 335q0 214 151 361t371 147q117 0 224 -47t168 -126q102 -131 102 -380v-328q0 -267 -151.5 -433.5t-394.5 -166.5q-74 0 -187 37v340q73 -40 148 -40q101 0 156 66.5t55 190.5v375q0 157 -127 157 +q-54 0 -94.5 -41.5t-40.5 -95.5q0 -57 38.5 -95t95.5 -38q38 0 73 18z" /> + <glyph glyph-name="h" unicode="h" horiz-adv-x="1095" +d="M483 1365v-417q95 69 190 69q144 0 228.5 -104t84.5 -281v-632h-374v527q0 64 -13.5 86t-52.5 22q-63 0 -63 -93v-542h-374v1365h374z" /> + <glyph glyph-name="i" unicode="i" horiz-adv-x="594" +d="M483 997v-997h-374v997h374zM297 1442q76 0 131.5 -53.5t55.5 -126.5q0 -78 -52.5 -128t-134.5 -50t-134.5 50t-52.5 128q0 73 55.5 126.5t131.5 53.5z" /> + <glyph glyph-name="j" unicode="j" horiz-adv-x="728" +d="M244 997h374v-842q0 -264 -125 -420q-159 -198 -438 -198q-85 0 -192 36v353q94 -44 159 -44q222 0 222 327v788zM420 1442q76 0 131.5 -53.5t55.5 -126.5q0 -78 -52.5 -128t-134.5 -50t-134.5 50t-52.5 128q0 73 55.5 126.5t131.5 53.5z" /> + <glyph glyph-name="k" unicode="k" horiz-adv-x="1104" +d="M483 1365v-1365h-374v1365h374zM1056 997l-183 -363l272 -634h-414l-234 651l170 346h389z" /> + <glyph glyph-name="l" unicode="l" horiz-adv-x="593" +d="M483 1365v-1365h-374v1365h374z" /> + <glyph glyph-name="m" unicode="m" horiz-adv-x="1587" +d="M1477 0h-374v538q0 62 -13 86t-47 24q-63 0 -63 -111v-537h-374v538q0 62 -13.5 86t-47.5 24q-62 0 -62 -111v-537h-374v614q0 168 113 285.5t274 117.5q166 0 298 -140q147 140 294 140q187 0 300 -136q89 -106 89 -309v-572z" /> + <glyph glyph-name="n" unicode="n" horiz-adv-x="1107" +d="M998 0h-374v563q0 86 -71 86q-70 0 -70 -86v-563h-374v556q0 195 129 328.5t316 133.5q214 0 343 -155q101 -121 101 -337v-526z" /> + <glyph glyph-name="o" unicode="o" horiz-adv-x="1144" +d="M582 1018q212 0 363.5 -152.5t151.5 -365.5q0 -216 -153.5 -368t-370.5 -152t-371 152.5t-154 367.5q0 219 154 368.5t380 149.5zM572 649q-60 0 -102 -43.5t-42 -106.5q0 -62 42.5 -106t101.5 -44q60 0 102.5 44t42.5 106q0 63 -42 106.5t-103 43.5z" /> + <glyph glyph-name="p" unicode="p" horiz-adv-x="1185" +d="M461 -369h-374v832q0 229 120 373q69 83 175.5 132t218.5 49q223 0 376 -150t153 -368q0 -212 -152 -366t-360 -154q-34 0 -100 7v412q46 -37 92 -37q58 0 99.5 43t41.5 102t-43 100.5t-103 41.5q-144 0 -144 -199v-818z" /> + <glyph glyph-name="q" unicode="q" horiz-adv-x="1185" +d="M723 -369v818q0 199 -145 199q-59 0 -102 -41.5t-43 -100.5t41.5 -102t99.5 -43q45 0 92 37v-412q-66 -7 -100 -7q-208 0 -360 154t-152 366q0 218 153 368t376 150q112 0 218.5 -49t175.5 -132q120 -144 120 -373v-832h-374z" /> + <glyph glyph-name="r" unicode="r" horiz-adv-x="657" +d="M656 1007v-400q-39 22 -71 22q-102 0 -102 -156v-473h-374v545q0 216 118 344.5t315 128.5q44 0 114 -11z" /> + <glyph glyph-name="s" unicode="s" horiz-adv-x="747" +d="M734 983v-394q-79 0 -108.5 -29.5t-37.5 -116.5q-26 -289 -224 -408q-105 -62 -298 -62h-52v396h17q90 0 128.5 37.5t44.5 131.5q8 153 28.5 215t83.5 123q110 107 305 107h113z" /> + <glyph glyph-name="t" unicode="t" horiz-adv-x="685" +d="M442 1365v-382h168v-395h-168q0 -119 37.5 -164t137.5 -45v-393q-29 -1 -43 -1q-127 0 -239.5 59t-180.5 160q-86 129 -86 342v819h374z" /> + <glyph glyph-name="u" unicode="u" horiz-adv-x="1107" +d="M109 983h374v-563q0 -85 71 -85q70 0 70 85v563h374v-556q0 -194 -129 -327.5t-316 -133.5q-213 0 -343 155q-101 121 -101 336v526z" /> + <glyph glyph-name="v" unicode="v" horiz-adv-x="789" +d="M858 997l-466 -1036l-460 1036h357l106 -269l116 269h347z" /> + <glyph glyph-name="w" unicode="w" horiz-adv-x="1587" +d="M109 983h374v-537q0 -63 13 -87.5t47 -24.5q63 0 63 112v537h374v-537q0 -63 13.5 -87.5t47.5 -24.5q62 0 62 112v537h374v-614q0 -168 -113 -285.5t-274 -117.5q-166 0 -298 140q-146 -140 -294 -140q-187 0 -300 136q-89 107 -89 309v572z" /> + <glyph glyph-name="x" unicode="x" horiz-adv-x="1081" +d="M612 997h374v-219q0 -94 -27.5 -151.5t-94.5 -101.5q68 -46 95 -101t27 -144v-280h-374v301q0 103 -72 103q-70 0 -70 -89v-315h-374v266q0 92 33.5 150t116.5 109q-83 54 -116.5 114t-33.5 153v205h374v-252q0 -39 20 -64t51 -25q71 0 71 89v252z" /> + <glyph glyph-name="y" unicode="y" horiz-adv-x="1098" +d="M238 -437v325q76 -32 133 -32q182 0 236 205q-98 -58 -192 -58q-139 0 -229 103.5t-90 263.5v627h374v-536q0 -89 74 -89q71 0 71 98v527h374v-890q0 -249 -140 -402q-167 -182 -404 -182q-104 0 -207 40z" /> + <glyph glyph-name="z" unicode="z" horiz-adv-x="1014" +d="M941 997l-306 -605h352v-392h-961l304 607h-316v390h927z" /> + <glyph glyph-name="braceleft" unicode="{" horiz-adv-x="751" +d="M378 553q65 -43 89.5 -94.5t24.5 -146.5v-205v-22q0 -71 27.5 -89t132.5 -18h29v-247q-34 0 -65 -1l-115 -6l-71 3q-141 9 -199 70.5t-58 202.5v269q0 78 -23.5 115t-80.5 48v262q88 17 97 85l6 45q1 11 1 13v267q0 155 68.5 215.5t243.5 60.5l57 -1l74 -3l65 -2v-253 +l-44 1q-92 0 -118.5 -19.5t-26.5 -87.5v-23v-198q0 -97 -22.5 -144.5t-91.5 -96.5z" /> + <glyph glyph-name="bar" unicode="|" +d="M328 1365h368v-1706h-368v1706z" /> + <glyph glyph-name="braceright" unicode="}" horiz-adv-x="751" +d="M372 551q-65 42 -89.5 93.5t-24.5 146.5v206v22q0 71 -27.5 89t-132.5 18l-29 -1v247q33 0 64 2l116 6l71 -3q257 0 257 -274v-269q0 -77 23.5 -114t80.5 -48v-262q-88 -18 -97 -86l-5 -44q-2 -12 -2 -14v-267q0 -155 -68.5 -215.5t-243.5 -60.5l-57 1l-75 3l-64 2v253 +l44 -1q92 0 118.5 20t26.5 87v23v198q0 98 22.5 145.5t91.5 96.5z" /> + <glyph glyph-name="asciitilde" unicode="~" horiz-adv-x="1365" +d="M364 1108l-175 147q117 299 319 299q60 0 225 -65q113 -45 144 -45q70 0 131 115l175 -147q-66 -161 -139 -228.5t-183 -67.5q-66 0 -229 67q-101 41 -139 41q-67 0 -129 -116z" /> + <glyph glyph-name="Adieresis" unicode="Ä" horiz-adv-x="1212" +d="M632 685v-360h-117v-325h-406v868q0 252 137.5 391.5t386.5 139.5q240 0 355 -126.5t115 -390.5v-882h-406v855q0 80 -19 111t-68 31q-95 0 -95 -142v-170h117zM372 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5 +q0 74 52.5 126.5t127.5 52.5zM841 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5z" /> + <glyph glyph-name="Aring" unicode="Å" horiz-adv-x="1212" +d="M632 685v-360h-117v-325h-406v868q0 252 137.5 391.5t386.5 139.5q240 0 355 -126.5t115 -390.5v-882h-406v855q0 80 -19 111t-68 31q-95 0 -95 -142v-170h117zM606 1841q80 0 136.5 -56.5t56.5 -135.5q0 -80 -56.5 -136.5t-136.5 -56.5t-136.5 56.5t-56.5 136.5 +q0 79 56.5 135.5t136.5 56.5zM605 1710q-25 0 -43.5 -18t-18.5 -43q0 -26 18 -44t44 -18t44.5 18t18.5 44q0 25 -18.5 43t-44.5 18z" /> + <glyph glyph-name="Ccedilla" unicode="Ç" horiz-adv-x="1540" +d="M953 -14q-41 -240 -277 -365l-174 179q86 90 99 185q-248 58 -397.5 247.5t-149.5 445.5q0 305 209.5 513t516.5 208q302 0 504 -204q140 -141 198 -393l-435 -29q-73 224 -277 224q-130 0 -214.5 -90t-84.5 -229q0 -134 83 -221.5t210 -87.5q129 0 205.5 77t90.5 221 +l425 -11q-71 -557 -532 -670z" /> + <glyph glyph-name="Eacute" unicode="É" horiz-adv-x="987" +d="M865 834v-304h-265q-54 0 -76.5 -16t-22.5 -54q0 -43 23 -56.5t94 -13.5h273v-390h-319q-225 0 -344 107.5t-119 310.5v535q0 196 112.5 304t316.5 108h353v-392h-259q-105 0 -105 -68q0 -40 25 -55.5t89 -15.5h224zM1018 1751l-280 -273h-249l249 273h280z" /> + <glyph glyph-name="Ntilde" unicode="Ñ" horiz-adv-x="1206" +d="M109 0v886q0 233 139.5 373t371.5 140q231 0 353.5 -136t122.5 -391v-872h-406v872q0 125 -89 125q-86 0 -86 -125v-872h-406zM718 1744h176q-6 -124 -52 -195.5t-120 -71.5q-47 0 -131 47q-38 22 -54 22q-33 0 -39 -61h-187q25 267 191 267q46 0 103 -31l40 -21 +q23 -13 40 -13q33 0 33 43v14z" /> + <glyph glyph-name="Odieresis" unicode="Ö" horiz-adv-x="1543" +d="M784 1399q290 0 497.5 -211t207.5 -505q0 -299 -209 -508t-508 -209q-297 0 -507 210t-210 507q0 300 211.5 508t517.5 208zM772 997q-125 0 -213 -92t-88 -222t88.5 -222t212.5 -92q126 0 213.5 91.5t87.5 222.5t-87.5 222.5t-213.5 91.5zM537 1809q74 0 126.5 -52.5 +t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5zM1007 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5z" /> + <glyph glyph-name="Udieresis" unicode="Ü" horiz-adv-x="1206" +d="M1096 1365v-885q0 -234 -139.5 -374t-371.5 -140q-231 0 -353.5 136t-122.5 391v872h406v-871q0 -125 89 -125q86 0 86 125v871h406zM367 1809q75 0 127.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-127.5 -52.5q-74 0 -126.5 52.5t-52.5 127.5q0 74 52.5 126.5t126.5 52.5 +zM838 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5z" /> + <glyph glyph-name="aacute" unicode="á" horiz-adv-x="1204" +d="M663 374v-387q-46 -8 -84 -8q-225 0 -375 148t-150 371q0 217 151.5 368t368.5 151q242 0 381.5 -141.5t139.5 -386.5v-489h-374v462q0 79 -38.5 126t-103.5 47q-59 0 -102 -43t-43 -102q0 -62 39 -102t99 -40q49 0 91 26zM657 1329h237l-237 -232h-211z" /> + <glyph glyph-name="agrave" unicode="à" horiz-adv-x="1204" +d="M663 374v-387q-46 -8 -84 -8q-225 0 -375 148t-150 371q0 217 151.5 368t368.5 151q242 0 381.5 -141.5t139.5 -386.5v-489h-374v462q0 79 -38.5 126t-103.5 47q-59 0 -102 -43t-43 -102q0 -62 39 -102t99 -40q49 0 91 26zM547 1329l211 -232h-211l-237 232h237z" /> + <glyph glyph-name="acircumflex" unicode="â" horiz-adv-x="1204" +d="M663 374v-387q-46 -8 -84 -8q-225 0 -375 148t-150 371q0 217 151.5 368t368.5 151q242 0 381.5 -141.5t139.5 -386.5v-489h-374v462q0 79 -38.5 126t-103.5 47q-59 0 -102 -43t-43 -102q0 -62 39 -102t99 -40q49 0 91 26zM595 1361l279 -268h-234l-45 49l-51 -49h-214z +" /> + <glyph glyph-name="adieresis" unicode="ä" horiz-adv-x="1204" +d="M663 374v-387q-46 -8 -84 -8q-225 0 -375 148t-150 371q0 217 151.5 368t368.5 151q242 0 381.5 -141.5t139.5 -386.5v-489h-374v462q0 79 -38.5 126t-103.5 47q-59 0 -102 -43t-43 -102q0 -62 39 -102t99 -40q49 0 91 26zM351 1439q82 0 137 -49.5t55 -124.5 +q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5zM851 1437q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5z" /> + <glyph glyph-name="atilde" unicode="ã" horiz-adv-x="1204" +d="M663 374v-387q-46 -8 -84 -8q-225 0 -375 148t-150 371q0 217 151.5 368t368.5 151q242 0 381.5 -141.5t139.5 -386.5v-489h-374v462q0 79 -38.5 126t-103.5 47q-59 0 -102 -43t-43 -102q0 -62 39 -102t99 -40q49 0 91 26zM699 1322h154q0 -101 -47 -166t-120 -65 +q-41 0 -80 24l-45 28q-10 6 -21 7q-31 2 -40 -52h-149q0 108 43.5 168t122.5 60q40 0 77 -23l40 -24q11 -7 25 -8q34 -2 40 51z" /> + <glyph glyph-name="aring" unicode="å" horiz-adv-x="1204" +d="M663 374v-387q-46 -8 -84 -8q-225 0 -375 148t-150 371q0 217 151.5 368t368.5 151q242 0 381.5 -141.5t139.5 -386.5v-489h-374v462q0 79 -38.5 126t-103.5 47q-59 0 -102 -43t-43 -102q0 -62 39 -102t99 -40q49 0 91 26zM602 1470q79 0 135.5 -56.5t56.5 -136.5 +t-56.5 -136.5t-135.5 -56.5q-80 0 -136.5 56.5t-56.5 136.5t56.5 136.5t136.5 56.5zM601 1339q-26 0 -44 -18t-18 -44t18 -44t44 -18q25 0 43 18t18 44t-18 44t-43 18z" /> + <glyph glyph-name="ccedilla" unicode="ç" horiz-adv-x="1146" +d="M747 8q-26 -197 -239 -289l-135 137q54 71 54 128v18q-171 53 -271.5 189.5t-100.5 316.5q0 210 153 360t367 150q187 0 330 -118t178 -301l-379 -14q-48 64 -124 64q-64 0 -105 -42t-41 -106q0 -65 43.5 -109t108.5 -44q94 0 135 111l371 14q-12 -168 -103 -290 +t-242 -175z" /> + <glyph glyph-name="eacute" unicode="é" horiz-adv-x="1135" +d="M1089 438h-567q-13 43 -13 79q0 50 18 98h190q-20 111 -125 111q-70 0 -114 -59.5t-44 -152.5q0 -97 42.5 -157t111.5 -60q56 0 108 56l213 -256q-149 -117 -331 -117q-222 0 -373 149t-151 369q0 219 152.5 370t374.5 151q217 0 364.5 -147.5t147.5 -363.5q0 -22 -4 -70 +zM677 1329h237l-237 -232h-211z" /> + <glyph glyph-name="egrave" unicode="è" horiz-adv-x="1135" +d="M1089 438h-567q-13 43 -13 79q0 50 18 98h190q-20 111 -125 111q-70 0 -114 -59.5t-44 -152.5q0 -97 42.5 -157t111.5 -60q56 0 108 56l213 -256q-149 -117 -331 -117q-222 0 -373 149t-151 369q0 219 152.5 370t374.5 151q217 0 364.5 -147.5t147.5 -363.5q0 -22 -4 -70 +zM512 1329l211 -232h-211l-237 232h237z" /> + <glyph glyph-name="ecircumflex" unicode="ê" horiz-adv-x="1135" +d="M1089 438h-567q-13 43 -13 79q0 50 18 98h190q-20 111 -125 111q-70 0 -114 -59.5t-44 -152.5q0 -97 42.5 -157t111.5 -60q56 0 108 56l213 -256q-149 -117 -331 -117q-222 0 -373 149t-151 369q0 219 152.5 370t374.5 151q217 0 364.5 -147.5t147.5 -363.5q0 -22 -4 -70 +zM560 1361l279 -268h-234l-45 49l-51 -49h-214z" /> + <glyph glyph-name="edieresis" unicode="ë" horiz-adv-x="1135" +d="M1089 438h-567q-13 43 -13 79q0 50 18 98h190q-20 111 -125 111q-70 0 -114 -59.5t-44 -152.5q0 -97 42.5 -157t111.5 -60q56 0 108 56l213 -256q-149 -117 -331 -117q-222 0 -373 149t-151 369q0 219 152.5 370t374.5 151q217 0 364.5 -147.5t147.5 -363.5q0 -22 -4 -70 +zM316 1439q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5zM816 1437q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5z" /> + <glyph glyph-name="iacute" unicode="í" horiz-adv-x="593" +d="M483 997v-997h-374v997h374zM352 1329h237l-237 -232h-211z" /> + <glyph glyph-name="igrave" unicode="ì" horiz-adv-x="593" +d="M483 997v-997h-374v997h374zM242 1329l211 -232h-211l-237 232h237z" /> + <glyph glyph-name="icircumflex" unicode="î" horiz-adv-x="593" +d="M290 1361l279 -268h-234l-45 49l-51 -49h-214zM483 997v-997h-374v997h374z" /> + <glyph glyph-name="idieresis" unicode="ï" horiz-adv-x="593" +d="M483 997v-997h-374v997h374zM76 1418q74 0 123.5 -44.5t49.5 -111.5t-52.5 -117t-121.5 -50q-67 0 -117 50t-50 117q0 63 49.5 109.5t118.5 46.5zM512 1416q74 0 123.5 -44.5t49.5 -111.5t-52.5 -117t-121.5 -50q-67 0 -117 50t-50 117q0 63 50 109.5t118 46.5z" /> + <glyph glyph-name="ntilde" unicode="ñ" horiz-adv-x="1107" +d="M998 0h-374v563q0 86 -71 86q-70 0 -70 -86v-563h-374v556q0 195 129 328.5t316 133.5q214 0 343 -155q101 -121 101 -337v-526zM651 1322h154q0 -101 -47 -166t-120 -65q-41 0 -80 24l-45 28q-10 6 -21 7q-31 2 -40 -52h-149q0 108 43.5 168t122.5 60q40 0 77 -23 +l40 -24q11 -7 25 -8q34 -2 40 51z" /> + <glyph glyph-name="oacute" unicode="ó" horiz-adv-x="1144" +d="M582 1018q212 0 363.5 -152.5t151.5 -365.5q0 -216 -153.5 -368t-370.5 -152t-371 152.5t-154 367.5q0 219 154 368.5t380 149.5zM572 649q-60 0 -102 -43.5t-42 -106.5q0 -62 42.5 -106t101.5 -44q60 0 102.5 44t42.5 106q0 63 -42 106.5t-103 43.5zM627 1329h237 +l-237 -232h-211z" /> + <glyph glyph-name="ograve" unicode="ò" horiz-adv-x="1144" +d="M582 1018q212 0 363.5 -152.5t151.5 -365.5q0 -216 -153.5 -368t-370.5 -152t-371 152.5t-154 367.5q0 219 154 368.5t380 149.5zM572 649q-60 0 -102 -43.5t-42 -106.5q0 -62 42.5 -106t101.5 -44q60 0 102.5 44t42.5 106q0 63 -42 106.5t-103 43.5zM517 1329l211 -232 +h-211l-237 232h237z" /> + <glyph glyph-name="ocircumflex" unicode="ô" horiz-adv-x="1144" +d="M582 1018q212 0 363.5 -152.5t151.5 -365.5q0 -216 -153.5 -368t-370.5 -152t-371 152.5t-154 367.5q0 219 154 368.5t380 149.5zM572 649q-60 0 -102 -43.5t-42 -106.5q0 -62 42.5 -106t101.5 -44q60 0 102.5 44t42.5 106q0 63 -42 106.5t-103 43.5zM565 1361l279 -268 +h-234l-45 49l-51 -49h-214z" /> + <glyph glyph-name="odieresis" unicode="ö" horiz-adv-x="1144" +d="M582 1018q212 0 363.5 -152.5t151.5 -365.5q0 -216 -153.5 -368t-370.5 -152t-371 152.5t-154 367.5q0 219 154 368.5t380 149.5zM572 649q-60 0 -102 -43.5t-42 -106.5q0 -62 42.5 -106t101.5 -44q60 0 102.5 44t42.5 106q0 63 -42 106.5t-103 43.5zM320 1439 +q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5zM820 1437q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5z" /> + <glyph glyph-name="otilde" unicode="õ" horiz-adv-x="1144" +d="M582 1018q212 0 363.5 -152.5t151.5 -365.5q0 -216 -153.5 -368t-370.5 -152t-371 152.5t-154 367.5q0 219 154 368.5t380 149.5zM572 649q-60 0 -102 -43.5t-42 -106.5q0 -62 42.5 -106t101.5 -44q60 0 102.5 44t42.5 106q0 63 -42 106.5t-103 43.5zM669 1322h154 +q0 -101 -47 -166t-120 -65q-41 0 -80 24l-45 28q-10 6 -21 7q-31 2 -40 -52h-149q0 108 43.5 168t122.5 60q40 0 77 -23l40 -24q11 -7 25 -8q34 -2 40 51z" /> + <glyph glyph-name="uacute" unicode="ú" horiz-adv-x="1107" +d="M109 983h374v-563q0 -85 71 -85q70 0 70 85v563h374v-556q0 -194 -129 -327.5t-316 -133.5q-213 0 -343 155q-101 121 -101 336v526zM609 1329h237l-237 -232h-211z" /> + <glyph glyph-name="ugrave" unicode="ù" horiz-adv-x="1107" +d="M109 983h374v-563q0 -85 71 -85q70 0 70 85v563h374v-556q0 -194 -129 -327.5t-316 -133.5q-213 0 -343 155q-101 121 -101 336v526zM499 1329l211 -232h-211l-237 232h237z" /> + <glyph glyph-name="ucircumflex" unicode="û" horiz-adv-x="1107" +d="M109 983h374v-563q0 -85 71 -85q70 0 70 85v563h374v-556q0 -194 -129 -327.5t-316 -133.5q-213 0 -343 155q-101 121 -101 336v526zM547 1361l279 -268h-234l-45 49l-51 -49h-214z" /> + <glyph glyph-name="udieresis" unicode="ü" horiz-adv-x="1107" +d="M109 983h374v-563q0 -85 71 -85q70 0 70 85v563h374v-556q0 -194 -129 -327.5t-316 -133.5q-213 0 -343 155q-101 121 -101 336v526zM302 1439q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5z +M802 1437q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5z" /> + <glyph glyph-name="dagger" unicode="†" +d="M678 -259h-333v867h-163v375h163v382h333v-382h164v-375h-164v-867z" /> + <glyph glyph-name="degree" unicode="°" horiz-adv-x="804" +d="M401 1399q149 0 250.5 -103t101.5 -254q0 -144 -103.5 -245.5t-251.5 -101.5q-142 0 -244.5 103.5t-102.5 246.5q0 147 102.5 250.5t247.5 103.5zM402 1239q-76 0 -131 -57t-55 -135q0 -77 54.5 -134t127.5 -57q78 0 134 55.5t56 133.5q0 79 -55.5 136.5t-130.5 57.5z +" /> + <glyph glyph-name="cent" unicode="¢" horiz-adv-x="1164" +d="M908 1082v-283q-46 17 -81 17q-66 0 -114.5 -50t-48.5 -119q0 -71 49 -120.5t118 -49.5q34 0 77 15v-289q-63 -22 -99 -28v-175h-343v248q-210 148 -210 392q0 243 210 399v321h343v-248q57 -11 99 -30z" /> + <glyph glyph-name="sterling" unicode="£" horiz-adv-x="1164" +d="M990 384v-384h-885l122 337l25 66q32 88 40 161h-90v187h59q-49 107 -49 213q0 175 124.5 301.5t297.5 126.5q176 0 300.5 -119.5t124.5 -287.5l-1 -44h-331v11l-1 18q-4 65 -70 65q-33 0 -56.5 -28t-23.5 -68q0 -38 27 -100q22 -51 35 -88h209v-187h-203 +q-3 -63 -38 -180h384z" /> + <glyph glyph-name="section" unicode="§" horiz-adv-x="1051" +d="M61 -84l203 218q96 -87 145 -116.5t98 -29.5q35 0 62 17.5t26 39.5q-3 39 -94 78q-246 104 -334.5 193t-88.5 232q0 183 170 289q-130 105 -130 230q0 142 119.5 237t298.5 95q233 0 414 -175l-177 -203q-115 97 -211 97q-74 0 -74 -55q0 -36 63 -60l53 -21 +q212 -82 299.5 -175.5t87.5 -236.5q0 -174 -149 -286q122 -104 122 -243q0 -152 -123.5 -250t-314.5 -98q-265 0 -465 223zM537 641q-32 0 -54.5 -22t-22.5 -53q0 -32 22.5 -54t54.5 -22t54.5 22t22.5 54q0 31 -22.5 53t-54.5 22z" /> + <glyph glyph-name="bullet" unicode="•" horiz-adv-x="1365" +d="M685 978q118 0 201 -83t83 -201t-83 -201t-201 -83t-201 83t-83 201t83 201t201 83z" /> + <glyph glyph-name="paragraph" unicode="¶" horiz-adv-x="1533" +d="M680 -259v1113q0 180 -130 180q-54 0 -92.5 -37.5t-38.5 -89.5q0 -54 37.5 -92.5t89.5 -38.5q41 0 83 32v-370q-60 -6 -90 -6q-188 0 -324.5 138.5t-136.5 328.5q0 196 138 331t339 135h150h476v-1624h-191v1310h-112v-1310h-198z" /> + <glyph glyph-name="germandbls" unicode="ß" horiz-adv-x="1163" +d="M529 565v253l23 -1q60 0 95 28t35 77q0 44 -29.5 72.5t-76.5 28.5q-104 0 -104 -115v-908h-374v965q0 177 126.5 301.5t306.5 124.5q188 0 312.5 -121t124.5 -305q0 -116 -73 -233q111 -77 156.5 -154t45.5 -187q0 -172 -126.5 -298.5t-299.5 -126.5q-73 0 -142 26v321 +q42 -15 74 -15q53 0 89 36.5t36 92.5q0 66 -46.5 98.5t-152.5 39.5z" /> + <glyph glyph-name="registered" unicode="®" horiz-adv-x="1533" +d="M688 863v-563h-242v777h305q136 0 219 -71t83 -188q0 -119 -103 -198l136 -320h-241l-115 251v202h15q63 0 63 58q0 52 -81 52h-39zM778 1399q288 0 496.5 -212t208.5 -504q0 -297 -210 -507t-507 -210t-507 210t-210 507q0 300 211.5 508t517.5 208zM776 1285 +q-256 0 -434 -175t-178 -427q0 -249 176.5 -425.5t425.5 -176.5q250 0 426.5 176.5t176.5 425.5q0 246 -175.5 424t-417.5 178z" /> + <glyph glyph-name="copyright" unicode="©" horiz-adv-x="1533" +d="M929 663l253 -7q-24 -179 -132.5 -277t-283.5 -98q-180 0 -299 117t-119 294q0 167 123 285.5t295 118.5q163 0 269.5 -84.5t145.5 -245.5l-259 -16q-41 112 -155 112q-75 0 -123 -49.5t-48 -126.5q0 -74 47 -122.5t120 -48.5q150 0 166 148zM778 1399q288 0 496.5 -212 +t208.5 -504q0 -297 -210 -507t-507 -210t-507 210t-210 507q0 300 211.5 508t517.5 208zM776 1285q-256 0 -434 -175t-178 -427q0 -249 176.5 -425.5t425.5 -176.5q250 0 426.5 176.5t176.5 425.5q0 246 -175.5 424t-417.5 178z" /> + <glyph glyph-name="trademark" unicode="™" horiz-adv-x="1576" +d="M427 1136v-549h-242v549h-180v228h602v-228h-180zM672 587v558q0 105 65.5 171.5t168.5 66.5q124 0 189 -106q73 106 198 106q108 0 165.5 -66.5t57.5 -191.5v-538h-242v504q0 58 -27 58q-31 0 -31 -43v-11v-508h-242v504q0 58 -28 58q-32 0 -32 -58v-504h-242z" /> + <glyph glyph-name="acute" unicode="´" +d="M567 1329h237l-237 -232h-211z" /> + <glyph glyph-name="dieresis" unicode="¨" +d="M260 1439q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5zM760 1437q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5z" /> + <glyph glyph-name="notequal" unicode="≠" +d="M518 1009l146 271l224 -125l-83 -146h151v-305h-274l-79 -140h351v-305h-462l-123 -224l-224 125l59 99h-136v305h247l80 140h-326v305h449z" /> + <glyph glyph-name="AE" unicode="Æ" horiz-adv-x="1565" +d="M1443 837v-306h-265q-99 0 -99 -67q0 -72 112 -72h278v-392h-784v867q0 71 -18 100.5t-62 29.5q-90 0 -90 -112v-199h107v-358h-107v-328h-406v867q0 218 106 348q69 84 175 134t216 50q148 0 274 -86q82 52 229 52h360v-388h-259q-104 0 -104 -69q0 -71 107 -71h230z +" /> + <glyph glyph-name="Oslash" unicode="Ø" horiz-adv-x="1544" +d="M1298 1171q191 -212 191 -488q0 -296 -210.5 -506.5t-506.5 -210.5q-249 0 -449 158l-116 -124l-64 59l116 123q-204 211 -204 501q0 296 210 506t507 210q264 0 466 -171l114 122l61 -56zM1015 867l-413 -443q81 -55 170 -55q124 0 212.5 92t88.5 222q0 95 -58 184z +M540 483l418 447q-89 67 -186 67q-125 0 -213 -92t-88 -222q0 -109 69 -200z" /> + <glyph glyph-name="infinity" unicode="∞" horiz-adv-x="1365" +d="M689 541q-146 -174 -332 -174q-141 0 -231.5 93.5t-90.5 238.5q0 141 93 233t235 92q177 0 315 -173q137 173 325 173q144 0 235.5 -92t91.5 -237t-92.5 -237t-238.5 -92q-176 0 -310 175zM800 696q83 -117 167 -117q50 0 84.5 33.5t34.5 83.5q0 49 -35 82.5t-85 33.5 +q-84 0 -166 -116zM566 695q-83 116 -168 116q-50 0 -84.5 -33.5t-34.5 -82.5t35 -82.5t85 -33.5q83 0 167 116z" /> + <glyph glyph-name="plusminus" unicode="±" horiz-adv-x="1533" +d="M621 699h-366v282h366v384h290v-384h366v-282h-366v-329h-290v329zM255 270h1022v-270h-1022v270z" /> + <glyph glyph-name="lessequal" unicode="≤" +d="M955 1359v-340l-489 -139l489 -137v-340l-887 326v305zM955 350v-320h-887v320h887z" /> + <glyph glyph-name="greaterequal" unicode="≥" +d="M69 403v340l488 137l-489 139v340l887 -325v-305zM68 30v320h887v-320h-887z" /> + <glyph glyph-name="yen" unicode="¥" horiz-adv-x="1164" +d="M1132 1365l-294 -512h113v-191h-164v-82h164v-191h-164v-389h-406v389h-163v191h163v82h-163v191h110l-295 512h412l135 -281l148 281h404z" /> + <glyph glyph-name="mu" unicode="µ" +d="M48 -352v1335h308v-498q0 -113 24 -159q45 -87 137 -87q152 0 152 250v494h308v-983h-308v118q-51 -136 -159 -136q-97 0 -154 113v-447h-308z" /> + <glyph glyph-name="partialdiff" unicode="∂" +d="M104 1090l39 266q421 -43 636.5 -247.5t215.5 -560.5q0 -263 -132.5 -414t-363.5 -151q-207 0 -340 133.5t-133 340.5q0 181 118 303.5t293 122.5q138 0 230 -71q-73 127 -178 183q-140 76 -385 95zM509 629q-73 0 -125 -55t-52 -131q0 -78 51.5 -133t123.5 -55 +q74 0 125 55t51 133q0 79 -50 132.5t-124 53.5z" /> + <glyph glyph-name="summation" unicode="∑" horiz-adv-x="1365" +d="M1291 1536v-542h-311l-38 224h-485l491 -677l-488 -735h500l22 236h327v-554h-1240v366l469 686l-469 629v367h1222z" /> + <glyph glyph-name="product" unicode="∏" horiz-adv-x="1365" +d="M32 1536h1300v-276h-145v-1496h145v-276h-580v276h126v1496h-391v-1496h122v-276h-577v276h148v1496h-148v276z" /> + <glyph glyph-name="pi" unicode="π" horiz-adv-x="1321" +d="M190 0v727h-149v255h1238v-255h-148v-727h-323v727h-295v-727h-323z" /> + <glyph glyph-name="integral" unicode="∫" +d="M57 -491l55 327q53 -21 91 -21q56 0 90 35q21 21 27 49.5t6 104.5v116v720v116q0 177 10 246t45 131q115 203 395 203q77 0 191 -20l-55 -328q-52 20 -93 20q-70 0 -95.5 -40t-25.5 -149v-825q0 -290 -9 -366t-53 -148q-116 -190 -395 -190q-101 0 -184 19z" /> + <glyph glyph-name="ordfeminine" unicode="ª" horiz-adv-x="781" +d="M418 1014v-235q-26 -4 -44 -4q-139 0 -233 89.5t-94 222.5q0 131 95 221.5t231 90.5q151 0 238.5 -85.5t87.5 -231.5v-295h-239v279q0 99 -84 99q-35 0 -61 -24.5t-26 -58.5q0 -33 23 -56.5t56 -23.5q27 0 50 12zM715 706v-129h-623v129h623z" /> + <glyph glyph-name="ordmasculine" unicode="º" horiz-adv-x="744" +d="M371 1399q138 0 233.5 -90.5t95.5 -220.5q0 -129 -96 -220.5t-233 -91.5q-135 0 -231.5 91.5t-96.5 220.5q0 130 95.5 220.5t232.5 90.5zM371 1173q-36 0 -61 -25t-25 -60q0 -36 25.5 -61t60.5 -25q36 0 61.5 25t25.5 61q0 35 -25.5 60t-61.5 25zM697 706v-129h-624v129 +h624z" /> + <glyph glyph-name="Omega" unicode="Ω" horiz-adv-x="1365" +d="M56 0v300h253q-261 166 -261 451q0 275 183 461.5t452 186.5q268 0 451 -187t183 -461q0 -285 -261 -451h253v-300h-559v276q215 109 215 421q0 173 -80 285.5t-203 112.5q-122 0 -202.5 -112.5t-80.5 -283.5q0 -313 215 -423v-276h-558z" /> + <glyph glyph-name="ae" unicode="æ" horiz-adv-x="1802" +d="M1755 441h-582q-14 48 -14 80q0 39 19 95h206q-23 110 -131 110q-73 0 -118 -58t-45 -152q0 -100 44 -160.5t116 -60.5q63 0 112 61l213 -255q-151 -121 -326 -121q-75 0 -173 20h-363v458q0 92 -32.5 134.5t-102.5 42.5q-60 0 -102 -43t-42 -104q0 -59 40 -99.5 +t99 -40.5q37 0 83 28v-391q-53 -5 -75 -5q-221 0 -374 149.5t-153 365.5q0 211 149 366.5t353 155.5q192 0 344 -131q149 131 335 131q219 0 372 -144.5t153 -351.5q0 -26 -5 -80z" /> + <glyph glyph-name="oslash" unicode="ø" horiz-adv-x="1144" +d="M989 813q107 -148 107 -314q0 -214 -154 -366.5t-370 -152.5q-196 0 -350 132l-142 -130l-58 61l142 130q-117 149 -117 326q0 217 152.5 367.5t372.5 150.5q212 0 362 -141l130 119l57 -61zM717 564l-226 -207q41 -22 81 -22q65 0 111.5 48t46.5 116q0 28 -13 65z +M434 419l232 212q-49 31 -95 31q-66 0 -112 -47.5t-46 -116.5q0 -39 21 -79z" /> + <glyph glyph-name="questiondown" unicode="¿" horiz-adv-x="1087" +d="M366 489h371v-63q0 -125 -28 -184.5t-103 -92.5l-67 -29q-77 -34 -77 -97q0 -36 25 -61t61 -25q98 0 98 136h345q0 -182 -83 -297q-63 -86 -162 -136t-205 -50q-188 0 -316.5 125t-128.5 308q0 228 184 320q60 30 73 52t13 94zM545 1018q103 0 169.5 -66.5t66.5 -169.5 +q0 -100 -69 -169.5t-167 -69.5t-168.5 71t-70.5 169t70 166.5t169 68.5z" /> + <glyph glyph-name="exclamdown" unicode="¡" horiz-adv-x="884" +d="M251 -375l7 847h355l21 -847h-383zM444 1018q103 0 169.5 -66.5t66.5 -169.5q0 -100 -69 -169.5t-167 -69.5t-168.5 71t-70.5 169t70 166.5t169 68.5z" /> + <glyph glyph-name="logicalnot" unicode="¬" +d="M599 0v286h-531v320h887v-606h-356z" /> + <glyph glyph-name="radical" unicode="√" horiz-adv-x="1365" +d="M1365 1693v-285h-327l-339 -1408h-406l-105 497h-188v285h383l46 -194q21 -86 35 -296h20q29 290 110 621l191 780h580z" /> + <glyph glyph-name="florin" unicode="ƒ" horiz-adv-x="1164" +d="M818 912h166l-69 -392h-166l-41 -230q-25 -144 -92 -244q-86 -129 -226 -210.5t-278 -81.5l-39 1l69 392h19q71 0 117.5 47t61.5 132l116 657q30 167 119 283q90 115 220.5 184.5t256.5 69.5l39 -1l-69 -393q-12 1 -19 1q-99 0 -149 -87q-19 -33 -36 -128z" /> + <glyph glyph-name="approxequal" unicode="≈" +d="M190 713l-175 124q117 298 319 298q60 0 225 -64l75 -30q39 -15 69 -15q40 0 66 18t65 74l175 -124q-66 -161 -139 -228.5t-183 -67.5q-68 0 -229 66q-100 41 -143 41q-61 0 -125 -92zM190 233l-175 123q117 299 319 299q61 0 225 -65l75 -30q39 -15 70 -15q65 0 130 92 +l175 -123q-66 -162 -139 -229.5t-182 -67.5q-69 0 -230 66q-100 42 -143 42q-61 0 -125 -92z" /> + <glyph glyph-name="Delta" unicode="∆" horiz-adv-x="1348" +d="M18 0l474 1365h359l478 -1365h-1311zM458 300h424l-208 701z" /> + <glyph glyph-name="guillemotleft" unicode="«" horiz-adv-x="763" +d="M493 146l-145 332l145 350h188l-143 -350l143 -332h-188zM223 146l-141 332l141 350h192l-143 -350l143 -332h-192z" /> + <glyph glyph-name="guillemotright" unicode="»" horiz-adv-x="763" +d="M270 828l145 -332l-145 -350h-188l143 350l-143 332h188zM540 828l141 -332l-141 -350h-192l143 350l-143 332h192z" /> + <glyph glyph-name="ellipsis" unicode="…" horiz-adv-x="2325" +d="M386 448q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5zM1161 448q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5zM1937 448q97 0 167.5 -71 +t70.5 -169q0 -97 -70 -166t-169 -69q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t168 69.5z" /> + <glyph glyph-name="Agrave" unicode="À" horiz-adv-x="1212" +d="M632 685v-360h-117v-325h-406v868q0 252 137.5 391.5t386.5 139.5q240 0 355 -126.5t115 -390.5v-882h-406v855q0 80 -19 111t-68 31q-95 0 -95 -142v-170h117zM260 1752h279l249 -273h-249z" /> + <glyph glyph-name="Atilde" unicode="Ã" horiz-adv-x="1212" +d="M632 685v-360h-117v-325h-406v868q0 252 137.5 391.5t386.5 139.5q240 0 355 -126.5t115 -390.5v-882h-406v855q0 80 -19 111t-68 31q-95 0 -95 -142v-170h117zM722 1744h176q-5 -124 -51 -195.5t-120 -71.5q-47 0 -131 47q-39 22 -55 22q-33 0 -39 -61h-187 +q25 267 192 267q46 0 103 -31l40 -21q23 -13 40 -13q33 0 33 43q0 5 -1 14z" /> + <glyph glyph-name="Otilde" unicode="Õ" horiz-adv-x="1543" +d="M784 1399q290 0 497.5 -211t207.5 -505q0 -299 -209 -508t-508 -209q-297 0 -507 210t-210 507q0 300 211.5 508t517.5 208zM772 997q-125 0 -213 -92t-88 -222t88.5 -222t212.5 -92q126 0 213.5 91.5t87.5 222.5t-87.5 222.5t-213.5 91.5zM887 1744h176 +q-6 -124 -51.5 -195.5t-119.5 -71.5q-47 0 -132 47q-38 22 -54 22q-33 0 -39 -61h-187q25 267 191 267q46 0 103 -31l40 -21q23 -13 40 -13q33 0 33 43v14z" /> + <glyph glyph-name="OE" unicode="Œ" horiz-adv-x="1939" +d="M1816 837v-303h-265q-101 0 -101 -67q0 -72 103 -72h291v-395h-344q-105 0 -173 23t-141 83q-198 -140 -414 -140q-324 0 -539 252q-178 207 -178 466q0 295 212.5 505t510.5 210q228 0 408 -134q73 59 129 79.5t144 20.5h385v-392h-269q-95 0 -95 -67q0 -69 101 -69h235 +zM778 997q-127 0 -217 -92t-90 -221q0 -130 90 -222.5t217 -92.5t217.5 92.5t90.5 222.5t-90 221.5t-218 91.5z" /> + <glyph glyph-name="oe" unicode="œ" horiz-adv-x="1797" +d="M1750 438h-581q-13 49 -13 78q0 33 19 98h204q-19 112 -132 112q-71 0 -116 -61t-45 -156q0 -94 44 -154t112 -60q60 0 116 57l209 -255q-152 -117 -334 -117q-174 0 -331 121q-152 -121 -338 -121q-215 0 -365.5 150t-150.5 363q0 219 149.5 371.5t364.5 152.5 +q187 0 340 -128q166 128 333 128q254 0 408 -190q114 -141 114 -307q0 -25 -7 -82zM572 648q-62 0 -103 -44t-41 -112q0 -60 39.5 -102t96.5 -42q64 0 105 40t41 104q0 72 -37 114t-101 42z" /> + <glyph glyph-name="endash" unicode="–" +d="M961 738v-265h-897v265h897z" /> + <glyph glyph-name="emdash" unicode="—" horiz-adv-x="1370" +d="M1370 738v-265h-1370v265h1370z" /> + <glyph glyph-name="quotedblleft" unicode="“" horiz-adv-x="1309" +d="M934 1393v-73q100 -6 163 -71t63 -161q0 -101 -67.5 -169.5t-167.5 -68.5q-97 0 -163 69t-66 171q0 106 64.5 188t173.5 115zM388 1392v-72q100 -6 163 -71t63 -161q0 -101 -67.5 -169.5t-167.5 -68.5q-97 0 -163 69t-66 171q0 106 64.5 188t173.5 114z" /> + <glyph glyph-name="quotedblright" unicode="”" horiz-adv-x="1309" +d="M376 850v73q-100 6 -163 70.5t-63 160.5q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -114zM922 850v73q-100 6 -163 70.5t-63 160.5q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -114z" /> + <glyph glyph-name="quoteleft" unicode="‘" horiz-adv-x="763" +d="M388 1392v-72q100 -6 163 -71t63 -161q0 -101 -67.5 -169.5t-167.5 -68.5q-97 0 -163 69t-66 171q0 106 64.5 188t173.5 114z" /> + <glyph glyph-name="quoteright" unicode="’" horiz-adv-x="763" +d="M376 850v73q-100 6 -163 70.5t-63 160.5q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -114z" /> + <glyph glyph-name="divide" unicode="÷" horiz-adv-x="1533" +d="M761 473q77 0 131.5 -53t54.5 -129q0 -74 -53 -126.5t-129 -52.5q-78 0 -128.5 50.5t-50.5 128.5q0 74 52 128t123 54zM761 1280q78 0 132 -53t54 -129q0 -74 -53 -126.5t-129 -52.5q-78 0 -128.5 50.5t-50.5 128.5q0 74 51.5 128t123.5 54zM255 841h1022v-290h-1022v290 +z" /> + <glyph glyph-name="lozenge" unicode="◊" horiz-adv-x="1365" +d="M683 1419l532 -736l-532 -736l-532 736zM683 1237l-404 -554l404 -555l403 555z" /> + <glyph glyph-name="ydieresis" unicode="ÿ" horiz-adv-x="1098" +d="M238 -437v325q76 -32 133 -32q182 0 236 205q-98 -58 -192 -58q-139 0 -229 103.5t-90 263.5v627h374v-536q0 -89 74 -89q71 0 71 98v527h374v-890q0 -249 -140 -402q-167 -182 -404 -182q-104 0 -207 40zM297 1439q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5 +t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5zM797 1437q82 0 137 -49.5t55 -124.5q0 -74 -58 -129.5t-136 -55.5q-74 0 -129.5 55.5t-55.5 129.5q0 71 55.5 122.5t131.5 51.5z" /> + <glyph glyph-name="Ydieresis" unicode="Ÿ" horiz-adv-x="1030" +d="M1099 1365l-386 -607v-758h-406v758l-389 607h412l176 -281l189 281h404zM280 1809q75 0 127.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-127.5 -52.5q-74 0 -126.5 52.5t-52.5 127.5q0 74 52.5 126.5t126.5 52.5zM749 1809q75 0 127.5 -52.5t52.5 -126.5 +q0 -75 -52.5 -127.5t-127.5 -52.5q-74 0 -126.5 52.5t-52.5 127.5q0 74 52.5 126.5t126.5 52.5z" /> + <glyph glyph-name="fraction" unicode="∕" horiz-adv-x="250" +d="M482 1365l-551 -1365h-163l554 1365h160z" /> + <glyph glyph-name="Euro" unicode="€" horiz-adv-x="1163" +d="M1106 203l-14 -20q-83 -121 -186.5 -169.5t-223.5 -48.5q-223 0 -352.5 148t-134.5 407h-152l20 119h132v100h-152l20 121h132q9 258 140 398.5t347 140.5q135 0 228.5 -50t189.5 -180l-312 -227l-10 23q-17 37 -35.5 55t-60.5 18q-98 0 -98 -125v-53h272l-18 -121h-254 +v-98h272l-18 -121h-254v-67q0 -125 98 -125q38 0 62 19.5t47 84.5z" /> + <glyph glyph-name="guilsinglleft" unicode="‹" horiz-adv-x="497" +d="M223 146l-141 332l141 350h192l-143 -350l143 -332h-192z" /> + <glyph glyph-name="guilsinglright" unicode="›" horiz-adv-x="497" +d="M274 828l141 -332l-141 -350h-192l143 350l-143 332h192z" /> + <glyph glyph-name="fi" unicode="" horiz-adv-x="1146" +d="M609 776v-392h-126v-384h-374v847q0 167 68 282q61 101 183 178t223 77q10 0 33 -2v-392q-75 -17 -104 -56.5t-29 -123.5v-34h126zM1035 997v-997h-374v997h374zM868 1399q74 0 128 -51t54 -120q0 -74 -53.5 -123.5t-133.5 -49.5q-76 0 -125 50t-49 128q0 69 52.5 117.5 +t126.5 48.5z" /> + <glyph glyph-name="fl" unicode="" horiz-adv-x="1144" +d="M609 776v-392h-126v-384h-374v847q0 192 92 317q69 94 179 156t207 62h22v-392q-71 -17 -98.5 -56.5t-27.5 -123.5v-34h126zM1035 1365v-1365h-374v1365h374z" /> + <glyph glyph-name="daggerdbl" unicode="‡" +d="M352 669h-170v355h170v341h320v-341h170v-355h-170v-218h170v-355h-170v-355h-320v355h-170v355h170v218z" /> + <glyph glyph-name="periodcentered" unicode="∙" horiz-adv-x="775" +d="M386 737q98 0 168.5 -71t70.5 -169t-70 -166.5t-169 -68.5q-103 0 -169.5 66.5t-66.5 169.5q0 100 69 169.5t167 69.5z" /> + <glyph glyph-name="quotesinglbase" unicode="‚" horiz-adv-x="763" +d="M376 -104v73q-100 6 -163 71t-63 161q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -115z" /> + <glyph glyph-name="quotedblbase" unicode="„" horiz-adv-x="1309" +d="M376 -104v73q-100 6 -163 71t-63 161q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -115zM922 -104v73q-100 6 -163 71t-63 161q0 101 67.5 169.5t167.5 68.5q97 0 163 -69t66 -171q0 -106 -64.5 -188t-173.5 -115z" /> + <glyph glyph-name="perthousand" unicode="‰" horiz-adv-x="2744" +d="M487 1384q148 0 253 -104.5t105 -252.5q0 -149 -104.5 -253.5t-253.5 -104.5q-148 0 -252.5 105t-104.5 253q0 147 105 252t252 105zM488 1184q-65 0 -111 -46t-46 -111t46 -111t111 -46t111 46t46 111t-46 111t-111 46zM1278 1365l-551 -1365h-122l554 1365h119z +M1411 702q147 0 252 -105t105 -253t-105 -253t-252 -105q-148 0 -253 105t-105 253t105 253t253 105zM1411 502q-65 0 -111 -46t-46 -111q0 -66 46 -112t111 -46t111 46t46 112q0 65 -46 111t-111 46zM2257 702q147 0 252 -105t105 -253t-104.5 -253t-252.5 -105 +q-149 0 -253.5 105t-104.5 253t105 253t253 105zM2257 502q-65 0 -111 -46t-46 -111q0 -66 46 -112t111 -46t111 46t46 112q0 65 -46 111t-111 46z" /> + <glyph glyph-name="Acircumflex" unicode="Â" horiz-adv-x="1212" +d="M632 685v-360h-117v-325h-406v868q0 252 137.5 391.5t386.5 139.5q240 0 355 -126.5t115 -390.5v-882h-406v855q0 80 -19 111t-68 31q-95 0 -95 -142v-170h117zM603 1775l301 -298h-239l-62 60l-58 -60h-235z" /> + <glyph glyph-name="Ecircumflex" unicode="Ê" horiz-adv-x="987" +d="M865 834v-304h-265q-54 0 -76.5 -16t-22.5 -54q0 -43 23 -56.5t94 -13.5h273v-390h-319q-225 0 -344 107.5t-119 310.5v535q0 196 112.5 304t316.5 108h353v-392h-259q-105 0 -105 -68q0 -40 25 -55.5t89 -15.5h224zM571 1775l301 -298h-239l-62 60l-58 -60h-234z" /> + <glyph glyph-name="Aacute" unicode="Á" horiz-adv-x="1212" +d="M632 685v-360h-117v-325h-406v868q0 252 137.5 391.5t386.5 139.5q240 0 355 -126.5t115 -390.5v-882h-406v855q0 80 -19 111t-68 31q-95 0 -95 -142v-170h117zM993 1751l-279 -273h-249l249 273h279z" /> + <glyph glyph-name="Edieresis" unicode="Ë" horiz-adv-x="987" +d="M865 834v-304h-265q-54 0 -76.5 -16t-22.5 -54q0 -43 23 -56.5t94 -13.5h273v-390h-319q-225 0 -344 107.5t-119 310.5v535q0 196 112.5 304t316.5 108h353v-392h-259q-105 0 -105 -68q0 -40 25 -55.5t89 -15.5h224zM341 1809q74 0 126.5 -52.5t52.5 -126.5 +q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5zM811 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5z" /> + <glyph glyph-name="Egrave" unicode="È" horiz-adv-x="987" +d="M865 834v-304h-265q-54 0 -76.5 -16t-22.5 -54q0 -43 23 -56.5t94 -13.5h273v-390h-319q-225 0 -344 107.5t-119 310.5v535q0 196 112.5 304t316.5 108h353v-392h-259q-105 0 -105 -68q0 -40 25 -55.5t89 -15.5h224zM216 1752h280l249 -273h-249z" /> + <glyph glyph-name="Iacute" unicode="Í" horiz-adv-x="679" +d="M543 1365v-1365h-406v1365h406zM727 1751l-280 -273h-249l249 273h280z" /> + <glyph glyph-name="Icircumflex" unicode="Î" horiz-adv-x="679" +d="M543 1365v-1365h-406v1365h406zM335 1775l302 -298h-239l-63 60l-58 -60h-234z" /> + <glyph glyph-name="Idieresis" unicode="Ï" horiz-adv-x="678" +d="M543 1365v-1365h-406v1365h406zM116 1801q71 0 121 -50t50 -121q0 -70 -50 -120t-121 -50q-70 0 -120 50t-50 120q0 71 50 121t120 50zM562 1801q71 0 121 -50t50 -121q0 -70 -50 -120t-121 -50q-70 0 -120 50t-50 120q0 71 50 121t120 50z" /> + <glyph glyph-name="Igrave" unicode="Ì" horiz-adv-x="679" +d="M542 1365v-1365h-406v1365h406zM-7 1752h280l249 -273h-249z" /> + <glyph glyph-name="Oacute" unicode="Ó" horiz-adv-x="1543" +d="M784 1399q290 0 497.5 -211t207.5 -505q0 -299 -209 -508t-508 -209q-297 0 -507 210t-210 507q0 300 211.5 508t517.5 208zM772 997q-125 0 -213 -92t-88 -222t88.5 -222t212.5 -92q126 0 213.5 91.5t87.5 222.5t-87.5 222.5t-213.5 91.5zM1159 1751l-280 -273h-249 +l249 273h280z" /> + <glyph glyph-name="Ocircumflex" unicode="Ô" horiz-adv-x="1543" +d="M784 1399q290 0 497.5 -211t207.5 -505q0 -299 -209 -508t-508 -209q-297 0 -507 210t-210 507q0 300 211.5 508t517.5 208zM772 997q-125 0 -213 -92t-88 -222t88.5 -222t212.5 -92q126 0 213.5 91.5t87.5 222.5t-87.5 222.5t-213.5 91.5zM768 1775l301 -298h-239 +l-62 60l-58 -60h-235z" /> + <glyph glyph-name="Ograve" unicode="Ò" horiz-adv-x="1543" +d="M784 1399q290 0 497.5 -211t207.5 -505q0 -299 -209 -508t-508 -209q-297 0 -507 210t-210 507q0 300 211.5 508t517.5 208zM772 997q-125 0 -213 -92t-88 -222t88.5 -222t212.5 -92q126 0 213.5 91.5t87.5 222.5t-87.5 222.5t-213.5 91.5zM425 1752h279l249 -273h-249z +" /> + <glyph glyph-name="Uacute" unicode="Ú" horiz-adv-x="1206" +d="M1096 1365v-885q0 -234 -139.5 -374t-371.5 -140q-231 0 -353.5 136t-122.5 391v872h406v-871q0 -125 89 -125q86 0 86 125v871h406zM990 1751l-280 -273h-249l249 273h280z" /> + <glyph glyph-name="Ucircumflex" unicode="Û" horiz-adv-x="1206" +d="M1096 1365v-885q0 -234 -139.5 -374t-371.5 -140q-231 0 -353.5 136t-122.5 391v872h406v-871q0 -125 89 -125q86 0 86 125v871h406zM598 1775l301 -298h-239l-62 60l-58 -60h-234z" /> + <glyph glyph-name="Ugrave" unicode="Ù" horiz-adv-x="1206" +d="M1096 1365v-885q0 -234 -139.5 -374t-371.5 -140q-231 0 -353.5 136t-122.5 391v872h406v-871q0 -125 89 -125q86 0 86 125v871h406zM257 1752h280l249 -273h-249z" /> + <glyph glyph-name="dotlessi" unicode="ı" horiz-adv-x="593" +d="M483 997v-997h-374v997h374z" /> + <glyph glyph-name="circumflex" unicode="ˆ" +d="M505 1361l279 -268h-234l-45 49l-51 -49h-214z" /> + <glyph glyph-name="tilde" unicode="˜" +d="M609 1322h154q0 -101 -47 -166t-120 -65q-41 0 -80 24l-45 28q-10 6 -21 7q-31 2 -40 -52h-149q0 108 43.5 168t122.5 60q40 0 77 -23l40 -24q11 -7 25 -8q34 -2 40 51z" /> + <glyph glyph-name="macron" unicode="ˉ" +d="M764 1298v-156h-504v156h504z" /> + <glyph glyph-name="breve" unicode="˘" +d="M579 1325h186q-43 -246 -253 -246q-209 0 -252 246h185q9 -86 67 -86q60 0 67 86z" /> + <glyph glyph-name="dotaccent" unicode="˙" +d="M512 1440q76 0 131.5 -53.5t55.5 -125.5q0 -78 -52.5 -128t-134.5 -50t-134.5 50t-52.5 128q0 72 55.5 125.5t131.5 53.5z" /> + <glyph glyph-name="ring" unicode="˚" +d="M512 1470q79 0 135.5 -56.5t56.5 -136.5t-56.5 -136.5t-135.5 -56.5q-80 0 -136.5 56.5t-56.5 136.5t56.5 136.5t136.5 56.5zM511 1339q-26 0 -44 -18t-18 -44t18 -44t44 -18q25 0 43 18t18 44t-18 44t-43 18z" /> + <glyph glyph-name="cedilla" unicode="¸" +d="M659 10q-26 -199 -240 -291l-135 136q55 72 55 130q0 9 -1 25h321z" /> + <glyph glyph-name="hungarumlaut" unicode="˝" +d="M410 1329h210l-210 -232h-184zM710 1329h210l-210 -232h-184z" /> + <glyph glyph-name="ogonek" unicode="˛" +d="M720 -377q-50 -11 -93 -11q-99 0 -170.5 62.5t-71.5 149.5q0 97 118 176h210q-113 -78 -113 -131q0 -28 21.5 -47.5t52.5 -19.5q15 0 43 9z" /> + <glyph glyph-name="caron" unicode="ˇ" +d="M505 1093l-265 268h214l51 -49l45 49h234z" /> + <glyph glyph-name="Scaron" unicode="Š" horiz-adv-x="847" +d="M778 1371v-389q-44 15 -68 15q-46 0 -79 -34t-33 -82q0 -41 36 -104l31 -54q84 -146 84 -282q0 -199 -141.5 -337t-345.5 -138q-98 0 -194 45v395q58 -37 103 -37q53 0 88.5 30.5t35.5 76.5q0 30 -57 131q-91 160 -91 320q0 193 137.5 332.5t328.5 139.5q84 0 165 -28z +M537 1477l-301 298h238l63 -60l58 60h234z" /> + <glyph glyph-name="scaron" unicode="š" horiz-adv-x="747" +d="M734 983v-394q-79 0 -108.5 -29.5t-37.5 -116.5q-26 -289 -224 -408q-105 -62 -298 -62h-52v396h17q90 0 128.5 37.5t44.5 131.5q8 153 28.5 215t83.5 123q110 107 305 107h113zM558 1093l-265 268h214l51 -49l45 49h234z" /> + <glyph glyph-name="brokenbar" unicode="¦" +d="M328 1365h368v-734h-368v734zM328 314h368v-655h-368v655z" /> + <glyph glyph-name="Eth" unicode="Ð" horiz-adv-x="1499" +d="M543 973v-157h217v-273h-217v-543h-406v543h-137v273h137v549h528q349 0 545 -158q234 -189 234 -513q0 -310 -199.5 -506t-514.5 -196q-37 0 -121 4v401h64q355 0 355 297q0 279 -348 279h-137z" /> + <glyph glyph-name="eth" unicode="ð" horiz-adv-x="1145" +d="M372 1365h270l274 -396q111 -161 146 -248.5t35 -202.5q0 -226 -149.5 -382t-366.5 -156q-229 0 -381 149.5t-152 374.5q0 199 129.5 340t339.5 170zM572 648q-60 0 -102 -43.5t-42 -105.5t42.5 -106t101.5 -44q60 0 102.5 44t42.5 106t-42 105.5t-103 43.5z" /> + <glyph glyph-name="Yacute" unicode="Ý" horiz-adv-x="1030" +d="M1099 1365l-386 -607v-758h-406v758l-389 607h412l176 -281l189 281h404zM902 1751l-279 -273h-249l249 273h279z" /> + <glyph glyph-name="yacute" unicode="ý" horiz-adv-x="1098" +d="M238 -437v325q76 -32 133 -32q182 0 236 205q-98 -58 -192 -58q-139 0 -229 103.5t-90 263.5v627h374v-536q0 -89 74 -89q71 0 71 98v527h374v-890q0 -249 -140 -402q-167 -182 -404 -182q-104 0 -207 40zM604 1329h237l-237 -232h-211z" /> + <glyph glyph-name="Thorn" unicode="Þ" horiz-adv-x="1151" +d="M109 1365h406v-169q62 12 114 12q208 0 349.5 -140t141.5 -347q0 -201 -127 -326q-116 -115 -350 -115h-62v359q123 0 123 94q0 86 -94 86q-95 0 -95 -119v-700h-406v1365z" /> + <glyph glyph-name="thorn" unicode="þ" horiz-adv-x="1185" +d="M87 1365h374v-368q77 20 140 20q223 0 376 -150t153 -368q0 -212 -152 -366t-360 -154q-34 0 -100 7v412q46 -37 92 -37q58 0 99.5 43t41.5 102t-43 100.5t-103 41.5q-144 0 -144 -199v-818h-374v1734z" /> + <glyph glyph-name="multiply" unicode="×" horiz-adv-x="1533" +d="M562 696l-298 298l205 205l298 -297l297 297l205 -205l-297 -298l297 -297l-205 -205l-297 297l-298 -297l-205 205z" /> + <glyph glyph-name="onesuperior" unicode="¹" horiz-adv-x="763" +d="M497 1365v-819h-232v819h232z" /> + <glyph glyph-name="twosuperior" unicode="²" horiz-adv-x="763" +d="M671 783v-237h-529l271 509q11 20 11 35q0 53 -57 53q-22 0 -38.5 -16.5t-16.5 -38.5q0 -25 22 -46l-105 -186q-137 84 -137 241q0 119 83.5 203.5t201.5 84.5q114 0 199.5 -85t85.5 -199q0 -70 -27 -122l-101 -196h137z" /> + <glyph glyph-name="threesuperior" unicode="³" horiz-adv-x="763" +d="M164 1365h434l-134 -314q137 -92 137 -246q0 -116 -87.5 -197.5t-212.5 -81.5q-71 0 -140 26v232q49 -32 90 -32t70 30.5t29 73.5q0 111 -156 111l61 162h-91v236z" /> + <glyph glyph-name="onehalf" unicode="½" horiz-adv-x="1775" +d="M497 1365v-819h-232v819h232zM1245 1365l-552 -1365h-163l555 1365h160zM1683 237v-237h-529l271 509q11 20 11 35q0 54 -57 54q-22 0 -38.5 -16.5t-16.5 -38.5q0 -26 22 -46l-105 -187q-137 84 -137 241q0 120 83.5 204.5t201.5 84.5q114 0 199.5 -85t85.5 -200 +q0 -70 -27 -122l-101 -196h137z" /> + <glyph glyph-name="onequarter" unicode="¼" horiz-adv-x="1775" +d="M497 1365v-819h-232v819h232zM1245 1365l-552 -1365h-163l555 1365h160zM1695 819v-819h-231v625l-103 -203h51v-178h-320l243 575h360z" /> + <glyph glyph-name="threequarters" unicode="¾" horiz-adv-x="1775" +d="M164 1365h434l-134 -314q137 -92 137 -246q0 -116 -87.5 -197.5t-212.5 -81.5q-71 0 -140 26v232q49 -32 90 -32t70 30.5t29 73.5q0 111 -156 111l61 162h-91v236zM1245 1365l-552 -1365h-163l555 1365h160zM1695 819v-819h-231v625l-102 -203h50v-178h-320l243 575h360z +" /> + <glyph glyph-name="glyph240" horiz-adv-x="1212" +d="M372 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5zM841 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5 +t127.5 52.5z" /> + <glyph glyph-name="glyph241" horiz-adv-x="1212" +d="M993 1751l-279 -273h-249l249 273h279z" /> + <glyph glyph-name="glyph242" horiz-adv-x="1212" +d="M260 1752h279l249 -273h-249z" /> + <glyph glyph-name="glyph243" horiz-adv-x="1212" +d="M603 1775l301 -298h-239l-62 60l-58 -60h-235z" /> + <glyph glyph-name="glyph244" horiz-adv-x="1212" +d="M722 1744h176q-5 -124 -51 -195.5t-120 -71.5q-47 0 -131 47q-39 22 -55 22q-33 0 -39 -61h-187q25 267 192 267q46 0 103 -31l40 -21q23 -13 40 -13q33 0 33 43q0 5 -1 14z" /> + <glyph glyph-name="glyph245" horiz-adv-x="1212" +d="M606 1841q80 0 136.5 -56.5t56.5 -135.5q0 -80 -56.5 -136.5t-136.5 -56.5t-136.5 56.5t-56.5 136.5q0 79 56.5 135.5t136.5 56.5zM605 1710q-25 0 -43.5 -18t-18.5 -43q0 -26 18 -44t44 -18t44.5 18t18.5 44q0 25 -18.5 43t-44.5 18z" /> + <glyph glyph-name="glyph246" horiz-adv-x="987" +d="M341 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5zM811 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5 +t127.5 52.5z" /> + <glyph glyph-name="glyph247" horiz-adv-x="987" +d="M1018 1751l-280 -273h-249l249 273h280z" /> + <glyph glyph-name="glyph248" horiz-adv-x="987" +d="M216 1752h280l249 -273h-249z" /> + <glyph glyph-name="glyph249" horiz-adv-x="987" +d="M571 1775l301 -298h-239l-62 60l-58 -60h-234z" /> + <glyph glyph-name="glyph250" horiz-adv-x="678" +d="M116 1801q71 0 121 -50t50 -121q0 -70 -50 -120t-121 -50q-70 0 -120 50t-50 120q0 71 50 121t120 50zM562 1801q71 0 121 -50t50 -121q0 -70 -50 -120t-121 -50q-70 0 -120 50t-50 120q0 71 50 121t120 50z" /> + <glyph glyph-name="glyph251" horiz-adv-x="679" +d="M727 1751l-280 -273h-249l249 273h280z" /> + <glyph glyph-name="glyph252" horiz-adv-x="679" +d="M-7 1752h280l249 -273h-249z" /> + <glyph glyph-name="glyph253" horiz-adv-x="679" +d="M335 1775l302 -298h-239l-63 60l-58 -60h-234z" /> + <glyph glyph-name="glyph254" horiz-adv-x="1206" +d="M718 1744h176q-6 -124 -52 -195.5t-120 -71.5q-47 0 -131 47q-38 22 -54 22q-33 0 -39 -61h-187q25 267 191 267q46 0 103 -31l40 -21q23 -13 40 -13q33 0 33 43v14z" /> + <glyph glyph-name="glyph255" horiz-adv-x="1543" +d="M537 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5t127.5 52.5zM1007 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5 +t127.5 52.5z" /> + <glyph glyph-name="glyph256" horiz-adv-x="1543" +d="M1159 1751l-280 -273h-249l249 273h280z" /> + <glyph glyph-name="glyph257" horiz-adv-x="1543" +d="M425 1752h279l249 -273h-249z" /> + <glyph glyph-name="glyph258" horiz-adv-x="1543" +d="M768 1775l301 -298h-239l-62 60l-58 -60h-235z" /> + <glyph glyph-name="glyph259" horiz-adv-x="1543" +d="M887 1744h176q-6 -124 -51.5 -195.5t-119.5 -71.5q-47 0 -132 47q-38 22 -54 22q-33 0 -39 -61h-187q25 267 191 267q46 0 103 -31l40 -21q23 -13 40 -13q33 0 33 43v14z" /> + <glyph glyph-name="glyph260" horiz-adv-x="847" +d="M537 1477l-301 298h238l63 -60l58 60h234z" /> + <glyph glyph-name="glyph261" horiz-adv-x="1206" +d="M367 1809q75 0 127.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-127.5 -52.5q-74 0 -126.5 52.5t-52.5 127.5q0 74 52.5 126.5t126.5 52.5zM838 1809q74 0 126.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-126.5 -52.5q-75 0 -127.5 52.5t-52.5 127.5q0 74 52.5 126.5 +t127.5 52.5z" /> + <glyph glyph-name="glyph262" horiz-adv-x="1206" +d="M990 1751l-280 -273h-249l249 273h280z" /> + <glyph glyph-name="glyph263" horiz-adv-x="1206" +d="M257 1752h280l249 -273h-249z" /> + <glyph glyph-name="glyph264" horiz-adv-x="1206" +d="M598 1775l301 -298h-239l-62 60l-58 -60h-234z" /> + <glyph glyph-name="glyph265" horiz-adv-x="1030" +d="M902 1751l-279 -273h-249l249 273h279z" /> + <glyph glyph-name="glyph266" horiz-adv-x="1030" +d="M280 1809q75 0 127.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-127.5 -52.5q-74 0 -126.5 52.5t-52.5 127.5q0 74 52.5 126.5t126.5 52.5zM749 1809q75 0 127.5 -52.5t52.5 -126.5q0 -75 -52.5 -127.5t-127.5 -52.5q-74 0 -126.5 52.5t-52.5 127.5q0 74 52.5 126.5 +t126.5 52.5z" /> + <glyph glyph-name="glyph267" horiz-adv-x="593" +d="M76 1418q74 0 123.5 -44.5t49.5 -111.5t-52.5 -117t-121.5 -50q-67 0 -117 50t-50 117q0 63 49.5 109.5t118.5 46.5zM512 1416q74 0 123.5 -44.5t49.5 -111.5t-52.5 -117t-121.5 -50q-67 0 -117 50t-50 117q0 63 50 109.5t118 46.5z" /> + <glyph glyph-name="glyph268" horiz-adv-x="593" +d="M483 997v-997h-374v997h374z" /> + <glyph glyph-name="currency" unicode="¤" horiz-adv-x="1498" +d="M59 220l216 215q-64 124 -64 261q0 125 72 262l-222 220l206 206l226 -226q133 64 256 64q125 0 254 -62l223 221l204 -204l-216 -216q76 -132 76 -267q0 -129 -65 -258l215 -215l-203 -206l-214 214q-132 -75 -278 -75q-127 0 -268 74l-214 -211zM751 885 +q-79 0 -134.5 -55.5t-55.5 -134.5q0 -80 55.5 -136.5t134.5 -56.5q80 0 135.5 56.5t55.5 136.5q0 79 -56 134.5t-135 55.5z" /> + </font> +</defs></svg> diff --git a/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.ttf b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c4c6db7ecd83cb0e1352194d237382fe6199aaaa Binary files /dev/null and b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.ttf differ diff --git a/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff new file mode 100644 index 0000000000000000000000000000000000000000..6bc3f116d69208476ea49cb34af9edec3aede636 Binary files /dev/null and b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff differ diff --git a/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff2 b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b25977746693899ef64e1461509ec2982fb359e7 Binary files /dev/null and b/src/vitis/client/css/icons/fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff2 differ diff --git a/src/vitis/client/css/icons/fonts/bauhaus/Demo.html b/src/vitis/client/css/icons/fonts/bauhaus/Demo.html new file mode 100644 index 0000000000000000000000000000000000000000..d4289d2f7de39ebb15f66a31adb7ad4744d08c03 --- /dev/null +++ b/src/vitis/client/css/icons/fonts/bauhaus/Demo.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"/> +<title>Bauhaus 93 V2 Font - OnlineWebFonts.COM</title> +<style type="text/css"> +@font-face {font-family: "Bauhaus 93 V2"; + src: url("89d11a443c316da80dcb8f5e1f63c86e.eot"); /* IE9*/ + src: url("89d11a443c316da80dcb8f5e1f63c86e.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ + url("89d11a443c316da80dcb8f5e1f63c86e.woff2") format("woff2"), /* chrome、firefox */ + url("89d11a443c316da80dcb8f5e1f63c86e.woff") format("woff"), /* chrome、firefox */ + url("89d11a443c316da80dcb8f5e1f63c86e.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url("89d11a443c316da80dcb8f5e1f63c86e.svg#Bauhaus 93 V2") format("svg"); /* iOS 4.1- */ +} +*{margin:0;padding:0;list-style:none;}pre{border:solid 1px #e7e1cd;background-color:#fffdef;overflow:auto;font-size:12px;line-height:14px;margin-top:10px;margin-right:0;margin-bottom:10px;margin-left:0;padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;}.demo pre{color:#000;line-height: 1.2em;font-family:"Bauhaus 93 V2"!important;font-size:22px;background-color:#FFF;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;}body{font-family:sans-serif;line-height:1.5;font-size:16px;padding:20px;color:#333;}:hover,:before,:after{-webkit-transition:all 0.1s ease-in;-moz-transition:all 0.1s ease-in;-ms-transition:all 0.1s ease-in;-o-transition:all 0.1s ease-in;transition:all 0.1s ease-in;}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;}a{color:#66A523;}h1.logo{font-size:40px;letter-spacing:-1px;margin-top:-16px;}h1.logo strong{font-size:16px;font-family:sans-serif;color:#333;}h1.logo a{color:#34302d;text-decoration:none;}h1.logo a span{color:#66A523;}h1.logo a small{color:#006699;}.info{float:left;font-size:14px;margin-top:15px;}.info ul{margin-left:0px;color:#111;margin-bottom:20px;}.info .exs{font-size:12px;color:#666;margin-left:35px;display:block;}.info ul li{margin-top:10px;list-style:none;}.info .numno{color:#fff;border-radius:20px;padding:1px;display:inline-block;width:22px;height:22px;text-align:center;margin-right:10px;background-color:#999999;}.info ul strong{font-weight:normal;color:#000;}.info .inst{font-size:22px;margin-bottom:10px;}.demo{float:left;width:100%;height:auto;border-top-width:1px;border-top-style:solid;border-top-color:#bbb;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#bbb;padding-bottom:10px;}.demo .demo_svg{float:left;height:auto;width:100px;margin-right:5px;margin-left:5px;margin-bottom:10px;}.demo .demo_svg i{float:left;height:80px;width:80px;text-align:center;font-size:40px;margin-left:10px;line-height:80px;color:#777;}.demo .demo_svg .code{float:left;height:20px;width:100%;overflow:hidden;text-align:center;line-height:20px;font-size:11px;color:#666;}.demo .demo_svg .txt{float:left;height:20px;width:100%;font-size:11px;text-align:center;white-space:nowrap;overflow:hidden;line-height:20px;}.demo .demo_svg:hover i{font-size:60px;color:#333;}.by{padding-top:15px;float:left;width:100%;margin-top:10px;margin-right:0;margin-bottom:10px;margin-left:0;}.by{margin-bottom:10px;font-size:20px;}.by .attr{font-size:14px;color:#333;padding-top:10px;padding-bottom:10px;}textarea{width:80%;height:auto;border:1px solid #CCC;resize:none;background:#EEE;padding:20px;float:left;margin-top:10px;line-height:30px;}#footer{float:left;width:100%;margin-top:10px;padding-bottom:20px;}h2{background-color:#000;padding-top:10px;padding-bottom:10px;padding-left:10px;color:#FFF;} +</style> +</head> +<body> +<h1 class="logo"> <a href="http://www.onlinewebfonts.com/"> <span>Online</span><small>Web</small>Fonts</a> <strong>Font Demo</strong></h1> +<h2> +Bauhaus 93 V2 Font <a style="font-size:14px;" href="http://www.onlinewebfonts.com/download/89d11a443c316da80dcb8f5e1f63c86e" target="_blank">More Format Downloads</a></h2> +<div class="info"> + <div class="inst">Instructions:</div> + <ul> + <li> + <p> <span class="numno">1</span>Use font-face declaration Fonts.<br /> + <span class="exs"> + <pre> +@font-face {font-family: "Bauhaus 93 V2"; + src: url("89d11a443c316da80dcb8f5e1f63c86e.eot"); /* IE9*/ + src: url("89d11a443c316da80dcb8f5e1f63c86e.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ + url("89d11a443c316da80dcb8f5e1f63c86e.woff2") format("woff2"), /* chrome、firefox */ + url("89d11a443c316da80dcb8f5e1f63c86e.woff") format("woff"), /* chrome、firefox */ + url("89d11a443c316da80dcb8f5e1f63c86e.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url("89d11a443c316da80dcb8f5e1f63c86e.svg#Bauhaus 93 V2") format("svg"); /* iOS 4.1- */ +} +</pre> + </span> + </li> + <li> + <p> <span class="numno">2</span>Settings font css style <br /> + <span class="exs"> +<pre> +.demo{ + font-family:"Bauhaus 93 V2" !important; + font-size:16px;font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale;} +</pre> + </span> + </li> + <li> + <p> <span class="numno">3</span>View DEMO <br /> + <span class="exs"><pre> +<div class="demo"> www.OnlineWebFonts.Com </div> +</pre></span> + </li> + <li> + <p> <span class="numno">OR</span>Or add to the head section of page. <br /> + <span class="exs"><pre> +<link href="//db.onlinewebfonts.com/c/89d11a443c316da80dcb8f5e1f63c86e?family=Bauhaus+93+V2" rel="stylesheet" type="text/css"/> +</pre></span> + </li> + </ul> +</div> +<div class="demo"> +<pre> + +OnlineWebFonts.Com features an amazing collection of free fonts, +premium fonts and free dingbats. With over 8,000,000 freeware fonts, +you've come to the best place to download fonts! + +OnlineWebFonts.Com Some fonts provided are trial versions of full versions and may not allow embedding +unless a commercial license is purchased or may contain a limited character set. +Please review any files included with your download, +which will usually include information on the usage and licenses of the fonts. +If no information is provided, +please use at your own discretion or contact the author directly. + +0123456789 /*-+~!@#$%^&*()-=_+{}[]:;"'|\<>.? + +</pre> +</div> + +<div class="by"> +<div class="by_title">License and attribution:</div> +<div class="attr">You must credit the author Copy this link ( <a href="http://www.onlinewebfonts.com" target="_blank">oNlineWebFonts.Com</a> ) on your web </div><div class="usetitle">Copy the Attribution License:</div> +<textarea onclick="this.focus();this.select();"><div>Icons made from <a href="http://www.onlinewebfonts.com">oNline Web Fonts</a>is licensed by CC BY 3.0</div></textarea> +</div> +<div id="footer"> + <div>Generated by <a href="http://www.onlinewebfonts.com" target="_blank">oNlineWebFonts.Com</a></div> +</div> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/client/css/icons/style.css b/src/vitis/client/css/icons/style.css index d1ab16da2b8e43d2bf9287d13bba84fae2a603e3..354d19d695b830f0a1e6d873ade04a47cb0cfbd9 100755 --- a/src/vitis/client/css/icons/style.css +++ b/src/vitis/client/css/icons/style.css @@ -10,6 +10,23 @@ font-display: block; } +@font-face {font-family: "Bauhaus 93 V2"; + src: url("fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.eot"); /* IE9*/ + src: url("fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ + url("fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff2") format("woff2"), /* chrome、firefox */ + url("fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.woff") format("woff"), /* chrome、firefox */ + url("fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url("fonts/bauhaus/89d11a443c316da80dcb8f5e1f63c86e.svg#Bauhaus 93 V2") format("svg"); /* iOS 4.1- */ +} + +.urbalyon{ + font-family:"Bauhaus 93 V2" !important; + /*font-size:16px;font-style:normal;*/ + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; +} + [class^="icon-"], [class*=" icon-"] { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'veremes' !important; @@ -1041,3 +1058,10 @@ .icon-scissors:before { content: "\f0c4"; } +/******* URBALYON *********/ +.icon-suivi_prod_immo_saisie:before { + content: "\e94e"; +} +.icon-suivi_prod_immo_bi:before { + content: "\f043"; +} \ No newline at end of file diff --git a/src/vitis/client/images/background_urbalyon.png b/src/vitis/client/images/background_urbalyon.png new file mode 100644 index 0000000000000000000000000000000000000000..c754a0e11f0904c59dda22b4e4465bfceb6920fc Binary files /dev/null and b/src/vitis/client/images/background_urbalyon.png differ diff --git a/src/vitis/client/images/favicon.ico b/src/vitis/client/images/favicon.ico old mode 100755 new mode 100644 index 6876819ea138046bc8ff48fa271e611067f2c233..9fd09fae6ae035cfb7b867089c364f516f71c448 Binary files a/src/vitis/client/images/favicon.ico and b/src/vitis/client/images/favicon.ico differ diff --git a/src/vitis/client/images/logo_bandeau_urbalyon.png b/src/vitis/client/images/logo_bandeau_urbalyon.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f86ba9adfc009e40fb005d81c7ab8cd82961d7 Binary files /dev/null and b/src/vitis/client/images/logo_bandeau_urbalyon.png differ diff --git a/src/vitis/client/images/logo_urbalyon.png b/src/vitis/client/images/logo_urbalyon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c68f9b7ed875eddce4318780e59a09f3d5bd0cd Binary files /dev/null and b/src/vitis/client/images/logo_urbalyon.png differ diff --git a/src/vitis/client/index.html b/src/vitis/client/index.html index e7c405f05b308fb7b317fef764e4f78dbd0dd41a..fbc8c20824eed59a0ad0c776d4b4c34b01917438 100755 --- a/src/vitis/client/index.html +++ b/src/vitis/client/index.html @@ -4,10 +4,18 @@ <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> - <title>Administration</title> + <title>Urbalyon</title> <script src="javascript/externs/jquery/jquery-1.11.3.min.js"></script> <script src="javascript/externs/mobile-detect/mobile-detect.min.js"></script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> + <style> + body { + background-image:url(images/background_urbalyon.png); + background-repeat:no-repeat; + background-position:center center; + /*opacity:0.75;*/ + } + </style> </head> <body data-app-init=""> <div class=""></div> diff --git a/src/vitis/client/javascript/app/controllers/initCtrl.js b/src/vitis/client/javascript/app/controllers/initCtrl.js index b64f70fc44d389e9101f2899f809c9c86a1b4c3a..e598a2bc818a05f85f14538b5fa690406d1389f8 100755 --- a/src/vitis/client/javascript/app/controllers/initCtrl.js +++ b/src/vitis/client/javascript/app/controllers/initCtrl.js @@ -201,10 +201,10 @@ vitisApp.initCtrl = function ($scope, $log, $q, envSrvc, sessionSrvc, properties // Surcharge la propriété "app_name" par le nom de l'application passé dans l'url. propertiesSrvc["app_name"] = sessionStorage["application"].toLowerCase().charAt(0).toUpperCase() + sessionStorage["application"].slice(1); // Titre de la page - document.title = propertiesSrvc["app_name"].toUpperCase(); + document.title = "Urbalyon"; if (goog.isDefAndNotNull(propertiesSrvc["application_title"])) { if (propertiesSrvc["application_title"] != "") { - document.title = propertiesSrvc["application_title"]; + document.title = "Urbalyon"; } } // ajoute une favicon @@ -253,10 +253,10 @@ vitisApp.initCtrl = function ($scope, $log, $q, envSrvc, sessionSrvc, properties "app_name": propertiesSrvc["app_name"] }; // Titre de la page - document.title = propertiesSrvc["app_name"].toUpperCase(); + document.title = "Urbalyon"; if (goog.isDefAndNotNull(propertiesSrvc["application_title"])) { if (propertiesSrvc["application_title"] != "") { - document.title = propertiesSrvc["application_title"]; + document.title = "Urbalyon"; } } // ajoute une favicon diff --git a/src/vitis/client/less/main.less b/src/vitis/client/less/main.less index 3deb16c2830bd95e49ab791d53006aeb46d69cea..15be5ca87947e5a3bcb0c20c5062f7545403d493 100755 --- a/src/vitis/client/less/main.less +++ b/src/vitis/client/less/main.less @@ -402,7 +402,7 @@ body { } .footer-logo_column { height: 30px; - background: url(@application-footer-logo) no-repeat right center; + font-size: 20px; } /* Supprime le padding gauche a droite des classe de colonnes de Bootstrap. */ diff --git a/src/vitis/client/templates/loginTpl.html b/src/vitis/client/templates/loginTpl.html index 19c3796a15ac3983b1c544b75d912da4a4355fdb..d39a92deec040e3f3276e6ec4e1fe532f6080784 100755 --- a/src/vitis/client/templates/loginTpl.html +++ b/src/vitis/client/templates/loginTpl.html @@ -3,7 +3,8 @@ <div data-app-login="" class="row login-form-container"> <div class="login-container"> <div class="login-logo"> - <span class="login-logo-icon icon-logo_{{oProperties.app_name| lowercase}}"></span> + <img src="images/logo_urbalyon.png" alt="Urbalyon"> + <!--<span class="login-logo-icon icon-logo_{{oProperties.app_name| lowercase}}"></span>--> </div> <div class="login"> <!--<div class="login-form-title" data-translate="LOGIN_TITLE" data-translate-values="translationData"></div>--> diff --git a/src/vitis/client/templates/mainTpl.html b/src/vitis/client/templates/mainTpl.html index 9edefb1a64d80c6830f7368e1d18459d869bc324..6783b97b79c6efdfdc0f7831c9dbce9bb3ce70ba 100755 --- a/src/vitis/client/templates/mainTpl.html +++ b/src/vitis/client/templates/mainTpl.html @@ -50,6 +50,7 @@ <a href="#" ng-if="oProperties.documentation" ng-click="showDocumentation()" data-translate="DOCUMENTATION" style="margin-left:20px"></a> </div> <div class="col-xs-6 text-right footer-logo_column"> + <a href="https://www.intra.urbalyon.org/" target="about:blank" class="urbalyon" style="color:black"><img src="images/logo_bandeau_urbalyon.png"> Urbalyon</a> </div> </footer> </div> diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_athletisme.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_athletisme.pdf new file mode 100644 index 0000000000000000000000000000000000000000..37d3701bfdb50b5c80eb589e57f5f446761f453c Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_athletisme.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_basket_handball_volley.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_basket_handball_volley.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9e0ac392d23b5ebea0538e669d2456468d5b9547 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_basket_handball_volley.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_boulodrome.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_boulodrome.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d2b53e5d8641d8c641810e20076610aa026234f2 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_boulodrome.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_complet.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_complet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..21ab06f24044507d4bbb49a9d7c8083c702e4082 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_complet.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_grand_jeux.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_grand_jeux.pdf new file mode 100644 index 0000000000000000000000000000000000000000..92189bf94c09f569b9693be3ea9bbba1577625f2 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_grand_jeux.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_natation.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_natation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c6192621985848e19cf6491f91397716b0c07c05 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_natation.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_salle_multisport.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_salle_multisport.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b42113add2025b330484fff5e1b9c03c47a3ff71 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_salle_multisport.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_sport_combat.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_sport_combat.pdf new file mode 100644 index 0000000000000000000000000000000000000000..012cb3cdd3b6bc68560af3174be41681d2788d35 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_sport_combat.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_tennis.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_tennis.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8d50e85a0c7a397e1c76b1eb9151c56e5376785d Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_tennis.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2018/atlas_tous_sports.pdf b/src/vitis/vas/doc/sport/atlas_2018/atlas_tous_sports.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a8707f1ace5ab0392ebdc814e5f4a57c361d0cb8 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2018/atlas_tous_sports.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c66617c05853fa5bd0e21830cd8947b60df25947 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..515adde0d939fedb917c77b5d59d9a21266bb988 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5f3c9e9ce7bc772e38a0dd7e219f6a63d43f6bb5 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..017413d7f4b2c6f2199a62d861652ea05575af77 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d8dbd20be419bf4fec1c314a72e5db512a7be61d Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..28a387821d78e8ba29135886029fba447769090a Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8577ea64d92821e596de2960fdab149137300f4c Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..671b6612047a106da55355c71d045373897537ec Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM01_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM01_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..316478dc1277c59362ed0cb8d825da7e4d9eb75a Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM01_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..741c673f81547f518253bf0b0eeb8fad6d36f744 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..415a7c94d70d66a56d85323fa24b9ff08db1c6c2 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74b40971ed0df2a81582d113081507bb7290c63e Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2d10e1bfe641907216f5023a41cb82166696c313 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f0920eac795919c2c59e6a7b348099af17fad08 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ffd9def71b1719e59e7d741d8ecf1108dd2b5854 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..752f6981f3f4960f81c8ec13408710609604d48d Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..68366e6e951034e1460268211043027ef9636078 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM02_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM02_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3625458644d71924c39d2e53a028febcd9abef13 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM02_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0961783771d58a1460aa03aad28fc49365f980d0 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea164f868b23c3ae6f2e5050511aaf0cc89eb1c0 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eeb20d4ee04061f97ae0946ce8e17af72a7f6ad9 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79ef2841ed69da1ff895a9e204927eaf9432c3ad Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f913618d03bb716014c9aefe44afc2bcdee76d3a Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e3ffdc0e4a0359e139c5c0c69d3cca7d06156dcf Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5879b902b8b307c8aadbe405c3fc3953f47548e4 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5f992d48f5933c2b99abe63c0e21f44d70bc8ac0 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM03_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM03_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1bc8a628c1af0ec7b03378aad5711f9305288d05 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM03_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b9e7810960a314b0a45be8e0706156d654169d72 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1a1e7b640524f35b162333edb3ebd6dd51e1bf99 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c96f243e068ba16b2eedde8d8c8028f6365e733 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8f9d0b600831b35994e21d5c7a8aa5d7a990ca2f Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..17b871c6ac5ac6d12fa046e320bf8469124840bb Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..21986b5dc24329254fa2e0fd916d6e3cb6b32dc9 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9c280fa08f9f5f332664a12d33a49a792ee92da5 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e53fed5bfdd7a32de8d70fe3df1fd028c175563 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM04_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM04_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6c698c6d6639732bd19488efe3af0b8cf4b4703b Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM04_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f1c69770612cf08c7e6fbab8cb4cc99146557d5e Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a3f6f5f6ae99c59350a53884101fbf89a8a0bb8 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dea4420969e81e9bce534d365bcdf9d4e595fcce Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b21049a2cc43eab5df0f8ee81a9385633448ff83 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7696abffe1689b08ceae0d8bd0748e5226123722 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0c078df166cfc760fa2179ba55af3860e81de1f1 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74c0a344c3c7f58744307dd32831facbeac32558 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a7487ca1ad6b789b6dfa6cbf3d1dcd0a0bc01462 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM05_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM05_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8e41d9ae762cf5bc1688d447424dc491ac7f3f74 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM05_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..11d657c4a975a89cb9a494b3cf9444d4cc5dba0f Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a4e8542af859b6a7d6a288e4389680068b14253 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..67c2accfd07bf362329c8404fe6ea17011d15d37 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1d145904e1201c8bb76cc419ac4060e0d044c488 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4d69ad63522ff4a0e24d417f1778400684f86207 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8a99ef03d0d8068caa7dd860387436c75af21526 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..17399716a73c3b40a5dede3b5763aca6badde839 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5d37fdf664b23ad5ca3a58838a011f99ebb1cc5e Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM06_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM06_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0ac43e95229b391185418c8975eb258d560e508e Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM06_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..60123036545b3bff005a6da20c1dd16704567b77 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ad8bf32e8597f31d95cc5e1672db3f958b9bbf93 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d01ef4fb4ed6f5331dd64e9c456ace64005b2631 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..219b1607d3a608bbe729f6db6277fba284423282 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..753fa3676b6589d5a2b3202ce51f5d7c4008e2b3 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1d9cf50e9fac400da89a03ddffded04fce2fbc0b Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fefebd9fec94d173e09e6daf62a88df37171ef7d Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a95ba0e9646d891e2176b03b763d5b53defc46b Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM07_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM07_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0394580464230c8a736b74360fa7549086914136 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM07_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6cfe7c58c4ebabb99997dd8debec9ba157fae9a0 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e61e43cc2b942d947de05619900f27ac945a365c Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cd7bd6ec4080641c3c6068c9b4794b1899800414 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e227616d17004be1e33a75672a2f746dda9e19eb Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca33e17579c8ad6f83f01262a49eba72960b0564 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..842f3fe21101dda33936dd9a3e9c143648d5e33c Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..99ea9e756655967421d47e1859d71622b3431a13 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb1c8240b41807528bd6b81804e7827e2347ecfa Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM08_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM08_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5b0b945e6a0c6337f36d99aa87db51c51b468c74 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM08_9.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_1.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f6d22064cdba7b07786140b291077e9c88d73bc Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_1.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_2.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c41a48a04bdd984ba579f1f4e4d3a5e4a9e3aec8 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_2.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_3.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f82d550ea3267ca6c039489688d0352639529a3f Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_3.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_4.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f5e7ea627ddaf63ac0081fec15e1bc68884d5dd6 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_4.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_5.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90fc7a2ac2abbea3eb93a18d6bd1dd270799f424 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_5.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_6.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ccc680cd29695d83ae5a4cdb12c0dc7688489cf3 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_6.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_7.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cfee44b1a32c4b4d0c1ef712f449dda78cf96225 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_7.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_8.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6e8057be7fd78bc27ced5ad1a06d1e28817410d8 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_8.pdf differ diff --git a/src/vitis/vas/doc/sport/atlas_2019/CTM09_9.pdf b/src/vitis/vas/doc/sport/atlas_2019/CTM09_9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b25c6ac64f113506464ba851aa6e413179c26f4 Binary files /dev/null and b/src/vitis/vas/doc/sport/atlas_2019/CTM09_9.pdf differ diff --git a/src/vitis/vas/doc/sport/equipement.html b/src/vitis/vas/doc/sport/equipement.html new file mode 100644 index 0000000000000000000000000000000000000000..9d33b7339eb57f53e72385b95a88d377c48e1533 --- /dev/null +++ b/src/vitis/vas/doc/sport/equipement.html @@ -0,0 +1,289 @@ + <!------------------------------------------------- EQUIPEMENT -------------------------------------------------> + <div class="row mt-4 title_equipement"> + <div class="col-2 "><h4>Équipement</h4></div> + <div class="col-8"><h4><?php echo $aEquipement["nomequipement"]; ?></h4></div> + <div class="col-2">n° <?php echo $aEquipement["numequipement"]; ?></div> + </div> + <div class="row subtitle_equipement"> + <div class="col-2"></div> + <div class="col subtitle_equipement">Batiment : <?php echo $aEquipement["nom_batiment"]; ?></div> + </div> + <div class="row"><div class="col-2">Type</div><div class="col"><?php echo $aEquipement["typequipement"]; ?></div></div> + <div class="row"><div class="col-2">Adresse internet</div><div class="col"><a href="<?php echo $aEquipement["adresse_internet"]; ?>" target='about:blank'><?php echo $aEquipement["adresse_internet"]; ?></a></div></div> + <div class="row"> + <div class="col-3"></div> + <div class="col"> + <div class="container"> + <div class="row blue_title"><div class="col">Administration</div></div> + <div class="row"><div class="col-6 text-right font-weight-bold">Propriétaire principal</div><div class="col-6"><?php echo $aEquipement["type_proprietaire"]; ?></div></div> + <div class="row"><div class="col-6 text-right">Gestionnaire principal</div><div class="col-6"><?php echo $aEquipement["type_gestionnaire"]; ?></div></div> + <div class="row"><div class="col-6 text-right">Propriétaire secondaire</div><div class="col-6"><?php echo $aEquipement["type_proprietaire_secondaire"]; ?></div></div> + <div class="row"><div class="col-6 text-right">Gestionnaire secondaire</div><div class="col-6"><?php echo $aEquipement["type_cogestionnaire"]; ?></div></div> + <div class="row"><div class="col-6 text-right">Gestionnaire en DSP</div><div class="col-1"><?php echo $aEquipement["gestion_dsp"] ? "Oui" : "Non"; ?></div><div class="col-5 small">(délégation de service)</div></div> + </div> + </div> + <div class="col-3"></div> + </div> + <div class="row blue_title"><div class="col-6">Mise en service</div><div class="col-6">Homologation</div></div> + <div class="row"> + <div class="col-4 text-right">Année</div><div class="col-2"><?php echo $aEquipement["annee_mise_en_service"]; ?></div> + <div class="col-5 text-right">Soumis à la procédure de l'homologation préfectorale</div><div class="col-1"><?php echo $aEquipement["homologation_prefectorale"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Tranche d'année de mise en service</div><div class="col-2"><?php echo $aEquipement["periode_mise_en_service"]; ?></div> + <div class="col-4 text-right">Arrêté d'ouverture au public</div><div class="col-2"><?php echo $aEquipement["arrete_ouverture_public"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nb de place en tribune </div><div class="col-2"><?php echo $aEquipement["nb_place_assise_tribune"]; ?></div> + <div class="col-4 text-right">Date de l'homologation préfectorale</div><div class="col-2"><?php echo $aEquipement["date_homologation_pref"]; ?></div> + </div> + <div class="row"> + <div class="col-6"></div> + <div class="col-4 text-right">Période de l'homologation préfectorale</div><div class="col-2"><?php echo $aEquipement["periode_homologation_pref"]; ?></div> + </div> + <div class="row"> + <div class="col-6 blue_title">ERP (Etablissement recevant du public)</div> + <div class="col-3 font-weight-bold text-right">Catégorie ERP (1 à 5):</div><div class="col-3"><?php echo $aEquipement["categorie_erp"]; ?></div> + </div> + <div class="row"> + <div class="col-12"><?php echo is_array($aEquipement["type_erp_etablissement"]) ? implode('<br>',$aEquipement["type_erp_etablissement"]) : $aEquipement["type_erp_etablissement"]; ?></div> + </div> + <div class="row blue_title"><div class="col">Présence de :</div></div> + <div class="row"> + <div class="col-3 text-right">Vestiaires avec douches</div><div class="col-1"><?php echo $aEquipement["douche"] ? "Oui" : "Non"; ?></div> + <div class="col-3 text-right">Eclairage</div><div class="col-1"><?php echo $aEquipement["eclairage"] ? "Oui" : "Non"; ?></div> + <div class="col-3 text-right">Accès libre</div><div class="col-1"><?php echo $aEquipement["access_libre"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row blue_title"><div class="col">Fiche Technique</div></div> + <div class="row"> + <div class="col-3 text-right">Nature du sol</div><div class="col-9"><?php echo $aEquipement["nature_sol"]; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Nature de l'équipement sportif</div><div class="col-9"><?php echo $aEquipement["nature_equipement_sportif"]; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Aire d'évolution Hauteur</div><div class="col-3"><?php echo $aEquipement["hauteur_aire_evolution"]; ?></div> + <div class="col-3 text-right">Sanitaires</div><div class="col-3"><?php echo $aEquipement["sanitaire"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Aire d'évolution Longueur</div><div class="col-2"><?php echo $aEquipement["longueur_aire_evolution"]; ?></div> + <div class="col-4 text-right">Ouverture exclusivement saisonnière</div><div class="col-3"><?php echo $aEquipement["ouverture_exclusivement_saisonniere"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Aire d'évolution Largeur</div><div class="col-2"><?php echo $aEquipement["largeur_aire_evolution"]; ?></div> + <div class="col-4 text-right">Nombre de couloir / piste / poste / etc.</div><div class="col-3"><?php echo $aEquipement["nb_couloir_piste_poste_jeux_pas"]; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Aire d'évolution Surface</div><div class="col-3"><?php echo $aEquipement["surface_aire_evolution"]; ?></div> + <div class="col-3 text-right">Vestiaire chauffé</div><div class="col-3"><?php echo $aEquipement["vestiaire_chauffe"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Nombre de vestiaire sportif</div><div class="col-2"><?php echo $aEquipement["nb_vestiaire_sportif"]; ?></div> + <div class="col-4 text-right">Nombre de vestiaire arbitre enseignant</div><div class="col-3"><?php echo $aEquipement["nb_vestiaire_arbitre_enseignant"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Types d'aménagements d'information</div><div class="col-8"><?php echo is_null($aEquipement["type_amenagement_information"]) ? 'Aucun' : $aEquipement["type_amenagement_information"]; ?></div> + </div> + <div class="row blue_title"><div class="col">Usage</div></div> + <div class="row"> + <div class="col-3 text-right">Type(s) d'utilisateur</div><div class="col-9"><?php echo $aEquipement["type_utilisateur"]; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Type(s) d'utilisation</div><div class="col-9"><?php echo $aEquipement["type_utilisation"]; ?></div> + </div> + <div class="row blue_title"><div class="col">Travaux</div></div> + <div class="row"> + <div class="col-6 text-right">Tranche de date de dernier travaux</div><div class="col-6"><?php echo $aEquipement["periode_dernier_gros_travaux"]; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Date dernier travaux réalisés </div><div class="col-6"><?php echo $aEquipement["date_dernier_travaux"]; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Motifs des derniers gros travaux</div><div class="col-9"><?php echo $aEquipement["motif_dernier_gros_travaux"]; ?></div> + </div> + <div class="row blue_title"><div class="col">Accès handicapé</div></div> + <div class="row"><div class="col-5 text-right"></div><div class="col-2">Mobilité</div><div class="col-2">Sensoriel</div></div> + <div class="row"> + <div class="col-5 text-right">Accessibilité partielle ou totale</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_partielle_totale_pmr"] ? "Oui" : "Non"; ?></div> + <div class="col-2"><?php echo $aEquipement["accessibilite_partielle_totale_handicap_sensoriel"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité à l'accueil</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_pmr_acceuil"] ? "Oui" : "Non"; ?></div> + <div class="col-2">-</div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité à l'aire de jeu</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_pmr_aire_jeu"] ? "Oui" : "Non"; ?></div> + <div class="col-2"><?php echo $aEquipement["accessibilite_handicap_sensoriel_aire_jeu"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité aux cheminements</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_pmr_cheminement"] ? "Oui" : "Non"; ?></div> + <div class="col-2"><?php echo $aEquipement["accessibilite_handicap_sensoriel_cheminement"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité aux douches</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_pmr_douche"] ? "Oui" : "Non"; ?></div> + <div class="col-2">-</div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité aux sanitaires</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_pmr_sanitaire"] ? "Oui" : "Non"; ?></div> + <div class="col-2"><?php echo $aEquipement["accessibilite_handicap_sensoriel_sanitaire"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité - signalétique</div> + <div class="col-2">-</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_handicap_sensoriel_signaletique"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité aux tribunes</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_pmr_tribune"] ? "Oui" : "Non"; ?></div> + <div class="col-2"><?php echo $aEquipement["accessibilite_handicap_sensoriel_tribune"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-5 text-right">Accessibilité aux vestiaires</div> + <div class="col-2"><?php echo $aEquipement["accessibilite_pmr_vestiaire"] ? "Oui" : "Non"; ?></div> + <div class="col-2"><?php echo $aEquipement["accessibilite_handicap_sensoriel_vestiaire"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row blue_title"><div class="col">Types de locaux complémentaires</div></div> + <div class="row"><div class="col"><?php echo is_null($aEquipement["type_locaux_complementaire"]) ? 'Aucun' : $aEquipement["type_locaux_complementaire"]; ?></div></div> + <div class="row blue_title"><div class="col">Types de chauffage - source d'énergie</div></div> + <div class="row"><div class="col"><?php echo is_null($aEquipement["type_chauffage_source_energie"]) ? 'Aucun' : $aEquipement["type_chauffage_source_energie"]; ?></div></div> + <div class="row blue_title"><div class="col">Types d'aménagements de confort</div></div> + <div class="row"><div class="col"><?php echo is_null($aEquipement["type_amenagement_confort"]) ? 'Aucun' : $aEquipement["type_amenagement_confort"]; ?></div></div> + <div class="row blue_title"><div class="col">SAE (Structure Artificielle d'Escalade)</div></div> + <div class="row"> + <div class="col-2 text-right">Nombre de couloirs</div><div class="col-2"><?php echo $aEquipement["sae_nb_couloir"]; ?></div> + <div class="col-1 text-right">Hauteur</div><div class="col-2"><?php echo $aEquipement["sae_hauteur_max"]; ?></div> + <div class="col-1 text-right">Surface</div><div class="col-2"><?php echo $aEquipement["sae_surface_totale"]; ?></div> + </div> + <div class="row blue_title"><div class="col">Accès à l'équipement</div></div> + <div class="row"> + <div class="col-4 text-right">Présence d'une signalétique de sécurité</div><div class="col-2"><?php echo $aEquipement["signaletique_securite"] ? "Oui" : "Non"; ?></div> + <div class="col-4 text-right">Présence de moyen d'alerte</div><div class="col-2"><?php echo $aEquipement["moyen_alerte"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Types d'accès pour le public</div><div class="col-9"><?php echo is_null($aEquipement["type_access_public"]) ? 'Aucun' : $aEquipement["type_access_public"]; ?></div> + </div> + <div class="row"> + <div class="col-3 text-right">Types d'accès pour les secours</div><div class="col-9"><?php echo is_null($aEquipement["type_access_secours"]) ? 'Aucun' : $aEquipement["type_access_secours"]; ?></div> + </div> + <div class="row blue_title"><div class="col">Locaux</div></div> + <div class="row"> + <div class="col-4 text-right">Démarche pour la qualité environnementale</div><div class="col-2"><?php echo $aEquipement["demarche_qualite_environnementale"] ? "Oui" : "Non"; ?></div> + <div class="col-4 text-right">Existence d'une aide publique à l'investissement</div><div class="col-2"><?php echo $aEquipement["aide_publique_investissement"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Présence de locaux techniques</div><div class="col-2"><?php echo $aEquipement["locaux_technique"] ? "Oui" : "Non"; ?></div> + <div class="col-4 text-right">Equipement inscrit au PDESI / PDIPR</div><div class="col-2"><?php echo $aEquipement["inscrit_pdesi_pdipr"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Présence de locaux pédagogiques</div><div class="col-2"><?php echo $aEquipement["locaux_pedagogique"] ? "Oui" : "Non"; ?></div> + <div class="col-6 text-right small">(Plan Dép. des Espaces, Sites et Itinéraires relatifs aux sports de nature)</div> + </div> + <div class="row blue_title"><div class="col">Équipement</div></div> + + <div class="row"><div class="col-6 font-weight-bold">Piscine</div><div class="col font-weight-bold">Athlétisme</div></div> + <div class="row"> + <div class="col-4 text-right">Forme du bassin</div><div class="col-1"><?php echo $aEquipement["forme_bassin"]; ?></div> + <div class="col-5 text-right">Développement de la piste en mètre</div><div class="col-1"><?php echo $aEquipement["longueur_piste"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Longueur du bassin</div><div class="col-1"><?php echo $aEquipement["longueur_bassin"]; ?></div> + <div class="col-5 text-right">Longueur de ligne droite</div><div class="col-1"><?php echo $aEquipement["longueur_ligne_droite_arrivee"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Largeur du bassin</div><div class="col-1"><?php echo $aEquipement["largeur_bassin"]; ?></div> + <div class="col-5 text-right">Nombre de couloir en ligne droite</div><div class="col-1"><?php echo $aEquipement["nb_couloir_ligne_droite_arrivee"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Surface du bassin</div><div class="col-1"><?php echo $aEquipement["surface_bassin"]; ?></div> + <div class="col-5 text-right">Nombre de couloir hors ligne droite</div><div class="col-1"><?php echo $aEquipement["nb_couloir_hors_ligne_droite"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Profondeur mini</div><div class="col-1"><?php echo $aEquipement["profondeur_min_bassin"]; ?></div> + <div class="col-5 text-right">Rivière de steeple</div><div class="col-1"><?php echo $aEquipement["riviere_steeple"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Profondeur maxi</div><div class="col-1"><?php echo $aEquipement["profondeur_max_bassin"]; ?></div> + <div class="col-5 text-right">Développement de la piste en mètre</div><div class="col-1"><?php echo $aEquipement["longueur_piste"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre de couloirs des bassins mixtes et sportifs</div><div class="col-1"><?php echo $aEquipement["nb_couloir_bassin_mixte_sportif"]; ?></div> + <div class="col-1"></div><div class="col-2">Nombre d'aires de :</div> + </div> + <div class="row"> + <div class="col-4 text-right">Surface des plages du bassin</div><div class="col-1"><?php echo $aEquipement["surface_plage_bassin"]; ?></div> + <div class="col-5 text-right">saut</div><div class="col-1"><?php echo $aEquipement["nb_aire_saut"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre total de tremplins</div><div class="col-1"><?php echo $aEquipement["nb_tremplin"]; ?></div> + <div class="col-5 text-right">saut en hauteur</div><div class="col-1"><?php echo $aEquipement["nb_aire_saut_hauteur"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre de tremplins de 1 mètre</div><div class="col-1"><?php echo $aEquipement["nb_tremplin_1m"]; ?></div> + <div class="col-5 text-right">saut en longueur</div><div class="col-1"><?php echo $aEquipement["nb_aire_saut_longueur"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre de tremplins de 3 mètres</div><div class="col-1"><?php echo $aEquipement["nb_tremplin_3m"]; ?></div> + <div class="col-5 text-right">saut en longueur et triple saut</div><div class="col-1"><?php echo $aEquipement["nb_aire_saut_longueur_triple_saut"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre total de plate-formes</div><div class="col-1"><?php echo $aEquipement["nb_plateforme"]; ?></div> + <div class="col-5 text-right">saut à la perche</div><div class="col-1"><?php echo $aEquipement["nb_aire_saut_perche"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre de plate-forme de 3 mètres</div><div class="col-1"><?php echo $aEquipement["nb_plateforme_3m"]; ?></div> + <div class="col-5 text-right">lancer</div><div class="col-1"><?php echo $aEquipement["nb_aire_lancer"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre de plate-forme de 5 mètres</div><div class="col-1"><?php echo $aEquipement["nb_plateforme_5m"]; ?></div> + <div class="col-5 text-right">lancer de poids</div><div class="col-1"><?php echo $aEquipement["nb_aire_lancer_poid"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre de plate-forme de 7, 5 mètres</div><div class="col-1"><?php echo $aEquipement["nb_plateforme_7_5m"]; ?></div> + <div class="col-5 text-right">lancer de disque</div><div class="col-1"><?php echo $aEquipement["nb_aire_lancer_disque"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Nombre de plate-forme de 10 mètres</div><div class="col-1"><?php echo $aEquipement["nb_plateforme_10m"]; ?></div> + <div class="col-5 text-right">lancer de javelot</div><div class="col-1"><?php echo $aEquipement["nb_aire_lancer_javelot"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Présence d'une pataugeoire</div><div class="col-1"><?php echo $aEquipement["pataugeoire"] ? "Oui" : "Non"; ?></div> + <div class="col-5 text-right">lancer de marteau</div><div class="col-1"><?php echo $aEquipement["nb_aire_lancer_marteau"]; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Aménagements complémentaires des bassins</div><div class="col-1"><?php echo $aEquipement["amenagement_complement_bassin"] ? "Oui" : "Non"; ?></div> + <div class="col-5 text-right">lancer de mixte disque-marteau</div><div class="col-1"><?php echo $aEquipement["nb_aire_lancer_mixte_disque_marteau"]; ?></div> + </div> + <div class="row"> + <div class="col-5 text-right">Types d'aménagements complémentaires des bassins</div><div class="col-7"><?php echo is_null($aEquipement["type_amenagement_complementaire_bassin"]) ? 'Aucun' : $aEquipement["type_access_public"]; ?></div> + </div> + <div class="row"><div class="col-6 font-weight-bold">Tir</div></div> + <div class="row"> + <div class="col-2 text-right">Type de pas de tir</div><div class="col-10"><?php echo is_null($aEquipement["type_pas_tir"]) ? 'Aucun' : $aEquipement["type_access_public"]; ?></div> + </div> + <div class="row"><div class="col-6 font-weight-bold">Equipement dans la nature</div></div> + <div class="row"> + <div class="col-4 text-right">Présence d'une tour d'arrivée (si stade)</div><div class="col-8"><?php echo $aEquipement["tour_arrivee"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-4 text-right">Présence d'un treuil</div><div class="col-8"><?php echo $aEquipement["treuil"] ? "Oui" : "Non"; ?></div> + </div> + <!------------------------------------------------- ACTIVITE -------------------------------------------------> + <div class="row title_activite"> + <div class="col-sm "><h4>Activités</h4></div> + </div> + <div class="row"> + <div class="col-sm subtitle_activite small">"Praticable"= praticable à demeure</div> + </div> + <?php foreach($aActivites as $aActivite): ?> + <div class="row"> + <div class="col-4"><?php echo $aActivite["activite"]; ?></div> + <div class="col-4"><?php echo $aActivite["pratique"]; ?></div> + <div class="col-4"><?php echo $aActivite["niveau_pratique_plus_eleve"]; ?></div> + </div> + <?php endforeach; ?> diff --git a/src/vitis/vas/doc/sport/equipement.php b/src/vitis/vas/doc/sport/equipement.php new file mode 100644 index 0000000000000000000000000000000000000000..5111781b2cf32487b29a67742d89b99bf7271154 --- /dev/null +++ b/src/vitis/vas/doc/sport/equipement.php @@ -0,0 +1,57 @@ +<?php +//https://geo.urbalyon.org/doc/sport/equipement.php?numequipement=E001I690290012 +require_once("../../rest/conf/properties.inc"); +require_once("properties_sport.inc"); +require_once("lib_sport.inc"); + + +try{ + $oConn = new PDO('pgsql:host=srv-postgres;port=5432;dbname='.$properties['db_sport'], $properties['db_user_sport'], $properties['db_pass_sport']); + + if($oConn){ + if (isset($_REQUEST["numequipement"])){ + $numequipement = $_REQUEST["numequipement"]; + // get data Equipement + $oResult = $oConn->prepare('SELECT equipement.*, typequipement FROM '.$properties['schema_sport'].'.equipement INNER JOIN '.$properties['schema_sport'].'.typequipement ON equipement.codetypequipement=typequipement.codetypequipement WHERE numequipement=\''.$numequipement.'\''); + $oResult->execute(); + + if ($oResult->rowCount()==1){ + $aEquipement = $oResult->fetchAll(); + $aEquipement=$aEquipement[0]; + + $aTypeErpEtablissement = explode(',',$aEquipement['type_erp_etablissement']); + if (count($aTypeErpEtablissement)>0){ + $aEquipement['type_erp_etablissement']=get_ERP($aTypeErpEtablissement); + }else{ + $aEquipement['type_erp_etablissement']='Aucun'; + } + + $oResult2 = $oConn->prepare('SELECT installation.*, commune FROM '.$properties['schema_sport'].'.installation INNER JOIN sport.commune ON installation.codeinsee=commune.codeinsee WHERE numinstallation=\''.$aEquipement["numinstallation"].'\''); + $oResult2->execute(); + $aInstallation = $oResult2->fetchAll(); + $aInstallation=$aInstallation[0]; + + $oResult3 = $oConn->prepare('SELECT activite_equipement.*, activite FROM '.$properties['schema_sport'].'.activite_equipement INNER JOIN '.$properties['schema_sport'].'.activite ON activite_equipement.codeactivite=activite.codeactivite WHERE numequipement=\''.$numequipement.'\''); + $oResult3->execute(); + $aActivites = $oResult3->fetchAll(); + + // var_dump($aInstallation); + + include ('header.html'); + include ('installation.html'); + include ('equipement.html'); + include ('footer.html'); + + }else{ + echo "Erreur : ".$oResult->rowCount()." équipement(s) trouvé(s) avec le numéro : ".$numequipement; + } + }else{ + echo "Erreur : pas de numéro d'équipement passé en paramètre !"; + } + } +}catch (PDOException $e){ + echo "ERROR : ".$e->getMessage(); +} + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/sport/equipement_commune.php b/src/vitis/vas/doc/sport/equipement_commune.php new file mode 100644 index 0000000000000000000000000000000000000000..314cfa4de3ba241b94a0df31d58cd6f96736ac13 --- /dev/null +++ b/src/vitis/vas/doc/sport/equipement_commune.php @@ -0,0 +1,63 @@ +<?php +// https://geo.urbalyon.org/doc/sport/equipement_commune.php?codeinsee=69149 +require_once("../../rest/conf/properties.inc"); +require_once("properties_sport.inc"); +require_once("lib_sport.inc"); + +try{ + $oConn = new PDO('pgsql:host=srv-postgres;port=5432;dbname='.$properties['db_sport'], $properties['db_user_sport'], $properties['db_pass_sport']); + + if($oConn){ + if (isset($_REQUEST["codeinsee"])){ + $codeinsee = $_REQUEST["codeinsee"]; + // get data Installation + $oResult = $oConn->prepare('SELECT installation.*, commune FROM '.$properties['schema_sport'].'.installation INNER JOIN sport.commune ON installation.codeinsee=commune.codeinsee WHERE installation.codeinsee='.$codeinsee.' ORDER BY installation.nominstallation'); + $oResult->execute(); + + if ($oResult->rowCount()>0){ + $aInstallations = $oResult->fetchAll(); + $sCommune = $aInstallations[0]["commune"]; + include ('header_commune.html'); + echo '<div class="row"><div class="col-4 font-weight-bold">Installation(s) sportive(s) de la commune :</div></div>'; + echo '<div class="row"><div class="col-4" style="font-size: 12px"><ion-icon name="information-circle" style="font-size: 20px; color: blue;"></ion-icon> Cliquer sur un nom d\'installation pour faire apparaitre la liste des équipements.</div></div>'; + echo '<div class="row"><div class="col-4"><div class="list-group" id="list-tab" role="tablist">'; + foreach ($aInstallations as $aInstallation) { + echo '<a class="list-group-item list-group-item-action list-group-item-success" id="list-'.$aInstallation["numinstallation"].'-list" data-toggle="list" href="#list-'.$aInstallation["numinstallation"].'" role="tab" aria-controls="'.$aInstallation["numinstallation"].'">'.$aInstallation["nominstallation"].'</a>'; + } + echo '</div></div>'; + echo '<div class="col-8"><div class="tab-content" id="nav-tabContent">'; + + foreach ($aInstallations as $aInstallation) { + echo '<div class="tab-pane fade" id="list-'.$aInstallation["numinstallation"].'" role="tabpanel" aria-labelledby="list-'.$aInstallation["numinstallation"].'-list"><b>Équipement(s) de l\'installation "'.$aInstallation["nominstallation"].'" :</b><br>'; + echo '<div class="row"><div class="col-8" style="font-size: 12px"><ion-icon name="information-circle" style="font-size: 20px; color: blue;"></ion-icon> Cliquer sur le nom de l\'équipement pour afficher la fiche complète de l\'équipement.</div></div>'; + echo '<div class="list-group">'; + $oResult2 = $oConn->prepare('SELECT equipement.*, typequipement FROM '.$properties['schema_sport'].'.equipement INNER JOIN '.$properties['schema_sport'].'.typequipement ON equipement.codetypequipement=typequipement.codetypequipement WHERE numinstallation=\''.$aInstallation["numinstallation"].'\' ORDER BY nomequipement'); + $oResult2->execute(); + $aEquipements = $oResult2->fetchAll(); + foreach ($aEquipements as $aEquipement) { + echo '<a href="https://geo.urbalyon.org/doc/sport/equipement.php?numequipement='.$aEquipement['numequipement'].'" target="about:blank" class="list-group-item list-group-item-action">'.$aEquipement['nomequipement'].' ('.$aEquipement['typequipement'].') <ion-icon name="download"></ion-icon></a>'; + } + + echo '</div></div>'; + } + + echo '</div></div>'; + echo '</div><br>'; + + echo '<div class="alert alert-light" role="alert"><a href="https://geo.urbalyon.org/doc/sport/equipement_commune_complet.php?codeinsee='.$codeinsee.'" target="about:blank" class="alert-link"><ion-icon name="download"></ion-icon> Afficher</a> l\'ensemble des fiches de la commune</div>'; + + include ('footer.html'); + + }else{ + echo "Erreur : ".$oResult->rowCount()." équipement(s) trouvé(s) avec le code insee : ".$codeinsee; + } + }else{ + echo "Erreur : pas de numéro d'équipement passé en paramètre !"; + } + } +}catch (PDOException $e){ + echo "ERROR : ".$e->getMessage(); +} + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/sport/equipement_commune_complet.php b/src/vitis/vas/doc/sport/equipement_commune_complet.php new file mode 100644 index 0000000000000000000000000000000000000000..2e3bde6c17eb0c55da0b4b3eabd1732471a573ca --- /dev/null +++ b/src/vitis/vas/doc/sport/equipement_commune_complet.php @@ -0,0 +1,56 @@ +<?php +// https://geo.urbalyon.org/doc/sport/equipement_commune_complet.php?codeinsee=69149 +require_once("../../rest/conf/properties.inc"); +require_once("properties_sport.inc"); +require_once("lib_sport.inc"); + + +try{ + $oConn = new PDO('pgsql:host=srv-postgres;port=5432;dbname='.$properties['db_sport'], $properties['db_user_sport'], $properties['db_pass_sport']); + + if($oConn){ + if (isset($_REQUEST["codeinsee"])){ + $codeinsee = $_REQUEST["codeinsee"]; + // get data Installation + $oResult = $oConn->prepare('SELECT installation.*, commune FROM '.$properties['schema_sport'].'.installation INNER JOIN sport.commune ON installation.codeinsee=commune.codeinsee WHERE installation.codeinsee='.$codeinsee); + $oResult->execute(); + + if ($oResult->rowCount()>0){ + include ('header.html'); + $aInstallations = $oResult->fetchAll(); + foreach ($aInstallations as $aInstallation) { + include ('installation.html'); + $oResult2 = $oConn->prepare('SELECT equipement.*, typequipement FROM '.$properties['schema_sport'].'.equipement INNER JOIN '.$properties['schema_sport'].'.typequipement ON equipement.codetypequipement=typequipement.codetypequipement WHERE numinstallation=\''.$aInstallation["numinstallation"].'\''); + $oResult2->execute(); + $aEquipements = $oResult2->fetchAll(); + foreach ($aEquipements as $aEquipement) { + $aTypeErpEtablissement = explode(',',$aEquipement['type_erp_etablissement']); + if (count($aTypeErpEtablissement)>0){ + $aEquipement['type_erp_etablissement']=get_ERP($aTypeErpEtablissement); + }else{ + $aEquipement['type_erp_etablissement']='Aucun'; + } + + $oResult3 = $oConn->prepare('SELECT activite_equipement.*, activite FROM '.$properties['schema_sport'].'.activite_equipement INNER JOIN '.$properties['schema_sport'].'.activite ON activite_equipement.codeactivite=activite.codeactivite WHERE numequipement=\''.$aEquipement["numequipement"].'\''); + $oResult3->execute(); + $aActivites = $oResult3->fetchAll(); + + include ('equipement.html'); + } + } + + include ('footer.html'); + + }else{ + echo "Erreur : ".$oResult->rowCount()." équipement(s) trouvé(s) avec le code insee : ".$codeinsee; + } + }else{ + echo "Erreur : pas de numéro d'équipement passé en paramètre !"; + } + } +}catch (PDOException $e){ + echo "ERROR : ".$e->getMessage(); +} + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/sport/footer.html b/src/vitis/vas/doc/sport/footer.html new file mode 100644 index 0000000000000000000000000000000000000000..faa2c3657f4b56e435d9d06aaf3590bfdc565e2f --- /dev/null +++ b/src/vitis/vas/doc/sport/footer.html @@ -0,0 +1,21 @@ + + <div class="row pt-5 footer_fiche"><div class="col"><img src="images/ministere_sports.png" width="130px"></div></div> + <div class="row footer_fiche"> + <div class="col"><i>Source : Recensement des équipements sportifs, espaces et sites de pratiques (RES) février 2019</i></div> + </div> + <div class="row footer_fiche"> + <div class="col">Contact pour modifier la base : res@jeunesse-sports.gouv.fr (ministère)</div> + </div> + <div class="row pt-2 footer_fiche"><div class="col"><img src="images/urbalyon.png" width="100px></div></div> + <div class="row footer_fiche"> + <div class="col">Réalisation : Agence d'urbanisme de l'aire métropolitaine de lyonnnaise</div> + </div> + </div> + <!-- Optional JavaScript --> + <!-- jQuery first, then Popper.js, then Bootstrap JS --> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + <script src="https://unpkg.com/ionicons@4.5.10-0/dist/ionicons.js"></script> + </body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/sport/header.html b/src/vitis/vas/doc/sport/header.html new file mode 100644 index 0000000000000000000000000000000000000000..947bb1b0d04fbbd683456f08c176cfd789f3ac62 --- /dev/null +++ b/src/vitis/vas/doc/sport/header.html @@ -0,0 +1,15 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>Fiche Équipement</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> + <link rel="stylesheet" href="style.css"> +</head> +<body> + <div class="container"> + <div class="row pt-2 header_fiche"><div class="col"><img src="images/grand_lyon.png" width="150px"></div></div> + <div class="row"> + <div class="col-sm title_fiche"><h3>FICHE EQUIPEMENT</h3></div> + </div> diff --git a/src/vitis/vas/doc/sport/header_commune.html b/src/vitis/vas/doc/sport/header_commune.html new file mode 100644 index 0000000000000000000000000000000000000000..449e034109ad87ae0344a07c43ba6e3fa292b448 --- /dev/null +++ b/src/vitis/vas/doc/sport/header_commune.html @@ -0,0 +1,16 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>Commune / Fiche Équipement</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> + <link rel="stylesheet" href="style.css"> +</head> +<body> + <div class="container"> + <div class="row pt-2 header_fiche"><div class="col"><img src="images/grand_lyon.png" width="150px"></div></div> + <div class="row"> + <div class="col-sm title_fiche"><h3>Commune "<?php echo $sCommune; ?>"</h3></div> + </div> + <br> diff --git a/src/vitis/vas/doc/sport/images/grand_lyon.png b/src/vitis/vas/doc/sport/images/grand_lyon.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecc936312a5c68eef586224b011b81ddc58adae Binary files /dev/null and b/src/vitis/vas/doc/sport/images/grand_lyon.png differ diff --git a/src/vitis/vas/doc/sport/images/ministere_sports.png b/src/vitis/vas/doc/sport/images/ministere_sports.png new file mode 100644 index 0000000000000000000000000000000000000000..24af61c5f571903e745e2db5b13cc1e071cda9e1 Binary files /dev/null and b/src/vitis/vas/doc/sport/images/ministere_sports.png differ diff --git a/src/vitis/vas/doc/sport/images/urbalyon.png b/src/vitis/vas/doc/sport/images/urbalyon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c68f9b7ed875eddce4318780e59a09f3d5bd0cd Binary files /dev/null and b/src/vitis/vas/doc/sport/images/urbalyon.png differ diff --git a/src/vitis/vas/doc/sport/installation.html b/src/vitis/vas/doc/sport/installation.html new file mode 100644 index 0000000000000000000000000000000000000000..545dc33745c0e773df036ad7613b83fbaf3d8c63 --- /dev/null +++ b/src/vitis/vas/doc/sport/installation.html @@ -0,0 +1,39 @@ + <!------------------------------------------------- INSTALLATION -------------------------------------------------> + <div class="row mt-5 title_installation"> + <div class="col-sm"><h4>Installation</h4></div> + <div class="col-sm"></div> + <div class="col-sm">(peut intégrer plusieurs équipements)</div> + </div> + <div class="row"> + <div class="col-2 subtitle_installation text-right">n°<?php echo $aInstallation["numinstallation"]; ?></div> + <div class="col subtitle_installation"><h4><?php echo $aInstallation["nominstallation"]; ?></h4></div> + </div> + <div class="row"> + <div class="col-5 subtitle_installation text-right"><?php echo $aInstallation["adresse"]; ?></div> + <div class="col-7 subtitle_installation"><?php echo $aInstallation["codepostal"]; ?> <?php echo $aInstallation["commune"]; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Installation particulière :</div><div class="col-6"><?php echo $aInstallation["particularite"]; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Multi commune</div><div class="col-6"><?php echo $aInstallation["plusieurs_communes"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Possibilité de restauration</div><div class="col-6"><?php echo $aInstallation["restauration"] ? "Oui" : "Non"; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Possibilité d'hébergement</div><div class="col-1"><?php echo $aInstallation["hebergement"] ? "Oui" : "Non"; ?></div> + <div class="col-3 text-right">Nombre de lits</div><div class="col-1"><?php echo $aInstallation["nb_lit"]; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Nombre total de places de parking</div><div class="col-6"><?php echo $aInstallation["nb_parking"]; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Dont nombre de places de parking handicapés</div><div class="col-6"><?php echo $aInstallation["nb_parking_handicap"]; ?></div> + </div> + <div class="row"> + <div class="col-6 text-right">Emprise foncière</div><div class="col-6"><?php echo $aInstallation["emprise_fonciere"]; ?> m²</div> + </div> + <div class="row"> + <div class="col-6 text-right">Desserte</div><div class="col-6"><?php echo $aInstallation["accessibilite"]; ?></div> + </div> diff --git a/src/vitis/vas/doc/sport/lib_sport.inc b/src/vitis/vas/doc/sport/lib_sport.inc new file mode 100644 index 0000000000000000000000000000000000000000..ccee1b8ed218f7d5968b223b1fd1de7629d77be8 --- /dev/null +++ b/src/vitis/vas/doc/sport/lib_sport.inc @@ -0,0 +1,39 @@ +<?php + + +function get_ERP($aTypeErpEtablissement){ + $aTypeErpEtablissementResult=array(); + $aErpNom=array( + "REF"=>"Refuge de montagne", + "OA"=>"Hôtel-restaurant d'altitude", + "GA"=>"Gare (pour sa partie accessible au public)", + "PS"=>"Parcs de stationnement couvert", + "SG"=>"Structure gonflable", + "PA"=>"Établissement de plein air", + "Y"=>"Musée", + "X"=>"Établissement sportif clos et couvert, salle omnisports, patinoire, manège, piscine couverte, transformable ou mixte ou salle polyvalente sportive de moins de 1 200 m² ou d'une hauteur sous plafond de plus de 6,50 m", + "W"=>"Administration, banque, bureau (sauf si le professionnel ne reçoit pas de clientèle dans son bureau)", + "V"=>"Lieu de culte", + "U"=>"Établissement de santé public ou privé, clinique, hôpital, pouponnière, établissement de cure thermale", + "T"=>"Salle d'exposition", + "S"=>"Bibliothèque et centre de documentation", + "R"=>"Crèche, école maternelle, halte-garderie, jardin d'enfants ou Établissement d'enseignement et de formation ou Centre de vacance et centre de loisirs (sans hébergement)", + "P"=>"Salles de danse et salle de jeux", + "O"=>"Hôtel, pension de famille, résidence de tourisme", + "N"=>"Restaurant et débit de boisson", + "M"=>"Magasin de vente et centre commercial", + "L"=>"Salle d'audition, de conférence, multimédia ou salle de réunion, de quartier, réservée aux associations ou salle de spectacle (y compris cirque non forain) ou de cabaret ou salle de projection, multimédia ou salle polyvalente à dominante sportive de plus de 1 200 m² ou d'une hauteur sous plafond de moins de 6,50 m", + "J"=>"Structure d'accueil pour personnes âgées ou structure d'accueil personnes handicapées" + ); + foreach ($aTypeErpEtablissement as $sErp) { + if (isset($aErpNom[$sErp])) { + $aTypeErpEtablissementResult[count($aTypeErpEtablissementResult)+1]=$aErpNom[$sErp]; + }else{ + $aTypeErpEtablissementResult[count($aTypeErpEtablissementResult)+1]=$sErp; + } + } + return $aTypeErpEtablissementResult; +} + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/sport/properties_sport.inc b/src/vitis/vas/doc/sport/properties_sport.inc new file mode 100644 index 0000000000000000000000000000000000000000..9904f1125894f33441996ab62c3f8ab0de9ca5f8 --- /dev/null +++ b/src/vitis/vas/doc/sport/properties_sport.inc @@ -0,0 +1,9 @@ +<?php + +$properties['db_sport']='sport'; +$properties['db_user_sport']='sport'; +$properties['db_pass_sport']='Urbalyon35*'; +$properties['schema_sport']='res_2019'; + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/sport/style.css b/src/vitis/vas/doc/sport/style.css new file mode 100644 index 0000000000000000000000000000000000000000..29d281ab2d1899bf6733bc5f7ec5a19ab010e98d --- /dev/null +++ b/src/vitis/vas/doc/sport/style.css @@ -0,0 +1,54 @@ + + +.title_fiche { + text-align: center; +} + +.title_installation { + text-align: left; + background-color: #89BE81; + color: #4E6D48; +} + +.subtitle_installation { + text-align: left; + background-color: #CBF0C5; +} + +.title_equipement { + text-align: left; + background-color: #99C5D6; + color: #2D708A; +} + +.subtitle_equipement { + text-align: left; + background-color: #C6DAE2; +} + +.title_activite { + text-align: left; + background-color: #FFD97F; + color: #AC7B07; +} + +.subtitle_activite { + text-align: right; + background-color: #FFF3D7; +} + +.header_fiche { + text-align: right; +} +.footer_fiche { + text-align: center; +} + + +.blue_title { + text-align: left; + font-weight: bold; + color: #4d94ff; + border-top: solid; + border-color: #4d94ff; +} \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/css/bootstrap_4.3.1/bootstrap.min.css b/src/vitis/vas/doc/suivi_prod_immo/css/bootstrap_4.3.1/bootstrap.min.css new file mode 100644 index 0000000000000000000000000000000000000000..92e3fe871295c44f8fa58ddc7ac242463f13e6bd --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/css/bootstrap_4.3.1/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/css/right-arrow.svg b/src/vitis/vas/doc/suivi_prod_immo/css/right-arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..3f4229f7fe52aaa2d92714716e55c89ea2ea6f0d --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/css/right-arrow.svg @@ -0,0 +1 @@ +<svg id="Capa_1" enable-background="new 0 0 546.55 546.55" height="512" viewBox="0 0 546.55 546.55" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m256.195 478.239c-2.719 0-5.454-.651-7.956-1.968-5.604-2.952-9.124-8.773-9.124-15.112v-85.398h-222.035c-9.441 0-17.08-7.639-17.08-17.08v-170.797c0-9.441 7.639-17.08 17.08-17.08h222.036v-85.398c0-6.338 3.519-12.159 9.124-15.112 5.588-2.986 12.376-2.569 17.63 1.034l273.275 187.877c4.637 3.186 7.406 8.456 7.406 14.077s-2.769 10.892-7.406 14.077l-273.276 187.878c-2.902 1.984-6.288 3.002-9.674 3.002zm-222.036-136.638h222.036c9.441 0 17.08 7.639 17.08 17.08v70.004l226.056-155.402-226.056-155.402v70.003c0 9.441-7.639 17.08-17.08 17.08h-222.036z"/></svg> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/css/signin.css b/src/vitis/vas/doc/suivi_prod_immo/css/signin.css new file mode 100644 index 0000000000000000000000000000000000000000..90cc93e5b97ba7cd9419492a48c4c6f95b052830 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/css/signin.css @@ -0,0 +1,44 @@ +html, +body { + height: 100%; +} + +body { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding-top: 40px; + padding-bottom: 40px; + background-color: #f5f5f5; +} + +.form-signin { + width: 100%; + max-width: 330px; + padding: 15px; + margin: auto; +} +.form-signin .checkbox { + font-weight: 400; +} +.form-signin .form-control { + position: relative; + box-sizing: border-box; + height: auto; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} diff --git a/src/vitis/vas/doc/suivi_prod_immo/css/style.css b/src/vitis/vas/doc/suivi_prod_immo/css/style.css new file mode 100644 index 0000000000000000000000000000000000000000..a88df22fcfb9878e1a0a28ef49cc1bcb81849879 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/css/style.css @@ -0,0 +1,111 @@ + +.navbar_analyse { + background-color: #ff8a55!important; +} + +body { + font-size: .875rem; +} + +.feather { + width: 16px; + height: 16px; + vertical-align: text-bottom; +} + +/* + * Sidebar + */ + +.sidebar { + position: fixed; + top: 0; + bottom: 0; + left: 0; + z-index: 100; /* Behind the navbar */ + padding: 48px 0 0; /* Height of navbar */ + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); +} + +.sidebar-sticky { + position: relative; + top: 0; + height: calc(100vh - 48px); + padding-top: .5rem; + overflow-x: hidden; + overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ +} + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sidebar-sticky { + position: -webkit-sticky; + position: sticky; + } +} + +.sidebar .nav-link { + font-weight: 500; + color: #333; +} + +.sidebar .nav-link .feather { + margin-right: 4px; + color: #999; +} + +.sidebar .nav-link.active { + color: #007bff; +} + +.sidebar .nav-link:hover .feather, +.sidebar .nav-link.active .feather { + color: inherit; +} + +.sidebar-heading { + font-size: .75rem; + text-transform: uppercase; +} + +/* + * Content + */ + +[role="main"] { + padding-top: 48px; /* Space for fixed navbar */ +} + +/* + * Navbar + */ + +.navbar-brand { + padding-top: .75rem; + padding-bottom: .75rem; + font-size: 1.1rem; + background-color: rgba(0, 0, 0, .25); + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25); +} + +.navbar-text { + font-size: 1.5rem; + font-weight: bold; + color: white; +} + +.navbar .form-control { + padding: .75rem 1rem; + border-width: 0; + border-radius: 0; +} + +.form-control-dark { + color: #fff; + background-color: rgba(255, 255, 255, .1); + border-color: rgba(255, 255, 255, .1); +} + +.form-control-dark:focus { + border-color: transparent; + box-shadow: 0 0 0 3px rgba(255, 255, 255, .25); +} diff --git a/src/vitis/vas/doc/suivi_prod_immo/css/style_dashboard.css b/src/vitis/vas/doc/suivi_prod_immo/css/style_dashboard.css new file mode 100644 index 0000000000000000000000000000000000000000..611f65d30f4c4159ac974dd6f4aacbb2a8b0e90e --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/css/style_dashboard.css @@ -0,0 +1,45 @@ +.feather { + width: 16px; + height: 16px; + vertical-align: text-bottom; +} + +.title { + background-color: #89b923!important; + font-size: 1.5rem; + font-weight: bold; + color: white; +} + +.subtitle { + background-color: #89b923!important; + font-size: 1.2rem; + color: white; +} +.line_table { + background-color: #f6ffe2!important; + font-size: 0.8rem; +} + +.line_table_2 { + background-color: #e4fbb2!important; + font-size: 0.8rem; +} + +.date_maj { + background-color: #bdd457!important; + font-size: 1.5rem; + color: grey; +} + +.arrow { + background-repeat:no-repeat; + background-position:center center; + background-size: contain; +} + +.hachure { + background-image: repeating-linear-gradient(-45deg, transparent, transparent 5px,gainsboro 5px,gainsboro 7px); + /* avec plusieurs longueurs pour les points d'arrêt */ + background-image: repeating-linear-gradient(-45deg, transparent 0 5px, gainsboro 5px 7px); +} \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_1_operation.html b/src/vitis/vas/doc/suivi_prod_immo/form_1_operation.html new file mode 100644 index 0000000000000000000000000000000000000000..cdffe1530b726c31ae9b64598ddd45edc6e38d83 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_1_operation.html @@ -0,0 +1,89 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style.css"> +</head> +<body> + <nav class="navbar navbar-dark fixed-top navbar_analyse flex-md-nowrap p-0 shadow"> + <a class="navbar-brand col-sm-3 col-md-2 mr-0" href="#">BD Suivi de la production immobilière</a> + <a class="navbar-text col-sm-2 col-md-4 mr-0" href="#"> Module d'analyse</a> + <ul class="navbar-nav px-3"> + <li class="nav-item text-nowrap"> + <img src="images/grand_lyon_large.png" width="150px"> <img src="https://geo.urbalyon.org/images/logo_bandeau_urbalyon.png">Urbalyon + </li> + </ul> + </nav> + + <div class="container-fluid"> + <div class="row"> + <nav class="col-md-2 d-none d-md-block bg-light sidebar"> + <div class="sidebar-sticky"> + <ul class="nav flex-column"> + <li class="nav-item"> + <a class="nav-link active" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_1_operation.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Fiche opération<span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_2_type.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Type d'opération</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_3_porteur.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Porteurs de programmes</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_4_logement.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Les programmes de logements</a> + </li> + </ul> + </div> + </nav> + + <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4"> + <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"> + <div class="container"> + <div class="row"> + <h1 class="h2">Fiche opération</h1> + </div> + <div class="row"> + <?php if (isset($sError)): ?> + <div class="alert alert-danger" role="alert"> + <span data-feather="alert-triangle"></span> <?php echo $sError; ?> + </div> + <?php endif; ?> + </div> + <div class="row mt-5"> + <form> + <div class="form-group"> + <label for="l_operation">Opération</label> + <select class="form-control" id="l_operation"> + <option></option> + <?php foreach($aOperations as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['id_operation']; ?>"><?php echo $aValue['nom_operation']; ?></option> + <?php endforeach; ?> + </select> + </div> + <div class="btn-group" role="group" aria-label="Basic example"> + <button id="get_operation" type="button" class="btn btn-outline-secondary">Afficher la fiche</button> + <button id="get_operation_excel" type="button" class="btn btn-outline-secondary"><span data-feather="download"></span> Export</button> + </div> + + </form> + </div> + </div> + </main> + + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + var sToken='<?php echo $_SESSION['token_bd_prod_immo']; ?>'; + feather.replace(); + </script> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + <script type="text/javascript" src="js/form.js"></script> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_1_operation.php b/src/vitis/vas/doc/suivi_prod_immo/form_1_operation.php new file mode 100644 index 0000000000000000000000000000000000000000..5ce995b9c6b24ffca0f364a46df6a6cf4902ef47 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_1_operation.php @@ -0,0 +1,41 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/form_1_operation.php +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + // get data Opérations + $oResult = $oConn->prepare('SELECT id_operation, nom_operation FROM '.$properties['schema_prod_immo'].'.operation ORDER BY nom_operation'); + $oResult->execute(); + + if ($oResult->rowCount()>0){ + $aOperations = $oResult->fetchAll(); + }else{ + $sError="Erreur : ".$oResult->rowCount()." opération(s) trouvée(s)."; + } + } + include ('form_1_operation.html'); + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_2_type.html b/src/vitis/vas/doc/suivi_prod_immo/form_2_type.html new file mode 100644 index 0000000000000000000000000000000000000000..e5b4e049afcfaeab99c242af348c9ddfc85321a1 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_2_type.html @@ -0,0 +1,118 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style.css"> +</head> +<body> + <nav class="navbar navbar-dark fixed-top navbar_analyse flex-md-nowrap p-0 shadow"> + <a class="navbar-brand col-sm-3 col-md-2 mr-0" href="#">BD Suivi de la production immobilière</a> + <a class="navbar-text col-sm-2 col-md-4 mr-0" href="#"> Module d'analyse</a> + <ul class="navbar-nav px-3"> + <li class="nav-item text-nowrap"> + <img src="images/grand_lyon_large.png" width="150px"> <img src="https://geo.urbalyon.org/images/logo_bandeau_urbalyon.png">Urbalyon + </li> + </ul> + </nav> + + <div class="container-fluid"> + <div class="row"> + <nav class="col-md-2 d-none d-md-block bg-light sidebar"> + <div class="sidebar-sticky"> + <ul class="nav flex-column"> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_1_operation.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Fiche opération</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_2_type.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Type d'opération<span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_3_porteur.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Porteurs de programmes</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_4_logement.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Les programmes de logements</a> + </li> + </ul> + </div> + </nav> + + <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4"> + <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"> + <div class="container"> + <div class="row"> + <h1 class="h2">Type d'opération</h1> + </div> + <div class="row"> + <?php if (isset($sError)): ?> + <div class="alert alert-danger" role="alert"> + <span data-feather="alert-triangle"></span> <?php echo $sError; ?> + </div> + <?php endif; ?> + </div> + <div class="row mt-5"> + <form> + <div class="form-group"> + <label for="l_ctm">Conférence Territoriale des Maires</label> + <select class="form-control" id="l_ctm"> + <option></option> + <?php foreach($aCTMs as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['id_ctm']; ?>"><?php echo $aValue['nom_ctm']; ?></option> + <?php endforeach; ?> + </select> + <label for="l_commune">Communes</label> + <select class="form-control" id="l_commune"> + <option></option> + <?php foreach($aCommunes as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['id_commune']; ?>"><?php echo $aValue['nom_commune']; ?></option> + <?php endforeach; ?> + </select> + <label for="l_procedure_amenagement">Procédure d'aménagement</label> + <select class="form-control" id="l_procedure_amenagement"> + <option></option> + <?php foreach($aProcedureAmenagement as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['code_procedure_amenagement']; ?>"><?php echo $aValue['procedure_amenagement']; ?></option> + <?php endforeach; ?> + </select> + <label for="l_financement">Mode de financement</label> + <select class="form-control" id="l_financement"> + <option></option> + <?php foreach($aFinancement as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['code_financement_equ_public']; ?>"><?php echo $aValue['financement_equ_public']; ?></option> + <?php endforeach; ?> + </select> + <label for="l_suivi">Suivi de l'opération</label> + <select class="form-control" id="l_suivi"> + <option></option> + <?php foreach($aSuivi as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['code_suivi']; ?>"><?php echo $aValue['suivi']; ?></option> + <?php endforeach; ?> + </select> + </div> + <div class="btn-group" role="group" aria-label="Basic example"> + <button id="get_type" type="button" class="btn btn-outline-secondary">Afficher la fiche</button> + <button id="get_type_excel" type="button" class="btn btn-outline-secondary"><span data-feather="download"></span> Export</button> + </div> + + </form> + + </div> + </div> + </main> + + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + var sToken='<?php echo $_SESSION['token_bd_prod_immo']; ?>'; + feather.replace(); + </script> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + <script type="text/javascript" src="js/form.js"></script> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_2_type.php b/src/vitis/vas/doc/suivi_prod_immo/form_2_type.php new file mode 100644 index 0000000000000000000000000000000000000000..267173246baae88747bc719d66f19d44ead471da --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_2_type.php @@ -0,0 +1,72 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/form_2_type.php +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + // get data Mode de financement + $oResult = $oConn->prepare('SELECT code_financement_equ_public, financement_equ_public FROM '.$properties['schema_prod_immo'].'.tr_financement_equ_public ORDER BY financement_equ_public'); + $oResult->execute(); + if ($oResult->rowCount()>0){ + $aFinancement = $oResult->fetchAll(); + }else{ + $sError="Erreur : ".$oResult->rowCount()." financement(s) trouvé(s)."; + } + // get data Procédure d'aménagement + $oResult = $oConn->prepare('SELECT code_procedure_amenagement, procedure_amenagement FROM '.$properties['schema_prod_immo'].'.tr_procedure_amenagement ORDER BY procedure_amenagement'); + $oResult->execute(); + if ($oResult->rowCount()>0){ + $aProcedureAmenagement = $oResult->fetchAll(); + }else{ + $sError="Erreur : ".$oResult->rowCount()." procédure(s) d'aménagement trouvé(s)."; + } + // get data CTM + $oResult2=$oConn->prepare('SELECT id_ctm, nom_ctm FROM '.$properties['schema_prod_immo'].'.conference_territoriale_maire ORDER BY nom_ctm'); + $oResult2->execute(); + if ($oResult2->rowCount()>0){ + $aCTMs = $oResult2->fetchAll(); + }else{ + $sError="Erreur : ".$oResult2->rowCount()." CTM(s) trouvé(s)."; + } + // get data Communes + $oResult4=$oConn->prepare('SELECT id_commune, nom_commune FROM '.$properties['schema_prod_immo'].'.commune ORDER BY nom_commune'); + $oResult4->execute(); + if ($oResult4->rowCount()>0){ + $aCommunes = $oResult4->fetchAll(); + }else{ + $sError="Erreur : ".$oResult4->rowCount()." commune(s) trouvé(s)."; + } + // get data Suivi de l'opération + $oResult3 = $oConn->prepare('SELECT code_suivi, suivi FROM '.$properties['schema_prod_immo'].'.tr_suivi ORDER BY suivi'); + $oResult3->execute(); + if ($oResult3->rowCount()>0){ + $aSuivi = $oResult3->fetchAll(); + }else{ + $sError="Erreur : ".$oResult3->rowCount()." suivi(s) trouvé(s)."; + } + } + include ('form_2_type.html'); + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_3_porteur.html b/src/vitis/vas/doc/suivi_prod_immo/form_3_porteur.html new file mode 100644 index 0000000000000000000000000000000000000000..d462fc18bd3bf0711d362020ccb62f70537bc1c2 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_3_porteur.html @@ -0,0 +1,89 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style.css"> +</head> +<body> + <nav class="navbar navbar-dark fixed-top navbar_analyse flex-md-nowrap p-0 shadow"> + <a class="navbar-brand col-sm-3 col-md-2 mr-0" href="#">BD Suivi de la production immobilière</a> + <a class="navbar-text col-sm-2 col-md-4 mr-0" href="#"> Module d'analyse</a> + <ul class="navbar-nav px-3"> + <li class="nav-item text-nowrap"> + <img src="images/grand_lyon_large.png" width="150px"> <img src="https://geo.urbalyon.org/vmap/images/logo_bandeau_urbalyon.png">Urbalyon + </li> + </ul> + </nav> + + <div class="container-fluid"> + <div class="row"> + <nav class="col-md-2 d-none d-md-block bg-light sidebar"> + <div class="sidebar-sticky"> + <ul class="nav flex-column"> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_1_operation.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Fiche opération</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_2_type.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Type d'opération</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_3_porteur.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Porteurs de programmes<span class="sr-only">(current)</span></a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_4_logement.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Les programmes de logements</a> + </li> + </ul> + </div> + </nav> + + <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4"> + <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"> + <div class="container"> + <div class="row"> + <h1 class="h2">Porteurs de programmes immobiliers</h1> + </div> + <div class="row"> + <?php if (isset($sError)): ?> + <div class="alert alert-danger" role="alert"> + <span data-feather="alert-triangle"></span> <?php echo $sError; ?> + </div> + <?php endif; ?> + </div> + <div class="row mt-5"> + <form> + <div class="form-group"> + <label for="l_amenageur">Opérateurs et partenaires</label> + <select class="form-control" id="l_amenageur"> + <option></option> + <?php foreach($aAmenageurs as $iKey=>$aValue): ?> + <option value="<?php echo urlencode($aValue['nom_amenageur']); ?>"><?php echo $aValue['nom_amenageur']." (".$aValue['count'].")"; ?></option> + <?php endforeach; ?> + </select> + <small class="form-text text-muted"><span data-feather="info" style="color:blue"></span> Le nombre d'opération de l'opérateur est affiché entre parenthèse.</small> + </div> + <div class="btn-group" role="group" aria-label="Basic example"> + <button id="get_porteur" type="button" class="btn btn-outline-secondary">Afficher la fiche</button> + <button id="get_porteur_excel" type="button" class="btn btn-outline-secondary"><span data-feather="download"></span> Export</button> + </div> + </form> + </div> + </div> + </main> + + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + var sToken='<?php echo $_SESSION['token_bd_prod_immo']; ?>'; + feather.replace(); + </script> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + <script type="text/javascript" src="js/form.js"></script> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_3_porteur.php b/src/vitis/vas/doc/suivi_prod_immo/form_3_porteur.php new file mode 100644 index 0000000000000000000000000000000000000000..f657e61844def14ddb53e9ea197929ca901e4481 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_3_porteur.php @@ -0,0 +1,40 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/form_3_porteur.php +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + // get data CTM + $oResult=$oConn->prepare('SELECT DISTINCT nom_amenageur, count(nom_amenageur) FROM '.$properties['schema_prod_immo'].'.operation WHERE nom_amenageur IS NOT NULL GROUP BY nom_amenageur ORDER BY count DESC, nom_amenageur'); + $oResult->execute(); + if ($oResult->rowCount()>0){ + $aAmenageurs = $oResult->fetchAll(); + }else{ + $sError="Erreur : ".$oResult->rowCount()." aménageur(s) trouvé(s)."; + } + } + include ('form_3_porteur.html'); + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} + + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_4_logement.html b/src/vitis/vas/doc/suivi_prod_immo/form_4_logement.html new file mode 100644 index 0000000000000000000000000000000000000000..62bf50dbd59b39408dd17583b7f533abc9e7c968 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_4_logement.html @@ -0,0 +1,103 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style.css"> +</head> +<body> + <nav class="navbar navbar-dark fixed-top navbar_analyse flex-md-nowrap p-0 shadow"> + <a class="navbar-brand col-sm-3 col-md-2 mr-0" href="#">BD Suivi de la production immobilière</a> + <a class="navbar-text col-sm-2 col-md-4 mr-0" href="#"> Module d'analyse</a> + <ul class="navbar-nav px-3"> + <li class="nav-item text-nowrap"> + <img src="images/grand_lyon_large.png" width="150px"> <img src="https://geo.urbalyon.org/images/logo_bandeau_urbalyon.png">Urbalyon + </li> + </ul> + </nav> + + <div class="container-fluid"> + <div class="row"> + <nav class="col-md-2 d-none d-md-block bg-light sidebar"> + <div class="sidebar-sticky"> + <ul class="nav flex-column"> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_1_operation.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Fiche opération</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_2_type.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Type d'opération</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_3_porteur.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Porteurs de programmes</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="https://geo.urbalyon.org/doc/suivi_prod_immo/form_4_logement.php?token=<?php echo $_SESSION['token_bd_prod_immo']; ?>"><span data-feather="file-text"></span>Les programmes de logements<span class="sr-only">(current)</span></a> + </li> + </ul> + </div> + </nav> + + <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4"> + <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"> + <div class="container"> + <div class="row"> + <h1 class="h2">Fiche des programmes immobiliers de logements</h1> + </div> + <div class="row"> + <?php if (isset($sError)): ?> + <div class="alert alert-danger" role="alert"> + <span data-feather="alert-triangle"></span> <?php echo $sError; ?> + </div> + <?php endif; ?> + </div> + <div class="row mt-5"> + <form> + <div class="form-group"> + <label for="l_financement">Mode de financement</label> + <select class="form-control" id="l_financement"> + <option></option> + <?php foreach($aFinancement as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['code_financement_equ_public']; ?>"><?php echo $aValue['financement_equ_public']; ?></option> + <?php endforeach; ?> + </select> + <label for="l_ctm">Conférence Territoriale des Maires</label> + <select class="form-control" id="l_ctm"> + <option></option> + <?php foreach($aCTMs as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['id_ctm']; ?>"><?php echo $aValue['nom_ctm']; ?></option> + <?php endforeach; ?> + </select> + <label for="l_commune">Communes</label> + <select class="form-control" id="l_commune"> + <option></option> + <?php foreach($aCommunes as $iKey=>$aValue): ?> + <option value="<?php echo $aValue['id_commune']; ?>"><?php echo $aValue['nom_commune']; ?></option> + <?php endforeach; ?> + </select> + </div> + <div class="btn-group" role="group" aria-label="Basic example"> + <button id="get_logement" type="button" class="btn btn-outline-secondary">Afficher la fiche</button> + <button id="get_logement_excel" type="button" class="btn btn-outline-secondary"><span data-feather="download"></span> Export</button> + </div> + + </form> + </div> + </div> + </main> + + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + var sToken='<?php echo $_SESSION['token_bd_prod_immo']; ?>'; + feather.replace() + </script> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + <script type="text/javascript" src="js/form.js"></script> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/form_4_logement.php b/src/vitis/vas/doc/suivi_prod_immo/form_4_logement.php new file mode 100644 index 0000000000000000000000000000000000000000..c4f1273122181173105e1d2b18995b58dcce502f --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/form_4_logement.php @@ -0,0 +1,58 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/form_4_logement.php +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + // get data Mode de financement + $oResult = $oConn->prepare('SELECT code_financement_equ_public, financement_equ_public FROM '.$properties['schema_prod_immo'].'.tr_financement_equ_public ORDER BY financement_equ_public'); + $oResult->execute(); + if ($oResult->rowCount()>0){ + $aFinancement = $oResult->fetchAll(); + }else{ + $sError="Erreur : ".$oResult->rowCount()." financement(s) trouvé(s)."; + } + // get data CTM + $oResult2=$oConn->prepare('SELECT id_ctm, nom_ctm FROM '.$properties['schema_prod_immo'].'.conference_territoriale_maire ORDER BY nom_ctm'); + $oResult2->execute(); + if ($oResult2->rowCount()>0){ + $aCTMs = $oResult2->fetchAll(); + }else{ + $sError="Erreur : ".$oResult2->rowCount()." CTM(s) trouvé(s)."; + } + // get data Communes + $oResult3=$oConn->prepare('SELECT id_commune, nom_commune FROM '.$properties['schema_prod_immo'].'.commune ORDER BY nom_commune'); + $oResult3->execute(); + if ($oResult3->rowCount()>0){ + $aCommunes = $oResult3->fetchAll(); + }else{ + $sError="Erreur : ".$oResult3->rowCount()." commune(s) trouvé(s)."; + } + + + }else{ + $sError="Pas de connexion à la base de données."; + } + include ('form_4_logement.html'); + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_1_operation.html b/src/vitis/vas/doc/suivi_prod_immo/get_1_operation.html new file mode 100644 index 0000000000000000000000000000000000000000..310338a193ffa209344d8db976afa49128bdd763 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_1_operation.html @@ -0,0 +1,567 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style_dashboard.css"> +</head> +<body> + <div class="container-fluid"> + <div class="row"> + <div class="col-sm-3 title"><?php echo $aOperation['nom_operation']; ?></div> + <div class="col-sm-7 "></div> + <div class="col-sm-2 date_maj">État au <?php echo $aOperation['date_mise_a_jour']; ?></div> + </div> + <!-- BLOC 1 --> + <div class="row mt-4"> + <div class="col-sm-4"> + <canvas id="chart_sdp"></canvas> + </div> + <div class="col-sm-1"></div> + <div class="col-sm-7"> + <div class="row"> + <div class="col-sm-5"> + <div class="container-fluid border"> + <div class="row"><div class="col-sm subtitle">Acteurs et mode opératoire</div></div> + <div class="row mt-3"><div class="col-sm-4 line_table" style="text-align: right;">Type d'opération :</div><div class="col-sm-8 pl-0 line_table"><b><?php echo $aOperation['procedure_amenagement']; ?></b></div></div> + <div class="row"><div class="col-sm-4 line_table" style="text-align: right;">Opérateur :</div><div class="col-sm-8 pl-0 line_table"><b><?php echo $aOperation['nom_amenageur']; ?></b></div></div> + <div class="row"><div class="col-sm-5 line_table" style="text-align: right;">Dates (prévisionnelles) :</div><div class="col-sm-7 pl-0 line_table"><b><?php echo $aOperation['annee_init']."-".$aOperation['annee_achevement']; ?></b></div></div> + <div class="row"><div class="col-sm-5 line_table" style="text-align: right;">Chef de projet DMOU :</div><div class="col-sm-7 pl-0 line_table"><b><?php echo $aOperation['cdp_mo']; ?></b></div></div> + </div> + </div> + <div class="col-sm-1"></div> + <div class="col-sm-6"> + <div class="container-fluid border"> + <div class="row"><div class="col-sm subtitle">Superficies et vocation</div></div> + <div class="row mt-3"><div class="col-sm-5 line_table" style="text-align: right;">Vocation dominante :</div><div class="col-sm-7 pl-0 line_table"><b><?php echo $aOperation['vocation']; ?></b></div></div> + <div class="row"><div class="col-sm-4 line_table" style="text-align: right;">Superficie totale :</div><div class="col-sm-8 pl-0 line_table"><b><?php echo $aOperation['surface']; ?> Ha</b></div></div> + <div class="row"><div class="col-sm-4 line_table" style="text-align: right;">SDP :</div><div class="col-sm-8 pl-0 line_table"><b><?php echo $aOperation['sdp']; ?> m²</b></div></div> + <?php if($aOperation['coef_emprise_sol_moyen']!=''): ?> + <div class="row"><div class="col-sm-4 line_table" style="text-align: right;">CES moyen <span style="color: red;">*</span> :</div><div class="col-sm-8 pl-0 line_table"><b><?php echo $aOperation['coef_emprise_sol_moyen'].' %'; ?></b></div></div> + <?php endif; ?> + <?php if($aOperation['densite_batie']!=''): ?> + <div class="row"><div class="col-sm-4 line_table" style="text-align: right;">COS moyen <span style="color: red;">*</span> :</div><div class="col-sm-8 pl-0 line_table"><b><?php echo $aOperation['densite_batie']; ?></b></div></div> + <?php endif; ?> + </div> + <span style="font-size: 0.7rem;"><span style="color: red;">*</span> valeurs calculées à l'ilôt hors voirie et espace publique</span> + </div> + </div> + <div class="row mt-4"> + <div class="col-sm-12"> + <div class="container-fluid"> + <div class="row" style="height: 80px;"> + <div class="col-sm-2"></div> + <div class="col-sm-2 h-100 d-inline-block arrow" style="background-image : url(images/arrow_right_<?php if($aOperation['avancement']=='initialisation de l\'opération (études préalables amont ...)') echo "border_" ?>1.png);"> + <p class="text-center mt-4 align-middle <?php if($aOperation['avancement']=='initialisation de l\'opération (études préalables amont ...)') echo "font-weight-bolder" ?>">Initialisation</p> + </div> + <div class="col-sm-2 h-100 d-inline-block arrow" style="background-image : url(images/arrow_right_<?php if($aOperation['avancement']=='structuration de l\'opération (études pré-opérationnelles ...)') echo "border_" ?>2.png);"> + <p class="text-center mt-4 align-middle <?php if($aOperation['avancement']=='structuration de l\'opération (études pré-opérationnelles ...)') echo "font-weight-bolder" ?>">Structuration</p> + </div> + <div class="col-sm-2 h-100 d-inline-block arrow" style="background-image : url(images/arrow_right_<?php if($aOperation['avancement']=='réalisation de l\'opération - chantier (autorisations - constructions en cours)') echo "border_" ?>3.png);"> + <p class="text-center mt-4 align-middle <?php if($aOperation['avancement']=='réalisation de l\'opération - chantier (autorisations - constructions en cours)') echo "font-weight-bolder" ?>">Réalisation</p> + </div> + <div class="col-sm-2 h-100 d-inline-block arrow" style="background-image : url(images/arrow_right_<?php if($aOperation['avancement']=='achèvement de l\'opération (chantier et livraisons terminés, opération cloturée)') echo "border_" ?>4.png);"> + <p class="text-center mt-4 align-middle <?php if($aOperation['avancement']=='achèvement de l\'opération (chantier et livraisons terminés, opération cloturée)') echo "font-weight-bolder" ?>">Achèvement</p> + </div> + <div class="col-sm-2"></div> + </div> + <div class="row"> + <div class="col-sm-12 text-center"><span style="font-size: 0.9rem;">Avancement : <b><?php echo $iIlotSansProgramme; ?></b> ilôt(s) sans programmes autorisés sur un total de <b><?php echo $aIlot['count']; ?></b> ilôts</span></div> + </div> + </div> + </div> + </div> + </div> + </div> + <!-- BLOC 2 MAP --> + <div class="row mt-3"> + <div class="col-sm-6 text-right"> + <img src="<?php echo $sUrlMapImage; ?>" class="img-fluid" alt="carte" /> + </div> + <div class="col-sm-6"> + <div class="row mt-3">CTM : <b><?php echo $aOperation['nom_ctm']; ?></b></div> + <div class="row">Commune : <b><?php echo $aOperation['nom_commune']; ?></b></div> + <div class="row mt-3"> + <div class="col-sm-1">Légende</div> + </div> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1"><img src="images/legende_get_1_operation.png" alt="légende" /></div> + </div> + </div> + </div> + <!-- BLOC 3 Avancement --> + <div class="row mt-3"> + <div class="col-sm-12"> + <div class="container-fluid border"> + <div class="row"><div class="col-sm subtitle">Etat d'avancement par destination</div></div> + <div class="row mt-2"> + <div class="col-sm-2"></div> + <div class="col-sm-6"><canvas id="barchart_avancement"></canvas></div> + <div class="col-sm-2"></div> + </div> + <div class="row mt-3"> + <div class="col-sm-2 border-top border-bottom"><b>Destination</b></div> + <div class="col-sm-4 border"> + <div class="row"> + <div class="col-sm-12 text-center border-bottom"><b>Logements</b></div> + </div> + <div class="row" style="height: 110px;"> + <div class="col-sm-3 h-100 d-inline-block text-center border-right" style="writing-mode: vertical-rl;text-orientation: mixed;">accession libre</div> + <div class="col-sm-2 h-100 d-inline-block text-center border-right" style="writing-mode: vertical-rl;text-orientation: mixed;">accession aidée <br>et sociale</div> + <div class="col-sm-3 h-100 d-inline-block text-center border-right" style="writing-mode: vertical-rl;text-orientation: mixed;">locatif social</div> + <div class="col-sm-2 h-100 d-inline-block text-center border-right" style="writing-mode: vertical-rl;text-orientation: mixed;">locatif<br>intermédiaire</div> + <div class="col-sm-2 h-100 d-inline-block text-center" style="writing-mode: vertical-rl;text-orientation: mixed;">habitat<br>spécifique</div> + </div> + </div> + <div class="col-sm-1 text-center border-top border-bottom"><b>Bureaux</b></div> + <div class="col-sm-2 text-center border"> + <div class="row"><div class="col-sm-12 text-center border-bottom"><b>Commerces - hôtellerie - services</b></div></div> + <div class="row" style="height: 110px;"> + <div class="col-sm-6 h-100 d-inline-block text-center border-right" style="writing-mode: vertical-rl;text-orientation: mixed;">Commerces</div> + <div class="col-sm-6 h-100 d-inline-block text-center" style="writing-mode: vertical-rl;text-orientation: mixed;">Hôtels</div> + </div> + </div> + <div class="col-sm-2 text-center border-top border-bottom"> + <div class="row"><div class="col-sm-12 text-center border-bottom"><b>Activités - Industrie</b></div></div> + <div class="row" style="height: 110px;"> + <div class="col-sm-6 h-100 d-inline-block text-center border-right" style="writing-mode: vertical-rl;text-orientation: mixed;">Production<br>Industrie<br>Logistique</div> + <div class="col-sm-6 h-100 d-inline-block text-center" style="writing-mode: vertical-rl;text-orientation: mixed;">Autres<br>activités</div> + </div> + </div> + <div class="col-sm-1 text-center border-left border-top border-bottom"><b>Équipements publics de superstructure</b></div> + </div> + <div class="row border-bottom line_table"> + <div class="col-sm-2 border-right"><b>Répartition prévisionnelle en SDP</b></div> + <div class="col-sm-4 border-right text-center"><?php if (isset($aOperation['sdp_logement'])) echo $aOperation['sdp_logement'].' m²'; ?></div> + <div class="col-sm-1 border-right text-center"><?php if (isset($aOperation['sdp_bureau'])) echo $aOperation['sdp_bureau'].' m²'; ?></div> + <div class="col-sm-2 text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($aOperation['sdp_commerce_service'])) echo $aOperation['sdp_commerce_service'].' m²'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($aOperation['sdp_hotel'])) echo $aOperation['sdp_hotel'].' m²'; ?></div> + </div> + </div> + <div class="col-sm-2 text-center border-right"><?php if (isset($aOperation['sdp_locaux'])) echo $aOperation['sdp_locaux'].' m²'; ?></div> + <div class="col-sm-1 text-center"><?php if (isset($aOperation['sdp_equipement'])) echo $aOperation['sdp_equipement'].' m²'; ?></div> + </div> + <div class="row border-bottom line_table"> + <div class="col-sm-2 border-right"><b>Répartition prévisionnelle en nombre de logements</b></div> + <div class="col-sm-4 border-right text-center"><!--<?php echo $aOperation['nb_logement']; ?>--> + <div class="row"> + <div class="col-sm-10 border-right"><?php echo $aOperation['nb_lgt_fam']; ?></div> + <div class="col-sm-2 border-right"><?php echo $aOperation['nb_lgt_spe']; ?></div> + </div> + </div> + <div class="col-sm-1 border-right hachure"></div> + <div class="col-sm-2 border-right hachure"></div> + <div class="col-sm-2 border-right hachure"></div> + <div class="col-sm-1 hachure"></div> + </div> + <div class="row border-bottom line_table"> + <div class="col-sm-2 border-right"><b>SDP en m² des programmes autorisés</b></div> + <div class="col-sm-4 text-center"> + <div class="row"> + <div class="col-sm-3 border-right"><?php if (isset($iSdpAccessionLibre) && $iSdpAccessionLibre>0) echo $iSdpAccessionLibre.' m²'; ?></div> + <div class="col-sm-2 border-right"><?php if (isset($iSdpAccessionAide) && $iSdpAccessionAide>0) echo $iSdpAccessionAide.' m²'; ?></div> + <div class="col-sm-3 border-right"><?php if (isset($iSdpLocSocial) && $iSdpLocSocial>0) echo $iSdpLocSocial.' m²'; ?></div> + <div class="col-sm-2 border-right"><?php if (isset($iSdpLocIntermediaire) && $iSdpLocIntermediaire>0) echo $iSdpLocIntermediaire.' m²'; ?></div> + <div class="col-sm-2 border-right"><?php if (isset($iSdpHabitatSpe) && $iSdpHabitatSpe>0) echo $iSdpHabitatSpe.' m²'; ?></div> + </div> + </div> + <div class="col-sm-1 border-right text-center"><?php if (isset($iSdpBureau)) echo $iSdpBureau.' m²'; ?></div> + <div class="col-sm-2 text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($iSdpCommerce)) echo $iSdpCommerce.' m²'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($iSdpHotel)) echo $iSdpHotel.' m²'; ?></div> + </div> + </div> + <div class="col-sm-2 text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($iSdpProd)) echo $iSdpProd.' m²'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($iSdpActAutre)) echo $iSdpActAutre.' m²'; ?></div> + </div> + </div> + <div class="col-sm-1 text-center"><?php if (isset($iSdpEquipement)) echo $iSdpEquipement.' m²'; ?></div> + </div> + <div class="row border-bottom line_table"> + <div class="col-sm-2 border-right"><b>Nombre de logements restant à produire</b></div> + <div class="col-sm-4 text-center"> + <div class="row"> + <div class="col-sm-10 border-right"><?php if (isset($iNbLgtFam) && isset($aOperation['nb_lgt_fam']) && $iNbLgtFam>0) echo $aOperation['nb_lgt_fam']-$iNbLgtFam; ?></div> + <div class="col-sm-2 border-right"><?php if (isset($iNbHabitatSpe) && isset($aOperation['nb_lgt_spe'])) echo $aOperation['nb_lgt_spe']-$iNbHabitatSpe; ?></div> + </div> + </div> + <div class="col-sm-1 border-right hachure"></div> + <div class="col-sm-2 border-right hachure"></div> + <div class="col-sm-2 border-right hachure"></div> + <div class="col-sm-1 hachure"></div> + </div> + <div class="row border-bottom line_table"> + <div class="col-sm-2 border-right"><b>SDP autorisée/SDP prévisionnelle</b></div> + <div class="col-sm-4 border-right text-center"><?php if ((isset($iSdpAccessionLibre) or isset($iSdpAccessionAide) or isset($iSdpLocSocial) or isset($iSdpLocIntermediaire) or isset($iSdpHabitatSpe)) && isset($aOperation['sdp_logement'])) echo round((($iSdpAccessionLibre+$iSdpAccessionAide+$iSdpLocSocial+$iSdpLocIntermediaire+$iSdpHabitatSpe)*100) / $aOperation['sdp_logement']).' %'; ?></div> + <div class="col-sm-1 border-right text-center"><?php if (isset($iSdpBureau) && isset($aOperation['sdp_bureau'])) echo round(($iSdpBureau*100) / $aOperation['sdp_bureau']).' %'; ?></div> + <div class="col-sm-2 text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($iSdpCommerce) && isset($aOperation['sdp_commerce_service'])) echo round(($iSdpCommerce*100) / $aOperation['sdp_commerce_service']).' %'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($iSdpHotel) && isset($aOperation['sdp_hotel'])) echo round(($iSdpHotel*100) / $aOperation['sdp_hotel']).' %'; ?></div> + </div> + </div> + <div class="col-sm-2 border-right text-center"><?php if ((isset($iSdpProd) or isset($iSdpActAutre)) && isset($aOperation['sdp_locaux'])) echo round((($iSdpProd+$iSdpActAutre)*100) / $aOperation['sdp_locaux']).' %'; ?></div> + <div class="col-sm-1 text-center"><?php if (isset($iSdpEquipement) && isset($aOperation['sdp_equipement'])) echo round(($iSdpEquipement*100) / $aOperation['sdp_equipement']).' %'; ?></div> + </div> + <div class="row border-bottom line_table_2"> + <div class="col-sm-2 border-right"><b>Prix de vente moyen (HT hors stationnement)</b></div> + <div class="col-sm-4 border-right text-center"> + <div class="row"> + <div class="col-sm-3 border-right text-center"><?php if (isset($iPVAccessionLibre) && $iPVAccessionLibre>0) echo $iPVAccessionLibre.' €/m²'; ?></div> + <div class="col-sm-2 border-right text-center"><?php if (isset($iPVAccessionAidee) && $iPVAccessionAidee>0) echo $iPVAccessionAidee.' €/m²'; ?></div> + <div class="col-sm-3 border-right text-center"><?php if (isset($iPrixVenteSocial) && $iPrixVenteSocial>0) echo $iPrixVenteSocial.' €/m²'; ?></div> + <div class="col-sm-2 border-right text-center"><?php if (isset($iPrixVenteIntermediaire) && $iPrixVenteIntermediaire>0) echo $iPrixVenteIntermediaire.' €/m²'; ?></div> + <div class="col-sm-2 hachure"></div> + </div> + </div> + <div class="col-sm-1 border-right text-center"><?php if (isset($iPrixVenteBureau) && $iPrixVenteBureau>0) echo $iPrixVenteBureau.' €/m²'; ?></div> + <div class="col-sm-2 border-right text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($iPrixVenteCommerce)) echo $iPrixVenteCommerce.' €/m²'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($iPrixVenteHotel)) echo $iPrixVenteHotel.' €/m²'; ?></div> + </div> + </div> + <div class="col-sm-2 border-right text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($iPrixVenteProd)) echo $iPrixVenteProd.' €/m²'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($iPrixVenteActAutre)) echo $iPrixVenteActAutre.' €/m²'; ?></div> + </div> + </div> + <div class="col-sm-1 hachure"></div> + </div> + <div class="row border-bottom line_table_2"> + <div class="col-sm-2 border-right"><b>Charge foncière nette moyenne (HT hors stationnement)</b></div> + <div class="col-sm-4 border-right text-center"> + <div class="row"> + <div class="col-sm-3 border-right text-center"><?php if (isset($iCFAccessionLibre) && $iCFAccessionLibre>0) echo $iCFAccessionLibre.' €/m²'; ?></div> + <div class="col-sm-2 border-right text-center"><?php if (isset($iCFAccessionAidee) && $iCFAccessionAidee>0) echo $iCFAccessionAidee.' €/m²'; ?></div> + <div class="col-sm-3 border-right text-center"><?php if (isset($iCFSocial) && $iCFSocial>0) echo $iCFSocial.' €/m²'; ?></div> + <div class="col-sm-2 border-right text-center"><?php if (isset($iCFIntermediaire) && $iCFIntermediaire>0) echo $iCFIntermediaire.' €/m²'; ?></div> + <div class="col-sm-2 hachure"></div> + </div> + </div> + <div class="col-sm-1 border-right text-center"><?php if (isset($iCFBureau) && $iCFBureau>0) echo $iCFBureau.' €/m²'; ?></div> + <div class="col-sm-2 border-right text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($iCFCommerce) && $iCFCommerce>0) echo $iCFCommerce.' €/m²'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($iCFHotel) && $iCFHotel>0) echo $iCFHotel.' €/m²'; ?></div> + </div> + </div> + <div class="col-sm-2 border-right text-center"> + <div class="row"> + <div class="col-sm-6 border-right"><?php if (isset($iCFProd) && $iCFProd>0) echo $iCFProd.' €/m²'; ?></div> + <div class="col-sm-6 border-right"><?php if (isset($iCFActAutre) && $iCFActAutre>0) echo $iCFActAutre.' €/m²'; ?></div> + </div> + </div> + <div class="col-sm-1 hachure"></div> + </div> + <div class="row border-bottom line_table_2"> + <div class="col-sm-2 border-right"><b>Charge foncière nette moyenne</b></div> + <div class="col-sm-10 text-center"><?php if (isset($aProgrammesStat['charge_fonciere_nette']) && $aProgrammesStat['charge_fonciere_nette']>0) echo $aProgrammesStat['charge_fonciere_nette'].' €/m² HT hors stationnement'; ?></div> + </div> + <div class="row line_table_2"> + <div class="col-sm-2 border-right"><b>Charge foncière brute moyenne</b></div> + <div class="col-sm-10 text-center"><?php if (isset($aProgrammesStat['cout_construction_moyen']) && $aProgrammesStat['cout_construction_moyen']>0) echo $aProgrammesStat['cout_construction_moyen'].' €/m² HT hors stationnement'; ?></div> + </div> + </div> + </div> + </div> + <!-- BLOC 4 taille --> + <?php if (count($aProgrammes)>0): ?> + <div class="row mt-3"> + <div class="col-sm-12"> + <div class="container-fluid border"> + <div class="row"><div class="col-sm subtitle">Taille des logements des programmes engagés</div></div> + <div class="row"> + <div class="col-sm-5"> + <canvas id="chart_granulometrie"></canvas> + </div> + <div class="col-sm-7"> + <canvas id="barchart_granulometrie"></canvas> + </div> + </div> + <div class="row"> + <div class="col-sm-5"> + <div class="row"><div class="col-sm subtitle">Répartition moyenne des acquéreurs des logements en accession libre</div></div> + <div class="row border-bottom line_table_2"> + <div class="col-sm-6 border-right"></div> + <div class="col-sm-3 border-right text-center"><b>Nombre de logements</b></div> + <div class="col-sm-3 border-right text-center"><b>Pourcentage<!-- de SDP--></b></div> + </div> + <div class="row border-bottom"> + <div class="col-sm-6 border-right line_table_2 text-right"><b>Propriétaire occupant</b></div> + <div class="col-sm-3 border-right line_table text-center"><?php if (isset($iNbProprioOcc) && $iNbProprioOcc>0) echo $iNbProprioOcc; ?></div> + <div class="col-sm-3 border-right line_table text-center"><?php if (isset($iPourcProprioOcc) && $iPourcProprioOcc>0) echo $iPourcProprioOcc.'%'; ?></div> + </div> + <div class="row border-bottom"> + <div class="col-sm-6 border-right line_table_2 text-right"><b>Investisseur</b></div> + <div class="col-sm-3 border-right line_table text-center"><?php if (isset($iNbInvest) && $iNbInvest>0) echo $iNbInvest; ?></div> + <div class="col-sm-3 border-right line_table text-center"><?php if (isset($iPourcInvest) && $iPourcInvest>0) echo $iPourcInvest.'%'; ?></div> + </div> + </div> + <div class="col-sm-7"> + <?php if(count($aGranulometrie)>0): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-bottom border-right"></div> + <div class="col-sm-2 border-bottom border-right line_table_2 text-center"><b>Accession</b></div> + <div class="col-sm-3 border-bottom border-right line_table_2 text-center"><b>Location (sociale ou intermédiaire)</b></div> + <div class="col-sm-3 border-bottom border-right line_table_2 text-center"><b>Habitat spécifique</b></div> + <div class="col-sm-2 border-bottom line_table_2 text-center"><b>Total</b></div> + </div> + <?php if(isset($aGranulometrie['T1'])): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-bottom border-right line_table_2 text-right"><b>T1</b></div> + <div class="col-sm-2 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T1']['LG_FAM_ACC']) && $aGranulometrie['T1']['LG_FAM_ACC']>0) echo $aGranulometrie['T1']['LG_FAM_ACC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T1']['LG_FAM_LOC']) && $aGranulometrie['T1']['LG_FAM_LOC']>0) echo $aGranulometrie['T1']['LG_FAM_LOC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T1']['TOT_LG_SPE']) && $aGranulometrie['T1']['TOT_LG_SPE']>0) echo $aGranulometrie['T1']['TOT_LG_SPE']; ?></div> + <div class="col-sm-2 border-bottom line_table text-center"><?php echo array_sum($aGranulometrie['T1']); ?></div> + </div> + <?php endif; ?> + <?php if(isset($aGranulometrie['T2'])): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-bottom border-right line_table_2 text-right"><b>T2</b></div> + <div class="col-sm-2 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T2']['LG_FAM_ACC']) && $aGranulometrie['T2']['LG_FAM_ACC']>0) echo $aGranulometrie['T2']['LG_FAM_ACC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T2']['LG_FAM_LOC']) && $aGranulometrie['T2']['LG_FAM_LOC']>0) echo $aGranulometrie['T2']['LG_FAM_LOC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T2']['TOT_LG_SPE']) && $aGranulometrie['T2']['TOT_LG_SPE']>0) echo $aGranulometrie['T2']['TOT_LG_SPE']; ?></div> + <div class="col-sm-2 border-bottom line_table text-center"><?php echo array_sum($aGranulometrie['T2']); ?></div> + </div> + <?php endif; ?> + <?php if(isset($aGranulometrie['T3'])): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-bottom border-right line_table_2 text-right"><b>T3</b></div> + <div class="col-sm-2 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T3']['LG_FAM_ACC']) && $aGranulometrie['T3']['LG_FAM_ACC']>0) echo $aGranulometrie['T3']['LG_FAM_ACC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T3']['LG_FAM_LOC']) && $aGranulometrie['T3']['LG_FAM_LOC']>0) echo $aGranulometrie['T3']['LG_FAM_LOC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T3']['TOT_LG_SPE']) && $aGranulometrie['T3']['TOT_LG_SPE']>0) echo $aGranulometrie['T3']['TOT_LG_SPE']; ?></div> + <div class="col-sm-2 border-bottom line_table text-center"><?php echo array_sum($aGranulometrie['T3']); ?></div> + </div> + <?php endif; ?> + <?php if(isset($aGranulometrie['T4'])): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-bottom border-right line_table_2 text-right"><b>T4</b></div> + <div class="col-sm-2 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T4']['LG_FAM_ACC']) && $aGranulometrie['T4']['LG_FAM_ACC']>0) echo $aGranulometrie['T4']['LG_FAM_ACC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T4']['LG_FAM_LOC']) && $aGranulometrie['T4']['LG_FAM_LOC']>0) echo $aGranulometrie['T4']['LG_FAM_LOC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T4']['TOT_LG_SPE']) && $aGranulometrie['T4']['TOT_LG_SPE']>0) echo $aGranulometrie['T4']['TOT_LG_SPE']; ?></div> + <div class="col-sm-2 border-bottom line_table text-center"><?php echo array_sum($aGranulometrie['T4']); ?></div> + </div> + <?php endif; ?> + <?php if(isset($aGranulometrie['T5'])): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-bottom border-right line_table_2 text-right"><b>T5</b></div> + <div class="col-sm-2 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T5']['LG_FAM_ACC']) && $aGranulometrie['T5']['LG_FAM_ACC']>0) echo $aGranulometrie['T5']['LG_FAM_ACC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T5']['LG_FAM_LOC']) && $aGranulometrie['T5']['LG_FAM_LOC']>0) echo $aGranulometrie['T5']['LG_FAM_LOC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T5']['TOT_LG_SPE']) && $aGranulometrie['T5']['TOT_LG_SPE']>0) echo $aGranulometrie['T5']['TOT_LG_SPE']; ?></div> + <div class="col-sm-2 border-bottom line_table text-center"><?php echo array_sum($aGranulometrie['T5']); ?></div> + </div> + <?php endif; ?> + <?php if(isset($aGranulometrie['T6'])): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-bottom border-right line_table_2 text-right"><b>T6 et +</b></div> + <div class="col-sm-2 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T6']['LG_FAM_ACC']) && $aGranulometrie['T6']['LG_FAM_ACC']>0) echo $aGranulometrie['T6']['LG_FAM_ACC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T6']['LG_FAM_LOC']) && $aGranulometrie['T6']['LG_FAM_LOC']>0) echo $aGranulometrie['T6']['LG_FAM_LOC']; ?></div> + <div class="col-sm-3 border-bottom border-right line_table text-center"><?php if (isset($aGranulometrie['T6']['TOT_LG_SPE']) && $aGranulometrie['T6']['TOT_LG_SPE']>0) echo $aGranulometrie['T6']['TOT_LG_SPE']; ?></div> + <div class="col-sm-2 border-bottom line_table text-center"><?php echo array_sum($aGranulometrie['T6']); ?></div> + </div> + <?php endif; ?> + <?php if(isset($aGranulometrie['NB'])): ?> + <div class="row"> + <div class="col-sm-1"></div> + <div class="col-sm-1 border-right line_table_2 text-right"><b>Total</b></div> + <div class="col-sm-2 border-right line_table text-center"><?php if (isset($aGranulometrie['NB']['LG_FAM_ACC']) && $aGranulometrie['NB']['LG_FAM_ACC']>0) echo $aGranulometrie['NB']['LG_FAM_ACC']; ?></div> + <div class="col-sm-3 border-right line_table text-center"><?php if (isset($aGranulometrie['NB']['LG_FAM_LOC']) && $aGranulometrie['NB']['LG_FAM_LOC']>0) echo $aGranulometrie['NB']['LG_FAM_LOC']; ?></div> + <div class="col-sm-3 border-right line_table text-center"><?php if (isset($aGranulometrie['NB']['TOT_LG_SPE']) && $aGranulometrie['NB']['TOT_LG_SPE']>0) echo $aGranulometrie['NB']['TOT_LG_SPE']; ?></div> + <div class="col-sm-2 line_table text-center"><?php echo $aGranulometrie['NB']['TOT']; ?></div> + </div> + <?php endif; ?> + <?php endif; ?> + </div> + </div> + </div> + </div> + </div> + <!-- BLOC 5 Programmes --> + <div class="row mt-3"> + <div class="col-sm-12"> + <div class="container-fluid border"> + <div class="row"><div class="col-sm subtitle"><?php echo count($aProgrammes); ?> programme<?php if(count($aProgrammes)>1) echo 's'; ?> avec PC autorisé<?php if(count($aProgrammes)>1) echo 's'; ?></div></div> + <div class="row border-bottom line_table_2"> + <div class="col-sm-1 border-right"><b>Nom de l'ilôt</b></div> + <div class="col-sm-2 border-right"><b>Nom du programme</b></div> + <div class="col-sm-1 border-right"><b>Numéro du PC</b></div> + <div class="col-sm-3 border-right"><b>Nom du demandeur</b></div> + <div class="col-sm-1 border-right"><b>Période</b></div> + <div class="col-sm-1 border-right"><b>Type opérateur</b></div> + <div class="col-sm-3 border-right"> + <div class="row"> + <div class="col-sm-8 border-right"><b>Éléments principaux</b></div> + <div class="col-sm-2 border-right"><b>SDP m²</b></div> + <div class="col-sm-2"><b>NB</b></div> + </div> + </div> + </div> + <?php foreach($aProgrammes as $aProgramme): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-1 border-right"><?php echo $aProgramme['nom_ilot']; ?></div> + <div class="col-sm-2 border-right"><?php echo $aProgramme['nom_programme']; ?></div> + <div class="col-sm-1 border-right"><?php echo $aProgramme['numero_pc']; ?></div> + <div class="col-sm-3 border-right"><?php echo $aProgramme['nom_demandeur']; ?></div> + <div class="col-sm-1 border-right"><?php echo $aProgramme['annee_debut']." - ".$aProgramme['annee_fin']; ?></div> + <div class="col-sm-1 border-right"><?php echo $aProgramme['code_type_operateur']; ?></div> + <div class="col-sm-3"> + <!--<div class="row border-bottom line_table_2"> + <div class="col-sm-8 border-right"></div> + <div class="col-sm-2 border-right">SDP m²</div> + <div class="col-sm-2">NB</div> + <div class="col-sm-1 border-right">T1</div> + <div class="col-sm-1 border-right">T2</div> + <div class="col-sm-1 border-right">T3</div> + <div class="col-sm-1 border-right">T4</div> + <div class="col-sm-1 border-right">T5</div> + <div class="col-sm-1">T6</div> + </div>--> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Totaux logements familiaux</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['NB']; ?></div> + <!--<div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T1'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T1']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T2'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T2']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T3'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T3']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T4'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T4']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T5'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T5']; ?></div> + <div class="col-sm-1"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T6'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_FAM']['T6']; ?></div>--> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right"> dont logements familiaux en accession</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['NB']; ?></div> + <!--<div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T1'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T1']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T2'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T2']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T3'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T3']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T4'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T4']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T5'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T5']; ?></div> + <div class="col-sm-1"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T6'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_ACC']['T6']; ?></div>--> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right"> dont logements familiaux en location</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['NB']; ?></div> + <!--<div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T1'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T1']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T2'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T2']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T3'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T3']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T4'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T4']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T5'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T5']; ?></div> + <div class="col-sm-1"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T6'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LG_FAM_LOC']['T6']; ?></div>--> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Totaux logements habitat spécifique</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['NB']; ?></div> + <!--<div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T1'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T1']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T2'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T2']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T3'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T3']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T4'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T4']; ?></div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T5'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T5']; ?></div> + <div class="col-sm-1"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T6'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['TOT_LG_SPE']['T6']; ?></div>--> + </div> + <?php endif; ?> + + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['BUREAU'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Bureaux</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['BUREAU']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['BUREAU']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['BUREAU']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['BUREAU']['NB']; ?></div> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['ACT'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Activités</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['ACT']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['ACT']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['ACT']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['ACT']['NB']; ?></div> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['HOT'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Hotels</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['HOT']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['HOT']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['HOT']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['HOT']['NB']; ?></div> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['COMM'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Commerces/services</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['COMM']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['COMM']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['COMM']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['COMM']['NB']; ?></div> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LOISIR'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Loisirs</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LOISIR']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LOISIR']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['LOISIR']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['LOISIR']['NB']; ?></div> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['EQUIP'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-8 border-right">Équipements</div> + <div class="col-sm-2 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['EQUIP']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['EQUIP']['SDP']; ?></div> + <div class="col-sm-2"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['EQUIP']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['EQUIP']['NB']; ?></div> + </div> + <?php endif; ?> + <?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['PARKING'])): ?> + <div class="row border-bottom line_table"> + <div class="col-sm-4 border-right">Parkings</div> + <div class="col-sm-1 border-right"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['PARKING']['SDP'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['PARKING']['SDP']; ?></div> + <div class="col-sm-1"><?php if(isset($aSyntheseProgrammes[$aProgramme['id_programme']]['PARKING']['NB'])) echo $aSyntheseProgrammes[$aProgramme['id_programme']]['PARKING']['NB']; ?></div> + </div> + <?php endif; ?> + </div> + </div> + <?php endforeach; ?> + </div> + </div> + </div> + <?php endif; ?> + + <div class="row mt-3"> + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + feather.replace() + </script> + <!-- Chart.js --> + <script src="js/chart.js_2.8.0/Chart.min.js"></script> + <script> + var aDataSdpPrev=[<?php echo $sDataSdpPrev; ?>]; + var aDataAvancementPrev=[<?php echo (isset($aOperation['sdp_logement'])) ? $aOperation['sdp_logement'] : 0; ?>,<?php echo (isset($aOperation['sdp_bureau'])) ? $aOperation['sdp_bureau'] : 0; ?>,<?php echo (isset($aOperation['sdp_commerce_service'])) ? $aOperation['sdp_commerce_service'] : 0; ?>,<?php echo (isset($aOperation['sdp_locaux'])) ? $aOperation['sdp_locaux'] : 0; ?>,<?php echo (isset($aOperation['sdp_equipement'])) ? $aOperation['sdp_equipement'] : 0; ?>]; + var aDataAvancementEngag=[<?php echo (isset($iSdpAccessionLibre) or isset($iSdpAccessionAide) or isset($iSdpLocSocial) or isset($iSdpLocIntermediaire) or isset($iSdpHabitatSpe)) ? $iSdpAccessionLibre+$iSdpAccessionAide+$iSdpLocSocial+$iSdpLocIntermediaire+$iSdpHabitatSpe : 0; ?>,<?php echo (isset($iSdpBureau)) ? $iSdpBureau : 0; ?>,<?php echo (isset($iSdpCommerce)) ? $iSdpCommerce : 0; ?>,<?php echo (isset($iSdpProd) or isset($iSdpActAutre)) ? $iSdpProd+$iSdpActAutre : 0; ?>,<?php echo (isset($iSdpEquipement)) ? $iSdpEquipement : 0; ?>]; + var aDataGanulometrie=[<?php echo $sDataGranulometrie; ?>]; + var aDataGanulometrieAccession=[<?php if(isset($aGranulometrie2['LG_FAM_ACC'])) echo $aGranulometrie2['LG_FAM_ACC']; ?>]; + var aDataGanulometrieLoc=[<?php if(isset($aGranulometrie2['LG_FAM_LOC'])) echo $aGranulometrie2['LG_FAM_LOC']; ?>]; + var aDataGanulometrieHabSpe=[<?php if(isset($aGranulometrie2['TOT_LG_SPE'])) echo $aGranulometrie2['TOT_LG_SPE']; ?>]; + </script> + <script type="text/javascript" src="js/dashboard_1_operation.js"></script> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_1_operation.php b/src/vitis/vas/doc/suivi_prod_immo/get_1_operation.php new file mode 100644 index 0000000000000000000000000000000000000000..80cd62e827c0cbf8f3d79e3e32450a4786214364 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_1_operation.php @@ -0,0 +1,268 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/get_1_operation.php?id_operation=1041 +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + + if (isset($_REQUEST['id_operation']) && !is_null($_REQUEST['id_operation'])){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + $sSchema=$properties['schema_prod_immo']; + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + // get data Opérations + $sWhereIdOperation=" WHERE id_operation=".$_REQUEST['id_operation']; + $oResult = $oConn->prepare("SELECT *, ST_XMin(ST_Buffer(geom,50)) AS xmin, ST_YMin(ST_Buffer(geom,50)) AS ymin, ST_XMax(ST_Buffer(geom,50)) AS xmax, ST_YMax(ST_Buffer(geom,50)) AS ymax FROM ".$sSchema.".v_operation_layer".$sWhereIdOperation); + $oResult->execute(); + + if ($oResult->rowCount()>0){ + $aOperations = $oResult->fetchAll(); + $oResult->closeCursor(); + $aOperation =$aOperations[0]; + $aOperation['date_mise_a_jour'] = date("d/m/Y", strtotime($aOperation['date_mise_a_jour'])); + $sDataSdpPrev= $aOperation['sdp_logement'].",".$aOperation['sdp_bureau'].",".$aOperation['sdp_commerce_service'].",".$aOperation['sdp_locaux'].",".$aOperation['sdp_equipement']; + // get map image + $sNameMapImage=$_REQUEST['id_operation']."_operation.png"; + $sCommand = escapeshellcmd('python get_map_image_1_operation.py '.$aOperation['xmin'].' '.$aOperation['ymin'].' '.$aOperation['xmax'].' '.$aOperation['ymax'].' '.$sNameMapImage.' '.$_REQUEST['id_operation']); + $output = shell_exec($sCommand); + $sUrlMapImage=$properties['web_server_name']."/ws_data/vm4ms/map/tmp/".$sNameMapImage; + + // get data ilot + $oResult1 = $oConn->prepare("SELECT count(id_ilot) FROM ".$sSchema.".ilot".$sWhereIdOperation); + $oResult1->execute(); + $aIlot = $oResult1->fetch(PDO::FETCH_ASSOC); + $oResult1->closeCursor(); + $oResult2 = $oConn->prepare("SELECT count(DISTINCT programme_immobilier.id_ilot) FROM ".$sSchema.".programme_immobilier INNER JOIN ".$sSchema.".ilot ON programme_immobilier.id_ilot=ilot.id_ilot".$sWhereIdOperation); + $oResult2->execute(); + $aIlotProgramme = $oResult2->fetch(PDO::FETCH_ASSOC); + $iIlotSansProgramme = $aIlot['count']-$aIlotProgramme['count']; + $oResult2->closeCursor(); + // get data programme + $oResult3 = $oConn->prepare("SELECT array_to_string(array_agg(id_programme), ',') AS id_programme, round(avg(cout_construction_moyen)) AS cout_construction_moyen,round( avg(charge_fonciere_nette)) AS charge_fonciere_nette FROM ".$sSchema.".programme_immobilier INNER JOIN ".$sSchema.".ilot ON ilot.id_ilot=programme_immobilier.id_ilot ".$sWhereIdOperation." GROUP BY id_operation"); + $oResult3->execute(); + if ($oResult3->rowCount()>0){ + $aProgrammesStat=$oResult3->fetch(PDO::FETCH_ASSOC); + $sIdsProgramme = $aProgrammesStat['id_programme']; + $sWhereIdProgramme = " WHERE id_programme IN (".$sIdsProgramme.")"; + //echo $sWhereIdProgramme; + $oResult3->closeCursor(); + $oResult11=$oConn->prepare("SELECT nom_ilot, numero_pc, surface, id_programme, nom_programme, code_type_operateur, nom_demandeur, annee_debut, annee_fin FROM ".$sSchema.".programme_immobilier INNER JOIN ".$sSchema.".ilot ON ilot.id_ilot=programme_immobilier.id_ilot ".$sWhereIdOperation); + $oResult11->execute(); + $aProgrammes = $oResult11->fetchAll(); + $aSyntheseProgrammes=array(); + foreach ($aProgrammes as $iKey => $aProgramme){ + $aSyntheseProgrammes[$aProgramme['id_programme']]=array(); + $sSql12="SELECT code_composition_programme, code_type_granulometrie, valeur FROM ".$sSchema.".granulometrie WHERE id_programme IN (".$aProgramme['id_programme'].") ORDER BY code_composition_programme, code_type_granulometrie"; + foreach ($oConn->query($sSql12) as $aRow){ + if (!isset($aSyntheseProgrammes[$aProgramme['id_programme']][$aRow['code_composition_programme']])) $aSyntheseProgrammes[$aProgramme['id_programme']][$aRow['code_composition_programme']]=array(); + $aSyntheseProgrammes[$aProgramme['id_programme']][$aRow['code_composition_programme']][$aRow['code_type_granulometrie']]=$aRow['valeur']; + } + } + $oResult11->closeCursor(); + + + // get accession libre aidee + $sSql8="SELECT id_indicateur_logement_familliaux_accession, round(sum(accession_libre)::numeric) AS sum_accession_libre, round(coalesce(sum(accession_abordable),0)+coalesce(sum(accesion_sociale_securise),0)+coalesce(sum(psla),0)) AS sum_accession_aide, round(avg(accession_libre)::numeric) AS avg_accession_libre, round(avg(accession_abordable)) AS avg_accession_abordable, round(avg(accesion_sociale_securise)) AS avg_accesion_sociale_securise, round(avg(psla)) AS avg_psla FROM ".$sSchema.".logement_familliaux_accession".$sWhereIdProgramme." AND id_indicateur_logement_familliaux_accession IN (1,2,4,5,8,9) GROUP BY id_indicateur_logement_familliaux_accession"; + foreach ($oConn->query($sSql8) as $aRow){ + if ($aRow['id_indicateur_logement_familliaux_accession']==1){ + isset($iNbLgtFam) ? $iNbLgtFam=$iNbLgtFam+$aRow['sum_accession_libre'] : $iNbLgtFam=$aRow['sum_accession_libre']; + isset($iNbLgtFam) ? $iNbLgtFam=$iNbLgtFam+$aRow['sum_accession_aide'] : $iNbLgtFam=$aRow['sum_accession_aide']; + } + if ($aRow['id_indicateur_logement_familliaux_accession']==2){ + $iSdpAccessionLibre=$aRow['sum_accession_libre']; + $iSdpAccessionAide=$aRow['sum_accession_aide']; + } + if ($aRow['id_indicateur_logement_familliaux_accession']==4 or $aRow['id_indicateur_logement_familliaux_accession']==5){ + if(!isset($aCFAccessionLibre)) $aCFAccessionLibre=array(); + if(!is_null($aRow['avg_accession_libre'])) array_push($aCFAccessionLibre,$aRow['avg_accession_libre']); + if(!isset($aCFAccessionAidee)) $aCFAccessionAidee=array(); + if(!is_null($aRow['avg_accession_abordable'])) array_push($aCFAccessionAidee,$aRow['avg_accession_abordable']); + if(!is_null($aRow['avg_accesion_sociale_securise'])) array_push($aCFAccessionAidee,$aRow['avg_accesion_sociale_securise']); + if(!is_null($aRow['avg_psla'])) array_push($aCFAccessionAidee,$aRow['avg_psla']); + } + if ($aRow['id_indicateur_logement_familliaux_accession']==8 or $aRow['id_indicateur_logement_familliaux_accession']==9){ + if(!isset($aPVAccessionLibre)) $aPVAccessionLibre=array(); + if(!is_null($aRow['avg_accession_libre'])) array_push($aPVAccessionLibre,$aRow['avg_accession_libre']); + if(!isset($aPVAccessionAidee)) $aPVAccessionAidee=array(); + if(!is_null($aRow['avg_accession_abordable'])) array_push($aPVAccessionAidee,$aRow['avg_accession_abordable']); + if(!is_null($aRow['avg_accesion_sociale_securise'])) array_push($aPVAccessionAidee,$aRow['avg_accesion_sociale_securise']); + if(!is_null($aRow['avg_psla'])) array_push($aPVAccessionAidee,$aRow['avg_psla']); + } + } + if(isset($aPVAccessionLibre) and count($aPVAccessionLibre)>0) $iPVAccessionLibre = round(array_sum($aPVAccessionLibre)/count($aPVAccessionLibre)); + if(isset($aPVAccessionAidee) and count($aPVAccessionAidee)>0) $iPVAccessionAidee = round(array_sum($aPVAccessionAidee)/count($aPVAccessionAidee)); + if(isset($aCFAccessionLibre) and count($aCFAccessionLibre)>0) $iCFAccessionLibre = round(array_sum($aCFAccessionLibre)/count($aCFAccessionLibre)); + if(isset($aCFAccessionAidee) and count($aCFAccessionAidee)>0) $iCFAccessionAidee = round(array_sum($aCFAccessionAidee)/count($aCFAccessionAidee)); + // get locatif social + $sSql9="SELECT id_indicateur_logement_familliaux_location, round(coalesce(sum(social_pls),0)+coalesce(sum(social_plus_plai),0)) AS sum_social, round(coalesce(sum(intermediaire_pli),0)+coalesce(sum(intermediaire_afl),0)) AS sum_intermediaire, round(avg(social_pls)) AS avg_social_pls, round(avg(social_plus_plai)) AS avg_social_plus_plai, round(avg(intermediaire_pli)) AS avg_intermediaire_pli, round(avg(intermediaire_afl)) AS avg_intermediaire_afl FROM ".$sSchema.".composition_logement_familliaux_location_cp INNER JOIN ".$sSchema.".logement_familliaux_location ON logement_familliaux_location.id_logement_familliaux_location=composition_logement_familliaux_location_cp.id_logement_familliaux_location".$sWhereIdProgramme." AND id_indicateur_logement_familliaux_location IN (1,2,4,5,8) GROUP BY id_indicateur_logement_familliaux_location"; + foreach ($oConn->query($sSql9) as $aRow){ + if ($aRow['id_indicateur_logement_familliaux_location']==1){ + isset($iNbLgtFam) ? $iNbLgtFam=$iNbLgtFam+$aRow['sum_social'] : $iNbLgtFam=$aRow['sum_social']; + isset($iNbLgtFam) ? $iNbLgtFam=$iNbLgtFam+$aRow['sum_intermediaire'] : $iNbLgtFam=$aRow['sum_intermediaire']; + } + if ($aRow['id_indicateur_logement_familliaux_location']==2){ + $iSdpLocSocial=$aRow['sum_social']; + $iSdpLocIntermediaire=$aRow['sum_intermediaire']; + } + if ($aRow['id_indicateur_logement_familliaux_location']==4 or $aRow['id_indicateur_logement_familliaux_location']==5){ + if(!isset($aCFSocial)) $aCFSocial=array(); + if(!is_null($aRow['avg_social_pls'])) array_push($aCFSocial,$aRow['avg_social_pls']); + if(!is_null($aRow['avg_social_plus_plai'])) array_push($aCFSocial,$aRow['avg_social_plus_plai']); + if(!isset($aCFIntermediaire)) $aCFIntermediaire=array(); + if(!is_null($aRow['avg_intermediaire_pli'])) array_push($aCFIntermediaire,$aRow['avg_intermediaire_pli']); + if(!is_null($aRow['avg_intermediaire_afl'])) array_push($aCFIntermediaire,$aRow['avg_intermediaire_afl']); + } + if ($aRow['id_indicateur_logement_familliaux_location']==8){ + $aPrixVenteSocial=array(); + if(!is_null($aRow['avg_social_pls'])) array_push($aPrixVenteSocial,$aRow['avg_social_pls']); + if(!is_null($aRow['avg_social_plus_plai'])) array_push($aPrixVenteSocial,$aRow['avg_social_plus_plai']); + if(count($aPrixVenteSocial)>0) $iPrixVenteSocial = round(array_sum($aPrixVenteSocial)/count($aPrixVenteSocial)); + $aPrixVenteIntermediaire=array(); + if(!is_null($aRow['avg_intermediaire_pli'])) array_push($aPrixVenteIntermediaire,$aRow['avg_intermediaire_pli']); + if(!is_null($aRow['avg_intermediaire_afl'])) array_push($aPrixVenteIntermediaire,$aRow['avg_intermediaire_afl']); + if(count($aPrixVenteIntermediaire)>0) $iPrixVenteIntermediaire = round(array_sum($aPrixVenteIntermediaire)/count($aPrixVenteIntermediaire)); + } + } + if(isset($aCFSocial) and count($aCFSocial)>0) $iCFSocial = round(array_sum($aCFSocial)/count($aCFSocial)); + if(isset($aCFIntermediaire)and count($aCFIntermediaire)>0) $iCFIntermediaire = round(array_sum($aCFIntermediaire)/count($aCFIntermediaire)); + // get habitat spe + $oResult10=$oConn->prepare("SELECT id_indicateur_habitat_specifique, round(coalesce(sum(residence_etudiant),0)+coalesce(sum(residence_personne_agee),0)+coalesce(sum(autre),0)) AS total FROM ".$sSchema.".composition_habitat_specifique_cp INNER JOIN ".$sSchema.".habitat_specifique ON composition_habitat_specifique_cp.id_habitat_specifique=habitat_specifique.id_habitat_specifique".$sWhereIdProgramme." AND id_indicateur_habitat_specifique IN (1,2) GROUP BY id_indicateur_habitat_specifique ORDER BY id_indicateur_habitat_specifique"); + $oResult10->execute(); + $iNbHabitatSpe=$oResult10->fetch(PDO::FETCH_ASSOC)['total']; + $iSdpHabitatSpe=$oResult10->fetch(PDO::FETCH_ASSOC)['total']; + $oResult10->closeCursor(); + // get bureau + $sSql6="SELECT id_indicateur_bureau, round(sum(total)::numeric) AS sum, round(avg(total)::numeric) AS avg FROM ".$sSchema.".bureau".$sWhereIdProgramme." AND id_indicateur_bureau IN (1,2,3,6) GROUP BY id_indicateur_bureau"; + foreach ($oConn->query($sSql6) as $aRow) { + if ($aRow['id_indicateur_bureau']==1) $iSdpBureau = $aRow['sum']; + if ($aRow['id_indicateur_bureau']==2 or $aRow['id_indicateur_bureau']==3) + isset($iCFBureau) ? array_push($iCFBureau,$aRow['avg']) : $iCFBureau=array($aRow['avg']); + if ($aRow['id_indicateur_bureau']==6) $iPrixVenteBureau = $aRow['avg']; + } + //echo print_r($iCFBureau,true); + if (isset($iCFBureau)) $iCFBureau = round(array_sum($iCFBureau)/count($iCFBureau)); + //get commerce/hotel + $sSql4="SELECT id_indicateur_hotel_commerce_service, round(coalesce(sum(commerce),0)+coalesce(sum(loisir_marchand),0)+coalesce(sum(service_act_artisanale),0)) AS sum_commerce, round(sum(hotel)) AS sum_hotel, round(avg(commerce)) AS avg_commerce, round(avg(loisir_marchand)) AS avg_loisir_marchand, round(avg(service_act_artisanale)) AS avg_service_act_artisanale, round(avg(hotel)) AS avg_hotel FROM ".$sSchema.".hotel_commerce_service".$sWhereIdProgramme." AND id_indicateur_hotel_commerce_service IN (2,3,4,8) GROUP BY id_indicateur_hotel_commerce_service"; + foreach ($oConn->query($sSql4) as $aRow) { + if ($aRow['id_indicateur_hotel_commerce_service']==2){ + $iSdpCommerce=$aRow['sum_commerce']; + $iSdpHotel=$aRow['sum_hotel']; + } + if ($aRow['id_indicateur_hotel_commerce_service']==3 or $aRow['id_indicateur_hotel_commerce_service']==4){ + if(!isset($aCFCommerce)) $aCFCommerce=array(); + if(!is_null($aRow['avg_commerce'])) array_push($aCFCommerce,$aRow['avg_commerce']); + if(!is_null($aRow['avg_loisir_marchand'])) array_push($aCFCommerce,$aRow['avg_loisir_marchand']); + if(!is_null($aRow['avg_service_act_artisanale'])) array_push($aCFCommerce,$aRow['avg_service_act_artisanale']); + if(!isset($aCFHotel)) $aCFHotel=array(); + if(!is_null($aRow['avg_hotel'])) array_push($aCFHotel,$aRow['avg_hotel']); + } + if ($aRow['id_indicateur_hotel_commerce_service']==8){ + $aPrixVenteCommerce=array(); + if(!is_null($aRow['avg_commerce'])) array_push($aPrixVenteCommerce,$aRow['avg_commerce']); + if(!is_null($aRow['avg_loisir_marchand'])) array_push($aPrixVenteCommerce,$aRow['avg_loisir_marchand']); + if(!is_null($aRow['avg_service_act_artisanale'])) array_push($aPrixVenteCommerce,$aRow['avg_service_act_artisanale']); + if(count($aPrixVenteCommerce)>0) $iPrixVenteCommerce = round(array_sum($aPrixVenteCommerce)/count($aPrixVenteCommerce)); + $iPrixVenteHotel = $aRow['avg_hotel']; + } + } + if (isset($aCFCommerce)) $iCFCommerce = round(array_sum($aCFCommerce)/count($aCFCommerce)); + if (isset($aCFHotel)) $iCFHotel = round(array_sum($aCFHotel)/count($aCFHotel)); + //get prod/activite + $sSql7="SELECT id_indicateur_activite_industrie, round(sum(production_industrie_logistique)) AS sum_production_industrie_logistique, round(sum(autre)) AS sum_autre, round(avg(production_industrie_logistique)) AS avg_production_industrie_logistique, round(avg(autre)) AS avg_autre FROM ".$sSchema.".activite_industrie".$sWhereIdProgramme." AND id_indicateur_activite_industrie IN (2,3,4,7) GROUP BY id_indicateur_activite_industrie"; + foreach ($oConn->query($sSql7) as $aRow){ + if ($aRow['id_indicateur_activite_industrie']==2){ + $iSdpProd=$aRow['sum_production_industrie_logistique']; + $iSdpActAutre=$aRow['avg_autre']; + } + if ($aRow['id_indicateur_activite_industrie']==3 or $aRow['id_indicateur_activite_industrie']==4){ + isset($iCFProd) ? array_push($iCFProd,$aRow['avg_production_industrie_logistique']) : $iCFProd=array($aRow['avg_production_industrie_logistique']); + isset($iCFActAutre) ? array_push($iCFActAutre,$aRow['avg_autre']) : $iCFActAutre=array($aRow['avg_autre']); + } + if ($aRow['id_indicateur_activite_industrie']==7){ + $iPrixVenteProd = $aRow['avg_production_industrie_logistique']; + $iPrixVenteActAutre = $aRow['avg_autre']; + } + } + if (isset($iCFProd)) $iCFProd = round(array_sum($iCFProd)/count($iCFProd)); + if (isset($iCFActAutre)) $iCFActAutre = round(array_sum($iCFActAutre)/count($iCFActAutre)); + // get equipement + $oResult5 = $oConn->prepare("SELECT round(sum(sdp)::numeric) AS sdp FROM ".$sSchema.".equipement_structure".$sWhereIdProgramme); + $oResult5->execute(); + $iSdpEquipement = $oResult5->fetch(PDO::FETCH_ASSOC)['sdp']; + $oResult5->closeCursor(); + //get profil + $sSql12="SELECT id_type_acheteur_accession_libre, round(sum(nb)) AS nb, round(avg(pourc)) AS pourc FROM ".$sSchema.".profil_acheteur_accession_libre".$sWhereIdProgramme." AND id_type_acheteur_accession_libre IN (1,2) GROUP BY id_type_acheteur_accession_libre"; + foreach ($oConn->query($sSql12) as $aRow){ + if ($aRow['id_type_acheteur_accession_libre']==1){ + $iNbProprioOcc=$aRow['nb']; + $iPourcProprioOcc=$aRow['pourc']; + } + if ($aRow['id_type_acheteur_accession_libre']==2){ + $iNbInvest=$aRow['nb']; + $iPourcInvest=$aRow['pourc']; + } + } + // get granulometrie + $aGranulometrie=array(); + $aGranulometrie2=array('LG_FAM_ACC'=>array('T1'=>0,'T2'=>0,'T3'=>0,'T4'=>0,'T5'=>0,'T6'=>0), 'LG_FAM_LOC'=>array('T1'=>0,'T2'=>0,'T3'=>0,'T4'=>0,'T5'=>0,'T6'=>0), 'TOT_LG_SPE'=>array('T1'=>0,'T2'=>0,'T3'=>0,'T4'=>0,'T5'=>0,'T6'=>0)); + $aTypeGranulometrie=array('T1','T2','T3','T4','T5','T6','NB'); + foreach ($aTypeGranulometrie as $sTypeGranulometrie){ + $aTmp=array(); + $sSql13="SELECT code_composition_programme, sum(valeur) AS valeur FROM ".$sSchema.".granulometrie".$sWhereIdProgramme." AND code_type_granulometrie ='".$sTypeGranulometrie."' AND code_composition_programme IN ('TOT_LG_SPE','LG_FAM_ACC','LG_FAM_LOC','TOT_LG_FAM') GROUP BY code_composition_programme"; + foreach ($oConn->query($sSql13) as $aRow){ + if ($sTypeGranulometrie=='NB' && ($aRow['code_composition_programme']=='TOT_LG_FAM' || $aRow['code_composition_programme']=='TOT_LG_SPE')) $aTmp['TOT'] = $aTmp['TOT'] + $aRow['valeur']; + $aTmp[$aRow['code_composition_programme']]=$aRow['valeur']; + } + if (count($aTmp)>0) $aGranulometrie[$sTypeGranulometrie]=$aTmp; + if ($sTypeGranulometrie!='NB') + if (isset($sDataGranulometrie)) + $sDataGranulometrie=$sDataGranulometrie.','.array_sum($aTmp); + else + $sDataGranulometrie=array_sum($aTmp); + } + foreach ($aGranulometrie as $sTypeGranulometrie=>$aValues){ + if ($sTypeGranulometrie!='NB') + foreach ($aValues as $sCodeCompo=>$iValue){ + if (isset($aGranulometrie2[$sCodeCompo])) + $aGranulometrie2[$sCodeCompo][$sTypeGranulometrie]=$aGranulometrie2[$sCodeCompo][$sTypeGranulometrie]+$iValue; + } + + } + foreach ($aGranulometrie2 as $sCodeCompo=>$aValues) + $aGranulometrie2[$sCodeCompo] = implode(",", $aValues); + //echo '<br>'.print_r($aGranulometrie2,true); + } + + + include ('get_1_operation.html'); + }else{ + $sError="Erreur : ".$oResult->rowCount()." opération(s) trouvée(s)."; + $oResult->closeCursor(); + include ('get_error.html'); + } + } + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + include ('get_error.html'); + } + + }else{ + $sError="ERREUR : Pas d'opération passée en paramètre !"; + include ('get_error.html'); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_2_type.html b/src/vitis/vas/doc/suivi_prod_immo/get_2_type.html new file mode 100644 index 0000000000000000000000000000000000000000..f85478522e6e2952522d6321ddca0c28f4e13e6e --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_2_type.html @@ -0,0 +1,148 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style_dashboard.css"> +</head> +<body> + <div class="container-fluid"> + <div class="row"> + <div class="col-sm-4 title">Les types d'opérations</div> + <div class="col-sm-8 "></div> + </div> + <div class="row mt-4"> + <div class="col-sm-4 date_maj" style="color:black"><?php echo $aCTM['nom_ctm']; ?></div> + <div class="col-sm-8 "></div> + </div> + + <?php if (!isset($sUrlMapImage)): ?> + <div class="row mt-3">Pas d'opérations dans la base de données avec les filtres sélectionnées.</div> + <?php endif; ?> + + <?php if (isset($sUrlMapImage)): ?> + <?php if ($sFiltre!=''): ?> + <div class="row mt-1"> + <div class="col-sm-1"><b>Filtre(s) :</b></div> + <div class="col-sm-11"><?php echo $sFiltre; ?></div> + </div> + <?php endif; ?> + <div class="row mt-3"> + <div class="col-sm-2"><img src="images/legende_get_2_type.png" /></div> + <div class="col-sm-10"> + <img src="<?php echo $sUrlMapImage; ?>" class="img-fluid" alt="carte" /> + </div> + </div> + + <div class="row mt-3"> + <div class="col-sm-2 border-bottom border-right line_table_2"><b>Type de financement</b></div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Projet urbain partenarial</b></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Financements en ZAC</b></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Taxe d'aménagement</b></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Taxe d'aménagement majorée</b></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Participation équipement exceptionnel</b></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Autre</b></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Non défini</b></div> + <?php endif; ?> + </div> + <div class="row"> + <div class="col-sm-2 border-bottom border-right line_table_2">Charge foncière moyenne</div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['PUP']) && $aCF['PUP']>0) echo $aCF['PUP'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['FINZAC']) && $aCF['FINZAC']>0) echo $aCF['FINZAC'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['TA']) && $aCF['TA']>0) echo $aCF['TA'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['TAM']) && $aCF['TAM']>0) echo $aCF['TAM'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['PEPE']) && $aCF['PEPE']>0) echo $aCF['PEPE'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['AUT']) && $aCF['AUT']>0) echo $aCF['AUT'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['ND']) && $aCF['ND']>0) echo $aCF['ND'].' €'; ?></div> + <?php endif; ?> + </div> + <div class="row"> + <div class="col-sm-2 border-bottom border-right line_table_2">Prix de vente moyen</div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['PUP']) && $aPV['PUP']>0) echo $aPV['PUP'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['FINZAC']) && $aPV['FINZAC']>0) echo $aPV['FINZAC'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['TA']) && $aPV['TA']>0) echo $aPV['TA'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['TAM']) && $aPV['TAM']>0) echo $aPV['TAM'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['PEPE']) && $aPV['PEPE']>0) echo $aPV['PEPE'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['AUT']) && $aPV['AUT']>0) echo $aPV['AUT'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['ND']) && $aPV['ND']>0) echo $aPV['ND'].' €'; ?></div> + <?php endif; ?> + </div> + <div class="row"> + <div class="col-sm-2 line_table_2">CF par rapport au prix</div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['PUP']) && $aPourcCFPV['PUP']>0) echo $aPourcCFPV['PUP'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['FINZAC']) && $aPourcCFPV['FINZAC']>0) echo $aPourcCFPV['FINZAC'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['TA']) && $aPourcCFPV['TA']>0) echo $aPourcCFPV['TA'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['TAM']) && $aPourcCFPV['TAM']>0) echo $aPourcCFPV['TAM'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['PEPE']) && $aPourcCFPV['PEPE']>0) echo $aPourcCFPV['PEPE'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['AUT']) && $aPourcCFPV['AUT']>0) echo $aPourcCFPV['AUT'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['ND']) && $aPourcCFPV['ND']>0) echo $aPourcCFPV['ND'].' %'; ?></div> + <?php endif; ?> + </div> + <?php endif; ?> + + <div class="row mt-3"> + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + feather.replace() + </script> + <!-- + <script type="text/javascript" src="js/dashboard_1_operation.js"></script>--> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_2_type.php b/src/vitis/vas/doc/suivi_prod_immo/get_2_type.php new file mode 100644 index 0000000000000000000000000000000000000000..188fd2306bb8b10573d4f5acab049ce4200babdf --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_2_type.php @@ -0,0 +1,123 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/get_2_type.php?id_ctm=5 +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + + if ((isset($_REQUEST['id_ctm']) && !is_null($_REQUEST['id_ctm'])) or (isset($_REQUEST['id_commune']) && !is_null($_REQUEST['id_commune']))){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + $sSchema=$properties['schema_prod_immo']; + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + $sFiltre=""; + // get data Opérations + if (isset($_REQUEST['id_ctm'])) $sWhereClause=" WHERE id_ctm=".$_REQUEST['id_ctm']; + if (isset($_REQUEST['id_commune'])) $sWhereClause=" WHERE operation.id_commune=".$_REQUEST['id_commune']; + $sWhereClause2=$sWhereClause; + if (isset($_REQUEST['code_procedure_amenagement']) && !is_null($_REQUEST['code_procedure_amenagement'])){ + if($sFiltre!='') $sFiltre.="<br>"; + $sFiltre.="Procédure d'aménagement : ".$_REQUEST['code_procedure_amenagement']; + if($_REQUEST['code_procedure_amenagement']=='ND') + $sWhereClause2=$sWhereClause2." AND (code_procedure_amenagement='ND' OR code_procedure_amenagement IS NULL)"; + else + $sWhereClause2=$sWhereClause2." AND code_procedure_amenagement='".$_REQUEST['code_procedure_amenagement']."'"; + } + if (isset($_REQUEST['code_financement_equ_public']) && !is_null($_REQUEST['code_financement_equ_public'])){ + if($sFiltre!='') $sFiltre.="<br>"; + $sFiltre.="Type de financement : ".$_REQUEST['code_financement_equ_public']; + if($_REQUEST['code_financement_equ_public']=='ND') + $sWhereClause2=$sWhereClause2." AND (operation_tr_financement_equ_public.code_financement_equ_public='ND' OR operation_tr_financement_equ_public.code_financement_equ_public IS NULL) "; + else + $sWhereClause2=$sWhereClause2." AND operation_tr_financement_equ_public.code_financement_equ_public='".$_REQUEST['code_financement_equ_public']."'"; + } + if (isset($_REQUEST['code_suivi']) && !is_null($_REQUEST['code_suivi'])){ + if($sFiltre!='') $sFiltre.="<br>"; + $sFiltre.="Suivi de l'opération : ".$_REQUEST['code_suivi']; + if($_REQUEST['code_suivi']=='ND') + $sWhereClause2=$sWhereClause2." AND (code_suivi='ND' OR code_suivi IS NULL) "; + else + $sWhereClause2=$sWhereClause2." AND code_suivi='".$_REQUEST['code_suivi']."'"; + } + + if (isset($_REQUEST['id_ctm'])){ + $oResult = $oConn->prepare("SELECT nom_ctm, ST_XMin(ST_Buffer(geom,150)) AS xmin, ST_YMin(ST_Buffer(geom,150)) AS ymin, ST_XMax(ST_Buffer(geom,150)) AS xmax, ST_YMax(ST_Buffer(geom,150)) AS ymax FROM ".$sSchema.".conference_territoriale_maire ".$sWhereClause); + $sNameMapImage="ctm_".$_REQUEST['id_ctm']."_porteur.png"; + } + if (isset($_REQUEST['id_commune'])){ + $oResult = $oConn->prepare("SELECT nom_commune, ST_XMin(ST_Buffer(geom,150)) AS xmin, ST_YMin(ST_Buffer(geom,150)) AS ymin, ST_XMax(ST_Buffer(geom,150)) AS xmax, ST_YMax(ST_Buffer(geom,150)) AS ymax FROM ".$sSchema.".commune WHERE id_commune=".$_REQUEST['id_commune']); + $sNameMapImage="commune_".$_REQUEST['id_commune']."_porteur.png"; + } + $oResult->execute(); + + if ($oResult->rowCount()>0){ + $aCTM = $oResult->fetchAll(); + $aCTM = $aCTM[0]; + $oResult->closeCursor(); + // get map image + $aIdOperation=array(); + // echo "SELECT id_ctm, array_to_string(array_agg(operation.id_operation), ',') AS id_operation FROM (".$sSchema.".operation INNER JOIN ".$sSchema.".operation_ctm ON operation.id_operation=operation_ctm.id_operation) INNER JOIN ".$sSchema.".operation_tr_financement_equ_public ON operation.id_operation=operation_tr_financement_equ_public.id_operation ".$sWhereClause2." GROUP BY id_ctm"; + $oResult2 = $oConn->prepare("SELECT id_ctm, array_to_string(array_agg(operation.id_operation), ',') AS id_operation FROM (".$sSchema.".operation INNER JOIN ".$sSchema.".operation_ctm ON operation.id_operation=operation_ctm.id_operation) INNER JOIN ".$sSchema.".operation_tr_financement_equ_public ON operation.id_operation=operation_tr_financement_equ_public.id_operation ".$sWhereClause2." GROUP BY id_ctm"); + $oResult2->execute(); + $aOperations = $oResult2->fetchAll(); + $oResult2->closeCursor(); + if(count($aOperations[0])>0){ + $aOperations = $aOperations[0]; + $sCommand = escapeshellcmd('python get_map_image_2_type.py '.$aCTM['xmin'].' '.$aCTM['ymin'].' '.$aCTM['xmax'].' '.$aCTM['ymax'].' '.$sNameMapImage.' '.$aOperations['id_operation']); + // echo $sCommand; + $output = shell_exec($sCommand);/**/ + $sUrlMapImage=$properties['web_server_name']."/ws_data/vm4ms/map/tmp/".$sNameMapImage; + $sSql="SELECT code_financement_equ_public, count(DISTINCT id_programme), array_to_string(array_agg(id_programme), ',') AS id_programme, round(avg(charge_fonciere_moy)) AS charge_fonciere_moy FROM (SELECT id_programme, CASE WHEN operation_tr_financement_equ_public.code_financement_equ_public='PUP' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='FINZAC' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='TA' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='TAM' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='AUT' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='PEPE' THEN operation_tr_financement_equ_public.code_financement_equ_public ELSE 'ND' END AS code_financement_equ_public, charge_fonciere_moy FROM (((".$sSchema.".operation LEFT JOIN ".$sSchema.".operation_tr_financement_equ_public ON operation.id_operation=operation_tr_financement_equ_public.id_operation) INNER JOIN ".$sSchema.".ilot ON ilot.id_operation=operation.id_operation) INNER JOIN ".$sSchema.".programme_immobilier ON programme_immobilier.id_ilot=ilot.id_ilot) INNER JOIN ".$sSchema.".operation_ctm ON operation_ctm.id_operation=operation.id_operation ".$sWhereClause2.") AS t GROUP BY code_financement_equ_public"; + // echo $sSql; + $aPourcCFPV=$aPV=$aCF=$aNb=array(); + foreach ($oConn->query($sSql) as $aRow){ + if(!is_null($aRow['count'])) $aNb[$aRow['code_financement_equ_public']]=$aRow['count']; + if(!is_null($aRow['charge_fonciere_moy'])) $aCF[$aRow['code_financement_equ_public']]=$aRow['charge_fonciere_moy']; + $oResult3 = $oConn->prepare("SELECT round((COALESCE(avg1, 0) + COALESCE(avg2, 0) + COALESCE(avg3, 0) + COALESCE(avg4)) / ( CASE WHEN avg1 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg2 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg3 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg4 IS NULL THEN 0 ELSE 1 END)) AS pv_moy FROM (SELECT round(avg(accession_libre)) AS avg1, round(avg(accession_abordable)) AS avg2, round(avg(accesion_sociale_securise)) AS avg3, round(avg(psla)) AS avg4 FROM ".$sSchema.".logement_familliaux_accession WHERE id_programme IN (".$aRow['id_programme'].") AND id_indicateur_logement_familliaux_accession IN (8,9)) AS t"); + $oResult3->execute(); + $aPrixVenteMoy = $oResult3->fetchAll(); + if (isset($aPrixVenteMoy[0])) $aPV[$aRow['code_financement_equ_public']]=$aPrixVenteMoy[0]['pv_moy']; + $oResult3->closeCursor(); + } + if(isset($aCF['PUP']) && isset($aPV['PUP'])) $aPourcCFPV['PUP']=round(($aCF['PUP']/$aPV['PUP'])*100,1); + if(isset($aCF['FINZAC']) && isset($aPV['FINZAC'])) $aPourcCFPV['FINZAC']=round(($aCF['FINZAC']/$aPV['FINZAC'])*100,1); + if(isset($aCF['TA']) && isset($aPV['TA'])) $aPourcCFPV['TA']=round(($aCF['TA']/$aPV['TA'])*100,1); + if(isset($aCF['TAM']) && isset($aPV['TAM'])) $aPourcCFPV['TAM']=round(($aCF['TAM']/$aPV['TAM'])*100,1); + if(isset($aCF['PEPE']) && isset($aPV['PEPE'])) $aPourcCFPV['PEPE']=round(($aCF['PEPE']/$aPV['PEPE'])*100,1); + if(isset($aCF['AUT']) && isset($aPV['AUT'])) $aPourcCFPV['AUT']=round(($aCF['AUT']/$aPV['AUT'])*100,1); + if(isset($aCF['ND']) && isset($aPV['ND'])) $aPourcCFPV['ND']=round(($aCF['ND']/$aPV['ND'])*100,1); + // Moyenne pondérée au nombre d'opération total + // TODO pondérer au nombre d'opération ayant une valeur + } + include ('get_2_type.html'); + }else{ + $sError="Erreur : ".$oResult->rowCount()." conférence des maires trouvée."; + $oResult->closeCursor(); + include ('get_error.html'); + } + } + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + include ('get_error.html'); + } + + }else{ + $sError="ERREUR : Pas de CTM ou de communes passé en paramètre !"; + include ('get_error.html'); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur.html b/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur.html new file mode 100644 index 0000000000000000000000000000000000000000..5bc3833e8bb6018e40bb76e1485c7ab94f3fe48d --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur.html @@ -0,0 +1,165 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style_dashboard.css"> +</head> +<body> + <div class="container-fluid"> + <div class="row"> + <div class="col-sm-4 title">Les porteurs de programmes immobiliers *</div> + <div class="col-sm-8 "></div> + </div> + <div class="row mt-4"> + <div class="col-sm-4 date_maj" style="color:black"><?php echo $sTitle; ?> : <b><?php echo $_REQUEST['nom_amenageur']; ?></b></div> + <div class="col-sm-8 "></div> + </div> + <div class="row"><div class="col-sm-12 ">nombre d'opération : <?php echo $iNbOperation; ?></div></div> + + <div class="row mt-3"> + <div class="col-sm-2"><img src="images/legende_get_3_porteur.png" /></div> + <div class="col-sm-10"><img src="<?php echo $sUrlMapImage; ?>" class="img-fluid" alt="carte" /></div> + </div> + + <div class="row mt-3"> + <div class="col-sm-2 border-bottom border-right line_table_2"><b>Type de financement</b></div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Projet urbain partenarial</b></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Financements en ZAC</b></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Taxe d'aménagement</b></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Taxe d'aménagement majorée</b></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Participation équipement exceptionnel</b></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Autre</b></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Non défini</b></div> + <?php endif; ?> + <div class="col-sm-1 border-bottom border-right line_table_2 text-center"><b>Total / Moyenne</b></div> + </div> + <div class="row"> + <div class="col-sm-2 border-bottom border-right line_table_2">Nombre de programmes</div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php echo $aNb['PUP']; ?></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php echo $aNb['FINZAC']; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php echo $aNb['TA']; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php echo $aNb['TAM']; ?></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php echo $aNb['PEPE']; ?></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php echo $aNb['AUT']; ?></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php echo $aNb['ND']; ?></div> + <?php endif; ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aNb['TOTAL']) && $aNb['TOTAL']>0) echo $aNb['TOTAL']; ?></div> + </div> + <div class="row"> + <div class="col-sm-2 border-bottom border-right line_table_2">Charge foncière moyenne</div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['PUP']) && $aCF['PUP']>0) echo $aCF['PUP'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['FINZAC']) && $aCF['FINZAC']>0) echo $aCF['FINZAC'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['TA']) && $aCF['TA']>0) echo $aCF['TA'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['TAM']) && $aCF['TAM']>0) echo $aCF['TAM'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['PEPE']) && $aCF['PEPE']>0) echo $aCF['PEPE'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['AUT']) && $aCF['AUT']>0) echo $aCF['AUT'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['ND']) && $aCF['ND']>0) echo $aCF['ND'].' €'; ?></div> + <?php endif; ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aCF['MOY']) && $aCF['MOY']>0) echo $aCF['MOY'].' €'; ?></div> + </div> + <div class="row"> + <div class="col-sm-2 border-bottom border-right line_table_2">Prix de vente moyen</div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['PUP']) && $aPV['PUP']>0) echo $aPV['PUP'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['FINZAC']) && $aPV['FINZAC']>0) echo $aPV['FINZAC'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['TA']) && $aPV['TA']>0) echo $aPV['TA'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['TAM']) && $aPV['TAM']>0) echo $aPV['TAM'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['PEPE']) && $aPV['PEPE']>0) echo $aPV['PEPE'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['AUT']) && $aPV['AUT']>0) echo $aPV['AUT'].' €'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['ND']) && $aPV['ND']>0) echo $aPV['ND'].' €'; ?></div> + <?php endif; ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPV['MOY']) && $aPV['MOY']>0) echo $aPV['MOY'].' €'; ?></div> + </div> + <div class="row"> + <div class="col-sm-2 border-right line_table_2">CF par rapport au prix</div> + <?php if (isset($aNb['PUP']) && $aNb['PUP']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['PUP']) && $aPourcCFPV['PUP']>0) echo $aPourcCFPV['PUP'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['FINZAC']) && $aNb['FINZAC']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['FINZAC']) && $aPourcCFPV['FINZAC']>0) echo $aPourcCFPV['FINZAC'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TA']) && $aNb['TA']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['TA']) && $aPourcCFPV['TA']>0) echo $aPourcCFPV['TA'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['TAM']) && $aNb['TAM']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['TAM']) && $aPourcCFPV['TAM']>0) echo $aPourcCFPV['TAM'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['PEPE']) && $aNb['PEPE']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['PEPE']) && $aPourcCFPV['PEPE']>0) echo $aPourcCFPV['PEPE'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['AUT']) && $aNb['AUT']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['AUT']) && $aPourcCFPV['AUT']>0) echo $aPourcCFPV['AUT'].' %'; ?></div> + <?php endif; ?> + <?php if (isset($aNb['ND']) && $aNb['ND']>0): ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['ND']) && $aPourcCFPV['ND']>0) echo $aPourcCFPV['ND'].' %'; ?></div> + <?php endif; ?> + <div class="col-sm-1 border-bottom border-right line_table text-center"><?php if (isset($aPourcCFPV['MOY']) && $aPourcCFPV['MOY']>0) echo $aPourcCFPV['MOY'].' %'; ?></div> + </div> + <div class="row"><div class="col-sm-12 ">* au niveau des programmes : promoteur/ bailleur</div></div> + + <div class="row mt-3"> + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + feather.replace() + </script> + <!-- + <script type="text/javascript" src="js/dashboard_1_operation.js"></script>--> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur.php b/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur.php new file mode 100644 index 0000000000000000000000000000000000000000..eaa4aa375b480f6b96b1cf371baa5796c6cf454b --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur.php @@ -0,0 +1,109 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/get_1_operation.php?id_operation=1041 +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + + if (isset($_REQUEST['nom_amenageur']) && !is_null($_REQUEST['nom_amenageur'])){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + $sSchema=$properties['schema_prod_immo']; + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + // get data Opérations + $sWhereAmenageur=" WHERE nom_amenageur='".$_REQUEST['nom_amenageur']."'"; + $oResult = $oConn->prepare("SELECT * FROM ".$sSchema.".v_operation_layer".$sWhereAmenageur); + $oResult->execute(); + + if ($oResult->rowCount()>0){ + $iNbOperation=$oResult->rowCount(); + $aOperations = $oResult->fetchAll(); + $oResult->closeCursor(); + // get map image + $aIdOperation=array(); + foreach ($aOperations as $aOperation) + array_push($aIdOperation, $aOperation["id_operation"]); + $sNameMapImage=strtolower(preg_replace("#[^a-zA-Z]#", "", str_replace(' ', '_', $_REQUEST['nom_amenageur'])))."_porteur.png"; + $oResult2 = $oConn->prepare("SELECT round(st_xmin(st_buffer(st_envelope(st_union(geom)),150))) AS xmin, round(st_ymin(st_buffer(st_envelope(st_union(geom)),150))) AS ymin, round(st_ymax(st_buffer(st_envelope(st_union(geom)),150))) AS ymax, round(st_xmax(st_buffer(st_envelope(st_union(geom)),150))) AS xmax FROM ".$sSchema.".operation".$sWhereAmenageur); + $oResult2->execute(); + $aOperations2 = $oResult2->fetchAll(); + $oResult2->closeCursor(); + $aOperations2 = $aOperations2[0]; + $sCommand = escapeshellcmd('python get_map_image_3_porteur.py '.$aOperations2['xmin'].' '.$aOperations2['ymin'].' '.$aOperations2['xmax'].' '.$aOperations2['ymax'].' '.$sNameMapImage.' '.implode(",", $aIdOperation)); + // echo $sCommand; + $output = shell_exec($sCommand);/**/ + $sUrlMapImage=$properties['web_server_name']."/ws_data/vm4ms/map/tmp/".$sNameMapImage; + + $sSql="SELECT code_financement_equ_public, count(DISTINCT id_programme), array_to_string(array_agg(id_programme), ',') AS id_programme, round(avg(charge_fonciere_moy)) AS charge_fonciere_moy FROM (SELECT id_programme, CASE WHEN operation_tr_financement_equ_public.code_financement_equ_public='PUP' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='FINZAC' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='TA' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='TAM' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='AUT' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='PEPE' THEN operation_tr_financement_equ_public.code_financement_equ_public ELSE 'ND' END AS code_financement_equ_public, charge_fonciere_moy FROM ((".$sSchema.".operation LEFT JOIN ".$sSchema.".operation_tr_financement_equ_public ON operation.id_operation=operation_tr_financement_equ_public.id_operation) INNER JOIN ".$sSchema.".ilot ON ilot.id_operation=operation.id_operation) INNER JOIN ".$sSchema.".programme_immobilier ON programme_immobilier.id_ilot=ilot.id_ilot ".$sWhereAmenageur.") AS t GROUP BY code_financement_equ_public"; + $aPourcCFPV=$aPV=$aCF=$aNb=array(); + foreach ($oConn->query($sSql) as $aRow){ + if(!is_null($aRow['count'])) $aNb[$aRow['code_financement_equ_public']]=$aRow['count']; + if(!is_null($aRow['charge_fonciere_moy'])) $aCF[$aRow['code_financement_equ_public']]=$aRow['charge_fonciere_moy']; + $oResult3 = $oConn->prepare("SELECT round((COALESCE(avg1, 0) + COALESCE(avg2, 0) + COALESCE(avg3, 0) + COALESCE(avg4)) / ( CASE WHEN avg1 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg2 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg3 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg4 IS NULL THEN 0 ELSE 1 END)) AS pv_moy FROM (SELECT round(avg(accession_libre)) AS avg1, round(avg(accession_abordable)) AS avg2, round(avg(accesion_sociale_securise)) AS avg3, round(avg(psla)) AS avg4 FROM ".$sSchema.".logement_familliaux_accession WHERE id_programme IN (".$aRow['id_programme'].") AND id_indicateur_logement_familliaux_accession IN (8,9)) AS t"); + $oResult3->execute(); + $aPrixVenteMoy = $oResult3->fetchAll(); + if (isset($aPrixVenteMoy[0])) $aPV[$aRow['code_financement_equ_public']]=$aPrixVenteMoy[0]['pv_moy']; + $oResult3->closeCursor(); + } + if(isset($aCF['PUP']) && isset($aPV['PUP'])) $aPourcCFPV['PUP']=round(($aCF['PUP']/$aPV['PUP'])*100,1); + if(isset($aCF['FINZAC']) && isset($aPV['FINZAC'])) $aPourcCFPV['FINZAC']=round(($aCF['FINZAC']/$aPV['FINZAC'])*100,1); + if(isset($aCF['TA']) && isset($aPV['TA'])) $aPourcCFPV['TA']=round(($aCF['TA']/$aPV['TA'])*100,1); + if(isset($aCF['TAM']) && isset($aPV['TAM'])) $aPourcCFPV['TAM']=round(($aCF['TAM']/$aPV['TAM'])*100,1); + if(isset($aCF['PEPE']) && isset($aPV['PEPE'])) $aPourcCFPV['PEPE']=round(($aCF['PEPE']/$aPV['PEPE'])*100,1); + if(isset($aCF['AUT']) && isset($aPV['AUT'])) $aPourcCFPV['AUT']=round(($aCF['AUT']/$aPV['AUT'])*100,1); + if(isset($aCF['ND']) && isset($aPV['ND'])) $aPourcCFPV['ND']=round(($aCF['ND']/$aPV['ND'])*100,1); + $aNb['TOTAL']=array_sum($aNb); + // Moyenne pondérée au nombre d'opération total + // TODO pondérer au nombre d'opération ayant une valeur + $iCFTotal=$iPVTotal=$iCFPVTotal=0; + foreach ($aNb as $sFinancement=>$iNB){ + $iCFTotal=$iCFTotal+($aCF[$sFinancement]*$iNB); + $iPVTotal=$iPVTotal+($aPV[$sFinancement]*$iNB); + $iCFPVTotal=$iCFPVTotal+($aPourcCFPV[$sFinancement]*$iNB); + } + $aCF['MOY']=round($iCFTotal/$aNb['TOTAL']); + $aPV['MOY']=round($iPVTotal/$aNb['TOTAL']); + $aPourcCFPV['MOY']=round($iCFPVTotal/$aNb['TOTAL'],1); + // label title + $sTitle="Opérateur immobilier"; + $aPromoteurs=array("Cogedim", "Vinci Immobilier"); + $aAmenageurs=array("SERL", "LMH"); + $aRegies=array("Métropole de Lyon"); + if (in_array($_REQUEST['nom_amenageur'], $aPromoteurs)) $sTitle="Promoteur immobilier"; + if (in_array($_REQUEST['nom_amenageur'], $aAmenageurs)) $sTitle="Aménageur"; + if (in_array($_REQUEST['nom_amenageur'], $aRegies)) $sTitle="Opération(s) suivi en régie"; + + + + include ('get_3_porteur.html'); + }else{ + $sError="Erreur : ".$oResult->rowCount()." opération(s) trouvée(s) pour l'aménageur ".$_REQUEST['nom_amenageur']."."; + $oResult->closeCursor(); + include ('get_error.html'); + } + } + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + include ('get_error.html'); + } + + }else{ + $sError="ERREUR : Pas de nom d'aménageur passé en paramètre !"; + include ('get_error.html'); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur_excel.php b/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur_excel.php new file mode 100644 index 0000000000000000000000000000000000000000..40c99666ebcb9260b0eb49a2187c9f0075f3bada --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_3_porteur_excel.php @@ -0,0 +1,129 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/get_1_operation.php?id_operation=1041 +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + + if (isset($_REQUEST['nom_amenageur']) && !is_null($_REQUEST['nom_amenageur'])){ + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + $sSchema=$properties['schema_prod_immo']; + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + if($oConn){ + // get data Opérations + $sWhereAmenageur=" WHERE nom_amenageur='".$_REQUEST['nom_amenageur']."'"; + $oResult = $oConn->prepare("SELECT * FROM ".$sSchema.".v_operation_layer".$sWhereAmenageur); + $oResult->execute(); + + if ($oResult->rowCount()>0){ + $iNbOperation=$oResult->rowCount(); + $aOperations = $oResult->fetchAll(); + $oResult->closeCursor(); + // get map image + $aIdOperation=array(); + foreach ($aOperations as $aOperation) + array_push($aIdOperation, $aOperation["id_operation"]); + $sNameMapImage=strtolower(preg_replace("#[^a-zA-Z]#", "", str_replace(' ', '_', $_REQUEST['nom_amenageur'])))."_porteur.png"; + $oResult2 = $oConn->prepare("SELECT round(st_xmin(st_buffer(st_envelope(st_union(geom)),150))) AS xmin, round(st_ymin(st_buffer(st_envelope(st_union(geom)),150))) AS ymin, round(st_ymax(st_buffer(st_envelope(st_union(geom)),150))) AS ymax, round(st_xmax(st_buffer(st_envelope(st_union(geom)),150))) AS xmax FROM ".$sSchema.".operation".$sWhereAmenageur); + $oResult2->execute(); + $aOperations2 = $oResult2->fetchAll(); + $oResult2->closeCursor(); + $aOperations2 = $aOperations2[0]; + + $sSql="SELECT code_financement_equ_public, count(DISTINCT id_programme), array_to_string(array_agg(id_programme), ',') AS id_programme, round(avg(charge_fonciere_moy)) AS charge_fonciere_moy FROM (SELECT id_programme, CASE WHEN operation_tr_financement_equ_public.code_financement_equ_public='PUP' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='FINZAC' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='TA' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='TAM' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='AUT' THEN operation_tr_financement_equ_public.code_financement_equ_public WHEN operation_tr_financement_equ_public.code_financement_equ_public='PEPE' THEN operation_tr_financement_equ_public.code_financement_equ_public ELSE 'ND' END AS code_financement_equ_public, charge_fonciere_moy FROM ((".$sSchema.".operation LEFT JOIN ".$sSchema.".operation_tr_financement_equ_public ON operation.id_operation=operation_tr_financement_equ_public.id_operation) INNER JOIN ".$sSchema.".ilot ON ilot.id_operation=operation.id_operation) INNER JOIN ".$sSchema.".programme_immobilier ON programme_immobilier.id_ilot=ilot.id_ilot ".$sWhereAmenageur.") AS t GROUP BY code_financement_equ_public"; + $aPourcCFPV=$aPV=$aCF=$aNb=array(); + foreach ($oConn->query($sSql) as $aRow){ + if(!is_null($aRow['count'])) $aNb[$aRow['code_financement_equ_public']]=intval($aRow['count']); + if(!is_null($aRow['charge_fonciere_moy'])) $aCF[$aRow['code_financement_equ_public']]=intval($aRow['charge_fonciere_moy']); + $oResult3 = $oConn->prepare("SELECT round((COALESCE(avg1, 0) + COALESCE(avg2, 0) + COALESCE(avg3, 0) + COALESCE(avg4)) / ( CASE WHEN avg1 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg2 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg3 IS NULL THEN 0 ELSE 1 END + CASE WHEN avg4 IS NULL THEN 0 ELSE 1 END)) AS pv_moy FROM (SELECT round(avg(accession_libre)) AS avg1, round(avg(accession_abordable)) AS avg2, round(avg(accesion_sociale_securise)) AS avg3, round(avg(psla)) AS avg4 FROM ".$sSchema.".logement_familliaux_accession WHERE id_programme IN (".$aRow['id_programme'].") AND id_indicateur_logement_familliaux_accession IN (8,9)) AS t"); + $oResult3->execute(); + $aPrixVenteMoy = $oResult3->fetchAll(); + if (isset($aPrixVenteMoy[0]) && $aPrixVenteMoy[0]['pv_moy']>0) $aPV[$aRow['code_financement_equ_public']]=intval($aPrixVenteMoy[0]['pv_moy']); + $oResult3->closeCursor(); + } + if(isset($aCF['PUP']) && isset($aPV['PUP'])) $aPourcCFPV['PUP']=round(($aCF['PUP']/$aPV['PUP']),3); + if(isset($aCF['FINZAC']) && isset($aPV['FINZAC'])) $aPourcCFPV['FINZAC']=round(($aCF['FINZAC']/$aPV['FINZAC']),3); + if(isset($aCF['TA']) && isset($aPV['TA'])) $aPourcCFPV['TA']=round(($aCF['TA']/$aPV['TA']),3); + if(isset($aCF['TAM']) && isset($aPV['TAM'])) $aPourcCFPV['TAM']=round(($aCF['TAM']/$aPV['TAM']),3); + if(isset($aCF['PEPE']) && isset($aPV['PEPE'])) $aPourcCFPV['PEPE']=round(($aCF['PEPE']/$aPV['PEPE']),3); + if(isset($aCF['AUT']) && isset($aPV['AUT'])) $aPourcCFPV['AUT']=round(($aCF['AUT']/$aPV['AUT']),3); + if(isset($aCF['ND']) && isset($aPV['ND'])) $aPourcCFPV['ND']=round(($aCF['ND']/$aPV['ND']),3); + if (count($aNb)>0) $aNb['TOTAL']=array_sum($aNb); + // Moyenne pondérée au nombre d'opération total + // TODO pondérer au nombre d'opération ayant une valeur + $iCFTotal=$iPVTotal=$iCFPVTotal=0; + foreach ($aNb as $sFinancement=>$iNB){ + if (count($aCF)>0) $iCFTotal=$iCFTotal+($aCF[$sFinancement]*$iNB); + if (count($aPV)>0) $iPVTotal=$iPVTotal+($aPV[$sFinancement]*$iNB); + if (count($aPourcCFPV)>0) $iCFPVTotal=$iCFPVTotal+($aPourcCFPV[$sFinancement]*$iNB); + } + if (count($aCF)>0) $aCF['MOY']=round($iCFTotal/$aNb['TOTAL']); + if (count($aPV)>0) $aPV['MOY']=round($iPVTotal/$aNb['TOTAL']); + if (count($aPourcCFPV)>0) $aPourcCFPV['MOY']=round($iCFPVTotal/$aNb['TOTAL'],3); + + // Python + $data = array('nom_amenageur'=>$_REQUEST['nom_amenageur'], + 'nom_amenageur_file'=>strtolower(preg_replace("#[^a-zA-Z]#", "", str_replace(' ', '_', $_REQUEST['nom_amenageur']))), + 'map'=>array('xmin'=>$aOperations2['xmin'], 'ymin'=>$aOperations2['ymin'], 'xmax'=>$aOperations2['xmax'], 'ymax'=>$aOperations2['ymax'], 'filter'=>implode(",", $aIdOperation)), + 'NB'=>$aNb, 'CF'=>$aCF, 'PV'=>$aPV, 'PourcCFPV'=>$aPourcCFPV, + 'nb_operation'=>$iNbOperation); + // var_dump(json_encode($data)); + // echo mb_detect_encoding($_REQUEST['nom_amenageur']); + echo 'python get_excel_3_porteur.py '.escapeshellarg(json_encode($data)); + $sResult = shell_exec('python get_excel_3_porteur.py '.escapeshellarg(json_encode($data))); + $aResultData = json_decode($sResult, true); + + if (isset($aResultData['status'])){ + if ($aResultData['status']=='succes'){ + ob_clean(); + flush(); + $sXslxFile = $aResultData['file']; + // redirect output to client browser + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header('Content-Disposition: attachment;filename="'.basename($sXslxFile).'"'); + header('Cache-Control: max-age=0'); + readfile($sXslxFile); + }elseif ($aResultData['status']=='error'){ + $sError="ERROR : ".$aResultData['error']; + include ('get_error.html'); + exit; + }else{ + echo 'ERROR: unknow result :<br>'; + var_dump($aResultData); + } + }else{ + echo 'ERROR: unknow result :<br>'; + var_dump($sResult); + } + + }else{ + $sError="Erreur : ".$oResult->rowCount()." opération(s) trouvée(s) pour l'aménageur ".$_REQUEST['nom_amenageur']."."; + $oResult->closeCursor(); + include ('get_error.html'); + } + } + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + include ('get_error.html'); + } + + }else{ + $sError="ERREUR : Pas de nom d'aménageur passé en paramètre !"; + include ('get_error.html'); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_4_logement.html b/src/vitis/vas/doc/suivi_prod_immo/get_4_logement.html new file mode 100644 index 0000000000000000000000000000000000000000..9a6ebb7a305ccce2dede3f4a96cf5d38a167bb6b --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_4_logement.html @@ -0,0 +1,217 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/style_dashboard.css"> + <style type="text/css"> + .title_blue { + background-color:#b3d9ff; + } + .title_green { + background-color:#A5D6A7; + } + .subtitle_blue { + background-color:#cce6ff; + } + .subtitle_green { + background-color:#C8E6C9; + } + .border_right_black{ + border-right: 1px solid rgb(110,110,110); + } + .border_right_grey{ + border-right: 1px solid rgb(190,190,190); + } + </style> +</head> +<body> + <div class="container-fluid"> + <div class="row"> + <div class="col-sm-4 title">Les programmes immobiliers engagés de logements</div> + <div class="col-sm-8 "></div> + </div> + </div> + <br> + <table> + <thead> + <tr style="text-align: center;border-bottom: 1px solid rgb(190,190,190);border-top: 1px solid rgb(110,110,110);"> + <th scope="col" colspan="7" class='title_blue border_right_black'>Contexte</th> + <th scope="col" colspan="2" class='title_green border_right_black'>Synthèse</th> + <?php if ($bSetAccessionLibre): ?> + <th scope="col" colspan="3" class='title_<?php echo $sCssColor; ?> border_right_black'>Accession libre</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetAccessionAbordable): ?> + <th scope="col" colspan="3" class='title_<?php echo $sCssColor; ?> border_right_black'>Accession abordable</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetAccessionSecurisee): ?> + <th scope="col" colspan="3" class='title_<?php echo $sCssColor; ?> border_right_black'>Accession sécurisée</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetBRS): ?> + <th scope="col" colspan="4" class='title_<?php echo $sCssColor; ?> border_right_black'>Bail Réel Solidaire</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetLogementSocial): ?> + <th scope="col" colspan="3" class='title_<?php echo $sCssColor; ?> border_right_black'>Location sociale</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetLogementIntermediaire): ?> + <th scope="col" colspan="2" class='title_<?php echo $sCssColor; ?> border_right_black'>Location intermédiaire</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + </tr> + </thead> + <tbody> + <tr style='font-size: 14px;text-align: center;border-bottom: 1px solid rgb(190,190,190)'> + <th scope="row" class='subtitle_blue border_right_grey'>Commune</th> + <th scope="row" class='subtitle_blue border_right_grey'>Nom de l'opération</th> + <th scope="row" class='subtitle_blue border_right_grey'>Procédure d'aménagement</th> + <th scope="row" class='subtitle_blue border_right_grey'>Lot</th> + <th scope="row" class='subtitle_blue border_right_grey'>Maître d'ouvrage du prog immobilier</th> + <th scope="row" class='subtitle_blue border_right_grey'>Bailleur</th> + <th scope="row" width='20px' class='subtitle_blue border_right_black'>Part des investisseurs</th> + <th scope="row" width='20px' class='subtitle_green border_right_grey'>SDP d'habitat (en m²)</th> + <th scope="row" width='20px' class='subtitle_green border_right_black'>Nombre global de logements</th> + <?php $sCssColor='blue'; ?> + <?php if ($bSetAccessionLibre): ?> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Nombre de logements</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Charge foncière</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_black'>Prix de vente</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetAccessionAbordable): ?> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Nombre de logements</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Charge foncière</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_black'>Prix de vente</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetAccessionSecurisee): ?> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Nombre de logements</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Charge foncière</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_black'>Prix de vente</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetBRS): ?> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Nombre de logements</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Charge foncière</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Prix de vente</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_black'>Redevance (en € / m²)</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetLogementSocial): ?> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Nombre de logements</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Charge foncière</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_black'>Prix de vente</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + <?php if ($bSetLogementIntermediaire): ?> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_grey'>Nombre de logements</th> + <th scope="row" width='20px' class='subtitle_<?php echo $sCssColor; ?> border_right_black'>Charge foncière</th> + <?php $sCssColor = ($sCssColor=='blue') ? 'green' : 'blue'; ?> + <?php endif; ?> + </tr> + <?php foreach($aProgrammes as $aOperation): ?> + <tr style='border: 1px solid rgb(190,190,190);'> + <?php if ($sPrevNomCommune!=$aOperation['nom_commune']): ?> + <td <?php if ($aCptCommunes[$aOperation['nom_commune']]>1) echo 'rowspan='.$aCptCommunes[$aOperation['nom_commune']]; ?> class='border_right_grey'><?php echo $aOperation['nom_commune']; ?></td> + <?php endif; ?> + <?php if ($sPrevIdOperation!=$aOperation['id_operation']): ?> + <td <?php if ($aCptOperations[$aOperation['id_operation']]>1) echo 'rowspan='.$aCptOperations[$aOperation['id_operation']]; ?> class='border_right_grey'><?php echo $aOperation['nom_operation']; ?></td> + <td <?php if ($aCptOperations[$aOperation['id_operation']]>1) echo 'rowspan='.$aCptOperations[$aOperation['id_operation']]; ?> class='border_right_grey'><?php echo $aOperation['code_financement_equ_public']; ?></td> + <?php endif; ?> + <?php if ($sPrevIdIlot!=$aOperation['id_ilot']): ?> + <td <?php if ($aCptIlots[$aOperation['id_ilot']]>1) echo 'rowspan='.$aCptIlots[$aOperation['id_ilot']]; ?> class='border_right_grey'><?php echo $aOperation['nom_ilot']; ?></td> + <?php endif; ?> + <td class='border_right_grey'><?php echo $aOperation['nom_demandeur']; ?></td> + <td class='border_right_grey'><?php echo $aProgrammes2[$aOperation['id_programme']]['nom_bailleur']; ?></td> + <td class='border_right_black' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['profil']; ?></td> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['sdp']; ?></td> + <td class='border_right_black' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['nb']; ?></td> + <?php if ($bSetAccessionLibre): ?> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['nb_accession_libre']; ?></td> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['cfi_accession_libre']; ?></td></td> + <td class='border_right_black' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['pv_accession_libre']; ?></td></td> + <?php endif; ?> + <?php if ($bSetAccessionAbordable): ?> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['nb_accession_abordable']; ?></td> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['cfi_accession_abordable']; ?></td></td> + <td class='border_right_black' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['pv_accession_abordable']; ?></td> + <?php endif; ?> + <?php if ($bSetAccessionSecurisee): ?> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['nb_accession_sociale_securise']; ?></td> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['cfi_accession_sociale_securise']; ?></td></td> + <td class='border_right_black' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['pv_accession_sociale_securise']; ?></td> + <?php endif; ?> + <?php if ($bSetBRS): ?> + <td class='border_right_grey' style='text-align: center;'></td> + <td class='border_right_grey' style='text-align: center;'></td> + <td class='border_right_grey' style='text-align: center;'></td> + <td class='border_right_black' style='text-align: center;'></td> + <?php endif; ?> + <?php if ($bSetLogementSocial): ?> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['nb_lls']; ?></td> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['cfi_lls']; ?></td> + <td class='border_right_black' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['pv_lls']; ?></td> + <?php endif; ?> + <?php if ($bSetLogementIntermediaire): ?> + <td class='border_right_grey' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['nb_lli']; ?></td> + <td class='border_right_black' style='text-align: center;'><?php echo $aProgrammes2[$aOperation['id_programme']]['cfi_lli']; ?></td> + <?php endif; ?> + </tr> + <?php $sPrevNomCommune=$aOperation['nom_commune']; ?> + <?php $sPrevIdOperation=$aOperation['id_operation']; ?> + <?php $sPrevIdIlot=$aOperation['id_ilot']; ?> + <?php endforeach; ?> + </tbody> + <tfoot> + <tr style="text-align: center;border-top: 1px solid rgb(110,110,110);"> + <th scope="col" colspan="7" class='border_right_black' style='text-align: right;'>Totaux / Moyennes </th> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['sdp']>0) echo round($aTotaux['sdp']); ?></th> + <th scope="col" class='border_right_black' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['nb']>0) echo $aTotaux['nb']; ?></th> + <?php if ($bSetAccessionLibre): ?> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['nb_accession_libre']>0) echo $aTotaux['nb_accession_libre']; ?></th> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['cfi_accession_libre']>0) echo $aTotaux['cfi_accession_libre']; ?></th> + <th scope="col" class='border_right_black' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['pv_accession_libre']>0) echo $aTotaux['pv_accession_libre']; ?></th> + <?php endif; ?> + <?php if ($bSetAccessionAbordable): ?> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['nb_accession_abordable']>0) echo $aTotaux['nb_accession_abordable']; ?></th> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['cfi_accession_abordable']>0) echo $aTotaux['cfi_accession_abordable']; ?></th> + <th scope="col" class='border_right_black' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['pv_accession_abordable']>0) echo $aTotaux['pv_accession_abordable']; ?></th> + <?php endif; ?> + <?php if ($bSetAccessionSecurisee): ?> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['nb_accession_sociale_securise']>0) echo $aTotaux['nb_accession_sociale_securise']; ?></th> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['cfi_accession_sociale_securise']>0) echo $aTotaux['cfi_accession_sociale_securise']; ?></th> + <th scope="col" class='border_right_black' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['pv_accession_sociale_securise']>0) echo $aTotaux['pv_accession_sociale_securise']; ?></th> + <?php endif; ?> + <?php if ($bSetBRS): ?> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'></th> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'></th> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'></th> + <th scope="col" class='border_right_black' style='border-bottom: 1px solid rgb(110,110,110);'></th> + <?php endif; ?> + <?php if ($bSetLogementSocial): ?> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['nb_lls']>0) echo $aTotaux['nb_lls']; ?></th> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['cfi_lls']>0) echo $aTotaux['cfi_lls']; ?></th> + <th scope="col" class='border_right_black' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['pv_lls']>0) echo $aTotaux['pv_lls']; ?></th> + <?php endif; ?> + <?php if ($bSetLogementIntermediaire): ?> + <th scope="col" class='border_right_grey' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['nb_lli']>0) echo $aTotaux['nb_lli']; ?></th> + <th scope="col" class='border_right_black' style='border-bottom: 1px solid rgb(110,110,110);'><?php if($aTotaux['cfi_lli']>0) echo $aTotaux['cfi_lli']; ?></th> + <?php endif; ?> + </tr> + </tfoot> + </table> + + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + feather.replace() + </script> + <script type="text/javascript" src="js/dashboard_4_logement.js"></script> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_4_logement.php b/src/vitis/vas/doc/suivi_prod_immo/get_4_logement.php new file mode 100644 index 0000000000000000000000000000000000000000..7b39e3a03293ce4cabbb3c219fcc4c0e7d023d12 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_4_logement.php @@ -0,0 +1,265 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/get_4_logement.php?code_finanacment=TA +session_start(); +if (isset($_REQUEST['login'])) $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + +if(isset($_REQUEST['token']) && isset($_SESSION['token_bd_prod_immo'])){ + if($_REQUEST['token']==$_SESSION['token_bd_prod_immo']){ + + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + $sSchema=$properties['schema_prod_immo']; + + function avg($sum=0,$count=0){ + return ($count)? round($sum / $count): null; + } + + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $properties['db_user_prod_immo'], $properties['db_pass_prod_immo']); + $oConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $oConn->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); + + $bSetAccessionLibre=$bSetAccessionAbordable=$bSetAccessionSecurisee=$bSetBRS=$bSetLogementSocial=$bSetLogementIntermediaire=false; + + if($oConn){ + $sWhereOperation=''; + $aOperations=array(); + if (isset($_REQUEST['code_financement']) && !is_null($_REQUEST['code_financement'])){ + $sWhereOperation="WHERE operation_tr_financement_equ_public.code_financement_equ_public='".$_REQUEST['code_financement']."'"; + } + + if (isset($_REQUEST['id_commune']) && !is_null($_REQUEST['id_commune'])){ + if ($sWhereOperation=='') + $sWhereOperation="WHERE operation_commune.id_commune=".$_REQUEST['id_commune']; + else + $sWhereOperation=$sWhereOperation." AND operation_commune.id_commune=".$_REQUEST['id_commune']; + }else{ + if (isset($_REQUEST['id_ctm']) && !is_null($_REQUEST['id_ctm'])){ + $oResult2 = $oConn->prepare("SELECT array_to_string(array_agg(id_commune),', ') AS id_commune FROM ".$sSchema.".commune WHERE id_ctm=".$_REQUEST['id_ctm']." GROUP BY id_ctm"); + $oResult2->execute(); + if ($oResult2->rowCount()>0){ + $aCTMs=$oResult2->fetchAll(); + if ($sWhereOperation=='') + $sWhereOperation="WHERE operation_commune.id_commune IN (".$aCTMs[0]['id_commune'].")"; + else + $sWhereOperation=$sWhereOperation." AND operation_commune.id_commune IN (".$aCTMs[0]['id_commune'].")";/**/ + } + $oResult2->closeCursor(); + } + } + $sSql='SELECT DISTINCT operation.id_operation, nom_operation, array_to_string(array_agg(DISTINCT operation_tr_financement_equ_public.code_financement_equ_public),\', \') AS code_financement_equ_public, array_to_string(array_agg(DISTINCT nom_commune),\', \') AS nom_commune, nom_ilot, ilot.id_ilot, id_programme, nom_demandeur FROM (((('.$sSchema.'.operation INNER JOIN '.$sSchema.'.operation_tr_financement_equ_public ON operation_tr_financement_equ_public.id_operation=operation.id_operation) INNER JOIN '.$sSchema.'.operation_commune ON operation_commune.id_operation=operation.id_operation) INNER JOIN '.$sSchema.'.commune ON operation_commune.id_commune=commune.id_commune) INNER JOIN '.$sSchema.'.ilot ON ilot.id_operation=operation.id_operation) INNER JOIN '.$sSchema.'.programme_immobilier ON ilot.id_ilot=programme_immobilier.id_ilot '.$sWhereOperation.' GROUP BY id_programme, ilot.id_ilot, operation.id_operation ORDER BY nom_commune, nom_operation, nom_ilot'; + $oResult = $oConn->prepare($sSql); + $oResult->execute(); + if($oResult->rowCount()>0){ + $aProgrammes=$oResult->fetchAll(); + $aCptCommunes=array(); + $aCptOperations=array(); + $aCptIlots=array(); + $aTotaux=array('sdp'=>0,'nb'=>0,'nb_accession_libre'=>0,'cfi_accession_libre'=>array(),'pv_accession_libre'=>array(),'nb_accession_abordable'=>0,'cfi_accession_abordable'=>array(),'pv_accession_abordable'=>array(),'nb_accession_sociale_securise'=>0,'cfi_accession_sociale_securise'=>array(),'pv_accession_sociale_securise'=>array(),'nb_lls'=>0,'cfi_lls'=>array(),'pv_lls'=>array(),'nb_lli'=>0,'cfi_lli'=>array()); + $aProgrammes2=array(); + foreach ($aProgrammes as $aProgramme){ + // **** Compteurs pour fusion des cellules du tableau + if(isset($aCptCommunes[$aProgramme['nom_commune']])) + $aCptCommunes[$aProgramme['nom_commune']]=$aCptCommunes[$aProgramme['nom_commune']]+1; + else + $aCptCommunes[$aProgramme['nom_commune']]=1; + if(isset($aCptOperations[$aProgramme['id_operation']])) + $aCptOperations[$aProgramme['id_operation']]=$aCptOperations[$aProgramme['id_operation']]+1; + else + $aCptOperations[$aProgramme['id_operation']]=1; + if(isset($aCptIlots[$aProgramme['id_ilot']])) + $aCptIlots[$aProgramme['id_ilot']]=$aCptIlots[$aProgramme['id_ilot']]+1; + else + $aCptIlots[$aProgramme['id_ilot']]=1; + // **** Récupération des données tables associées + $iIdProgramme=$aProgramme['id_programme']; + $aProgramme2=array(); + // Granulométrie + $oResult3=$oConn->prepare("SELECT id_programme, code_type_granulometrie, sum(valeur) AS valeur FROM ".$sSchema.".granulometrie WHERE id_programme=".$iIdProgramme." AND code_type_granulometrie IN ('NB','SDP') AND code_composition_programme='TOT_LG_FAM' GROUP BY id_programme, code_composition_programme, code_type_granulometrie"); + $oResult3->execute(); + if($oResult3->rowCount()>0){ + $aGranulometries=$oResult3->fetchAll(); + foreach ($aGranulometries as $aGranulometrie){ + $aProgramme2[strtolower($aGranulometrie['code_type_granulometrie'])]=$aGranulometrie['valeur']; + $aTotaux[strtolower($aGranulometrie['code_type_granulometrie'])]=$aTotaux[strtolower($aGranulometrie['code_type_granulometrie'])]+$aGranulometrie['valeur']; + } + } + $oResult3->closeCursor(); + // profil + $oResult6=$oConn->prepare("SELECT pourc FROM prod_immo.profil_acheteur_accession_libre WHERE id_type_acheteur_accession_libre=2 AND pourc IS NOT NULL AND id_programme=".$iIdProgramme); + $oResult6->execute(); + if($oResult6->rowCount()>0){ + $aProfil=$oResult6->fetchAll(); + $aProgramme2['profil']=$aProfil[0]['pourc'].'%'; + } + $oResult6->closeCursor(); + // logement social + $oResult4=$oConn->prepare("SELECT id_programme, array_to_string(array_agg(DISTINCT nom_bailleur),',') AS nom_bailleur, id_indicateur_logement_familliaux_location, CASE WHEN id_indicateur_logement_familliaux_location=1 THEN sum(COALESCE(social_pls,0)) ELSE avg(COALESCE(social_pls,0)) END AS social_pls, CASE WHEN id_indicateur_logement_familliaux_location=1 THEN sum(COALESCE(social_plus_plai,0)) ELSE avg(COALESCE(social_plus_plai,0)) END AS social_plus_plai, CASE WHEN id_indicateur_logement_familliaux_location=1 THEN sum(COALESCE(intermediaire_pli,0)) ELSE avg(COALESCE(intermediaire_pli,0)) END AS intermediaire_pli, CASE WHEN id_indicateur_logement_familliaux_location=1 THEN sum(COALESCE(intermediaire_afl,0)) ELSE avg(COALESCE(intermediaire_afl,0)) END AS intermediaire_afl FROM ".$sSchema.".logement_familliaux_location INNER JOIN ".$sSchema.".composition_logement_familliaux_location_cp ON logement_familliaux_location.id_logement_familliaux_location=composition_logement_familliaux_location_cp.id_logement_familliaux_location WHERE id_programme=".$iIdProgramme." AND id_indicateur_logement_familliaux_location IN (1,4,5,8) GROUP BY id_programme, composition_logement_familliaux_location_cp.id_logement_familliaux_location, id_indicateur_logement_familliaux_location"); + $oResult4->execute(); + if($oResult4->rowCount()>0){ + $aLogSocials=$oResult4->fetchAll(); + $aProgramme2['nom_bailleur']=$aLogSocials[0]['nom_bailleur']; + $aCFIlls=array(); + $aCFIlli=array(); + foreach ($aLogSocials as $aLogSocial){ + switch ($aLogSocial['id_indicateur_logement_familliaux_location']) { + case 1: + if($aLogSocial['social_pls']>0 or $aLogSocial['social_plus_plai']>0){ + $bSetLogementSocial=true; + $aProgramme2['nb_lls']=$aLogSocial['social_pls']+$aLogSocial['social_plus_plai']; + $aTotaux['nb_lls']=$aTotaux['nb_lls']+$aLogSocial['social_pls']+$aLogSocial['social_plus_plai']; + } + if($aLogSocial['intermediaire_pli']>0 or $aLogSocial['intermediaire_afl']>0){ + $bSetLogementIntermediaire=true; + $aProgramme2['nb_lli']=$aLogSocial['intermediaire_pli']+$aLogSocial['intermediaire_afl']; + $aTotaux['nb_lli']=$aTotaux['nb_lli']+$aLogSocial['intermediaire_pli']+$aLogSocial['intermediaire_afl']; + } + break; + case 4: + case 5: + if(!is_null($aLogSocial['social_pls']) and $aLogSocial['social_pls']>0){ + $bSetLogementSocial=true; + $aCFIlls[count($aCFIlls)]=$aLogSocial['social_pls']; + $aTotaux['cfi_lls'][count($aTotaux['cfi_lls'])]=$aLogSocial['social_pls']; + } + if(!is_null($aLogSocial['social_plus_plai']) and $aLogSocial['social_plus_plai']>0){ + $bSetLogementSocial=true; + $aCFIlls[count($aCFIlls)]=$aLogSocial['social_plus_plai']; + $aTotaux['cfi_lls'][count($aTotaux['cfi_lls'])]=$aLogSocial['social_plus_plai']; + } + if(!is_null($aLogSocial['intermediaire_pli']) and $aLogSocial['intermediaire_pli']>0){ + $bSetLogementIntermediaire=true; + $aCFIlli[count($aCFIlli)]=$aLogSocial['intermediaire_pli']; + $aTotaux['cfi_lli'][count($aTotaux['cfi_lli'])]=$aLogSocial['intermediaire_pli']; + } + if(!is_null($aLogSocial['intermediaire_afl']) and $aLogSocial['intermediaire_afl']>0){ + $bSetLogementIntermediaire=true; + $aCFIlli[count($aCFIlli)]=$aLogSocial['intermediaire_afl']; + $aTotaux['cfi_lli'][count($aTotaux['cfi_lli'])]=$aLogSocial['intermediaire_afl']; + } + break; + case 8: + $aPVlls=array(); + if(!is_null($aLogSocial['social_pls']) and $aLogSocial['social_pls']>0){ + $bSetLogementSocial=true; + $aPVlls[count($aPVlls)]=$aLogSocial['social_pls']; + $aTotaux['pv_lls'][count($aTotaux['pv_lls'])]=$aLogSocial['social_pls']; + } + if(!is_null($aLogSocial['social_plus_plai']) and $aLogSocial['social_plus_plai']>0){ + $bSetLogementSocial=true; + $aPVlls[count($aPVlls)]=$aLogSocial['social_plus_plai']; + $aTotaux['pv_lls'][count($aTotaux['pv_lls'])]=$aLogSocial['social_plus_plai']; + } + $aProgramme2['pv_lls']=avg(array_sum($aPVlls),count($aPVlls)); + // pas de prix de vente en lli + break; + } + } + $aProgramme2['cfi_lls']=avg(array_sum($aCFIlls),count($aCFIlls)); + $aProgramme2['cfi_lli']=avg(array_sum($aCFIlli),count($aCFIlli)); + } + + $oResult4->closeCursor(); + // logement accession + $oResult5=$oConn->prepare("SELECT id_programme, id_indicateur_logement_familliaux_accession, CASE WHEN id_indicateur_logement_familliaux_accession=1 THEN sum(COALESCE(accession_libre,0)) ELSE avg(COALESCE(accession_libre,0)) END AS accession_libre, CASE WHEN id_indicateur_logement_familliaux_accession=1 THEN sum(COALESCE(accession_abordable,0)) ELSE avg(COALESCE(accession_abordable,0)) END AS accession_abordable, CASE WHEN id_indicateur_logement_familliaux_accession=1 THEN sum(COALESCE(accesion_sociale_securise,0)) ELSE avg(COALESCE(accesion_sociale_securise,0)) END AS accesion_sociale_securise, CASE WHEN id_indicateur_logement_familliaux_accession=1 THEN sum(COALESCE(psla,0)) ELSE avg(COALESCE(psla,0)) END AS psla FROM ".$sSchema.".logement_familliaux_accession WHERE id_programme=".$iIdProgramme." AND id_indicateur_logement_familliaux_accession IN (1,4,5,8,9) GROUP BY id_programme, id_indicateur_logement_familliaux_accession"); + $oResult5->execute(); + if($oResult5->rowCount()>0){ + $aLogAccessions=$oResult5->fetchAll(); + $aCFIAccessionLibre=$aCFIAccessionAbordable=$aCFIAccessionSocialeSecurise=array(); + $aPVAccessionLibre=$aPVAccessionAbordable=$aPVAccessionSocialeSecurise=array(); + foreach ($aLogAccessions as $aLogAccession){ + switch ($aLogAccession['id_indicateur_logement_familliaux_accession']){ + case 1: + if($aLogAccession['accession_libre']>0){ + $bSetAccessionLibre=true; + $aProgramme2['nb_accession_libre']=$aLogAccession['accession_libre']; + $aTotaux['nb_accession_libre']=$aTotaux['nb_accession_libre']+$aLogAccession['accession_libre']; + } + if($aLogAccession['accession_abordable']>0){ + $bSetAccessionAbordable=true; + $aProgramme2['nb_accession_abordable']=$aLogAccession['accession_abordable']; + $aTotaux['nb_accession_abordable']=$aTotaux['nb_accession_abordable']+$aLogAccession['accession_abordable']; + } + if($aLogAccession['accesion_sociale_securise']>0){ + $bSetAccessionSecurisee=true; + $aProgramme2['nb_accession_sociale_securise']=$aLogAccession['accesion_sociale_securise']; + $aTotaux['nb_accession_sociale_securise']=$aTotaux['nb_accession_sociale_securise']+$aLogAccession['accesion_sociale_securise']; + } + if($aLogAccession['psla']>0) $aProgramme2['nb_psla']=$aLogAccession['psla']; + break; + case 4: + case 5: + if(!is_null($aLogAccession['accession_libre']) and $aLogAccession['accession_libre']>0){ + $bSetAccessionLibre=true; + $aCFIAccessionLibre[count($aCFIAccessionLibre)]=$aLogAccession['accession_libre']; + $aTotaux['cfi_accession_libre'][count($aTotaux['cfi_accession_libre'])]=$aLogAccession['accession_libre']; + } + if(!is_null($aLogAccession['accession_abordable']) and $aLogAccession['accession_abordable']>0){ + $bSetAccessionAbordable=true; + $aCFIAccessionAbordable[count($aCFIAccessionAbordable)]=$aLogAccession['accession_abordable']; + $aTotaux['cfi_accession_abordable'][count($aTotaux['cfi_accession_abordable'])]=$aLogAccession['accession_abordable']; + } + if(!is_null($aLogAccession['accesion_sociale_securise']) and $aLogAccession['accesion_sociale_securise']>0){ + $bSetAccessionSecurisee=true; + $aCFIAccessionSocialeSecurise[count($aCFIAccessionSocialeSecurise)]=$aLogAccession['accesion_sociale_securise']; + $aTotaux['cfi_accession_sociale_securise'][count($aTotaux['cfi_accession_sociale_securise'])]=$aLogAccession['accesion_sociale_securise']; + } + break; + case 8: + case 9: + if(!is_null($aLogAccession['accession_libre']) and $aLogAccession['accession_libre']>0){ + $bSetAccessionLibre=true; + $aPVAccessionLibre[count($aPVAccessionLibre)]=$aLogAccession['accession_libre']; + $aTotaux['pv_accession_libre'][count($aTotaux['pv_accession_libre'])]=$aLogAccession['accession_libre']; + } + if(!is_null($aLogAccession['accession_abordable']) and $aLogAccession['accession_abordable']>0){ + $bSetAccessionAbordable=true; + $aPVAccessionAbordable[count($aPVAccessionAbordable)]=$aLogAccession['accession_abordable']; + $aTotaux['pv_accession_abordable'][count($aTotaux['pv_accession_abordable'])]=$aLogAccession['accession_abordable']; + } + if(!is_null($aLogAccession['accesion_sociale_securise']) and $aLogAccession['accesion_sociale_securise']>0){ + $bSetAccessionSecurisee=true; + $aPVAccessionSocialeSecurise[count($aPVAccessionSocialeSecurise)]=$aLogAccession['accesion_sociale_securise']; + $aTotaux['pv_accession_sociale_securise'][count($aTotaux['pv_accession_sociale_securise'])]=$aLogAccession['accesion_sociale_securise']; + } + break; + } + } + $aProgramme2['cfi_accession_libre']=avg(array_sum($aCFIAccessionLibre),count($aCFIAccessionLibre)); + $aProgramme2['cfi_accession_abordable']=avg(array_sum($aCFIAccessionAbordable),count($aCFIAccessionAbordable)); + $aProgramme2['cfi_accession_sociale_securise']=avg(array_sum($aCFIAccessionSocialeSecurise),count($aCFIAccessionSocialeSecurise)); + $aProgramme2['pv_accession_libre']=avg(array_sum($aPVAccessionLibre),count($aPVAccessionLibre)); + $aProgramme2['pv_accession_abordable']=avg(array_sum($aPVAccessionAbordable),count($aPVAccessionAbordable)); + $aProgramme2['pv_accession_sociale_securise']=avg(array_sum($aPVAccessionSocialeSecurise),count($aPVAccessionSocialeSecurise)); + } + $oResult5->closeCursor(); + $aProgrammes2[$aProgramme['id_programme']]=$aProgramme2; + } + $oResult->closeCursor(); + $aTotaux['cfi_accession_libre']=avg(array_sum($aTotaux['cfi_accession_libre']),count($aTotaux['cfi_accession_libre'])); + $aTotaux['pv_accession_libre']=avg(array_sum($aTotaux['pv_accession_libre']),count($aTotaux['pv_accession_libre'])); + $aTotaux['cfi_accession_abordable']=avg(array_sum($aTotaux['cfi_accession_abordable']),count($aTotaux['cfi_accession_abordable'])); + $aTotaux['pv_accession_abordable']=avg(array_sum($aTotaux['pv_accession_abordable']),count($aTotaux['pv_accession_abordable'])); + $aTotaux['cfi_accession_sociale_securise']=avg(array_sum($aTotaux['cfi_accession_sociale_securise']),count($aTotaux['cfi_accession_sociale_securise'])); + $aTotaux['pv_accession_sociale_securise']=avg(array_sum($aTotaux['pv_accession_sociale_securise']),count($aTotaux['pv_accession_sociale_securise'])); + $aTotaux['cfi_lls']=avg(array_sum($aTotaux['cfi_lls']),count($aTotaux['cfi_lls'])); + $aTotaux['pv_lls']=avg(array_sum($aTotaux['pv_lls']),count($aTotaux['pv_lls'])); + $aTotaux['cfi_lli']=avg(array_sum($aTotaux['cfi_lli']),count($aTotaux['cfi_lli'])); + } + $sCssColor='blue'; + include ('get_4_logement.html'); + } + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + include ('get_error.html'); + } + }else{ + header ('location: signin.php'); + exit(); + } +}else{ + header ('location: signin.php'); + exit(); +} + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_error.html b/src/vitis/vas/doc/suivi_prod_immo/get_error.html new file mode 100644 index 0000000000000000000000000000000000000000..3e670599200dc6bb7ade5ab14efcfc962fc07c34 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_error.html @@ -0,0 +1,27 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> +</head> +<body> + <div class="container-fluid"> + <div class="row mt-5"> + <div class="col-sm-2"></div> + <div class="col-sm-8"> + <div class="alert alert-danger" role="alert"> + <span data-feather="alert-triangle"></span> <?php echo $sError; ?> + </div> + </div> + <div class="col-sm-2"></div> + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + feather.replace() + </script> +</body> +</html> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_excel_3_porteur.py b/src/vitis/vas/doc/suivi_prod_immo/get_excel_3_porteur.py new file mode 100644 index 0000000000000000000000000000000000000000..6b78a1737074413b4a790fc6a126a3971b877fd4 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_excel_3_porteur.py @@ -0,0 +1,106 @@ +# coding: utf-8 +import sys, json +import mapscript +from openpyxl import load_workbook +from openpyxl import Workbook +from openpyxl import drawing +from openpyxl.utils import * + +# HOW TO USE : +# python /var/www/vmap/vas/doc/suivi_prod_immo/get_excel_3_porteur.py '{"nom_amenageur":"SERL","nom_amenageur_file":"serl","map":{"xmin":"838581","ymin":"6512122","xmax":"858716","ymax":"6533951","filter":"888,907,1032,891,1041,882,909,936,865,962,889,881,1042,654"},"NB":{"FINZAC":156,"PUP":14,"TOTAL":170},"CF":{"FINZAC":"440","PUP":"420","MOY":438},"PV":{"FINZAC":"2780","PUP":"2926","MOY":2792},"PourcCFPV":{"PUP":14.4,"FINZAC":15.8,"MOY":15.7},"nb_operation":14}' + +mapfile = '/var/www/vmap/vas/doc/suivi_prod_immo/get_map_image_3_porteur.map' +tmpdir = '/var/www/vmap/vas/ws_data/vm4ms/map/tmp/' +template_file = r'template/template_3_porteur.xlsx' + +# Load the data that PHP sent us +try: + data = json.loads(sys.argv[1]) +except: + result = {'status': 'error', 'error': 'JSON invalid : '+sys.argv[1]} + print result + sys.exit(1) + +# map +map = mapscript.mapObj(mapfile) +map.setExtent(int(data['map']['xmin']), int(data['map']['ymin']), int(data['map']['xmax']), int(data['map']['ymax'])) +# layers +a_id_operation=data['map']['filter'].split(',') +operation='' +for id_operation in a_id_operation: + if operation=='': + operation="[id_operation]='"+id_operation+"'" + else: + operation+=" or [id_operation]='"+id_operation+"'" +layer_op = map.getLayerByName("prod_immo_operation"); +result = layer_op.setFilter("("+operation+")") +# image +map_image_file=tmpdir+data['nom_amenageur_file'].lower()+"_porteur.png" +img = map.draw() +img.save(map_image_file) + +filename=data['nom_amenageur_file'].lower() +destination = tmpdir+'3_porteur_'+filename+'.xlsx' +template = load_workbook(template_file) +sheet = template.active +# nom_amenageur +nom_amenageur=data['nom_amenageur'] +#nom_amenageur=nom_amenageur.decode('utf8') +nom_amenageur=nom_amenageur.encode('utf-8') +sheet.cell(row=3, column=1).value = 'Opérateur immobilier : '+nom_amenageur +# nb_operation +sheet.cell(row=4, column=1).value = 'nombre d''opération : '+str(data['nb_operation']) +# type de financement +if 'NB' in data: + if 'PUP' in data['NB']: sheet.cell(row=34, column=2).value = data['NB']['PUP'] + if 'FINZAC' in data['NB']: sheet.cell(row=34, column=3).value = data['NB']['FINZAC'] + if 'TA' in data['NB']: sheet.cell(row=34, column=4).value = data['NB']['TA'] + if 'TAM' in data['NB']: sheet.cell(row=34, column=5).value = data['NB']['TAM'] + if 'PEPE' in data['NB']: sheet.cell(row=34, column=6).value = data['NB']['PEPE'] + if 'AUT' in data['NB']: sheet.cell(row=34, column=7).value = data['NB']['AUT'] + if 'ND' in data['NB']: sheet.cell(row=34, column=8).value = data['NB']['ND'] + if 'TOTAL' in data['NB']: sheet.cell(row=34, column=9).value = data['NB']['TOTAL'] +if 'CF' in data: + if 'PUP' in data['CF']: sheet.cell(row=35, column=2).value = data['CF']['PUP'] + if 'FINZAC' in data['CF']: sheet.cell(row=35, column=3).value = data['CF']['FINZAC'] + if 'TA' in data['CF']: sheet.cell(row=35, column=4).value = data['CF']['TA'] + if 'TAM' in data['CF']: sheet.cell(row=35, column=5).value = data['CF']['TAM'] + if 'PEPE' in data['CF']: sheet.cell(row=35, column=6).value = data['CF']['PEPE'] + if 'AUT' in data['CF']: sheet.cell(row=35, column=7).value = data['CF']['AUT'] + if 'ND' in data['CF']: sheet.cell(row=35, column=8).value = data['CF']['ND'] + if 'MOY' in data['CF']: sheet.cell(row=35, column=9).value = data['CF']['MOY'] +if 'PV' in data: + if 'PUP' in data['PV']: sheet.cell(row=36, column=2).value = data['PV']['PUP'] + if 'FINZAC' in data['PV']: sheet.cell(row=36, column=3).value = data['PV']['FINZAC'] + if 'TA' in data['PV']: sheet.cell(row=36, column=4).value = data['PV']['TA'] + if 'TAM' in data['PV']: sheet.cell(row=36, column=5).value = data['PV']['TAM'] + if 'PEPE' in data['PV']: sheet.cell(row=36, column=6).value = data['PV']['PEPE'] + if 'AUT' in data['PV']: sheet.cell(row=36, column=7).value = data['PV']['AUT'] + if 'ND' in data['PV']: sheet.cell(row=36, column=8).value = data['PV']['ND'] + if 'MOY' in data['PV']: sheet.cell(row=36, column=9).value = data['PV']['MOY'] +if 'PourcCFPV' in data: + if 'PUP' in data['PourcCFPV']: sheet.cell(row=37, column=2).value = data['PourcCFPV']['PUP'] + if 'FINZAC' in data['PourcCFPV']: sheet.cell(row=37, column=3).value = data['PourcCFPV']['FINZAC'] + if 'TA' in data['PourcCFPV']: sheet.cell(row=37, column=4).value = data['PourcCFPV']['TA'] + if 'TAM' in data['PourcCFPV']: sheet.cell(row=37, column=5).value = data['PourcCFPV']['TAM'] + if 'PEPE' in data['PourcCFPV']: sheet.cell(row=37, column=6).value = data['PourcCFPV']['PEPE'] + if 'AUT' in data['PourcCFPV']: sheet.cell(row=37, column=7).value = data['PourcCFPV']['AUT'] + if 'ND' in data['PourcCFPV']: sheet.cell(row=37, column=8).value = data['PourcCFPV']['ND'] + if 'MOY' in data['PourcCFPV']: sheet.cell(row=37, column=9).value = data['PourcCFPV']['MOY'] + +# legend image +legend = drawing.image.Image('images/legende_get_3_porteur.png') +legend.anchor = 'A6' +sheet.add_image(legend) +# map image +map_image = drawing.image.Image(map_image_file) +map_image.anchor = 'C6' +sheet.add_image(map_image) + +template.save(destination) + +# Generate some data to send to PHP +result = {'status': 'succes', 'file': destination} + +# Send it to stdout (to PHP) +print json.dumps(result) \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_map_image_1_operation.map b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_1_operation.map new file mode 100644 index 0000000000000000000000000000000000000000..f2cc65bcff1e0df57236a967a3db890379264af1 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_1_operation.map @@ -0,0 +1,600 @@ +MAP + NAME bd_prod_immo + STATUS ON + # Étentue de la carte + EXTENT 842299 6516833 843076 6517501 + # Taille de l'image générée + SIZE 800 500 + # Couleur de fond de l'image générée + IMAGECOLOR 255 255 255 + + # Format de sortie de l'image générée + OUTPUTFORMAT + NAME "png" + DRIVER AGG/PNG + MIMETYPE "image/png" + IMAGEMODE RGB + EXTENSION "png" + FORMATOPTION "GAMMA=0.75" + END + IMAGETYPE "png" + + # Type de légende générée (HTML) + LEGEND + STATUS ON + IMAGECOLOR 244 244 244 + KEYSIZE 15 15 + KEYSPACING 5 5 + LABEL + TYPE TRUETYPE + FONT "arial" + SIZE 8 + COLOR 0 0 0 + PARTIALS TRUE + END + TEMPLATE "/var/www/vmap/vas/ws_data/vm4ms/map/template/legend.html" + END + + MAXSIZE 4096 + SYMBOLSET "/var/www/vmap/vas/ws_data/vm4ms/map/symbols/symbols.sym" + FONTSET "/var/www/vmap/vas/ws_data/vm4ms/map/fonts/fonts.list" + + #CONFIG "MS_ERRORFILE" "/var/www/vmap/vas/log/mapserver/test/cb973e656aa3c2e416beff082ac7b2c165c152f4c2e14c679b2652476cabcb9d_prod_immo_programme_immobilier_vocation.log" + CONFIG "PROJ_LIB" "/var/www/vmap/vas/ws_data/vm4ms/map/proj" + DEBUG 2 + + PROJECTION + #EPSG:2154 / RGF93 + "+init=epsg:2154" + END + + WEB + #METADATA + # "wms_title" "Test" + # "wms_onlineresource" "https://geo.urbalyon.org//wms/public/Test" + # "wms_srs" "EPSG:2154" + # "wms_enable_request" "*" + #END + # Les attributs TEMPLATE, IMAGEPATH et IMAGEURL sont ajoutés dynamiquement lors des tests. Ils sont inutiles en production + #TEMPLATE "../template/template.html" + IMAGEPATH "/var/www/vmap/vas/ws_data/vm4ms/map/tmp/" + IMAGEURL "https://geo.urbalyon.org//ws_data/vm4ms/map/tmp/" + END + + LAYER + NAME "Ortho" + TYPE RASTER + STATUS ON + CONNECTION "https://download.data.grandlyon.com/wms/grandlyon?" + CONNECTIONTYPE WMS + METADATA + "wms_srs" "EPSG:3946" + "wms_name" "Ortho2018_Dalle_unique_8cm_CC46" + "wms_server_version" "1.1.0" + "wms_format" "image/png" + END + END + + LAYER + NAME "Limite_france" + TYPE RASTER + STATUS ON + CONNECTION "https://geo.urbalyon.org/wms/public/FluxPublic?" + CONNECTIONTYPE WMS + METADATA + "wms_srs" "EPSG:2154" + "wms_name" "Limite_france" + "wms_server_version" "1.1.0" + "wms_format" "image/png" + END + END + + LAYER + NAME "prod_immo_operation" + TYPE POLYGON + STATUS ON + CONNECTIONTYPE postgis + CONNECTION "user='fabien' password='Cov6Cov6' dbname='suivi_prod_immo' host='srv-postgres' port='5432'" + DATA "geom from \"prod_immo\".\"operation\" USING SRID=2154 USING UNIQUE id_operation" + OPACITY 100 + PROJECTION + "+init=epsg:2154" + END + #CLASSITEM "geom_approximative" + LABELITEM "nom_operation" + FILTERITEM "id_operation" + #SIZEUNITS METERS + + CLASS + NAME "Vocation résidentielle" + EXPRESSION (('[code_vocation]' = 'L') AND ('[geom_approximative]' = 'f')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + #MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + OUTLINECOLOR 255 145 0 + WIDTH 1 + END + STYLE + #MAXSCALEDENOM 60000 + OUTLINECOLOR 255 145 0 + WIDTH 3 + END + LABEL + #MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + #NAME "Vocation résidentielle (périmètre approximatif)" + EXPRESSION (('[code_vocation]' = 'L') AND ('[geom_approximative]' = 't')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 145 0 + WIDTH 3 + LINECAP butt + PATTERN 10 10 10 10 END + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + NAME "Vocation économique" + EXPRESSION (('[code_vocation]' = 'ECO') AND ('[geom_approximative]' = 'f')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 106 163 227 + WIDTH 3 + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + #NAME "Vocation économique (périmètre approximatif)" + EXPRESSION (('[code_vocation]' = 'ECO') AND ('[geom_approximative]' = 't')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 106 163 227 + WIDTH 3 + LINECAP butt + PATTERN 10 10 10 10 END + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + NAME "Vocation d'équipements publics" + EXPRESSION (('[code_vocation]' = 'E') AND ('[geom_approximative]' = 'f')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 161 101 196 + WIDTH 3 + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + #NAME "Vocation d'équipements publics (périmètre approximatif)" + EXPRESSION (('[code_vocation]' = 'E') AND ('[geom_approximative]' = 't')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 161 101 196 + WIDTH 3 + LINECAP butt + PATTERN 10 10 10 10 END + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + NAME "Parcs et espaces publics" + EXPRESSION (('[code_vocation]' = 'P') AND ('[geom_approximative]' = 'f')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 160 211 93 + WIDTH 3 + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + #NAME "Vocation d'équipements publics (périmètre approximatif)" + EXPRESSION (('[code_vocation]' = 'P') AND ('[geom_approximative]' = 't')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 160 211 93 + WIDTH 3 + LINECAP butt + PATTERN 10 10 10 10 END + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + NAME "Vocation mixte" + EXPRESSION (('[code_vocation]' = 'M') AND ('[geom_approximative]' = 'f')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR "#c2101a" + WIDTH 3 + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + NAME "Vocation indéfinie" + EXPRESSION (('[code_vocation]' = '') AND ('[geom_approximative]' = 'f')) + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR "#919899" + WIDTH 3 + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + NAME "Périmètre validé" + EXPRESSION (('[code_vocation]' = 'M') AND ('[geom_approximative]' = 't')) + KEYIMAGE "../symbols/legend_prod_immo/rectangle.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR 221 81 112 + WIDTH 3 + LINECAP butt + PATTERN 10 10 10 10 END + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + CLASS + NAME "Périmètre approximatif" + EXPRESSION (('[code_vocation]' = '') AND ('[geom_approximative]' = 't')) + KEYIMAGE "../symbols/legend_prod_immo/rectangle_point.png" + STYLE + MAXSCALEDENOM 60000 + COLOR "#d1d1d1" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 60000 + OUTLINECOLOR "#919899" + WIDTH 3 + LINECAP butt + PATTERN 10 10 10 10 END + END + LABEL + MAXSCALEDENOM 60000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#000000" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + END + + LAYER + NAME "prod_immo_ilot" + TYPE POLYGON + STATUS ON + CONNECTIONTYPE postgis + CONNECTION "user='fabien' password='Cov6Cov6' dbname='suivi_prod_immo' host='srv-postgres' port='5432'" + DATA "geom from \"prod_immo\".\"ilot\" USING SRID=2154 USING UNIQUE id_ilot" + OPACITY 100 + PROJECTION + "+init=epsg:2154" + END + FILTERITEM "id_operation" + LABELITEM "nom_ilot" + #SIZEUNITS METERS + CLASS + NAME "Îlots" + STYLE + MAXSCALEDENOM 20000 + COLOR "#f2f2a5" + WIDTH 1 + END + STYLE + MAXSCALEDENOM 10000 + OUTLINECOLOR "#e3e320" + WIDTH 1 + END + LABEL + MAXSCALEDENOM 5000 + OUTLINECOLOR 255 255 255 + TYPE TRUETYPE + FONT "verdana" + SIZE 10 + MINSIZE 10 + MAXSIZE 10 + POSITION AUTO + COLOR "#27450f" + ANTIALIAS TRUE + PARTIALS FALSE + FORCE FALSE + END + END + END + + LAYER + NAME "prod_immo_programme_immobilier_vocation" + TYPE POLYGON + STATUS ON + CONNECTIONTYPE postgis + CONNECTION "user='fabien' password='Cov6Cov6' dbname='suivi_prod_immo' host='srv-postgres' port='5432'" + DATA "geom from \"prod_immo\".\"v_programme_immobilier_vocation_layer\" USING SRID=2154 USING UNIQUE id_programme" + OPACITY 100 + PROJECTION + "+init=epsg:2154" + END + #LABELITEM "nom_ilot" + #SIZEUNITS METERS + + CLASS + NAME "Logements" + EXPRESSION ('[vocation]' = 'logement') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_programme_legend.png" + #STYLE + # MAXSCALEDENOM 20000 + # COLOR "#f5bac1" + # WIDTH 1 + #END + STYLE + MAXSCALEDENOM 10000 + OUTLINECOLOR "#3d3d3d" + COLOR 255 145 0 + WIDTH 1 + END + #LABEL + # MAXSCALEDENOM 10000 + # OUTLINECOLOR 255 255 255 + # TYPE TRUETYPE + # FONT "verdana" + # SIZE 10 + # MINSIZE 10 + # MAXSIZE 10 + # POSITION AUTO + # COLOR 255 0 0 + # ANTIALIAS TRUE + # PARTIALS FALSE + # FORCE FALSE + #END + END + CLASS + NAME "Activités économiques" + EXPRESSION ('[vocation]' = 'eco') + STYLE + MAXSCALEDENOM 10000 + OUTLINECOLOR "#3d3d3d" + COLOR 106 163 227 + WIDTH 1 + END + END + CLASS + NAME "Equipements de superstructure" + EXPRESSION ('[vocation]' = 'equipement') + STYLE + MAXSCALEDENOM 10000 + OUTLINECOLOR "#3d3d3d" + COLOR 161 101 196 + WIDTH 1 + END + END + CLASS + NAME "Mixte" + EXPRESSION ('[vocation]' = 'mixte') + STYLE + MAXSCALEDENOM 10000 + OUTLINECOLOR "#3d3d3d" + COLOR "#c2101a" + WIDTH 1 + END + END + CLASS + NAME "Indéfini" + EXPRESSION ('[vocation]' = '') + STYLE + MAXSCALEDENOM 10000 + OUTLINECOLOR "#3d3d3d" + COLOR "#a8a8a8" + WIDTH 1 + END + END + END + +END diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_map_image_1_operation.py b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_1_operation.py new file mode 100644 index 0000000000000000000000000000000000000000..250a1d5c84b787f5ed85178d93d422173ed27c9d --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_1_operation.py @@ -0,0 +1,27 @@ +import sys +import mapscript + +# HOW TO USE : +# python get_map_image_1_operation.py 848827 6519546 849279 6520166 operation_1058.png 1058 + +mapfile = '/var/www/vmap/vas/doc/suivi_prod_immo/get_map_image_1_operation.map' +tmpdir = '/var/www/vmap/vas/ws_data/vm4ms/map/tmp/' + +xmin=float(sys.argv[1]) +ymin=float(sys.argv[2]) +xmax=float(sys.argv[3]) +ymax=float(sys.argv[4]) +image=str(sys.argv[5]) +filter=str(sys.argv[6]) + +# map +map = mapscript.mapObj(mapfile) +map.setExtent(xmin, ymin, xmax, ymax) +# layers +layer_op = map.getLayerByName("prod_immo_operation"); +result = layer_op.setFilter(filter) +layer_ilot = map.getLayerByName("prod_immo_ilot"); +result = layer_ilot.setFilter(filter) +# image +img = map.draw() +img.save(tmpdir+image) \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_map_image_2_type.map b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_2_type.map new file mode 100644 index 0000000000000000000000000000000000000000..8d25dd4c814d13b8f0f72a95005b751da201ab6c --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_2_type.map @@ -0,0 +1,983 @@ +MAP + NAME bd_prod_immo + STATUS ON + # Étentue de la carte + EXTENT 842299 6516833 843076 6517501 + # Taille de l'image générée + SIZE 700 500 + # Couleur de fond de l'image générée + IMAGECOLOR 255 255 255 + + # Format de sortie de l'image générée + OUTPUTFORMAT + NAME "png" + DRIVER AGG/PNG + MIMETYPE "image/png" + IMAGEMODE RGB + EXTENSION "png" + FORMATOPTION "GAMMA=0.75" + END + IMAGETYPE "png" + + # Type de légende générée (HTML) + LEGEND + STATUS ON + IMAGECOLOR 244 244 244 + KEYSIZE 15 15 + KEYSPACING 5 5 + LABEL + TYPE TRUETYPE + FONT "arial" + SIZE 8 + COLOR 0 0 0 + PARTIALS TRUE + END + TEMPLATE "/var/www/vmap/vas/ws_data/vm4ms/map/template/legend.html" + END + + MAXSIZE 4096 + SYMBOLSET "/var/www/vmap/vas/ws_data/vm4ms/map/symbols/symbols.sym" + FONTSET "/var/www/vmap/vas/ws_data/vm4ms/map/fonts/fonts.list" + + #CONFIG "MS_ERRORFILE" "/var/www/vmap/vas/log/mapserver/test/cb973e656aa3c2e416beff082ac7b2c165c152f4c2e14c679b2652476cabcb9d_prod_immo_programme_immobilier_vocation.log" + CONFIG "PROJ_LIB" "/var/www/vmap/vas/ws_data/vm4ms/map/proj" + DEBUG 2 + + PROJECTION + #EPSG:2154 / RGF93 + "+init=epsg:2154" + END + + WEB + IMAGEPATH "/var/www/vmap/vas/ws_data/vm4ms/map/tmp/" + IMAGEURL "https://geo.urbalyon.org//ws_data/vm4ms/map/tmp/" + END + + LAYER + NAME "Ortho" + TYPE RASTER + STATUS ON + CONNECTION "https://download.data.grandlyon.com/wms/grandlyon?" + CONNECTIONTYPE WMS + METADATA + "wms_srs" "EPSG:3946" + "wms_name" "Ortho2018_Dalle_unique_8cm_CC46" + "wms_server_version" "1.1.0" + "wms_format" "image/png" + END + END + + LAYER + NAME "Conférence Territoriale des Maires" + TYPE POLYGON + STATUS ON + CONNECTIONTYPE postgis + CONNECTION "user='fabien' password='Cov6Cov6' dbname='suivi_prod_immo' host='srv-postgres' port='5432'" + DATA "geom from \"prod_immo\".\"conference_territoriale_maire\" USING SRID=2154 USING UNIQUE id_ctm" + DEBUG 0 + LABELITEM nom_ctm + PROJECTION + "+init=epsg:2154" + END + + + CLASS + #NAME "Limites communales" + STYLE + OUTLINECOLOR 255 255 255 + WIDTH 3 + END + #LABEL + # COLOR 0 0 0 + # OUTLINECOLOR 255 255 255 + # FONT "arial" + # TYPE truetype + # SIZE 6 + # #ANGLE [MYANGLE] + # POSITION AUTO + # PARTIALS FALSE + #END + END + END + + LAYER + NAME "prod_immo_operation" + TYPE POINT + STATUS ON + CONNECTIONTYPE postgis + CONNECTION "user='fabien' password='Cov6Cov6' dbname='suivi_prod_immo' host='srv-postgres' port='5432'" + DATA "geom from \"prod_immo\".\"v_operation_financement_layer\" USING SRID=2154 USING UNIQUE id_operation" + OPACITY 100 + PROJECTION + "+init=epsg:2154" + END + #CLASSITEM "geom_approximative" + LABELITEM "code_financement_equ_public" + #FILTERITEM "id_operation" + #FILTER ([id_operation]='1037' or [id_operation]='941' or [id_operation]='628') + #SIZEUNITS METERS + + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + #MINSCALEDENOM 60000 + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA,AUT' or '[code_financement_equ_public]' = 'AUT,TA' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "circle" + SIZE 10 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA,AUT' or '[code_financement_equ_public]' = 'AUT,TA' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA,AUT' or '[code_financement_equ_public]' = 'AUT,TA' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "square" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA,AUT' or '[code_financement_equ_public]' = 'AUT,TA' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA,AUT' or '[code_financement_equ_public]' = 'AUT,TA' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA,AUT' or '[code_financement_equ_public]' = 'AUT,TA' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "triangle" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "circle" + SIZE 10 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "square" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "triangle" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP,PEPE' or '[code_financement_equ_public]' = 'PEPE,PUP' and '[code_procedure_amenagement]' = 'PA') + KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "circle" + SIZE 10 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP,PEPE' or '[code_financement_equ_public]' = 'PEPE,PUP' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP,PEPE' or '[code_financement_equ_public]' = 'PEPE,PUP' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "square" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP,PEPE' or '[code_financement_equ_public]' = 'PEPE,PUP' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP,PEPE' or '[code_financement_equ_public]' = 'PEPE,PUP' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP,PEPE' or '[code_financement_equ_public]' = 'PEPE,PUP' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "triangle" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP,TA' or '[code_financement_equ_public]' = 'PUP,PEPE,TA' or '[code_financement_equ_public]' = 'TA,PUP,PEPE' or '[code_financement_equ_public]' = 'TA,PEPE,PUP' or '[code_financement_equ_public]' = 'PEPE,TA,PUP' or '[code_financement_equ_public]' = 'PUP,TA,PEPE' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 25 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "circle" + SIZE 15 + END + STYLE + COLOR 161 101 196 + SYMBOL "circle" + SIZE 5 + END + END + CLASS + NAME "PEPE,PUP,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP,TA' or '[code_financement_equ_public]' = 'PUP,PEPE,TA' or '[code_financement_equ_public]' = 'TA,PUP,PEPE' or '[code_financement_equ_public]' = 'TA,PEPE,PUP' or '[code_financement_equ_public]' = 'PEPE,TA,PUP' or '[code_financement_equ_public]' = 'PUP,TA,PEPE' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 25 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 15 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 5 + END + END + + + + + + + END + +END diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_map_image_2_type.py b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_2_type.py new file mode 100644 index 0000000000000000000000000000000000000000..8fee0fedc5529b9ea9fff984314717092e321ed9 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_2_type.py @@ -0,0 +1,32 @@ +import sys +import mapscript + +# HOW TO USE : +# python get_map_image_2_type.py 837588.444451396 6513503.28085589 849482.196139512 6525007.96208339 ctm_1_porteur.png 5,8,9,359,774,781,784,789,790,791,857,860,865,866,867,868,869,875,877,881,882,887,889,962,1036,1037,1041,1042,1051,1054,1058,1059,1082 + +mapfile = '/var/www/vmap/vas/doc/suivi_prod_immo/get_map_image_2_type.map' +tmpdir = '/var/www/vmap/vas/ws_data/vm4ms/map/tmp/' + +xmin=float(sys.argv[1]) +ymin=float(sys.argv[2]) +xmax=float(sys.argv[3]) +ymax=float(sys.argv[4]) +image=str(sys.argv[5]) +filter=str(sys.argv[6]) + +# map +map = mapscript.mapObj(mapfile) +map.setExtent(xmin, ymin, xmax, ymax) +# layers +a_id_operation=filter.split(',') +operation='' +for id_operation in a_id_operation: + if operation=='': + operation="[id_operation]='"+id_operation+"'" + else: + operation+=" or [id_operation]='"+id_operation+"'" +layer_op = map.getLayerByName("prod_immo_operation"); +result = layer_op.setFilter("("+operation+")") +# image +img = map.draw() +img.save(tmpdir+image) \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_map_image_3_porteur.map b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_3_porteur.map new file mode 100644 index 0000000000000000000000000000000000000000..1173e27f25171da75d0a3ddbe7f358d869ec6946 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_3_porteur.map @@ -0,0 +1,950 @@ +MAP + NAME bd_prod_immo + STATUS ON + # Étentue de la carte + EXTENT 842299 6516833 843076 6517501 + # Taille de l'image générée + SIZE 700 500 + # Couleur de fond de l'image générée + IMAGECOLOR 255 255 255 + + # Format de sortie de l'image générée + OUTPUTFORMAT + NAME "png" + DRIVER AGG/PNG + MIMETYPE "image/png" + IMAGEMODE RGB + EXTENSION "png" + FORMATOPTION "GAMMA=0.75" + END + IMAGETYPE "png" + + # Type de légende générée (HTML) + LEGEND + STATUS ON + IMAGECOLOR 244 244 244 + KEYSIZE 15 15 + KEYSPACING 5 5 + LABEL + TYPE TRUETYPE + FONT "arial" + SIZE 8 + COLOR 0 0 0 + PARTIALS TRUE + END + TEMPLATE "/var/www/vmap/vas/ws_data/vm4ms/map/template/legend.html" + END + + MAXSIZE 4096 + SYMBOLSET "/var/www/vmap/vas/ws_data/vm4ms/map/symbols/symbols.sym" + FONTSET "/var/www/vmap/vas/ws_data/vm4ms/map/fonts/fonts.list" + + #CONFIG "MS_ERRORFILE" "/var/www/vmap/vas/log/mapserver/test/cb973e656aa3c2e416beff082ac7b2c165c152f4c2e14c679b2652476cabcb9d_prod_immo_programme_immobilier_vocation.log" + CONFIG "PROJ_LIB" "/var/www/vmap/vas/ws_data/vm4ms/map/proj" + DEBUG 2 + + PROJECTION + #EPSG:2154 / RGF93 + "+init=epsg:2154" + END + + WEB + IMAGEPATH "/var/www/vmap/vas/ws_data/vm4ms/map/tmp/" + IMAGEURL "https://geo.urbalyon.org//ws_data/vm4ms/map/tmp/" + END + + LAYER + NAME "Ortho" + TYPE RASTER + STATUS ON + CONNECTION "https://download.data.grandlyon.com/wms/grandlyon?" + CONNECTIONTYPE WMS + METADATA + "wms_srs" "EPSG:3946" + "wms_name" "Ortho2018_Dalle_unique_8cm_CC46" + "wms_server_version" "1.1.0" + "wms_format" "image/png" + END + END + + LAYER + NAME "prod_immo_operation" + TYPE POINT + STATUS ON + CONNECTIONTYPE postgis + CONNECTION "user='fabien' password='Cov6Cov6' dbname='suivi_prod_immo' host='srv-postgres' port='5432'" + DATA "geom from \"prod_immo\".\"v_operation_financement_layer\" USING SRID=2154 USING UNIQUE id_operation" + OPACITY 100 + PROJECTION + "+init=epsg:2154" + END + #CLASSITEM "geom_approximative" + LABELITEM "code_financement_equ_public" + #FILTERITEM "id_operation" + #FILTER ([id_operation]='1037' or [id_operation]='941' or [id_operation]='628') + #SIZEUNITS METERS + + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + #MINSCALEDENOM 60000 + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + #NAME "PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PUP' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "FINZAC" + EXPRESSION ('[code_financement_equ_public]' = 'FINZAC' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 106 163 227 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TA" + EXPRESSION ('[code_financement_equ_public]' = 'TA' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 161 101 196 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "TAM" + EXPRESSION ('[code_financement_equ_public]' = 'TAM' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 253 105 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "PEPE" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT" + EXPRESSION ('[code_financement_equ_public]' = 'AUT' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "ND NULL" + EXPRESSION ('[code_financement_equ_public]' = 'ND' or '[code_financement_equ_public]' = '' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 255 255 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'AUT,TA' or '[code_financement_equ_public]' = 'TA,AUT' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "circle" + SIZE 10 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'AUT,TA' or '[code_financement_equ_public]' = 'TA,AUT' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'AUT,TA' or '[code_financement_equ_public]' = 'TA,AUT' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "square" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'AUT,TA' or '[code_financement_equ_public]' = 'TA,AUT' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'AUT,TA' or '[code_financement_equ_public]' = 'TA,AUT' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "AUT,TA" + EXPRESSION ('[code_financement_equ_public]' = 'AUT,TA' or '[code_financement_equ_public]' = 'TA,AUT' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 160 211 93 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "triangle" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "circle" + SIZE 10 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "square" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,TA' or '[code_financement_equ_public]' = 'TA,PEPE' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 223 223 223 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 161 101 196 + SYMBOL "triangle" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP' or '[code_financement_equ_public]' = 'PUP,PEPE' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "circle" + SIZE 10 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP' or '[code_financement_equ_public]' = 'PUP,PEPE' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP' or '[code_financement_equ_public]' = 'PUP,PEPE' and '[code_procedure_amenagement]' = 'ZAC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "square" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "square" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP' or '[code_financement_equ_public]' = 'PUP,PEPE' and '[code_procedure_amenagement]' = 'PA/PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP' or '[code_financement_equ_public]' = 'PUP,PEPE' and '[code_procedure_amenagement]' = 'AUT') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP' or '[code_financement_equ_public]' = 'PUP,PEPE' and '[code_procedure_amenagement]' = 'ND') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "triangle" + SIZE 20 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "triangle" + SIZE 9 + END + END + CLASS + NAME "PEPE,PUP,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP,TA' or '[code_financement_equ_public]' = 'PUP,PEPE,TA' or '[code_financement_equ_public]' = 'TA,PUP,PEPE' or '[code_financement_equ_public]' = 'TA,PEPE,PUP' or '[code_financement_equ_public]' = 'PEPE,TA,PUP' or '[code_financement_equ_public]' = 'PUP,TA,PEPE' and '[code_procedure_amenagement]' = 'PA') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "circle" + SIZE 25 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "circle" + SIZE 15 + END + STYLE + COLOR 161 101 196 + SYMBOL "circle" + SIZE 5 + END + END + CLASS + NAME "PEPE,PUP,TA" + EXPRESSION ('[code_financement_equ_public]' = 'PEPE,PUP,TA' or '[code_financement_equ_public]' = 'PUP,PEPE,TA' or '[code_financement_equ_public]' = 'TA,PUP,PEPE' or '[code_financement_equ_public]' = 'TA,PEPE,PUP' or '[code_financement_equ_public]' = 'PEPE,TA,PUP' or '[code_financement_equ_public]' = 'PUP,TA,PEPE' and '[code_procedure_amenagement]' = 'PC') + #KEYIMAGE "../symbols/legend_prod_immo/prod_immo_operation_legend.png" + STYLE + COLOR 255 145 0 + OUTLINECOLOR 0 0 0 + SYMBOL "pentagon" + SIZE 25 + WIDTH 2 + END + STYLE + COLOR 223 223 223 + SYMBOL "pentagon" + SIZE 15 + END + STYLE + COLOR 161 101 196 + SYMBOL "pentagon" + SIZE 5 + END + END + + + + + + + END + +END diff --git a/src/vitis/vas/doc/suivi_prod_immo/get_map_image_3_porteur.py b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_3_porteur.py new file mode 100644 index 0000000000000000000000000000000000000000..3de2916d399db3d7fe1e4eb476b62aea2323df61 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/get_map_image_3_porteur.py @@ -0,0 +1,32 @@ +import sys +import mapscript + +# HOW TO USE : +# python /var/www/vmap/vas/doc/suivi_prod_immo/get_map_image_3_porteur.py 843911 6518881 844987 6519939 spl_part_dieu_porteur.png 5,359 + +mapfile = '/var/www/vmap/vas/doc/suivi_prod_immo/get_map_image_3_porteur.map' +tmpdir = '/var/www/vmap/vas/ws_data/vm4ms/map/tmp/' + +xmin=float(sys.argv[1]) +ymin=float(sys.argv[2]) +xmax=float(sys.argv[3]) +ymax=float(sys.argv[4]) +image=str(sys.argv[5]) +filter=str(sys.argv[6]) + +# map +map = mapscript.mapObj(mapfile) +map.setExtent(xmin, ymin, xmax, ymax) +# layers +a_id_operation=filter.split(',') +operation='' +for id_operation in a_id_operation: + if operation=='': + operation="[id_operation]='"+id_operation+"'" + else: + operation+=" or [id_operation]='"+id_operation+"'" +layer_op = map.getLayerByName("prod_immo_operation"); +result = layer_op.setFilter("("+operation+")") +# image +img = map.draw() +img.save(tmpdir+image) \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_1.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0f11edaad06e0753e9de292f160c82ac27b637 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_1.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_2.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc89614c906a848c2ee14f670ed1293567eb9bc Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_2.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_3.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_3.png new file mode 100644 index 0000000000000000000000000000000000000000..4c23bf8137f235c152913aba3911192252576337 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_3.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_4.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_4.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe77eff0040459a2f4cd9ce4e3faf92fd219632 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_4.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_1.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_1.png new file mode 100644 index 0000000000000000000000000000000000000000..55a00a98331fe176ba9751e2cc7c35645b482fae Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_1.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_2.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_2.png new file mode 100644 index 0000000000000000000000000000000000000000..de33f3fa234cc28501d9ea689ef3043d182f3082 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_2.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_3.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_3.png new file mode 100644 index 0000000000000000000000000000000000000000..485faae617d0fbaccce54ea0223cf53d53f2e680 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_3.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_4.png b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_4.png new file mode 100644 index 0000000000000000000000000000000000000000..4442d19654ea5b6ae6a6866079485ec89e72cee1 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/arrow_right_border_4.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/grand_lyon.png b/src/vitis/vas/doc/suivi_prod_immo/images/grand_lyon.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecc936312a5c68eef586224b011b81ddc58adae Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/grand_lyon.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/grand_lyon_large.png b/src/vitis/vas/doc/suivi_prod_immo/images/grand_lyon_large.png new file mode 100644 index 0000000000000000000000000000000000000000..0c88fd5dfe119425afa03a291b1aaf3908a604c1 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/grand_lyon_large.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_1_operation.png b/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_1_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..85edead5cc0612b6e41b244c230d0c1933442f50 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_1_operation.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_2_type.png b/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_2_type.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2746afd90be0180e11f8596c8640f8e612eca3 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_2_type.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_3_porteur.png b/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_3_porteur.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2746afd90be0180e11f8596c8640f8e612eca3 Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/legende_get_3_porteur.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/map_tmp.png b/src/vitis/vas/doc/suivi_prod_immo/images/map_tmp.png new file mode 100644 index 0000000000000000000000000000000000000000..260404f8bec7ce9df79588f059dcd0c0dac109db Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/map_tmp.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/images/urbalyon.png b/src/vitis/vas/doc/suivi_prod_immo/images/urbalyon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c68f9b7ed875eddce4318780e59a09f3d5bd0cd Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/images/urbalyon.png differ diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/Encryption.js b/src/vitis/vas/doc/suivi_prod_immo/js/Encryption.js new file mode 100644 index 0000000000000000000000000000000000000000..601306affff42ae8459e95900b09705b5ef2d800 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/Encryption.js @@ -0,0 +1,107 @@ + + +/** + * Encryption class for encrypt/decrypt that works between programming languages. + * + * @author Vee Winch. + * @link https://stackoverflow.com/questions/41222162/encrypt-in-php-openssl-and-decrypt-in-javascript-cryptojs Reference. + * @link https://github.com/brix/crypto-js/releases crypto-js.js can be download from here. + */ +class Encryption { + + + /** + * @var integer Return encrypt method or Cipher method number. (128, 192, 256) + */ + get encryptMethodLength() { + var encryptMethod = this.encryptMethod; + // get only number from string. + // @link https://stackoverflow.com/a/10003709/128761 Reference. + var aesNumber = encryptMethod.match(/\d+/)[0]; + return parseInt(aesNumber); + }// encryptMethodLength + + + /** + * @var integer Return cipher method divide by 8. example: AES number 256 will be 256/8 = 32. + */ + get encryptKeySize() { + var aesNumber = this.encryptMethodLength; + return parseInt(aesNumber / 8); + }// encryptKeySize + + + /** + * @link http://php.net/manual/en/function.openssl-get-cipher-methods.php Refer to available methods in PHP if we are working between JS & PHP encryption. + * @var string Cipher method. + * Recommended AES-128-CBC, AES-192-CBC, AES-256-CBC + * due to there is no `openssl_cipher_iv_length()` function in JavaScript + * and all of these methods are known as 16 in iv_length. + */ + get encryptMethod() { + return 'AES-256-CBC'; + }// encryptMethod + + + /** + * Decrypt string. + * + * @link https://stackoverflow.com/questions/41222162/encrypt-in-php-openssl-and-decrypt-in-javascript-cryptojs Reference. + * @link https://stackoverflow.com/questions/25492179/decode-a-base64-string-using-cryptojs Crypto JS base64 encode/decode reference. + * @param string encryptedString The encrypted string to be decrypt. + * @param string key The key. + * @return string Return decrypted string. + */ + decrypt(encryptedString, key) { + var json = JSON.parse(CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(encryptedString))); + + var salt = CryptoJS.enc.Hex.parse(json.salt); + var iv = CryptoJS.enc.Hex.parse(json.iv); + + var encrypted = json.ciphertext;// no need to base64 decode. + + var iterations = parseInt(json.iterations); + if (iterations <= 0) { + iterations = 999; + } + var encryptMethodLength = (this.encryptMethodLength/4);// example: AES number is 256 / 4 = 64 + var hashKey = CryptoJS.PBKDF2(key, salt, {'hasher': CryptoJS.algo.SHA512, 'keySize': (encryptMethodLength/8), 'iterations': iterations}); + + var decrypted = CryptoJS.AES.decrypt(encrypted, hashKey, {'mode': CryptoJS.mode.CBC, 'iv': iv}); + + return decrypted.toString(CryptoJS.enc.Utf8); + }// decrypt + + + /** + * Encrypt string. + * + * @link https://stackoverflow.com/questions/41222162/encrypt-in-php-openssl-and-decrypt-in-javascript-cryptojs Reference. + * @link https://stackoverflow.com/questions/25492179/decode-a-base64-string-using-cryptojs Crypto JS base64 encode/decode reference. + * @param string string The original string to be encrypt. + * @param string key The key. + * @return string Return encrypted string. + */ + encrypt(string, key) { + var iv = CryptoJS.lib.WordArray.random(16);// the reason to be 16, please read on `encryptMethod` property. + + var salt = CryptoJS.lib.WordArray.random(256); + var iterations = 999; + var encryptMethodLength = (this.encryptMethodLength/4);// example: AES number is 256 / 4 = 64 + var hashKey = CryptoJS.PBKDF2(key, salt, {'hasher': CryptoJS.algo.SHA512, 'keySize': (encryptMethodLength/8), 'iterations': iterations}); + + var encrypted = CryptoJS.AES.encrypt(string, hashKey, {'mode': CryptoJS.mode.CBC, 'iv': iv}); + var encryptedString = CryptoJS.enc.Base64.stringify(encrypted.ciphertext); + + var output = { + 'ciphertext': encryptedString, + 'iv': CryptoJS.enc.Hex.stringify(iv), + 'salt': CryptoJS.enc.Hex.stringify(salt), + 'iterations': iterations + }; + + return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify(output))); + }// encrypt + + +} \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/chart.js_2.8.0/Chart.min.js b/src/vitis/vas/doc/suivi_prod_immo/js/chart.js_2.8.0/Chart.min.js new file mode 100644 index 0000000000000000000000000000000000000000..c74a7914a35f60ba32c6d8ecca9209208bced1ce --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/chart.js_2.8.0/Chart.min.js @@ -0,0 +1,7 @@ +/*! + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],function(t){return e(function(){try{return t("moment")}catch(t){}}())}):t.Chart=e(t.moment)}(this,function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={rgb2hsl:i,rgb2hsv:n,rgb2hwb:a,rgb2cmyk:o,rgb2keyword:s,rgb2xyz:l,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:u,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return a(u(t))},hsl2cmyk:function(t){return o(u(t))},hsl2keyword:function(t){return s(u(t))},hsv2rgb:h,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return e=a*o,[n,100*(e=(e/=(i=(2-a)*o)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return a(h(t))},hsv2cmyk:function(t){return o(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:c,hwb2hsl:function(t){return i(c(t))},hwb2hsv:function(t){return n(c(t))},hwb2cmyk:function(t){return o(c(t))},hwb2keyword:function(t){return s(c(t))},cmyk2rgb:f,cmyk2hsl:function(t){return i(f(t))},cmyk2hsv:function(t){return n(f(t))},cmyk2hwb:function(t){return a(f(t))},cmyk2keyword:function(t){return s(f(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return n(w(t))},keyword2hwb:function(t){return a(w(t))},keyword2cmyk:function(t){return o(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return l(w(t))},xyz2rgb:p,xyz2lab:m,xyz2lch:function(t){return x(m(t))},lab2xyz:v,lab2rgb:y,lab2lch:x,lch2lab:k,lch2xyz:function(t){return v(k(t))},lch2rgb:function(t){return y(k(t))}};function i(t){var e,i,n=t[0]/255,a=t[1]/255,o=t[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),i=(r+s)/2,[e,100*(s==r?0:i<=.5?l/(s+r):l/(2-s-r)),100*i]}function n(t){var e,i,n=t[0],a=t[1],o=t[2],r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return i=0==s?0:l/s*1e3/10,s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),[e,i,s/255*1e3/10]}function a(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function o(t){var e,i=t[0]/255,n=t[1]/255,a=t[2]/255;return[100*((1-i-(e=Math.min(1-i,1-n,1-a)))/(1-e)||0),100*((1-n-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]}function s(t){return _[JSON.stringify(t)]}function l(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function d(t){var e=l(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function u(t){var e,i,n,a,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[o=255*l,o,o];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var d=0;d<3;d++)(n=r+1/3*-(d-1))<0&&n++,n>1&&n--,o=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[d]=255*o;return a}function h(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*n*(1-i),s=255*n*(1-i*o),l=255*n*(1-i*(1-o));n*=255;switch(a){case 0:return[n,l,r];case 1:return[s,n,r];case 2:return[r,n,l];case 3:return[r,s,n];case 4:return[l,r,n];case 5:return[n,r,s]}}function c(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,d=s+l;switch(d>1&&(s/=d,l/=d),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function f(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function p(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100;return i=-.9689*a+1.8758*o+.0415*r,n=.0557*a+-.204*o+1.057*r,e=(e=3.2406*a+-1.5372*o+-.4986*r)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function m(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function v(t){var e,i,n,a,o=t[0],r=t[1],s=t[2];return o<=8?a=(i=100*o/903.3)/100*7.787+16/116:(i=100*Math.pow((o+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function x(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function y(t){return p(v(t))}function k(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function w(t){return M[t]}var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},_={};for(var C in M)_[JSON.stringify(M[C])]=C;var S=function(){return new T};for(var P in e){S[P+"Raw"]=function(t){return function(i){return"number"==typeof i&&(i=Array.prototype.slice.call(arguments)),e[t](i)}}(P);var I=/(\w+)2(\w+)/.exec(P),A=I[1],D=I[2];(S[A]=S[A]||{})[D]=S[P]=function(t){return function(i){"number"==typeof i&&(i=Array.prototype.slice.call(arguments));var n=e[t](i);if("string"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(P)}var T=function(){this.convs={}};T.prototype.routeSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i))},T.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},T.prototype.getValues=function(t){var e=this.convs[t];if(!e){var i=this.space,n=this.convs[i];e=S[i][t](n),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){T.prototype[t]=function(e){return this.routeSpace(t,arguments)}});var F=S,L={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},R={getRgba:O,getHsla:z,getRgb:function(t){var e=O(t);return e&&e.slice(0,3)},getHsl:function(t){var e=z(t);return e&&e.slice(0,3)},getHwb:B,getAlpha:function(t){var e=O(t);if(e)return e[3];if(e=z(t))return e[3];if(e=B(t))return e[3]},hexString:function(t,e){var e=void 0!==e&&3===t.length?e:t[3];return"#"+H(t[0])+H(t[1])+H(t[2])+(e>=0&&e<1?H(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return N(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:N,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return W(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+i+"%, "+n+"%, "+a+"%)"},percentaString:W,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return V(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:V,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return j[t.slice(0,3)]}};function O(t){if(t){var e=[0,0,0],i=1,n=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(n){a=(n=n[1])[3];for(var o=0;o<e.length;o++)e[o]=parseInt(n[o]+n[o],16);a&&(i=Math.round(parseInt(a+a,16)/255*100)/100)}else if(n=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=n[2],n=n[1];for(o=0;o<e.length;o++)e[o]=parseInt(n.slice(2*o,2*o+2),16);a&&(i=Math.round(parseInt(a,16)/255*100)/100)}else if(n=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(o=0;o<e.length;o++)e[o]=parseInt(n[o+1]);i=parseFloat(n[4])}else if(n=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(o=0;o<e.length;o++)e[o]=Math.round(2.55*parseFloat(n[o+1]));i=parseFloat(n[4])}else if(n=t.match(/(\w+)/)){if("transparent"==n[1])return[0,0,0,0];if(!(e=L[n[1]]))return}for(o=0;o<e.length;o++)e[o]=E(e[o],0,255);return i=i||0==i?E(i,0,1):1,e[3]=i,e}}function z(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[E(parseInt(e[1]),0,360),E(parseFloat(e[2]),0,100),E(parseFloat(e[3]),0,100),E(isNaN(i)?1:i,0,1)]}}}function B(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[E(parseInt(e[1]),0,360),E(parseFloat(e[2]),0,100),E(parseFloat(e[3]),0,100),E(isNaN(i)?1:i,0,1)]}}}function N(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function W(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function V(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function E(t,e,i){return Math.min(Math.max(e,t),i)}function H(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var j={};for(var q in L)j[L[q]]=q;var Y=function(t){return t instanceof Y?t:this instanceof Y?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=R.getRgba(t))?this.setValues("rgb",e):(e=R.getHsla(t))?this.setValues("hsl",e):(e=R.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new Y(t);var e};Y.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return R.hexString(this.values.rgb)},rgbString:function(){return R.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return R.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return R.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return R.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return R.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return R.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return R.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],i=0;i<t.length;i++){var n=t[i]/255;e[i]=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),i=t.luminosity();return e>i?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=t,n=void 0===e?.5:e,a=2*n-1,o=this.alpha()-i.alpha(),r=((a*o==-1?a:(a+o)/(1+a*o))+1)/2,s=1-r;return this.rgb(r*this.red()+s*i.red(),r*this.green()+s*i.green(),r*this.blue()+s*i.blue()).alpha(this.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new Y,n=this.values,a=i.values;for(var o in n)n.hasOwnProperty(o)&&(t=n[o],"[object Array]"===(e={}.toString.call(t))?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return i}},Y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Y.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n<t.length;n++)i[t.charAt(n)]=e[t][n];return 1!==e.alpha&&(i.a=e.alpha),i},Y.prototype.setValues=function(t,e){var i,n,a=this.values,o=this.spaces,r=this.maxes,s=1;if(this.valid=!0,"alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(i=0;i<t.length;i++)a[t][i]=e[t.charAt(i)];s=e.a}else if(void 0!==e[o[t][0]]){var l=o[t];for(i=0;i<t.length;i++)a[t][i]=e[l[i]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;for(i=0;i<t.length;i++)n=Math.max(0,Math.min(r[t][i],a[t][i])),a[t][i]=Math.round(n);for(var d in o)d!==t&&(a[d]=F[t][d](a[t]));return!0},Y.prototype.setSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i),this)},Y.prototype.setChannel=function(t,e,i){var n=this.values[t];return void 0===i?n[e]:i===n[e]?this:(n[e]=i,this.setValues(t,n),this)},"undefined"!=typeof window&&(window.Color=Y);var U,X=Y,K={noop:function(){},uid:(U=0,function(){return U++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,i){return K.valueOrDefault(K.isArray(t)?t[e]:t,i)},callback:function(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)},each:function(t,e,i,n){var a,o,r;if(K.isArray(t))if(o=t.length,n)for(a=o-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<o;a++)e.call(i,t[a],a);else if(K.isObject(t))for(o=(r=Object.keys(t)).length,a=0;a<o;a++)e.call(i,t[r[a]],r[a])},arrayEquals:function(t,e){var i,n,a,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(a=t[i],o=e[i],a instanceof Array&&o instanceof Array){if(!K.arrayEquals(a,o))return!1}else if(a!==o)return!1;return!0},clone:function(t){if(K.isArray(t))return t.map(K.clone);if(K.isObject(t)){for(var e={},i=Object.keys(t),n=i.length,a=0;a<n;++a)e[i[a]]=K.clone(t[i[a]]);return e}return t},_merger:function(t,e,i,n){var a=e[t],o=i[t];K.isObject(a)&&K.isObject(o)?K.merge(a,o,n):e[t]=K.clone(o)},_mergerIf:function(t,e,i){var n=e[t],a=i[t];K.isObject(n)&&K.isObject(a)?K.mergeIf(n,a):e.hasOwnProperty(t)||(e[t]=K.clone(a))},merge:function(t,e,i){var n,a,o,r,s,l=K.isArray(e)?e:[e],d=l.length;if(!K.isObject(t))return t;for(n=(i=i||{}).merger||K._merger,a=0;a<d;++a)if(e=l[a],K.isObject(e))for(s=0,r=(o=Object.keys(e)).length;s<r;++s)n(o[s],t,e,i);return t},mergeIf:function(t,e){return K.merge(t,e,{merger:K._mergerIf})},extend:function(t){for(var e=function(e,i){t[i]=e},i=1,n=arguments.length;i<n;++i)K.each(arguments[i],e);return t},inherits:function(t){var e=this,i=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},n=function(){this.constructor=i};return n.prototype=e.prototype,i.prototype=new n,i.extend=K.inherits,t&&K.extend(i.prototype,t),i.__super__=e.prototype,i}},G=K;K.callCallback=K.callback,K.indexOf=function(t,e,i){return Array.prototype.indexOf.call(t,e,i)},K.getValueOrDefault=K.valueOrDefault,K.getValueAtIndexOrDefault=K.valueAtIndexOrDefault;var Z={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-Z.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*Z.easeInBounce(2*t):.5*Z.easeOutBounce(2*t-1)+.5}},$={effects:Z};G.easingEffects=Z;var J=Math.PI,Q=J/180,tt=2*J,et=J/2,it=J/4,nt=2*J/3,at={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,o){if(o){var r=Math.min(o,a/2,n/2),s=e+r,l=i+r,d=e+n-r,u=i+a-r;t.moveTo(e,l),s<d&&l<u?(t.arc(s,l,r,-J,-et),t.arc(d,l,r,-et,0),t.arc(d,u,r,0,et),t.arc(s,u,r,et,J)):s<d?(t.moveTo(s,i),t.arc(d,l,r,-et,et),t.arc(s,l,r,et,J+et)):l<u?(t.arc(s,l,r,-J,0),t.arc(s,u,r,0,J)):t.arc(s,l,r,-J,J),t.closePath(),t.moveTo(e,i)}else t.rect(e,i,n,a)},drawPoint:function(t,e,i,n,a,o){var r,s,l,d,u,h=(o||0)*Q;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(r=e.toString())&&"[object HTMLCanvasElement]"!==r){if(!(isNaN(i)||i<=0)){switch(t.beginPath(),e){default:t.arc(n,a,i,0,tt),t.closePath();break;case"triangle":t.moveTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=nt,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=nt,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),t.closePath();break;case"rectRounded":d=i-(u=.516*i),s=Math.cos(h+it)*d,l=Math.sin(h+it)*d,t.arc(n-s,a-l,u,h-J,h-et),t.arc(n+l,a-s,u,h-et,h),t.arc(n+s,a+l,u,h,h+et),t.arc(n-l,a+s,u,h+et,h+J),t.closePath();break;case"rect":if(!o){d=Math.SQRT1_2*i,t.rect(n-d,a-d,2*d,2*d);break}h+=it;case"rectRot":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+l,a-s),t.lineTo(n+s,a+l),t.lineTo(n-l,a+s),t.closePath();break;case"crossRot":h+=it;case"cross":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"star":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s),h+=it,s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"line":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l);break;case"dash":t.moveTo(n,a),t.lineTo(n+Math.cos(h)*i,a+Math.sin(h)*i)}t.fill(),t.stroke()}}else t.drawImage(e,n-e.width/2,a-e.height/2,e.width,e.height)},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,i,n){var a=i.steppedLine;if(a){if("middle"===a){var o=(e.x+i.x)/2;t.lineTo(o,n?i.y:e.y),t.lineTo(o,n?e.y:i.y)}else"after"===a&&!n||"after"!==a&&n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}else i.tension?t.bezierCurveTo(n?e.controlPointPreviousX:e.controlPointNextX,n?e.controlPointPreviousY:e.controlPointNextY,n?i.controlPointNextX:i.controlPointPreviousX,n?i.controlPointNextY:i.controlPointPreviousY,i.x,i.y):t.lineTo(i.x,i.y)}},ot=at;G.clear=at.clear,G.drawRoundedRectangle=function(t){t.beginPath(),at.roundedRect.apply(at,arguments)};var rt={_set:function(t,e){return G.merge(this[t]||(this[t]={}),e)}};rt._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var st=rt,lt=G.valueOrDefault;var dt={toLineHeight:function(t,e){var i=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,i,n,a;return G.isObject(t)?(e=+t.top||0,i=+t.right||0,n=+t.bottom||0,a=+t.left||0):e=i=n=a=+t||0,{top:e,right:i,bottom:n,left:a,height:e+n,width:a+i}},_parseFont:function(t){var e=st.global,i=lt(t.fontSize,e.defaultFontSize),n={family:lt(t.fontFamily,e.defaultFontFamily),lineHeight:G.options.toLineHeight(lt(t.lineHeight,e.defaultLineHeight),i),size:i,style:lt(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return n.string=function(t){return!t||G.isNullOrUndef(t.size)||G.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(n),n},resolve:function(t,e,i){var n,a,o;for(n=0,a=t.length;n<a;++n)if(void 0!==(o=t[n])&&(void 0!==e&&"function"==typeof o&&(o=o(e)),void 0!==i&&G.isArray(o)&&(o=o[i]),void 0!==o))return o}},ut=G,ht=$,ct=ot,ft=dt;ut.easing=ht,ut.canvas=ct,ut.options=ft;var gt=function(t){ut.extend(this,t),this.initialize.apply(this,arguments)};ut.extend(gt.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=ut.clone(t._model)),t._start={},t},transition:function(t){var e=this,i=e._model,n=e._start,a=e._view;return i&&1!==t?(a||(a=e._view={}),n||(n=e._start={}),function(t,e,i,n){var a,o,r,s,l,d,u,h,c,f=Object.keys(i);for(a=0,o=f.length;a<o;++a)if(d=i[r=f[a]],e.hasOwnProperty(r)||(e[r]=d),(s=e[r])!==d&&"_"!==r[0]){if(t.hasOwnProperty(r)||(t[r]=s),(u=typeof d)==typeof(l=t[r]))if("string"===u){if((h=X(l)).valid&&(c=X(d)).valid){e[r]=c.mix(h,n).rgbString();continue}}else if(ut.isFinite(l)&&ut.isFinite(d)){e[r]=l+(d-l)*n;continue}e[r]=d}}(n,a,i,t),e):(e._view=i,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return ut.isNumber(this._model.x)&&ut.isNumber(this._model.y)}}),gt.extend=ut.inherits;var pt=gt,mt=pt.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),vt=mt;Object.defineProperty(mt.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(mt.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),st._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:ut.noop,onComplete:ut.noop}});var bt={animations:[],request:null,addAnimation:function(t,e,i,n){var a,o,r=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=i,n||(t.animating=!0),a=0,o=r.length;a<o;++a)if(r[a].chart===t)return void(r[a]=e);r.push(e),1===r.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=ut.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=ut.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,i,n,a=this.animations,o=0;o<a.length;)e=(t=a[o]).chart,i=t.numSteps,n=Math.floor((Date.now()-t.startTime)/t.duration*i)+1,t.currentStep=Math.min(n,i),ut.callback(t.render,[e,t],e),ut.callback(t.onAnimationProgress,[t],e),t.currentStep>=i?(ut.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(o,1)):++o}},xt=ut.options.resolve,yt=["push","pop","shift","splice","unshift"];function kt(t,e){var i=t._chartjs;if(i){var n=i.listeners,a=n.indexOf(e);-1!==a&&n.splice(a,1),n.length>0||(yt.forEach(function(e){delete t[e]}),delete t._chartjs)}}var wt=function(t,e){this.initialize(t,e)};ut.extend(wt.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this.update(!0)},destroy:function(){this._data&&kt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);i.dataset=i.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,i=this,n=i.getDataset(),a=n.data||(n.data=[]);i._data!==a&&(i._data&&kt(i._data,i),a&&Object.isExtensible(a)&&(e=i,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),yt.forEach(function(e){var i="onData"+e.charAt(0).toUpperCase()+e.slice(1),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=n.apply(this,e);return ut.each(t._chartjs.listeners,function(t){"function"==typeof t[i]&&t[i].apply(t,e)}),a}})}))),i._data=a),i.resyncElements()},update:ut.noop,transition:function(t){for(var e=this.getMeta(),i=e.data||[],n=i.length,a=0;a<n;++a)i[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],i=e.length,n=0;for(t.dataset&&t.dataset.draw();n<i;++n)e[n].draw()},removeHoverStyle:function(t){ut.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},a=t._model,o=ut.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=xt([n.hoverBackgroundColor,e.hoverBackgroundColor,o(a.backgroundColor)],void 0,i),a.borderColor=xt([n.hoverBorderColor,e.hoverBorderColor,o(a.borderColor)],void 0,i),a.borderWidth=xt([n.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,i)},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,i=t.data.length,n=e.length;n<i?t.data.splice(n,i-n):n>i&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;i<e;++i)this.addElementAndReset(t+i)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),wt.extend=ut.inherits;var Mt=wt;st._set("global",{elements:{arc:{backgroundColor:st.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var _t=pt.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var i=this._view;if(i){for(var n=ut.getAngleFromPoint(i,{x:t,y:e}),a=n.angle,o=n.distance,r=i.startAngle,s=i.endAngle;s<r;)s+=2*Math.PI;for(;a>s;)a-=2*Math.PI;for(;a<r;)a+=2*Math.PI;var l=a>=r&&a<=s,d=o>=i.innerRadius&&o<=i.outerRadius;return l&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t,e=this._chart.ctx,i=this._view,n=i.startAngle,a=i.endAngle,o="inner"===i.borderAlign?.33:0;e.save(),e.beginPath(),e.arc(i.x,i.y,Math.max(i.outerRadius-o,0),n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.fillStyle=i.backgroundColor,e.fill(),i.borderWidth&&("inner"===i.borderAlign?(e.beginPath(),t=o/i.outerRadius,e.arc(i.x,i.y,i.outerRadius,n-t,a+t),i.innerRadius>o?(t=o/i.innerRadius,e.arc(i.x,i.y,i.innerRadius-o,a+t,n-t,!0)):e.arc(i.x,i.y,o,a+Math.PI/2,n-Math.PI/2),e.closePath(),e.clip(),e.beginPath(),e.arc(i.x,i.y,i.outerRadius,n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.lineWidth=2*i.borderWidth,e.lineJoin="round"):(e.lineWidth=i.borderWidth,e.lineJoin="bevel"),e.strokeStyle=i.borderColor,e.stroke()),e.restore()}}),Ct=ut.valueOrDefault,St=st.global.defaultColor;st._set("global",{elements:{line:{tension:.4,backgroundColor:St,borderWidth:3,borderColor:St,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Pt=pt.extend({draw:function(){var t,e,i,n,a=this._view,o=this._chart.ctx,r=a.spanGaps,s=this._children.slice(),l=st.global,d=l.elements.line,u=-1;for(this._loop&&s.length&&s.push(s[0]),o.save(),o.lineCap=a.borderCapStyle||d.borderCapStyle,o.setLineDash&&o.setLineDash(a.borderDash||d.borderDash),o.lineDashOffset=Ct(a.borderDashOffset,d.borderDashOffset),o.lineJoin=a.borderJoinStyle||d.borderJoinStyle,o.lineWidth=Ct(a.borderWidth,d.borderWidth),o.strokeStyle=a.borderColor||l.defaultColor,o.beginPath(),u=-1,t=0;t<s.length;++t)e=s[t],i=ut.previousItem(s,t),n=e._view,0===t?n.skip||(o.moveTo(n.x,n.y),u=t):(i=-1===u?i:s[u],n.skip||(u!==t-1&&!r||-1===u?o.moveTo(n.x,n.y):ut.canvas.lineTo(o,i._view,e._view),u=t));o.stroke(),o.restore()}}),It=ut.valueOrDefault,At=st.global.defaultColor;function Dt(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}st._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:At,borderColor:At,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var Tt=pt.extend({inRange:function(t,e){var i=this._view;return!!i&&Math.pow(t-i.x,2)+Math.pow(e-i.y,2)<Math.pow(i.hitRadius+i.radius,2)},inLabelRange:Dt,inXRange:Dt,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,i=this._chart.ctx,n=e.pointStyle,a=e.rotation,o=e.radius,r=e.x,s=e.y,l=st.global,d=l.defaultColor;e.skip||(void 0===t||ut.canvas._isPointInArea(e,t))&&(i.strokeStyle=e.borderColor||d,i.lineWidth=It(e.borderWidth,l.elements.point.borderWidth),i.fillStyle=e.backgroundColor||d,ut.canvas.drawPoint(i,n,o,r,s,a))}}),Ft=st.global.defaultColor;function Lt(t){return t&&void 0!==t.width}function Rt(t){var e,i,n,a,o;return Lt(t)?(o=t.width/2,e=t.x-o,i=t.x+o,n=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(o=t.height/2,e=Math.min(t.x,t.base),i=Math.max(t.x,t.base),n=t.y-o,a=t.y+o),{left:e,top:n,right:i,bottom:a}}function Ot(t,e,i){return t===e?i:t===i?e:t}function zt(t,e,i){var n,a,o,r,s=t.borderWidth,l=function(t){var e=t.borderSkipped,i={};return e?(t.horizontal?t.base>t.x&&(e=Ot(e,"left","right")):t.base<t.y&&(e=Ot(e,"bottom","top")),i[e]=!0,i):i}(t);return ut.isObject(s)?(n=+s.top||0,a=+s.right||0,o=+s.bottom||0,r=+s.left||0):n=a=o=r=+s||0,{t:l.top||n<0?0:n>i?i:n,r:l.right||a<0?0:a>e?e:a,b:l.bottom||o<0?0:o>i?i:o,l:l.left||r<0?0:r>e?e:r}}function Bt(t,e,i){var n=null===e,a=null===i,o=!(!t||n&&a)&&Rt(t);return o&&(n||e>=o.left&&e<=o.right)&&(a||i>=o.top&&i<=o.bottom)}st._set("global",{elements:{rectangle:{backgroundColor:Ft,borderColor:Ft,borderSkipped:"bottom",borderWidth:0}}});var Nt=pt.extend({draw:function(){var t=this._chart.ctx,e=this._view,i=function(t){var e=Rt(t),i=e.right-e.left,n=e.bottom-e.top,a=zt(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n},inner:{x:e.left+a.l,y:e.top+a.t,w:i-a.l-a.r,h:n-a.t-a.b}}}(e),n=i.outer,a=i.inner;t.fillStyle=e.backgroundColor,t.fillRect(n.x,n.y,n.w,n.h),n.w===a.w&&n.h===a.h||(t.save(),t.beginPath(),t.rect(n.x,n.y,n.w,n.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return Bt(this._view,t,e)},inLabelRange:function(t,e){var i=this._view;return Lt(i)?Bt(i,t,null):Bt(i,null,e)},inXRange:function(t){return Bt(this._view,t,null)},inYRange:function(t){return Bt(this._view,null,t)},getCenterPoint:function(){var t,e,i=this._view;return Lt(i)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return Lt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),Wt={},Vt=_t,Et=Pt,Ht=Tt,jt=Nt;Wt.Arc=Vt,Wt.Line=Et,Wt.Point=Ht,Wt.Rectangle=jt;var qt=ut.options.resolve;st._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}});var Yt=Mt.extend({dataElementType:Wt.Rectangle,initialize:function(){var t;Mt.prototype.initialize.apply(this,arguments),(t=this.getMeta()).stack=this.getDataset().stack,t.bar=!0},update:function(t){var e,i,n=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,i=n.length;e<i;++e)this.updateElement(n[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.getMeta(),o=n.getDataset(),r=n._resolveElementOptions(t,e);t._xScale=n.getScaleForId(a.xAxisID),t._yScale=n.getScaleForId(a.yAxisID),t._datasetIndex=n.index,t._index=e,t._model={backgroundColor:r.backgroundColor,borderColor:r.borderColor,borderSkipped:r.borderSkipped,borderWidth:r.borderWidth,datasetLabel:o.label,label:n.chart.data.labels[e]},n._updateElementGeometry(t,e,i),t.pivot()},_updateElementGeometry:function(t,e,i){var n=this,a=t._model,o=n._getValueScale(),r=o.getBasePixel(),s=o.isHorizontal(),l=n._ruler||n.getRuler(),d=n.calculateBarValuePixels(n.index,e),u=n.calculateBarIndexPixels(n.index,e,l);a.horizontal=s,a.base=i?r:d.base,a.x=s?i?r:d.head:u.center,a.y=s?u.center:i?r:d.head,a.height=s?u.size:void 0,a.width=s?void 0:u.size},_getStacks:function(t){var e,i,n=this.chart,a=this._getIndexScale().options.stacked,o=void 0===t?n.data.datasets.length:t+1,r=[];for(e=0;e<o;++e)(i=n.getDatasetMeta(e)).bar&&n.isDatasetVisible(e)&&(!1===a||!0===a&&-1===r.indexOf(i.stack)||void 0===a&&(void 0===i.stack||-1===r.indexOf(i.stack)))&&r.push(i.stack);return r},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var i=this._getStacks(t),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n},getRuler:function(){var t,e,i=this._getIndexScale(),n=this.getStackCount(),a=this.index,o=i.isHorizontal(),r=o?i.left:i.top,s=r+(o?i.width:i.height),l=[];for(t=0,e=this.getMeta().data.length;t<e;++t)l.push(i.getPixelForValue(null,t,a));return{min:ut.isNullOrUndef(i.options.barThickness)?function(t,e){var i,n,a,o,r=t.isHorizontal()?t.width:t.height,s=t.getTicks();for(a=1,o=e.length;a<o;++a)r=Math.min(r,Math.abs(e[a]-e[a-1]));for(a=0,o=s.length;a<o;++a)n=t.getPixelForTick(a),r=a>0?Math.min(r,n-i):r,i=n;return r}(i,l):-1,pixels:l,start:r,end:s,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,o,r,s,l=this.chart,d=this.getMeta(),u=this._getValueScale(),h=u.isHorizontal(),c=l.data.datasets,f=+u.getRightValue(c[t].data[e]),g=u.options.minBarLength,p=u.options.stacked,m=d.stack,v=0;if(p||void 0===p&&void 0!==m)for(i=0;i<t;++i)(n=l.getDatasetMeta(i)).bar&&n.stack===m&&n.controller._getValueScaleId()===u.id&&l.isDatasetVisible(i)&&(a=+u.getRightValue(c[i].data[e]),(f<0&&a<0||f>=0&&a>0)&&(v+=a));return o=u.getPixelForValue(v),s=(r=u.getPixelForValue(v+f))-o,void 0!==g&&Math.abs(s)<g&&(s=g,r=f>=0&&!h||f<0&&h?o-g:o+g),{size:s,base:o,head:r,center:r+s/2}},calculateBarIndexPixels:function(t,e,i){var n=i.scale.options,a="flex"===n.barThickness?function(t,e,i){var n,a=e.pixels,o=a[t],r=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=i.categoryPercentage;return null===r&&(r=o-(null===s?e.end-e.start:s-o)),null===s&&(s=o+o-r),n=o-(o-Math.min(r,s))/2*l,{chunk:Math.abs(s-r)/2*l/e.stackCount,ratio:i.barPercentage,start:n}}(e,i,n):function(t,e,i){var n,a,o=i.barThickness,r=e.stackCount,s=e.pixels[t];return ut.isNullOrUndef(o)?(n=e.min*i.categoryPercentage,a=i.barPercentage):(n=o*r,a=1),{chunk:n/r,ratio:a,start:s-n/2}}(e,i,n),o=this.getStackIndex(t,this.getMeta().stack),r=a.start+a.chunk*o+a.chunk/2,s=Math.min(ut.valueOrDefault(n.maxBarThickness,1/0),a.chunk*a.ratio);return{base:r-s/2,head:r+s/2,center:r,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),i=this.getMeta().data,n=this.getDataset(),a=i.length,o=0;for(ut.canvas.clipArea(t.ctx,t.chartArea);o<a;++o)isNaN(e.getRightValue(n.data[o]))||i[o].draw();ut.canvas.unclipArea(t.ctx)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.rectangle,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderSkipped","borderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=qt([s[a],r[a],l[a]],u,e);return d}}),Ut=ut.valueOrDefault,Xt=ut.options.resolve;st._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"",n=e.datasets[t.datasetIndex].data[t.index];return i+": ("+t.xLabel+", "+t.yLabel+", "+n.r+")"}}}});var Kt=Mt.extend({dataElementType:Wt.Point,update:function(t){var e=this,i=e.getMeta().data;ut.each(i,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){var n=this,a=n.getMeta(),o=t.custom||{},r=n.getScaleForId(a.xAxisID),s=n.getScaleForId(a.yAxisID),l=n._resolveElementOptions(t,e),d=n.getDataset().data[e],u=n.index,h=i?r.getPixelForDecimal(.5):r.getPixelForValue("object"==typeof d?d:NaN,e,u),c=i?s.getBasePixel():s.getPixelForValue(d,e,u);t._xScale=r,t._yScale=s,t._options=l,t._datasetIndex=u,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:i?0:l.radius,skip:o.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Ut(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Ut(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Ut(i.hoverBorderWidth,i.borderWidth),e.radius=i.radius+i.hoverRadius},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d=r.data[e],u={},h={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},c=["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"];for(i=0,n=c.length;i<n;++i)u[a=c[i]]=Xt([s[a],r[a],l[a]],h,e);return u.radius=Xt([s.radius,d?d.r:void 0,r.radius,l.radius],h,e),u}}),Gt=ut.options.resolve,Zt=ut.valueOrDefault;st._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n],s=r&&r.custom||{},l=t.options.elements.arc;return{text:i,fillStyle:Gt([s.backgroundColor,o.backgroundColor,l.backgroundColor],void 0,n),strokeStyle:Gt([s.borderColor,o.borderColor,l.borderColor],void 0,n),lineWidth:Gt([s.borderWidth,o.borderWidth,l.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i<n;++i)(a=r.getDatasetMeta(i)).data[o]&&(a.data[o].hidden=!a.data[o].hidden);r.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.labels[t.index],n=": "+e.datasets[t.datasetIndex].data[t.index];return ut.isArray(i)?(i=i.slice())[0]+=n:i+=n,i}}}});var $t=Mt.extend({dataElementType:Wt.Arc,linkScales:ut.noop,getRingIndex:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&++e;return e},update:function(t){var e,i,n=this,a=n.chart,o=a.chartArea,r=a.options,s=o.right-o.left,l=o.bottom-o.top,d=Math.min(s,l),u={x:0,y:0},h=n.getMeta(),c=h.data,f=r.cutoutPercentage,g=r.circumference,p=n._getRingWeight(n.index);if(g<2*Math.PI){var m=r.rotation%(2*Math.PI),v=(m+=2*Math.PI*(m>=Math.PI?-1:m<-Math.PI?1:0))+g,b={x:Math.cos(m),y:Math.sin(m)},x={x:Math.cos(v),y:Math.sin(v)},y=m<=0&&v>=0||m<=2*Math.PI&&2*Math.PI<=v,k=m<=.5*Math.PI&&.5*Math.PI<=v||m<=2.5*Math.PI&&2.5*Math.PI<=v,w=m<=-Math.PI&&-Math.PI<=v||m<=Math.PI&&Math.PI<=v,M=m<=.5*-Math.PI&&.5*-Math.PI<=v||m<=1.5*Math.PI&&1.5*Math.PI<=v,_=f/100,C={x:w?-1:Math.min(b.x*(b.x<0?1:_),x.x*(x.x<0?1:_)),y:M?-1:Math.min(b.y*(b.y<0?1:_),x.y*(x.y<0?1:_))},S={x:y?1:Math.max(b.x*(b.x>0?1:_),x.x*(x.x>0?1:_)),y:k?1:Math.max(b.y*(b.y>0?1:_),x.y*(x.y>0?1:_))},P={width:.5*(S.x-C.x),height:.5*(S.y-C.y)};d=Math.min(s/P.width,l/P.height),u={x:-.5*(S.x+C.x),y:-.5*(S.y+C.y)}}for(e=0,i=c.length;e<i;++e)c[e]._options=n._resolveElementOptions(c[e],e);for(a.borderWidth=n.getMaxBorderWidth(),a.outerRadius=Math.max((d-a.borderWidth)/2,0),a.innerRadius=Math.max(f?a.outerRadius/100*f:0,0),a.radiusLength=(a.outerRadius-a.innerRadius)/(n._getVisibleDatasetWeightTotal()||1),a.offsetX=u.x*a.outerRadius,a.offsetY=u.y*a.outerRadius,h.total=n.calculateTotal(),n.outerRadius=a.outerRadius-a.radiusLength*n._getRingWeightOffset(n.index),n.innerRadius=Math.max(n.outerRadius-a.radiusLength*p,0),e=0,i=c.length;e<i;++e)n.updateElement(c[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.chart,o=a.chartArea,r=a.options,s=r.animation,l=(o.left+o.right)/2,d=(o.top+o.bottom)/2,u=r.rotation,h=r.rotation,c=n.getDataset(),f=i&&s.animateRotate?0:t.hidden?0:n.calculateCircumference(c.data[e])*(r.circumference/(2*Math.PI)),g=i&&s.animateScale?0:n.innerRadius,p=i&&s.animateScale?0:n.outerRadius,m=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_model:{backgroundColor:m.backgroundColor,borderColor:m.borderColor,borderWidth:m.borderWidth,borderAlign:m.borderAlign,x:l+a.offsetX,y:d+a.offsetY,startAngle:u,endAngle:h,circumference:f,outerRadius:p,innerRadius:g,label:ut.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;i&&s.animateRotate||(v.startAngle=0===e?r.rotation:n.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),i=this.getMeta(),n=0;return ut.each(i.data,function(i,a){t=e.data[a],isNaN(t)||i.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,i,n,a,o,r,s,l,d=0,u=this.chart;if(!t)for(e=0,i=u.data.datasets.length;e<i;++e)if(u.isDatasetVisible(e)){t=(n=u.getDatasetMeta(e)).data,e!==this.index&&(o=n.controller);break}if(!t)return 0;for(e=0,i=t.length;e<i;++e)a=t[e],"inner"!==(r=o?o._resolveElementOptions(a,e):a._options).borderAlign&&(s=r.borderWidth,d=(l=r.hoverBorderWidth)>(d=s>d?s:d)?l:d);return d},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Zt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Zt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Zt(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=Gt([s[a],r[a],l[a]],u,e);return d},_getRingWeightOffset:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e},_getRingWeight:function(t){return Math.max(Zt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});st._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}});var Jt=Yt.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Qt=ut.valueOrDefault,te=ut.options.resolve,ee=ut.canvas._isPointInArea;function ie(t,e){return Qt(t.showLine,e.showLines)}st._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var ne=Mt.extend({datasetElementType:Wt.Line,dataElementType:Wt.Point,update:function(t){var e,i,n=this,a=n.getMeta(),o=a.dataset,r=a.data||[],s=n.getScaleForId(a.yAxisID),l=n.getDataset(),d=ie(l,n.chart.options);for(d&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o._scale=s,o._datasetIndex=n.index,o._children=r,o._model=n._resolveLineOptions(o),o.pivot()),e=0,i=r.length;e<i;++e)n.updateElement(r[e],e,t);for(d&&0!==o._model.tension&&n.updateBezierControlPoints(),e=0,i=r.length;e<i;++e)r[e].pivot()},updateElement:function(t,e,i){var n,a,o=this,r=o.getMeta(),s=t.custom||{},l=o.getDataset(),d=o.index,u=l.data[e],h=o.getScaleForId(r.yAxisID),c=o.getScaleForId(r.xAxisID),f=r.dataset._model,g=o._resolvePointOptions(t,e);n=c.getPixelForValue("object"==typeof u?u:NaN,e,d),a=i?h.getBasePixel():o.calculatePointY(u,e,d),t._xScale=c,t._yScale=h,t._options=g,t._datasetIndex=d,t._index=e,t._model={x:n,y:a,skip:s.skip||isNaN(n)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Qt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)d[a=c[i]]=te([s[a],r[h[a]],r[a],l[a]],u,e);return d},_resolveLineOptions:function(t){var e,i,n,a=this.chart,o=a.data.datasets[this.index],r=t.custom||{},s=a.options,l=s.elements.line,d={},u=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","cubicInterpolationMode"];for(e=0,i=u.length;e<i;++e)d[n=u[e]]=te([r[n],o[n],l[n]]);return d.spanGaps=Qt(o.spanGaps,s.spanGaps),d.tension=Qt(o.lineTension,l.tension),d.steppedLine=te([r.steppedLine,o.steppedLine,l.stepped]),d},calculatePointY:function(t,e,i){var n,a,o,r=this.chart,s=this.getMeta(),l=this.getScaleForId(s.yAxisID),d=0,u=0;if(l.options.stacked){for(n=0;n<i;n++)if(a=r.data.datasets[n],"line"===(o=r.getDatasetMeta(n)).type&&o.yAxisID===l.id&&r.isDatasetVisible(n)){var h=Number(l.getRightValue(a.data[e]));h<0?u+=h||0:d+=h||0}var c=Number(l.getRightValue(t));return c<0?l.getPixelForValue(u+c):l.getPixelForValue(d+c)}return l.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,a=this.chart,o=this.getMeta(),r=o.dataset._model,s=a.chartArea,l=o.data||[];function d(t,e,i){return Math.max(Math.min(t,i),e)}if(r.spanGaps&&(l=l.filter(function(t){return!t._model.skip})),"monotone"===r.cubicInterpolationMode)ut.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)i=l[t]._model,n=ut.splineCurve(ut.previousItem(l,t)._model,i,ut.nextItem(l,t)._model,r.tension),i.controlPointPreviousX=n.previous.x,i.controlPointPreviousY=n.previous.y,i.controlPointNextX=n.next.x,i.controlPointNextY=n.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)i=l[t]._model,ee(i,s)&&(t>0&&ee(l[t-1]._model,s)&&(i.controlPointPreviousX=d(i.controlPointPreviousX,s.left,s.right),i.controlPointPreviousY=d(i.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&ee(l[t+1]._model,s)&&(i.controlPointNextX=d(i.controlPointNextX,s.left,s.right),i.controlPointNextY=d(i.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,i=this.getMeta(),n=i.data||[],a=e.chartArea,o=n.length,r=0;for(ie(this.getDataset(),e.options)&&(t=(i.dataset._model.borderWidth||0)/2,ut.canvas.clipArea(e.ctx,{left:a.left,right:a.right,top:a.top-t,bottom:a.bottom+t}),i.dataset.draw(),ut.canvas.unclipArea(e.ctx));r<o;++r)n[r].draw(a)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Qt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Qt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Qt(i.hoverBorderWidth,i.borderWidth),e.radius=Qt(i.hoverRadius,i.radius)}}),ae=ut.options.resolve;st._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n].custom||{},s=t.options.elements.arc;return{text:i,fillStyle:ae([r.backgroundColor,o.backgroundColor,s.backgroundColor],void 0,n),strokeStyle:ae([r.borderColor,o.borderColor,s.borderColor],void 0,n),lineWidth:ae([r.borderWidth,o.borderWidth,s.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i<n;++i)(a=r.getDatasetMeta(i)).data[o].hidden=!a.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var oe=Mt.extend({dataElementType:Wt.Arc,linkScales:ut.noop,update:function(t){var e,i,n,a=this,o=a.getDataset(),r=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],d=a._angles=[],u=r.data;for(a._updateRadius(),r.count=a.countVisibleElements(),e=0,i=o.data.length;e<i;e++)l[e]=s,n=a._computeAngle(e),d[e]=n,s+=n;for(e=0,i=u.length;e<i;++e)u[e]._options=a._resolveElementOptions(u[e],e),a.updateElement(u[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,i=e.chartArea,n=e.options,a=Math.min(i.right-i.left,i.bottom-i.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(n.cutoutPercentage?e.outerRadius/100*n.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,i){var n=this,a=n.chart,o=n.getDataset(),r=a.options,s=r.animation,l=a.scale,d=a.data.labels,u=l.xCenter,h=l.yCenter,c=r.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(o.data[e]),g=n._starts[e],p=g+(t.hidden?0:n._angles[e]),m=s.animateScale?0:l.getDistanceFromCenterForValue(o.data[e]),v=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:u,y:h,innerRadius:0,outerRadius:i?m:f,startAngle:i&&s.animateRotate?c:g,endAngle:i&&s.animateRotate?c:p,label:ut.valueAtIndexOrDefault(d,e,d[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),i=0;return ut.each(e.data,function(e,n){isNaN(t.data[n])||e.hidden||i++}),i},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor,a=ut.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=a(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=a(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=ae([s[a],r[a],l[a]],u,e);return d},_computeAngle:function(t){var e=this,i=this.getMeta().count,n=e.getDataset(),a=e.getMeta();if(isNaN(n.data[t])||a.data[t].hidden)return 0;var o={chart:e.chart,dataIndex:t,dataset:n,datasetIndex:e.index};return ae([e.chart.options.elements.arc.angle,2*Math.PI/i],o,t)}});st._set("pie",ut.clone(st.doughnut)),st._set("pie",{cutoutPercentage:0});var re=$t,se=ut.valueOrDefault,le=ut.options.resolve;st._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}});var de=Mt.extend({datasetElementType:Wt.Line,dataElementType:Wt.Point,linkScales:ut.noop,update:function(t){var e,i,n=this,a=n.getMeta(),o=a.dataset,r=a.data||[],s=n.chart.scale,l=n.getDataset();for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o._scale=s,o._datasetIndex=n.index,o._children=r,o._loop=!0,o._model=n._resolveLineOptions(o),o.pivot(),e=0,i=r.length;e<i;++e)n.updateElement(r[e],e,t);for(n.updateBezierControlPoints(),e=0,i=r.length;e<i;++e)r[e].pivot()},updateElement:function(t,e,i){var n=this,a=t.custom||{},o=n.getDataset(),r=n.chart.scale,s=r.getPointPositionForValue(e,o.data[e]),l=n._resolvePointOptions(t,e),d=n.getMeta().dataset._model,u=i?r.xCenter:s.x,h=i?r.yCenter:s.y;t._scale=r,t._options=l,t._datasetIndex=n.index,t._index=e,t._model={x:u,y:h,skip:a.skip||isNaN(u)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:se(a.tension,d?d.tension:0),hitRadius:l.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)d[a=c[i]]=le([s[a],r[h[a]],r[a],l[a]],u,e);return d},_resolveLineOptions:function(t){var e,i,n,a=this.chart,o=a.data.datasets[this.index],r=t.custom||{},s=a.options.elements.line,l={},d=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"];for(e=0,i=d.length;e<i;++e)l[n=d[e]]=le([r[n],o[n],s[n]]);return l.tension=se(o.lineTension,s.tension),l},updateBezierControlPoints:function(){var t,e,i,n,a=this.getMeta(),o=this.chart.chartArea,r=a.data||[];function s(t,e,i){return Math.max(Math.min(t,i),e)}for(t=0,e=r.length;t<e;++t)i=r[t]._model,n=ut.splineCurve(ut.previousItem(r,t,!0)._model,i,ut.nextItem(r,t,!0)._model,i.tension),i.controlPointPreviousX=s(n.previous.x,o.left,o.right),i.controlPointPreviousY=s(n.previous.y,o.top,o.bottom),i.controlPointNextX=s(n.next.x,o.left,o.right),i.controlPointNextY=s(n.next.y,o.top,o.bottom)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=se(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=se(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=se(i.hoverBorderWidth,i.borderWidth),e.radius=se(i.hoverRadius,i.radius)}});st._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}});var ue={bar:Yt,bubble:Kt,doughnut:$t,horizontalBar:Jt,line:ne,polarArea:oe,pie:re,radar:de,scatter:ne};function he(t,e){return t.native?{x:t.x,y:t.y}:ut.getRelativePosition(t,e)}function ce(t,e){var i,n,a,o,r;for(n=0,o=t.data.datasets.length;n<o;++n)if(t.isDatasetVisible(n))for(a=0,r=(i=t.getDatasetMeta(n)).data.length;a<r;++a){var s=i.data[a];s._view.skip||e(s)}}function fe(t,e){var i=[];return ce(t,function(t){t.inRange(e.x,e.y)&&i.push(t)}),i}function ge(t,e,i,n){var a=Number.POSITIVE_INFINITY,o=[];return ce(t,function(t){if(!i||t.inRange(e.x,e.y)){var r=t.getCenterPoint(),s=n(e,r);s<a?(o=[t],a=s):s===a&&o.push(t)}}),o}function pe(t){var e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,n){var a=e?Math.abs(t.x-n.x):0,o=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(o,2))}}function me(t,e,i){var n=he(e,t);i.axis=i.axis||"x";var a=pe(i.axis),o=i.intersect?fe(t,n):ge(t,n,!1,a),r=[];return o.length?(t.data.datasets.forEach(function(e,i){if(t.isDatasetVisible(i)){var n=t.getDatasetMeta(i).data[o[0]._index];n&&!n._view.skip&&r.push(n)}}),r):[]}var ve={modes:{single:function(t,e){var i=he(e,t),n=[];return ce(t,function(t){if(t.inRange(i.x,i.y))return n.push(t),n}),n.slice(0,1)},label:me,index:me,dataset:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis),o=i.intersect?fe(t,n):ge(t,n,!1,a);return o.length>0&&(o=t.getDatasetMeta(o[0]._datasetIndex).data),o},"x-axis":function(t,e){return me(t,e,{intersect:!1})},point:function(t,e){return fe(t,he(e,t))},nearest:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis);return ge(t,n,i.intersect,a)},x:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inXRange(n.x)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a},y:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inYRange(n.y)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a}}};function be(t,e){return ut.where(t,function(t){return t.position===e})}function xe(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}function ye(t,e){ut.each(t,function(t){e[t.position]+=t.isHorizontal()?t.height:t.width})}st._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var ke={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=["fullWidth","position","weight"],o=a.length,r=0;r<o;++r)n=a[r],i.hasOwnProperty(n)&&(e[n]=i[n])},update:function(t,e,i){if(t){var n=t.options.layout||{},a=ut.options.toPadding(n.padding),o=a.left,r=a.right,s=a.top,l=a.bottom,d=be(t.boxes,"left"),u=be(t.boxes,"right"),h=be(t.boxes,"top"),c=be(t.boxes,"bottom"),f=be(t.boxes,"chartArea");xe(d,!0),xe(u,!1),xe(h,!0),xe(c,!1);var g,p=d.concat(u),m=h.concat(c),v=p.concat(m),b=e-o-r,x=i-s-l,y=(e-b/2)/p.length,k=b,w=x,M={top:s,left:o,bottom:l,right:r},_=[];ut.each(v,function(t){var e,i=t.isHorizontal();i?(e=t.update(t.fullWidth?b:k,x/2),w-=e.height):(e=t.update(y,w),k-=e.width),_.push({horizontal:i,width:e.width,box:t})}),g=function(t){var e=0,i=0,n=0,a=0;return ut.each(t,function(t){if(t.getPadding){var o=t.getPadding();e=Math.max(e,o.top),i=Math.max(i,o.left),n=Math.max(n,o.bottom),a=Math.max(a,o.right)}}),{top:e,left:i,bottom:n,right:a}}(v),ut.each(p,T),ye(p,M),ut.each(m,T),ye(m,M),ut.each(p,function(t){var e=ut.findNextWhere(_,function(e){return e.box===t}),i={left:0,right:0,top:M.top,bottom:M.bottom};e&&t.update(e.width,w,i)}),ye(v,M={top:s,left:o,bottom:l,right:r});var C=Math.max(g.left-M.left,0);M.left+=C,M.right+=Math.max(g.right-M.right,0);var S=Math.max(g.top-M.top,0);M.top+=S,M.bottom+=Math.max(g.bottom-M.bottom,0);var P=i-M.top-M.bottom,I=e-M.left-M.right;I===k&&P===w||(ut.each(p,function(t){t.height=P}),ut.each(m,function(t){t.fullWidth||(t.width=I)}),w=P,k=I);var A=o+C,D=s+S;ut.each(d.concat(h),F),A+=k,D+=w,ut.each(u,F),ut.each(c,F),t.chartArea={left:M.left,top:M.top,right:M.left+k,bottom:M.top+w},ut.each(f,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,w)})}function T(t){var e=ut.findNextWhere(_,function(e){return e.box===t});if(e)if(e.horizontal){var i={left:Math.max(M.left,g.left),right:Math.max(M.right,g.right),top:0,bottom:0};t.update(t.fullWidth?b:k,x/2,i)}else t.update(e.width,w)}function F(t){t.isHorizontal()?(t.left=t.fullWidth?o:M.left,t.right=t.fullWidth?e-r:M.left+k,t.top=D,t.bottom=D+t.height,D=t.bottom):(t.left=A,t.right=A+t.width,t.top=M.top,t.bottom=M.top+w,A=t.right)}}};var we,Me=(we=Object.freeze({default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&we.default||we,_e="$chartjs",Ce="chartjs-size-monitor",Se="chartjs-render-monitor",Pe="chartjs-render-animation",Ie=["animationstart","webkitAnimationStart"],Ae={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function De(t,e){var i=ut.getStyle(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?Number(n[1]):void 0}var Te=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Fe(t,e,i){t.addEventListener(e,i,Te)}function Le(t,e,i){t.removeEventListener(e,i,Te)}function Re(t,e,i,n,a){return{type:t,chart:e,native:a||null,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Oe(t){var e=document.createElement("div");return e.className=t||"",e}function ze(t,e,i){var n,a,o,r,s=t[_e]||(t[_e]={}),l=s.resizer=function(t){var e=Oe(Ce),i=Oe(Ce+"-expand"),n=Oe(Ce+"-shrink");i.appendChild(Oe()),n.appendChild(Oe()),e.appendChild(i),e.appendChild(n),e._reset=function(){i.scrollLeft=1e6,i.scrollTop=1e6,n.scrollLeft=1e6,n.scrollTop=1e6};var a=function(){e._reset(),t()};return Fe(i,"scroll",a.bind(i,"expand")),Fe(n,"scroll",a.bind(n,"shrink")),e}((n=function(){if(s.resizer){var n=i.options.maintainAspectRatio&&t.parentNode,a=n?n.clientWidth:0;e(Re("resize",i)),n&&n.clientWidth<a&&i.canvas&&e(Re("resize",i))}},o=!1,r=[],function(){r=Array.prototype.slice.call(arguments),a=a||this,o||(o=!0,ut.requestAnimFrame.call(window,function(){o=!1,n.apply(a,r)}))}));!function(t,e){var i=t[_e]||(t[_e]={}),n=i.renderProxy=function(t){t.animationName===Pe&&e()};ut.each(Ie,function(e){Fe(t,e,n)}),i.reflow=!!t.offsetParent,t.classList.add(Se)}(t,function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}})}function Be(t){var e=t[_e]||{},i=e.resizer;delete e.resizer,function(t){var e=t[_e]||{},i=e.renderProxy;i&&(ut.each(Ie,function(e){Le(t,e,i)}),delete e.renderProxy),t.classList.remove(Se)}(t),i&&i.parentNode&&i.parentNode.removeChild(i)}var Ne={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(){var t,e,i;this._loaded||(this._loaded=!0,this.disableCSSInjection||(e=Me,i=(t=this)._style||document.createElement("style"),t._style||(t._style=i,e="/* Chart.js */\n"+e,i.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(i)),i.appendChild(document.createTextNode(e))))},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return this._ensureLoaded(),i&&i.canvas===t?(function(t,e){var i=t.style,n=t.getAttribute("height"),a=t.getAttribute("width");if(t[_e]={initial:{height:n,width:a,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===a||""===a){var o=De(t,"width");void 0!==o&&(t.width=o)}if(null===n||""===n)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var r=De(t,"height");void 0!==o&&(t.height=r)}}(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e[_e]){var i=e[_e].initial;["height","width"].forEach(function(t){var n=i[t];ut.isNullOrUndef(n)?e.removeAttribute(t):e.setAttribute(t,n)}),ut.each(i.style||{},function(t,i){e.style[i]=t}),e.width=e.width,delete e[_e]}},addEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=i[_e]||(i[_e]={});Fe(n,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){i(function(t,e){var i=Ae[t.type]||t.type,n=ut.getRelativePosition(t,e);return Re(i,e,n.x,n.y,t)}(e,t))})}else ze(n,i,t)},removeEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=((i[_e]||{}).proxies||{})[t.id+"_"+e];a&&Le(n,e,a)}else Be(n)}};ut.addEvent=Fe,ut.removeEvent=Le;var We=Ne._enabled?Ne:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Ve=ut.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},We);st._set("global",{plugins:{}});var Ee={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var i=e.indexOf(t);-1!==i&&e.splice(i,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,i){var n,a,o,r,s,l=this.descriptors(t),d=l.length;for(n=0;n<d;++n)if("function"==typeof(s=(o=(a=l[n]).plugin)[e])&&((r=[t].concat(i||[])).push(a.options),!1===s.apply(o,r)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var i=[],n=[],a=t&&t.config||{},o=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach(function(t){if(-1===i.indexOf(t)){var e=t.id,a=o[e];!1!==a&&(!0===a&&(a=ut.clone(st.global.plugins[e])),i.push(t),n.push({plugin:t,options:a||{}}))}}),e.descriptors=n,e.id=this._cacheId,n},_invalidate:function(t){delete t.$plugins}},He={constructors:{},defaults:{},registerScaleType:function(t,e,i){this.constructors[t]=e,this.defaults[t]=ut.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?ut.merge({},[st.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=ut.extend(this.defaults[t],e))},addScalesToLayout:function(t){ut.each(t.scales,function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,ke.addBox(t,e)})}},je=ut.valueOrDefault;st._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:ut.noop,title:function(t,e){var i="",n=e.labels,a=n?n.length:0;if(t.length>0){var o=t[0];o.label?i=o.label:o.xLabel?i=o.xLabel:a>0&&o.index<a&&(i=n[o.index])}return i},afterTitle:ut.noop,beforeBody:ut.noop,beforeLabel:ut.noop,label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i&&(i+=": "),ut.isNullOrUndef(t.value)?i+=t.yLabel:i+=t.value,i},labelColor:function(t,e){var i=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:i.borderColor,backgroundColor:i.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:ut.noop,afterBody:ut.noop,beforeFooter:ut.noop,footer:ut.noop,afterFooter:ut.noop}}});var qe={average:function(t){if(!t.length)return!1;var e,i,n=0,a=0,o=0;for(e=0,i=t.length;e<i;++e){var r=t[e];if(r&&r.hasValue()){var s=r.tooltipPosition();n+=s.x,a+=s.y,++o}}return{x:n/o,y:a/o}},nearest:function(t,e){var i,n,a,o=e.x,r=e.y,s=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){var l=t[i];if(l&&l.hasValue()){var d=l.getCenterPoint(),u=ut.distanceBetweenPoints(e,d);u<s&&(s=u,a=l)}}if(a){var h=a.tooltipPosition();o=h.x,r=h.y}return{x:o,y:r}}};function Ye(t,e){return e&&(ut.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Ue(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Xe(t){var e=st.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:je(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:je(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:je(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:je(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:je(t.titleFontStyle,e.defaultFontStyle),titleFontSize:je(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:je(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:je(t.footerFontStyle,e.defaultFontStyle),footerFontSize:je(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ke(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function Ge(t){return Ye([],Ue(t))}var Ze=pt.extend({initialize:function(){this._model=Xe(this._options),this._lastActive=[]},getTitle:function(){var t=this._options.callbacks,e=t.beforeTitle.apply(this,arguments),i=t.title.apply(this,arguments),n=t.afterTitle.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},getBeforeBody:function(){return Ge(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var i=this,n=i._options.callbacks,a=[];return ut.each(t,function(t){var o={before:[],lines:[],after:[]};Ye(o.before,Ue(n.beforeLabel.call(i,t,e))),Ye(o.lines,n.label.call(i,t,e)),Ye(o.after,Ue(n.afterLabel.call(i,t,e))),a.push(o)}),a},getAfterBody:function(){return Ge(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this._options.callbacks,e=t.beforeFooter.apply(this,arguments),i=t.footer.apply(this,arguments),n=t.afterFooter.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},update:function(t){var e,i,n,a,o,r,s,l,d,u,h=this,c=h._options,f=h._model,g=h._model=Xe(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var k=[],w=[];y=qe[c.position].call(h,p,h._eventPosition);var M=[];for(e=0,i=p.length;e<i;++e)M.push((n=p[e],a=void 0,o=void 0,r=void 0,s=void 0,l=void 0,d=void 0,u=void 0,a=n._xScale,o=n._yScale||n._scale,r=n._index,s=n._datasetIndex,l=n._chart.getDatasetMeta(s).controller,d=l._getIndexScale(),u=l._getValueScale(),{xLabel:a?a.getLabelForIndex(r,s):"",yLabel:o?o.getLabelForIndex(r,s):"",label:d?""+d.getLabelForIndex(r,s):"",value:u?""+u.getLabelForIndex(r,s):"",index:r,datasetIndex:s,x:n._model.x,y:n._model.y}));c.filter&&(M=M.filter(function(t){return c.filter(t,m)})),c.itemSort&&(M=M.sort(function(t,e){return c.itemSort(t,e,m)})),ut.each(M,function(t){k.push(c.callbacks.labelColor.call(h,t,h._chart)),w.push(c.callbacks.labelTextColor.call(h,t,h._chart))}),g.title=h.getTitle(M,m),g.beforeBody=h.getBeforeBody(M,m),g.body=h.getBody(M,m),g.afterBody=h.getAfterBody(M,m),g.footer=h.getFooter(M,m),g.x=y.x,g.y=y.y,g.caretPadding=c.caretPadding,g.labelColors=k,g.labelTextColors=w,g.dataPoints=M,x=function(t,e){var i=t._chart.ctx,n=2*e.yPadding,a=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,d=e.titleFontSize,u=e.bodyFontSize,h=e.footerFontSize;n+=s*d,n+=s?(s-1)*e.titleSpacing:0,n+=s?e.titleMarginBottom:0,n+=r*u,n+=r?(r-1)*e.bodySpacing:0,n+=l?e.footerMarginTop:0,n+=l*h,n+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,i.measureText(t).width+c)};return i.font=ut.fontString(d,e._titleFontStyle,e._titleFontFamily),ut.each(e.title,f),i.font=ut.fontString(u,e._bodyFontStyle,e._bodyFontFamily),ut.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?u+2:0,ut.each(o,function(t){ut.each(t.before,f),ut.each(t.lines,f),ut.each(t.after,f)}),c=0,i.font=ut.fontString(h,e._footerFontStyle,e._footerFontFamily),ut.each(e.footer,f),{width:a+=2*e.xPadding,height:n}}(this,g),b=function(t,e,i,n){var a=t.x,o=t.y,r=t.caretSize,s=t.caretPadding,l=t.cornerRadius,d=i.xAlign,u=i.yAlign,h=r+s,c=l+s;return"right"===d?a-=e.width:"center"===d&&((a-=e.width/2)+e.width>n.width&&(a=n.width-e.width),a<0&&(a=0)),"top"===u?o+=h:o-="bottom"===u?e.height+h:e.height/2,"center"===u?"left"===d?a+=h:"right"===d&&(a-=h):"left"===d?a-=c:"right"===d&&(a+=c),{x:a,y:o}}(g,x,v=function(t,e){var i,n,a,o,r,s=t._model,l=t._chart,d=t._chart.chartArea,u="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(d.left+d.right)/2,f=(d.top+d.bottom)/2;"center"===h?(i=function(t){return t<=c},n=function(t){return t>c}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},o=function(t){return t-e.width-s.caretSize-s.caretPadding<0},r=function(t){return t<=f?"top":"bottom"},i(s.x)?(u="left",a(s.x)&&(u="center",h=r(s.y))):n(s.x)&&(u="right",o(s.x)&&(u="center",h=r(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:u,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,o,r,s,l,d=i.caretSize,u=i.cornerRadius,h=i.xAlign,c=i.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(n=f)-d,o=n,r=s+d,l=s-d):(a=(n=f+p)+d,o=n,r=s-d,l=s+d);else if("left"===h?(n=(a=f+u+d)-d,o=a+d):"right"===h?(n=(a=f+p-u-d)-d,o=a+d):(n=(a=i.caretX)-d,o=a+d),"top"===c)s=(r=g)-d,l=r;else{s=(r=g+m)+d,l=r;var v=o;o=n,n=v}return{x1:n,x2:a,x3:o,y1:r,y2:s,y3:l}},drawTitle:function(t,e,i){var n=e.title;if(n.length){t.x=Ke(e,e._titleAlign),i.textAlign=e._titleAlign,i.textBaseline="top";var a,o,r=e.titleFontSize,s=e.titleSpacing;for(i.fillStyle=e.titleFontColor,i.font=ut.fontString(r,e._titleFontStyle,e._titleFontFamily),a=0,o=n.length;a<o;++a)i.fillText(n[a],t.x,t.y),t.y+=r+s,a+1===n.length&&(t.y+=e.titleMarginBottom-s)}},drawBody:function(t,e,i){var n,a=e.bodyFontSize,o=e.bodySpacing,r=e._bodyAlign,s=e.body,l=e.displayColors,d=e.labelColors,u=0,h=l?Ke(e,"left"):0;i.textAlign=r,i.textBaseline="top",i.font=ut.fontString(a,e._bodyFontStyle,e._bodyFontFamily),t.x=Ke(e,r);var c=function(e){i.fillText(e,t.x+u,t.y),t.y+=a+o};i.fillStyle=e.bodyFontColor,ut.each(e.beforeBody,c),u=l&&"right"!==r?"center"===r?a/2+1:a+2:0,ut.each(s,function(o,r){n=e.labelTextColors[r],i.fillStyle=n,ut.each(o.before,c),ut.each(o.lines,function(o){l&&(i.fillStyle=e.legendColorBackground,i.fillRect(h,t.y,a,a),i.lineWidth=1,i.strokeStyle=d[r].borderColor,i.strokeRect(h,t.y,a,a),i.fillStyle=d[r].backgroundColor,i.fillRect(h+1,t.y+1,a-2,a-2),i.fillStyle=n),c(o)}),ut.each(o.after,c)}),u=0,ut.each(e.afterBody,c),t.y-=o},drawFooter:function(t,e,i){var n=e.footer;n.length&&(t.x=Ke(e,e._footerAlign),t.y+=e.footerMarginTop,i.textAlign=e._footerAlign,i.textBaseline="top",i.fillStyle=e.footerFontColor,i.font=ut.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),ut.each(n,function(n){i.fillText(n,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing}))},drawBackground:function(t,e,i,n){i.fillStyle=e.backgroundColor,i.strokeStyle=e.borderColor,i.lineWidth=e.borderWidth;var a=e.xAlign,o=e.yAlign,r=t.x,s=t.y,l=n.width,d=n.height,u=e.cornerRadius;i.beginPath(),i.moveTo(r+u,s),"top"===o&&this.drawCaret(t,n),i.lineTo(r+l-u,s),i.quadraticCurveTo(r+l,s,r+l,s+u),"center"===o&&"right"===a&&this.drawCaret(t,n),i.lineTo(r+l,s+d-u),i.quadraticCurveTo(r+l,s+d,r+l-u,s+d),"bottom"===o&&this.drawCaret(t,n),i.lineTo(r+u,s+d),i.quadraticCurveTo(r,s+d,r,s+d-u),"center"===o&&"left"===a&&this.drawCaret(t,n),i.lineTo(r,s+u),i.quadraticCurveTo(r,s,r+u,s),i.closePath(),i.fill(),e.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(t.save(),t.globalAlpha=a,this.drawBackground(n,e,t,i),n.y+=e.yPadding,this.drawTitle(n,e,t),this.drawBody(n,e,t),this.drawFooter(n,e,t),t.restore())}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],"mouseout"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!ut.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),$e=qe,Je=Ze;Je.positioners=$e;var Qe=ut.valueOrDefault;function ti(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){if("xAxes"===t||"yAxes"===t){var a,o,r,s=i[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)r=i[t][a],o=Qe(r.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||r.type&&r.type!==e[t][a].type?ut.merge(e[t][a],[He.getScaleDefaults(o),r]):ut.merge(e[t][a],r)}else ut._merger(t,e,i,n)}})}function ei(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){var a=e[t]||{},o=i[t];"scales"===t?e[t]=ti(a,o):"scale"===t?e[t]=ut.merge(a,[He.getScaleDefaults(o.type),o]):ut._merger(t,e,i,n)}})}function ii(t){return"top"===t||"bottom"===t}st._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var ni=function(t,e){return this.construct(t,e),this};ut.extend(ni.prototype,{construct:function(t,e){var i=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=ei(st.global,st[t.type],t.options||{}),t}(e);var n=Ve.acquireContext(t,e),a=n&&n.canvas,o=a&&a.height,r=a&&a.width;i.id=ut.uid(),i.ctx=n,i.canvas=a,i.config=e,i.width=r,i.height=o,i.aspectRatio=o?r/o:null,i.options=e.options,i._bufferedRender=!1,i.chart=i,i.controller=i,ni.instances[i.id]=i,Object.defineProperty(i,"data",{get:function(){return i.config.data},set:function(t){i.config.data=t}}),n&&a?(i.initialize(),i.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Ee.notify(t,"beforeInit"),ut.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),Ee.notify(t,"afterInit"),t},clear:function(){return ut.canvas.clear(this),this},stop:function(){return bt.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,a=i.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(ut.getMaximumWidth(n))),r=Math.max(0,Math.floor(a?o/a:ut.getMaximumHeight(n)));if((e.width!==o||e.height!==r)&&(n.width=e.width=o,n.height=e.height=r,n.style.width=o+"px",n.style.height=r+"px",ut.retinaScale(e,i.devicePixelRatio),!t)){var s={width:o,height:r};Ee.notify(e,"resize",[s]),i.onResize&&i.onResize(e,s),e.stop(),e.update({duration:i.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;ut.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),ut.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,i=t.scales||{},n=[],a=Object.keys(i).reduce(function(t,e){return t[e]=!1,t},{});e.scales&&(n=n.concat((e.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(e.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),e.scale&&n.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),ut.each(n,function(e){var n=e.options,o=n.id,r=Qe(n.type,e.dtype);ii(n.position)!==ii(e.dposition)&&(n.position=e.dposition),a[o]=!0;var s=null;if(o in i&&i[o].type===r)(s=i[o]).options=n,s.ctx=t.ctx,s.chart=t;else{var l=He.getScaleConstructor(r);if(!l)return;s=new l({id:o,type:r,options:n,ctx:t.ctx,chart:t}),i[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)}),ut.each(a,function(t,e){t||delete i[e]}),t.scales=i,He.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t=this,e=[];return ut.each(t.data.datasets,function(i,n){var a=t.getDatasetMeta(n),o=i.type||t.config.type;if(a.type&&a.type!==o&&(t.destroyDatasetMeta(n),a=t.getDatasetMeta(n)),a.type=o,a.controller)a.controller.updateIndex(n),a.controller.linkScales();else{var r=ue[a.type];if(void 0===r)throw new Error('"'+a.type+'" is not a chart type.');a.controller=new r(t,n),e.push(a.controller)}},t),e},resetElements:function(){var t=this;ut.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,i,n=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),i=(e=n).options,ut.each(e.scales,function(t){ke.removeBox(e,t)}),i=ei(st.global,st[e.config.type],i),e.options=e.config.options=i,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=i.tooltips,e.tooltip.initialize(),Ee._invalidate(n),!1!==Ee.notify(n,"beforeUpdate")){n.tooltip._data=n.data;var a=n.buildOrUpdateControllers();ut.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.buildOrUpdateElements()},n),n.updateLayout(),n.options.animation&&n.options.animation.duration&&ut.each(a,function(t){t.reset()}),n.updateDatasets(),n.tooltip.initialize(),n.lastActive=[],Ee.notify(n,"afterUpdate"),n._bufferedRender?n._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:n.render(t)}},updateLayout:function(){!1!==Ee.notify(this,"beforeLayout")&&(ke.update(this,this.width,this.height),Ee.notify(this,"afterScaleUpdate"),Ee.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==Ee.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);Ee.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),i={meta:e,index:t};!1!==Ee.notify(this,"beforeDatasetUpdate",[i])&&(e.controller.update(),Ee.notify(this,"afterDatasetUpdate",[i]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var i=e.options.animation,n=Qe(t.duration,i&&i.duration),a=t.lazy;if(!1!==Ee.notify(e,"beforeRender")){var o=function(t){Ee.notify(e,"afterRender"),ut.callback(i&&i.onComplete,[t],e)};if(i&&n){var r=new vt({numSteps:n/16.66,easing:t.easing||i.easing,render:function(t,e){var i=ut.easing.effects[e.easing],n=e.currentStep,a=n/e.numSteps;t.draw(i(a),a,n)},onAnimationProgress:i.onProgress,onAnimationComplete:o});bt.addAnimation(e,r,n,a)}else e.draw(),o(new vt({numSteps:0,chart:e}));return e}},draw:function(t){var e=this;e.clear(),ut.isNullOrUndef(t)&&(t=1),e.transition(t),e.width<=0||e.height<=0||!1!==Ee.notify(e,"beforeDraw",[t])&&(ut.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.drawDatasets(t),e._drawTooltip(t),Ee.notify(e,"afterDraw",[t]))},transition:function(t){for(var e=0,i=(this.data.datasets||[]).length;e<i;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==Ee.notify(e,"beforeDatasetsDraw",[t])){for(var i=(e.data.datasets||[]).length-1;i>=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);Ee.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==Ee.notify(this,"beforeDatasetDraw",[n])&&(i.controller.draw(e),Ee.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==Ee.notify(this,"beforeTooltipDraw",[i])&&(e.draw(),Ee.notify(this,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return ve.modes.single(this,t)},getElementsAtEvent:function(t){return ve.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ve.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=ve.modes[e];return"function"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return ve.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e<i;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,i=this.data.datasets[t],n=i._meta&&i._meta[e];n&&(n.controller.destroy(),delete i._meta[e])},destroy:function(){var t,e,i=this,n=i.canvas;for(i.stop(),t=0,e=i.data.datasets.length;t<e;++t)i.destroyDatasetMeta(t);n&&(i.unbindEvents(),ut.canvas.clear(i),Ve.releaseContext(i.ctx),i.canvas=null,i.ctx=null),Ee.notify(i,"destroy"),delete ni.instances[i.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new Je({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},i=function(){t.eventHandler.apply(t,arguments)};ut.each(t.options.events,function(n){Ve.addEventListener(t,n,i),e[n]=i}),t.options.responsive&&(i=function(){t.resize()},Ve.addEventListener(t,"resize",i),e.resize=i)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,ut.each(e,function(e,i){Ve.removeEventListener(t,i,e)}))},updateHoverStyle:function(t,e,i){var n,a,o,r=i?"setHoverStyle":"removeHoverStyle";for(a=0,o=t.length;a<o;++a)(n=t[a])&&this.getDatasetMeta(n._datasetIndex).controller[r](n)},eventHandler:function(t){var e=this,i=e.tooltip;if(!1!==Ee.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var n=e.handleEvent(t);i&&(n=i._start?i.handleEvent(t):n|i.handleEvent(t)),Ee.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):n&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,i=this,n=i.options||{},a=n.hover;return i.lastActive=i.lastActive||[],"mouseout"===t.type?i.active=[]:i.active=i.getElementsAtEventForMode(t,a.mode,a),ut.callback(n.onHover||n.hover.onHover,[t.native,i.active],i),"mouseup"!==t.type&&"click"!==t.type||n.onClick&&n.onClick.call(i,t.native,i.active),i.lastActive.length&&i.updateHoverStyle(i.lastActive,a.mode,!1),i.active.length&&a.mode&&i.updateHoverStyle(i.active,a.mode,!0),e=!ut.arrayEquals(i.active,i.lastActive),i.lastActive=i.active,e}}),ni.instances={};var ai=ni;ni.Controller=ni,ni.types={},ut.configMerge=ei,ut.scaleMerge=ti;function oi(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function ri(t){this.options=t||{}}ut.extend(ri.prototype,{formats:oi,parse:oi,format:oi,add:oi,diff:oi,startOf:oi,endOf:oi,_create:function(t){return t}}),ri.override=function(t){ut.extend(ri.prototype,t)};var si={_date:ri},li={formatters:{values:function(t){return ut.isArray(t)?t:""+t},linear:function(t,e,i){var n=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var a=ut.log10(Math.abs(n)),o="";if(0!==t)if(Math.max(Math.abs(i[0]),Math.abs(i[i.length-1]))<1e-4){var r=ut.log10(Math.abs(t));o=t.toExponential(Math.floor(r)-Math.floor(a))}else{var s=-1*Math.floor(a);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o},logarithmic:function(t,e,i){var n=t/Math.pow(10,Math.floor(ut.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===e||e===i.length-1?t.toExponential():""}}},di=ut.valueOrDefault,ui=ut.valueAtIndexOrDefault;function hi(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(t[e].label);return n}function ci(t,e,i){return ut.isArray(e)?ut.longestText(t,i,e):t.measureText(e).width}st._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:li.formatters.values,minor:{},major:{}}});var fi=pt.extend({getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;for(var e in!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1}),t)"major"!==e&&"minor"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){ut.callback(this.options.beforeUpdate,[this])},update:function(t,e,i){var n,a,o,r,s,l,d=this;for(d.beforeUpdate(),d.maxWidth=t,d.maxHeight=e,d.margins=ut.extend({left:0,right:0,top:0,bottom:0},i),d._maxLabelLines=0,d.longestLabelWidth=0,d.longestTextCache=d.longestTextCache||{},d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeDataLimits(),d.determineDataLimits(),d.afterDataLimits(),d.beforeBuildTicks(),s=d.buildTicks()||[],s=d.afterBuildTicks(s)||s,d.beforeTickToLabelConversion(),o=d.convertTicksToLabels(s)||d.ticks,d.afterTickToLabelConversion(),d.ticks=o,n=0,a=o.length;n<a;++n)r=o[n],(l=s[n])?l.label=r:s.push(l={label:r,major:!1});return d._ticks=s,d.beforeCalculateTickRotation(),d.calculateTickRotation(),d.afterCalculateTickRotation(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:function(){ut.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){ut.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){ut.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){ut.callback(this.options.beforeDataLimits,[this])},determineDataLimits:ut.noop,afterDataLimits:function(){ut.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){ut.callback(this.options.beforeBuildTicks,[this])},buildTicks:ut.noop,afterBuildTicks:function(t){var e=this;return ut.isArray(t)&&t.length?ut.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=ut.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){ut.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){ut.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){ut.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,i=t.options.ticks,n=hi(t._ticks),a=ut.options._parseFont(i);e.font=a.string;var o=i.minRotation||0;if(n.length&&t.options.display&&t.isHorizontal())for(var r,s=ut.longestText(e,a.string,n,t.longestTextCache),l=s,d=t.getPixelForTick(1)-t.getPixelForTick(0)-6;l>d&&o<i.maxRotation;){var u=ut.toRadians(o);if(r=Math.cos(u),Math.sin(u)*s>t.maxHeight){o--;break}o++,l=r*s}t.labelRotation=o},afterCalculateTickRotation:function(){ut.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){ut.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},i=hi(t._ticks),n=t.options,a=n.ticks,o=n.scaleLabel,r=n.gridLines,s=t._isVisible(),l=n.position,d=t.isHorizontal(),u=ut.options._parseFont,h=u(a),c=n.gridLines.tickMarkLength;if(e.width=d?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:s&&r.drawTicks?c:0,e.height=d?s&&r.drawTicks?c:0:t.maxHeight,o.display&&s){var f=u(o),g=ut.options.toPadding(o.padding),p=f.lineHeight+g.height;d?e.height+=p:e.width+=p}if(a.display&&s){var m=ut.longestText(t.ctx,h.string,i,t.longestTextCache),v=ut.numberOfLabelLines(i),b=.5*h.size,x=t.options.ticks.padding;if(t._maxLabelLines=v,t.longestLabelWidth=m,d){var y=ut.toRadians(t.labelRotation),k=Math.cos(y),w=Math.sin(y)*m+h.lineHeight*v+b;e.height=Math.min(t.maxHeight,e.height+w+x),t.ctx.font=h.string;var M,_,C=ci(t.ctx,i[0],h.string),S=ci(t.ctx,i[i.length-1],h.string),P=t.getPixelForTick(0)-t.left,I=t.right-t.getPixelForTick(i.length-1);0!==t.labelRotation?(M="bottom"===l?k*C:k*b,_="bottom"===l?k*b:k*S):(M=C/2,_=S/2),t.paddingLeft=Math.max(M-P,0)+3,t.paddingRight=Math.max(_-I,0)+3}else a.mirror?m=0:m+=x+b,e.width=Math.min(t.maxWidth,e.width+m),t.paddingTop=h.size/2,t.paddingBottom=h.size/2}t.handleMargins(),t.width=e.width,t.height=e.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){ut.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(ut.isNullOrUndef(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:ut.noop,getPixelForValue:ut.noop,getValueForPixel:ut.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var o=e.left+a;return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+i;return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n=this,a=n.isHorizontal(),o=n.options.ticks.minor,r=t.length,s=!1,l=o.maxTicksLimit,d=n._tickSize()*(r-1),u=a?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.PaddingBottom),h=[];for(d>u&&(s=1+Math.floor(d/u)),r>l&&(s=Math.max(s,1+Math.floor(r/l))),e=0;e<r;e++)i=t[e],s>1&&e%s>0&&delete i.label,h.push(i);return h},_tickSize:function(){var t=this,e=t.isHorizontal(),i=t.options.ticks.minor,n=ut.toRadians(t.labelRotation),a=Math.abs(Math.cos(n)),o=Math.abs(Math.sin(n)),r=i.autoSkipPadding||0,s=t.longestLabelWidth+r||0,l=ut.options._parseFont(i),d=t._maxLabelLines*l.lineHeight+r||0;return e?d*a>s*o?s/a:d/o:d*o<s*a?d/a:s/o},_isVisible:function(){var t,e,i,n=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=n.data.datasets.length;t<e;++t)if(n.isDatasetVisible(t)&&((i=n.getDatasetMeta(t)).xAxisID===this.id||i.yAxisID===this.id))return!0;return!1},draw:function(t){var e=this,i=e.options;if(e._isVisible()){var n,a,o,r=e.chart,s=e.ctx,l=st.global.defaultFontColor,d=i.ticks.minor,u=i.ticks.major||d,h=i.gridLines,c=i.scaleLabel,f=i.position,g=0!==e.labelRotation,p=d.mirror,m=e.isHorizontal(),v=ut.options._parseFont,b=d.display&&d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),x=di(d.fontColor,l),y=v(d),k=y.lineHeight,w=di(u.fontColor,l),M=v(u),_=d.padding,C=d.labelOffset,S=h.drawTicks?h.tickMarkLength:0,P=di(c.fontColor,l),I=v(c),A=ut.options.toPadding(c.padding),D=ut.toRadians(e.labelRotation),T=[],F=h.drawBorder?ui(h.lineWidth,0,0):0,L=ut._alignPixel;"top"===f?(n=L(r,e.bottom,F),a=e.bottom-S,o=n-F/2):"bottom"===f?(n=L(r,e.top,F),a=n+F/2,o=e.top+S):"left"===f?(n=L(r,e.right,F),a=e.right-S,o=n-F/2):(n=L(r,e.left,F),a=n+F/2,o=e.left+S);if(ut.each(b,function(n,s){if(!ut.isNullOrUndef(n.label)){var l,d,u,c,v,b,x,y,w,M,P,I,A,R,O,z,B=n.label;s===e.zeroLineIndex&&i.offset===h.offsetGridLines?(l=h.zeroLineWidth,d=h.zeroLineColor,u=h.zeroLineBorderDash||[],c=h.zeroLineBorderDashOffset||0):(l=ui(h.lineWidth,s),d=ui(h.color,s),u=h.borderDash||[],c=h.borderDashOffset||0);var N=ut.isArray(B)?B.length:1,W=function(t,e,i){var n=t.getPixelForTick(e);return i&&(1===t.getTicks().length?n-=t.isHorizontal()?Math.max(n-t.left,t.right-n):Math.max(n-t.top,t.bottom-n):n-=0===e?(t.getPixelForTick(1)-n)/2:(n-t.getPixelForTick(e-1))/2),n}(e,s,h.offsetGridLines);if(m){var V=S+_;W<e.left-1e-7&&(d="rgba(0,0,0,0)"),v=x=w=P=L(r,W,l),b=a,y=o,A=e.getPixelForTick(s)+C,"top"===f?(M=L(r,t.top,F)+F/2,I=t.bottom,O=((g?1:.5)-N)*k,z=g?"left":"center",R=e.bottom-V):(M=t.top,I=L(r,t.bottom,F)-F/2,O=(g?0:.5)*k,z=g?"right":"center",R=e.top+V)}else{var E=(p?0:S)+_;W<e.top-1e-7&&(d="rgba(0,0,0,0)"),v=a,x=o,b=y=M=I=L(r,W,l),R=e.getPixelForTick(s)+C,O=(1-N)*k/2,"left"===f?(w=L(r,t.left,F)+F/2,P=t.right,z=p?"left":"right",A=e.right-E):(w=t.left,P=L(r,t.right,F)-F/2,z=p?"right":"left",A=e.left+E)}T.push({tx1:v,ty1:b,tx2:x,ty2:y,x1:w,y1:M,x2:P,y2:I,labelX:A,labelY:R,glWidth:l,glColor:d,glBorderDash:u,glBorderDashOffset:c,rotation:-1*D,label:B,major:n.major,textOffset:O,textAlign:z})}}),ut.each(T,function(t){var e=t.glWidth,i=t.glColor;if(h.display&&e&&i&&(s.save(),s.lineWidth=e,s.strokeStyle=i,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),h.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),h.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=t.major?M.string:y.string,s.fillStyle=t.major?w:x,s.textBaseline="middle",s.textAlign=t.textAlign;var n=t.label,a=t.textOffset;if(ut.isArray(n))for(var o=0;o<n.length;++o)s.fillText(""+n[o],0,a),a+=k;else s.fillText(n,0,a);s.restore()}}),c.display){var R,O,z=0,B=I.lineHeight/2;if(m)R=e.left+(e.right-e.left)/2,O="bottom"===f?e.bottom-B-A.bottom:e.top+B+A.top;else{var N="left"===f;R=N?e.left+B+A.top:e.right-B-A.top,O=e.top+(e.bottom-e.top)/2,z=N?-.5*Math.PI:.5*Math.PI}s.save(),s.translate(R,O),s.rotate(z),s.textAlign="center",s.textBaseline="middle",s.fillStyle=P,s.font=I.string,s.fillText(c.labelString,0,0),s.restore()}if(F){var W,V,E,H,j=F,q=ui(h.lineWidth,b.length-1,0);m?(W=L(r,e.left,j)-j/2,V=L(r,e.right,q)+q/2,E=H=n):(E=L(r,e.top,j)-j/2,H=L(r,e.bottom,q)+q/2,W=V=n),s.lineWidth=F,s.strokeStyle=ui(h.color,0),s.beginPath(),s.moveTo(W,E),s.lineTo(V,H),s.stroke()}}}}),gi=fi.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t,e=this,i=e.getLabels();e.minIndex=0,e.maxIndex=i.length-1,void 0!==e.options.ticks.min&&(t=i.indexOf(e.options.ticks.min),e.minIndex=-1!==t?t:e.minIndex),void 0!==e.options.ticks.max&&(t=i.indexOf(e.options.ticks.max),e.maxIndex=-1!==t?t:e.maxIndex),e.min=i[e.minIndex],e.max=i[e.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var i=this,n=i.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===i.id?i.getRightValue(n.data.datasets[e].data[t]):i.ticks[t-i.minIndex]},getPixelForValue:function(t,e){var i,n=this,a=n.options.offset,o=Math.max(n.maxIndex+1-n.minIndex-(a?0:1),1);if(null!=t&&(i=n.isHorizontal()?t.x:t.y),void 0!==i||void 0!==t&&isNaN(e)){t=i||t;var r=n.getLabels().indexOf(t);e=-1!==r?r:e}if(n.isHorizontal()){var s=n.width/o,l=s*(e-n.minIndex);return a&&(l+=s/2),n.left+l}var d=n.height/o,u=d*(e-n.minIndex);return a&&(u+=d/2),n.top+u},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,i=e.options.offset,n=Math.max(e._ticks.length-(i?0:1),1),a=e.isHorizontal(),o=(a?e.width:e.height)/n;return t-=a?e.left:e.top,i&&(t-=o/2),(t<=0?0:Math.round(t/o))+e.minIndex},getBasePixel:function(){return this.bottom}}),pi={position:"bottom"};gi._defaults=pi;var mi=ut.noop,vi=ut.isNullOrUndef;var bi=fi.extend({getRightValue:function(t){return"string"==typeof t?+t:fi.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var i=ut.sign(t.min),n=ut.sign(t.max);i<0&&n<0?t.max=0:i>0&&n>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==o&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,i=e.stepSize,n=e.maxTicksLimit;return i?t=Math.ceil(this.max/i)-Math.floor(this.min/i)+1:(t=this._computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:mi,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),n={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,precision:e.precision,stepSize:ut.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var i,n,a,o,r=[],s=t.stepSize,l=s||1,d=t.maxTicks-1,u=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=ut.niceNum((g-f)/d/l)*l;if(p<1e-14&&vi(u)&&vi(h))return[f,g];(o=Math.ceil(g/p)-Math.floor(f/p))>d&&(p=ut.niceNum(o*p/d/l)*l),s||vi(c)?i=Math.pow(10,ut._decimalPlaces(p)):(i=Math.pow(10,c),p=Math.ceil(p*i)/i),n=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!vi(u)&&ut.almostWhole(u/p,p/1e3)&&(n=u),!vi(h)&&ut.almostWhole(h/p,p/1e3)&&(a=h)),o=(a-n)/p,o=ut.almostEquals(o,Math.round(o),p/1e3)?Math.round(o):Math.ceil(o),n=Math.round(n*i)/i,a=Math.round(a*i)/i,r.push(vi(u)?n:u);for(var m=1;m<o;++m)r.push(Math.round((n+m*p)*i)/i);return r.push(vi(h)?a:h),r}(n,t);t.handleDirectionalChanges(),t.max=ut.max(a),t.min=ut.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),fi.prototype.convertTicksToLabels.call(t)}}),xi={position:"left",ticks:{callback:li.formatters.linear}},yi=bi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");void 0===s[l]&&(s[l]={positiveValues:[],negativeValues:[]});var d=s[l].positiveValues,u=s[l].negativeValues;i.isDatasetVisible(a)&&o(r)&&ut.each(n.data,function(i,n){var a=+t.getRightValue(i);isNaN(a)||r.data[n].hidden||(d[n]=d[n]||0,u[n]=u[n]||0,e.relativePoints?d[n]=100:a<0?u[n]+=a:d[n]+=a)})}),ut.each(s,function(e){var i=e.positiveValues.concat(e.negativeValues),n=ut.min(i),a=ut.max(i);t.min=null===t.min?n:Math.min(t.min,n),t.max=null===t.max?a:Math.max(t.max,a)})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=ut.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this,i=e.start,n=+e.getRightValue(t),a=e.end-i;return e.isHorizontal()?e.left+e.width/a*(n-i):e.bottom-e.height/a*(n-i)},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=i?e.width:e.height,a=(i?t-e.left:e.bottom-t)/n;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}}),ki=xi;yi._defaults=ki;var wi=ut.valueOrDefault;var Mi={position:"left",ticks:{callback:li.formatters.logarithmic}};function _i(t,e){return ut.isFinite(t)&&t>=0?t:e}var Ci=fi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null,t.minNotZero=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");i.isDatasetVisible(a)&&o(r)&&(void 0===s[l]&&(s[l]=[]),ut.each(n.data,function(e,i){var n=s[l],a=+t.getRightValue(e);isNaN(a)||r.data[i].hidden||a<0||(n[i]=n[i]||0,n[i]+=a)}))}),ut.each(s,function(e){if(e.length>0){var i=ut.min(e),n=ut.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?n:Math.max(t.max,n)}})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||n<0||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n),0!==n&&(null===t.minNotZero||n<t.minNotZero)&&(t.minNotZero=n))})});this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=_i(e.min,t.min),t.max=_i(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(ut.log10(t.min))-1),t.max=Math.pow(10,Math.floor(ut.log10(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(ut.log10(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(ut.log10(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(ut.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),n={min:_i(e.min),max:_i(e.max)},a=t.ticks=function(t,e){var i,n,a=[],o=wi(t.min,Math.pow(10,Math.floor(ut.log10(e.min)))),r=Math.floor(ut.log10(e.max)),s=Math.ceil(e.max/Math.pow(10,r));0===o?(i=Math.floor(ut.log10(e.minNotZero)),n=Math.floor(e.minNotZero/Math.pow(10,i)),a.push(o),o=n*Math.pow(10,i)):(i=Math.floor(ut.log10(o)),n=Math.floor(o/Math.pow(10,i)));var l=i<0?Math.pow(10,Math.abs(i)):1;do{a.push(o),10==++n&&(n=1,l=++i>=0?1:l),o=Math.round(n*Math.pow(10,i)*l)/l}while(i<r||i===r&&n<s);var d=wi(t.max,o);return a.push(d),a}(n,t);t.max=ut.max(a),t.min=ut.min(a),e.reverse?(i=!i,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),i&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),fi.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},_getFirstTickValue:function(t){var e=Math.floor(ut.log10(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},getPixelForValue:function(t){var e,i,n,a,o,r=this,s=r.options.ticks,l=s.reverse,d=ut.log10,u=r._getFirstTickValue(r.minNotZero),h=0;return t=+r.getRightValue(t),l?(n=r.end,a=r.start,o=-1):(n=r.start,a=r.end,o=1),r.isHorizontal()?(e=r.width,i=l?r.right:r.left):(e=r.height,o*=-1,i=l?r.top:r.bottom),t!==n&&(0===n&&(e-=h=wi(s.fontSize,st.global.defaultFontSize),n=u),0!==t&&(h+=e/(d(a)-d(n))*(d(t)-d(n))),i+=o*h),i},getValueForPixel:function(t){var e,i,n,a,o=this,r=o.options.ticks,s=r.reverse,l=ut.log10,d=o._getFirstTickValue(o.minNotZero);if(s?(i=o.end,n=o.start):(i=o.start,n=o.end),o.isHorizontal()?(e=o.width,a=s?o.right-t:t-o.left):(e=o.height,a=s?t-o.top:o.bottom-t),a!==i){if(0===i){var u=wi(r.fontSize,st.global.defaultFontSize);a-=u,e-=u,i=d}a*=l(n)-l(i),a/=e,a=Math.pow(10,l(i)+a)}return a}}),Si=Mi;Ci._defaults=Si;var Pi=ut.valueOrDefault,Ii=ut.valueAtIndexOrDefault,Ai=ut.options.resolve,Di={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:li.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Ti(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function Fi(t){var e=t.ticks;return e.display&&t.display?Pi(e.fontSize,st.global.defaultFontSize)+2*e.backdropPaddingY:0}function Li(t,e,i,n,a){return t===n||t===a?{start:e-i/2,end:e+i/2}:t<n||t>a?{start:e-i,end:e}:{start:e,end:e+i}}function Ri(t){return 0===t||180===t?"center":t<180?"left":"right"}function Oi(t,e,i,n){var a,o,r=i.y+n/2;if(ut.isArray(e))for(a=0,o=e.length;a<o;++a)t.fillText(e[a],i.x,r),r+=n;else t.fillText(e,i.x,r)}function zi(t,e,i){90===t||270===t?i.y-=e.h/2:(t>270||t<90)&&(i.y-=e.h)}function Bi(t){return ut.isNumber(t)?t:0}var Ni=bi.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Fi(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,i=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;ut.each(e.data.datasets,function(a,o){if(e.isDatasetVisible(o)){var r=e.getDatasetMeta(o);ut.each(a.data,function(e,a){var o=+t.getRightValue(e);isNaN(o)||r.data[a].hidden||(i=Math.min(o,i),n=Math.max(o,n))})}}),t.min=i===Number.POSITIVE_INFINITY?0:i,t.max=n===Number.NEGATIVE_INFINITY?0:n,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Fi(this.options))},convertTicksToLabels:function(){var t=this;bi.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map(t.options.pointLabels.callback,t)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,i,n,a=ut.options._parseFont(t.options.pointLabels),o={l:0,r:t.width,t:0,b:t.height-t.paddingTop},r={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,d,u=Ti(t);for(e=0;e<u;e++){n=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,d=t.pointLabels[e]||"",i=ut.isArray(d)?{w:ut.longestText(s,s.font,d),h:d.length*l}:{w:s.measureText(d).width,h:l},t._pointLabelSizes[e]=i;var h=t.getIndexAngle(e),c=ut.toDegrees(h)%360,f=Li(c,n.x,i.w,0,180),g=Li(c,n.y,i.h,90,270);f.start<o.l&&(o.l=f.start,r.l=h),f.end>o.r&&(o.r=f.end,r.r=h),g.start<o.t&&(o.t=g.start,r.t=h),g.end>o.b&&(o.b=g.end,r.b=h)}t.setReductions(t.drawingArea,o,r)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,i){var n=this,a=e.l/Math.sin(i.l),o=Math.max(e.r-n.width,0)/Math.sin(i.r),r=-e.t/Math.cos(i.t),s=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);a=Bi(a),o=Bi(o),r=Bi(r),s=Bi(s),n.drawingArea=Math.min(Math.floor(t-(a+o)/2),Math.floor(t-(r+s)/2)),n.setCenterPoint(a,o,r,s)},setCenterPoint:function(t,e,i,n){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,s=i+a.drawingArea,l=a.height-a.paddingTop-n-a.drawingArea;a.xCenter=Math.floor((r+o)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){return t*(2*Math.PI/Ti(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var i=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*i:(t-e.min)*i},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(i)*e+this.xCenter,y:Math.sin(i)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,e=t.options,i=e.gridLines,n=e.ticks;if(e.display){var a=t.ctx,o=this.getIndexAngle(0),r=ut.options._parseFont(n);(e.angleLines.display||e.pointLabels.display)&&function(t){var e=t.ctx,i=t.options,n=i.angleLines,a=i.gridLines,o=i.pointLabels,r=Pi(n.lineWidth,a.lineWidth),s=Pi(n.color,a.color),l=Fi(i);e.save(),e.lineWidth=r,e.strokeStyle=s,e.setLineDash&&(e.setLineDash(Ai([n.borderDash,a.borderDash,[]])),e.lineDashOffset=Ai([n.borderDashOffset,a.borderDashOffset,0]));var d=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),u=ut.options._parseFont(o);e.font=u.string,e.textBaseline="middle";for(var h=Ti(t)-1;h>=0;h--){if(n.display&&r&&s){var c=t.getPointPosition(h,d);e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(c.x,c.y),e.stroke()}if(o.display){var f=0===h?l/2:0,g=t.getPointPosition(h,d+f+5),p=Ii(o.fontColor,h,st.global.defaultFontColor);e.fillStyle=p;var m=t.getIndexAngle(h),v=ut.toDegrees(m);e.textAlign=Ri(v),zi(v,t._pointLabelSizes[h],g),Oi(e,t.pointLabels[h]||"",g,u.lineHeight)}}e.restore()}(t),ut.each(t.ticks,function(e,s){if(s>0||n.reverse){var l=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(i.display&&0!==s&&function(t,e,i,n){var a,o=t.ctx,r=e.circular,s=Ti(t),l=Ii(e.color,n-1),d=Ii(e.lineWidth,n-1);if((r||s)&&l&&d){if(o.save(),o.strokeStyle=l,o.lineWidth=d,o.setLineDash&&(o.setLineDash(e.borderDash||[]),o.lineDashOffset=e.borderDashOffset||0),o.beginPath(),r)o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI);else{a=t.getPointPosition(0,i),o.moveTo(a.x,a.y);for(var u=1;u<s;u++)a=t.getPointPosition(u,i),o.lineTo(a.x,a.y)}o.closePath(),o.stroke(),o.restore()}}(t,i,l,s),n.display){var d=Pi(n.fontColor,st.global.defaultFontColor);if(a.font=r.string,a.save(),a.translate(t.xCenter,t.yCenter),a.rotate(o),n.showLabelBackdrop){var u=a.measureText(e).width;a.fillStyle=n.backdropColor,a.fillRect(-u/2-n.backdropPaddingX,-l-r.size/2-n.backdropPaddingY,u+2*n.backdropPaddingX,r.size+2*n.backdropPaddingY)}a.textAlign="center",a.textBaseline="middle",a.fillStyle=d,a.fillText(e,0,-l),a.restore()}}})}}}),Wi=Di;Ni._defaults=Wi;var Vi=ut.valueOrDefault,Ei=Number.MIN_SAFE_INTEGER||-9007199254740991,Hi=Number.MAX_SAFE_INTEGER||9007199254740991,ji={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,15,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,15,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},qi=Object.keys(ji);function Yi(t,e){return t-e}function Ui(t){var e,i,n,a={},o=[];for(e=0,i=t.length;e<i;++e)a[n=t[e]]||(a[n]=!0,o.push(n));return o}function Xi(t,e,i,n){var a=function(t,e,i){for(var n,a,o,r=0,s=t.length-1;r>=0&&r<=s;){if(a=t[(n=r+s>>1)-1]||null,o=t[n],!a)return{lo:null,hi:o};if(o[e]<i)r=n+1;else{if(!(a[e]>i))return{lo:a,hi:o};s=n-1}}return{lo:o,hi:null}}(t,e,i),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],r=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=r[e]-o[e],l=s?(i-o[e])/s:0,d=(r[n]-o[n])*l;return o[n]+d}function Ki(t,e){var i=t._adapter,n=t.options.time,a=n.parser,o=a||n.format,r=e;return"function"==typeof a&&(r=a(r)),ut.isFinite(r)||(r="string"==typeof o?i.parse(r,o):i.parse(r)),null!==r?+r:(a||"function"!=typeof o||(r=o(e),ut.isFinite(r)||(r=i.parse(r))),r)}function Gi(t,e){if(ut.isNullOrUndef(e))return null;var i=t.options.time,n=Ki(t,t.getRightValue(e));return null===n?n:(i.round&&(n=+t._adapter.startOf(n,i.round)),n)}function Zi(t){for(var e=qi.indexOf(t)+1,i=qi.length;e<i;++e)if(ji[qi[e]].common)return qi[e]}function $i(t,e,i,n){var a,o=t._adapter,r=t.options,s=r.time,l=s.unit||function(t,e,i,n){var a,o,r,s=qi.length;for(a=qi.indexOf(t);a<s-1;++a)if(r=(o=ji[qi[a]]).steps?o.steps[o.steps.length-1]:Hi,o.common&&Math.ceil((i-e)/(r*o.size))<=n)return qi[a];return qi[s-1]}(s.minUnit,e,i,n),d=Zi(l),u=Vi(s.stepSize,s.unitStepSize),h="week"===l&&s.isoWeekday,c=r.ticks.major.enabled,f=ji[l],g=e,p=i,m=[];for(u||(u=function(t,e,i,n){var a,o,r,s=e-t,l=ji[i],d=l.size,u=l.steps;if(!u)return Math.ceil(s/(n*d));for(a=0,o=u.length;a<o&&(r=u[a],!(Math.ceil(s/(d*r))<=n));++a);return r}(e,i,l,n)),h&&(g=+o.startOf(g,"isoWeek",h),p=+o.startOf(p,"isoWeek",h)),g=+o.startOf(g,h?"day":l),(p=+o.startOf(p,h?"day":l))<i&&(p=+o.add(p,1,l)),a=g,c&&d&&!h&&!s.round&&(a=+o.startOf(a,d),a=+o.add(a,~~((g-a)/(f.size*u))*u,l));a<p;a=+o.add(a,u,l))m.push(+a);return m.push(+a),m}var Ji=fi.extend({initialize:function(){this.mergeTicksOptions(),fi.prototype.initialize.call(this)},update:function(){var t=this.options,e=t.time||(t.time={}),i=this._adapter=new si._date(t.adapters.date);return e.format&&console.warn("options.time.format is deprecated and replaced by options.time.parser."),ut.mergeIf(e.displayFormats,i.formats()),fi.prototype.update.apply(this,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),fi.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,i,n,a,o,r=this,s=r.chart,l=r._adapter,d=r.options.time,u=d.unit||"day",h=Hi,c=Ei,f=[],g=[],p=[],m=s.data.labels||[];for(t=0,i=m.length;t<i;++t)p.push(Gi(r,m[t]));for(t=0,i=(s.data.datasets||[]).length;t<i;++t)if(s.isDatasetVisible(t))if(a=s.data.datasets[t].data,ut.isObject(a[0]))for(g[t]=[],e=0,n=a.length;e<n;++e)o=Gi(r,a[e]),f.push(o),g[t][e]=o;else{for(e=0,n=p.length;e<n;++e)f.push(p[e]);g[t]=p.slice(0)}else g[t]=[];p.length&&(p=Ui(p).sort(Yi),h=Math.min(h,p[0]),c=Math.max(c,p[p.length-1])),f.length&&(f=Ui(f).sort(Yi),h=Math.min(h,f[0]),c=Math.max(c,f[f.length-1])),h=Gi(r,d.min)||h,c=Gi(r,d.max)||c,h=h===Hi?+l.startOf(Date.now(),u):h,c=c===Ei?+l.endOf(Date.now(),u)+1:c,r.min=Math.min(h,c),r.max=Math.max(h+1,c),r._horizontal=r.isHorizontal(),r._table=[],r._timestamps={data:f,datasets:g,labels:p}},buildTicks:function(){var t,e,i,n=this,a=n.min,o=n.max,r=n.options,s=r.time,l=[],d=[];switch(r.ticks.source){case"data":l=n._timestamps.data;break;case"labels":l=n._timestamps.labels;break;case"auto":default:l=$i(n,a,o,n.getLabelCapacity(a))}for("ticks"===r.bounds&&l.length&&(a=l[0],o=l[l.length-1]),a=Gi(n,s.min)||a,o=Gi(n,s.max)||o,t=0,e=l.length;t<e;++t)(i=l[t])>=a&&i<=o&&d.push(i);return n.min=a,n.max=o,n._unit=s.unit||function(t,e,i,n,a){var o,r;for(o=qi.length-1;o>=qi.indexOf(i);o--)if(r=qi[o],ji[r].common&&t._adapter.diff(a,n,r)>=e.length)return r;return qi[i?qi.indexOf(i):0]}(n,d,s.minUnit,n.min,n.max),n._majorUnit=Zi(n._unit),n._table=function(t,e,i,n){if("linear"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,o,r,s,l,d=[],u=[e];for(a=0,o=t.length;a<o;++a)(s=t[a])>e&&s<i&&u.push(s);for(u.push(i),a=0,o=u.length;a<o;++a)l=u[a+1],r=u[a-1],s=u[a],void 0!==r&&void 0!==l&&Math.round((l+r)/2)===s||d.push({time:s,pos:a/(o-1)});return d}(n._timestamps.data,a,o,r.distribution),n._offsets=function(t,e,i,n,a){var o,r,s=0,l=0;return a.offset&&e.length&&(a.time.min||(o=Xi(t,"time",e[0],"pos"),s=1===e.length?1-o:(Xi(t,"time",e[1],"pos")-o)/2),a.time.max||(r=Xi(t,"time",e[e.length-1],"pos"),l=1===e.length?r:(r-Xi(t,"time",e[e.length-2],"pos"))/2)),{start:s,end:l}}(n._table,d,0,0,r),r.ticks.reverse&&d.reverse(),function(t,e,i){var n,a,o,r,s=[];for(n=0,a=e.length;n<a;++n)o=e[n],r=!!i&&o===+t._adapter.startOf(o,i),s.push({value:o,major:r});return s}(n,d,n._majorUnit)},getLabelForIndex:function(t,e){var i=this,n=i._adapter,a=i.chart.data,o=i.options.time,r=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return ut.isObject(s)&&(r=i.getRightValue(s)),o.tooltipFormat?n.format(Ki(i,r),o.tooltipFormat):"string"==typeof r?r:n.format(Ki(i,r),o.displayFormats.datetime)},tickFormatFunction:function(t,e,i,n){var a=this._adapter,o=this.options,r=o.time.displayFormats,s=r[this._unit],l=this._majorUnit,d=r[l],u=+a.startOf(t,l),h=o.ticks.major,c=h.enabled&&l&&d&&t===u,f=a.format(t,n||(c?d:s)),g=c?h:o.ticks.minor,p=Vi(g.callback,g.userCallback);return p?p(f,e,i):f},convertTicksToLabels:function(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(this.tickFormatFunction(t[e].value,e,t));return n},getPixelForOffset:function(t){var e=this,i=e.options.ticks.reverse,n=e._horizontal?e.width:e.height,a=e._horizontal?i?e.right:e.left:i?e.bottom:e.top,o=Xi(e._table,"time",t,"pos"),r=n*(e._offsets.start+o)/(e._offsets.start+1+e._offsets.end);return i?a-r:a+r},getPixelForValue:function(t,e,i){var n=null;if(void 0!==e&&void 0!==i&&(n=this._timestamps.datasets[i][e]),null===n&&(n=Gi(this,t)),null!==n)return this.getPixelForOffset(n)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,i=e._horizontal?e.width:e.height,n=e._horizontal?e.left:e.top,a=(i?(t-n)/i:0)*(e._offsets.start+1+e._offsets.start)-e._offsets.end,o=Xi(e._table,"pos",a,"time");return e._adapter._create(o)},getLabelWidth:function(t){var e=this.options.ticks,i=this.ctx.measureText(t).width,n=ut.toRadians(e.maxRotation),a=Math.cos(n),o=Math.sin(n);return i*a+Vi(e.fontSize,st.global.defaultFontSize)*o},getLabelCapacity:function(t){var e=this,i=e.options.time.displayFormats.millisecond,n=e.tickFormatFunction(t,0,[],i),a=e.getLabelWidth(n),o=e.isHorizontal()?e.width:e.height,r=Math.floor(o/a);return r>0?r:1}}),Qi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};Ji._defaults=Qi;var tn={category:gi,linear:yi,logarithmic:Ci,radialLinear:Ni,time:Ji},en={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};si._date.override("function"==typeof t?{_id:"moment",formats:function(){return en},parse:function(e,i){return"string"==typeof e&&"string"==typeof i?e=t(e,i):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,i){return t(e).format(i)},add:function(e,i,n){return t(e).add(i,n).valueOf()},diff:function(e,i,n){return t.duration(t(e).diff(t(i))).as(n)},startOf:function(e,i,n){return e=t(e),"isoWeek"===i?e.isoWeekday(n).valueOf():e.startOf(i).valueOf()},endOf:function(e,i){return t(e).endOf(i).valueOf()},_create:function(e){return t(e)}}:{}),st._set("global",{plugins:{filler:{propagate:!0}}});var nn={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],o=a.length||0;return o?function(t,e){return e<o&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,i=e?e.x:null,n=e?e.y:null;return function(t){return{x:null===i?t.x:i,y:null===n?t.y:n}}}};function an(t,e,i){var n,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(n=parseFloat(o,10),isFinite(n)&&Math.floor(n)===n)return"-"!==o[0]&&"+"!==o[0]||(n=e+n),!(n===e||n<0||n>=i)&&n;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function on(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===i.scaleBottom?n.bottom:i.scaleBottom:"end"===a?o=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?o=i.scaleZero:n.getBasePosition?o=n.getBasePosition():n.getBasePixel&&(o=n.getBasePixel()),null!=o){if(void 0!==o.x&&void 0!==o.y)return o;if(ut.isFinite(o))return{x:(e=n.isHorizontal())?o:null,y:e?null:o}}return null}function rn(t,e,i){var n,a=t[e].fill,o=[e];if(!i)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;o.push(a),a=n.fill}return!1}function sn(t){var e=t.fill,i="dataset";return!1===e?null:(isFinite(e)||(i="boundary"),nn[i](t))}function ln(t){return t&&!t.skip}function dn(t,e,i,n,a){var o;if(n&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o<n;++o)ut.canvas.lineTo(t,e[o-1],e[o]);for(t.lineTo(i[a-1].x,i[a-1].y),o=a-1;o>0;--o)ut.canvas.lineTo(t,i[o],i[o-1],!0)}}var un={id:"filler",afterDatasetsUpdate:function(t,e){var i,n,a,o,r=(t.data.datasets||[]).length,s=e.propagate,l=[];for(n=0;n<r;++n)o=null,(a=(i=t.getDatasetMeta(n)).dataset)&&a._model&&a instanceof Wt.Line&&(o={visible:t.isDatasetVisible(n),fill:an(a,n,r),chart:t,el:a}),i.$filler=o,l.push(o);for(n=0;n<r;++n)(o=l[n])&&(o.fill=rn(l,n,s),o.boundary=on(o),o.mapper=sn(o))},beforeDatasetDraw:function(t,e){var i=e.meta.$filler;if(i){var n=t.ctx,a=i.el,o=a._view,r=a._children||[],s=i.mapper,l=o.backgroundColor||st.global.defaultColor;s&&l&&r.length&&(ut.canvas.clipArea(n,t.chartArea),function(t,e,i,n,a,o){var r,s,l,d,u,h,c,f=e.length,g=n.spanGaps,p=[],m=[],v=0,b=0;for(t.beginPath(),r=0,s=f+!!o;r<s;++r)u=i(d=e[l=r%f]._view,l,n),h=ln(d),c=ln(u),h&&c?(v=p.push(d),b=m.push(u)):v&&b&&(g?(h&&p.push(d),c&&m.push(u)):(dn(t,p,m,v,b),v=b=0,p=[],m=[]));dn(t,p,m,v,b),t.closePath(),t.fillStyle=a,t.fill()}(n,r,s,o,l,a._loop),ut.canvas.unclipArea(n))}}},hn=ut.noop,cn=ut.valueOrDefault;function fn(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}st._set("global",{legend:{display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return ut.isArray(e.datasets)?e.datasets.map(function(e,i){return{text:e.label,fillStyle:ut.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:i}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var i=0;i<t.data.datasets.length;i++)e.push('<li><span style="background-color:'+t.data.datasets[i].backgroundColor+'"></span>'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("</li>");return e.push("</ul>"),e.join("")}});var gn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:hn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:hn,beforeSetDimensions:hn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:hn,beforeBuildLabels:hn,buildLabels:function(){var t=this,e=t.options.labels||{},i=ut.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:hn,beforeFit:hn,fit:function(){var t=this,e=t.options,i=e.labels,n=e.display,a=t.ctx,o=ut.options._parseFont(i),r=o.size,s=t.legendHitBoxes=[],l=t.minSize,d=t.isHorizontal();if(d?(l.width=t.maxWidth,l.height=n?10:0):(l.width=n?10:0,l.height=t.maxHeight),n)if(a.font=o.string,d){var u=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="top",ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;(0===e||u[u.length-1]+n+i.padding>l.width)&&(h+=r+i.padding,u[u.length-(e>0?0:1)]=i.padding),s[e]={left:0,top:0,width:n,height:r},u[u.length-1]+=n+i.padding}),l.height+=h}else{var c=i.padding,f=t.columnWidths=[],g=i.padding,p=0,m=0,v=r+c;ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;e>0&&m+v>l.height-c&&(g+=p+i.padding,f.push(p),p=0,m=0),p=Math.max(p,n),m+=v,s[e]={left:0,top:0,width:n,height:r}}),g+=p,f.push(p),l.width+=g}t.width=l.width,t.height=l.height},afterFit:hn,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,n=st.global,a=n.defaultColor,o=n.elements.line,r=t.width,s=t.lineWidths;if(e.display){var l,d=t.ctx,u=cn(i.fontColor,n.defaultFontColor),h=ut.options._parseFont(i),c=h.size;d.textAlign="left",d.textBaseline="middle",d.lineWidth=.5,d.strokeStyle=u,d.fillStyle=u,d.font=h.string;var f=fn(i,c),g=t.legendHitBoxes,p=t.isHorizontal();l=p?{x:t.left+(r-s[0])/2+i.padding,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var m=c+i.padding;ut.each(t.legendItems,function(n,u){var h=d.measureText(n.text).width,v=f+c/2+h,b=l.x,x=l.y;p?u>0&&b+v+i.padding>t.left+t.minSize.width&&(x=l.y+=m,l.line++,b=l.x=t.left+(r-s[l.line])/2+i.padding):u>0&&x+m>t.top+t.minSize.height&&(b=l.x=b+t.columnWidths[l.line]+i.padding,x=l.y=t.top+i.padding,l.line++),function(t,i,n){if(!(isNaN(f)||f<=0)){d.save();var r=cn(n.lineWidth,o.borderWidth);if(d.fillStyle=cn(n.fillStyle,a),d.lineCap=cn(n.lineCap,o.borderCapStyle),d.lineDashOffset=cn(n.lineDashOffset,o.borderDashOffset),d.lineJoin=cn(n.lineJoin,o.borderJoinStyle),d.lineWidth=r,d.strokeStyle=cn(n.strokeStyle,a),d.setLineDash&&d.setLineDash(cn(n.lineDash,o.borderDash)),e.labels&&e.labels.usePointStyle){var s=f*Math.SQRT2/2,l=t+f/2,u=i+c/2;ut.canvas.drawPoint(d,n.pointStyle,s,l,u)}else 0!==r&&d.strokeRect(t,i,f,c),d.fillRect(t,i,f,c);d.restore()}}(b,x,n),g[u].left=b,g[u].top=x,function(t,e,i,n){var a=c/2,o=f+a+t,r=e+a;d.fillText(i.text,o,r),i.hidden&&(d.beginPath(),d.lineWidth=2,d.moveTo(o,r),d.lineTo(o+n,r),d.stroke())}(b,x,n,h),p?l.x+=v+i.padding:l.y+=m})}},_getLegendItemAt:function(t,e){var i,n,a,o=this;if(t>=o.left&&t<=o.right&&e>=o.top&&e<=o.bottom)for(a=o.legendHitBoxes,i=0;i<a.length;++i)if(t>=(n=a[i]).left&&t<=n.left+n.width&&e>=n.top&&e<=n.top+n.height)return o.legendItems[i];return null},handleEvent:function(t){var e,i=this,n=i.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!n.onHover&&!n.onLeave)return}else{if("click"!==a)return;if(!n.onClick)return}e=i._getLegendItemAt(t.x,t.y),"click"===a?e&&n.onClick&&n.onClick.call(i,t.native,e):(n.onLeave&&e!==i._hoveredItem&&(i._hoveredItem&&n.onLeave.call(i,t.native,i._hoveredItem),i._hoveredItem=e),n.onHover&&e&&n.onHover.call(i,t.native,e))}});function pn(t,e){var i=new gn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.legend=i}var mn={id:"legend",_element:gn,beforeInit:function(t){var e=t.options.legend;e&&pn(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(ut.mergeIf(e,st.global.legend),i?(ke.configure(t,i,e),i.options=e):pn(t,e)):i&&(ke.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}},vn=ut.noop;st._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var bn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:vn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:vn,beforeSetDimensions:vn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:vn,beforeBuildLabels:vn,buildLabels:vn,afterBuildLabels:vn,beforeFit:vn,fit:function(){var t=this,e=t.options,i=e.display,n=t.minSize,a=ut.isArray(e.text)?e.text.length:1,o=ut.options._parseFont(e),r=i?a*o.lineHeight+2*e.padding:0;t.isHorizontal()?(n.width=t.maxWidth,n.height=r):(n.width=r,n.height=t.maxHeight),t.width=n.width,t.height=n.height},afterFit:vn,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,i=t.options;if(i.display){var n,a,o,r=ut.options._parseFont(i),s=r.lineHeight,l=s/2+i.padding,d=0,u=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=ut.valueOrDefault(i.fontColor,st.global.defaultFontColor),e.font=r.string,t.isHorizontal()?(a=h+(f-h)/2,o=u+l,n=f-h):(a="left"===i.position?h+l:f-l,o=u+(c-u)/2,n=c-u,d=Math.PI*("left"===i.position?-.5:.5)),e.save(),e.translate(a,o),e.rotate(d),e.textAlign="center",e.textBaseline="middle";var g=i.text;if(ut.isArray(g))for(var p=0,m=0;m<g.length;++m)e.fillText(g[m],0,p,n),p+=s;else e.fillText(g,0,0,n);e.restore()}}});function xn(t,e){var i=new bn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.titleBlock=i}var yn={},kn=un,wn=mn,Mn={id:"title",_element:bn,beforeInit:function(t){var e=t.options.title;e&&xn(t,e)},beforeUpdate:function(t){var e=t.options.title,i=t.titleBlock;e?(ut.mergeIf(e,st.global.title),i?(ke.configure(t,i,e),i.options=e):xn(t,e)):i&&(ke.removeBox(t,i),delete t.titleBlock)}};for(var _n in yn.filler=kn,yn.legend=wn,yn.title=Mn,ai.helpers=ut,function(){function t(t,e,i){var n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}function e(t){return null!=t&&"none"!==t}function i(i,n,a){var o=document.defaultView,r=ut._getParentNode(i),s=o.getComputedStyle(i)[n],l=o.getComputedStyle(r)[n],d=e(s),u=e(l),h=Number.POSITIVE_INFINITY;return d||u?Math.min(d?t(s,i,a):h,u?t(l,r,a):h):"none"}ut.where=function(t,e){if(ut.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return ut.each(t,function(t){e(t)&&i.push(t)}),i},ut.findIndex=Array.prototype.findIndex?function(t,e,i){return t.findIndex(e,i)}:function(t,e,i){i=void 0===i?t:i;for(var n=0,a=t.length;n<a;++n)if(e.call(i,t[n],n,t))return n;return-1},ut.findNextWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=-1);for(var n=i+1;n<t.length;n++){var a=t[n];if(e(a))return a}},ut.findPreviousWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=t.length);for(var n=i-1;n>=0;n--){var a=t[n];if(e(a))return a}},ut.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},ut.almostEquals=function(t,e,i){return Math.abs(t-e)<i},ut.almostWhole=function(t,e){var i=Math.round(t);return i-e<t&&i+e>t},ut.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},ut.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},ut.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},ut.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},ut.toRadians=function(t){return t*(Math.PI/180)},ut.toDegrees=function(t){return t*(180/Math.PI)},ut._decimalPlaces=function(t){if(ut.isFinite(t)){for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}},ut.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),o=Math.atan2(n,i);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},ut.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},ut.aliasPixel=function(t){return t%2==0?0:.5},ut._alignPixel=function(t,e,i){var n=t.currentDevicePixelRatio,a=i/2;return Math.round((e-a)*n)/n+a},ut.splineCurve=function(t,e,i,n){var a=t.skip?e:t,o=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=s/(s+l),u=l/(s+l),h=n*(d=isNaN(d)?0:d),c=n*(u=isNaN(u)?0:u);return{previous:{x:o.x-h*(r.x-a.x),y:o.y-h*(r.y-a.y)},next:{x:o.x+c*(r.x-a.x),y:o.y+c*(r.y-a.y)}}},ut.EPSILON=Number.EPSILON||1e-14,ut.splineCurveMonotone=function(t){var e,i,n,a,o,r,s,l,d,u=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=u.length;for(e=0;e<h;++e)if(!(n=u[e]).model.skip){if(i=e>0?u[e-1]:null,(a=e<h-1?u[e+1]:null)&&!a.model.skip){var c=a.model.x-n.model.x;n.deltaK=0!==c?(a.model.y-n.model.y)/c:0}!i||i.model.skip?n.mK=n.deltaK:!a||a.model.skip?n.mK=i.deltaK:this.sign(i.deltaK)!==this.sign(n.deltaK)?n.mK=0:n.mK=(i.deltaK+n.deltaK)/2}for(e=0;e<h-1;++e)n=u[e],a=u[e+1],n.model.skip||a.model.skip||(ut.almostEquals(n.deltaK,0,this.EPSILON)?n.mK=a.mK=0:(o=n.mK/n.deltaK,r=a.mK/n.deltaK,(l=Math.pow(o,2)+Math.pow(r,2))<=9||(s=3/Math.sqrt(l),n.mK=o*s*n.deltaK,a.mK=r*s*n.deltaK)));for(e=0;e<h;++e)(n=u[e]).model.skip||(i=e>0?u[e-1]:null,a=e<h-1?u[e+1]:null,i&&!i.model.skip&&(d=(n.model.x-i.model.x)/3,n.model.controlPointPreviousX=n.model.x-d,n.model.controlPointPreviousY=n.model.y-d*n.mK),a&&!a.model.skip&&(d=(a.model.x-n.model.x)/3,n.model.controlPointNextX=n.model.x+d,n.model.controlPointNextY=n.model.y+d*n.mK))},ut.nextItem=function(t,e,i){return i?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},ut.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},ut.niceNum=function(t,e){var i=Math.floor(ut.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},ut.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},ut.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,o=t.target||t.srcElement,r=o.getBoundingClientRect(),s=a.touches;s&&s.length>0?(i=s[0].clientX,n=s[0].clientY):(i=a.clientX,n=a.clientY);var l=parseFloat(ut.getStyle(o,"padding-left")),d=parseFloat(ut.getStyle(o,"padding-top")),u=parseFloat(ut.getStyle(o,"padding-right")),h=parseFloat(ut.getStyle(o,"padding-bottom")),c=r.right-r.left-l-u,f=r.bottom-r.top-d-h;return{x:i=Math.round((i-r.left-l)/c*o.width/e.currentDevicePixelRatio),y:n=Math.round((n-r.top-d)/f*o.height/e.currentDevicePixelRatio)}},ut.getConstraintWidth=function(t){return i(t,"max-width","clientWidth")},ut.getConstraintHeight=function(t){return i(t,"max-height","clientHeight")},ut._calculatePadding=function(t,e,i){return(e=ut.getStyle(t,e)).indexOf("%")>-1?i*parseInt(e,10)/100:parseInt(e,10)},ut._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},ut.getMaximumWidth=function(t){var e=ut._getParentNode(t);if(!e)return t.clientWidth;var i=e.clientWidth,n=i-ut._calculatePadding(e,"padding-left",i)-ut._calculatePadding(e,"padding-right",i),a=ut.getConstraintWidth(t);return isNaN(a)?n:Math.min(n,a)},ut.getMaximumHeight=function(t){var e=ut._getParentNode(t);if(!e)return t.clientHeight;var i=e.clientHeight,n=i-ut._calculatePadding(e,"padding-top",i)-ut._calculatePadding(e,"padding-bottom",i),a=ut.getConstraintHeight(t);return isNaN(a)?n:Math.min(n,a)},ut.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},ut.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,o=t.width;n.height=a*i,n.width=o*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+"px",n.style.width=o+"px")}},ut.fontString=function(t,e,i){return e+" "+t+"px "+i},ut.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},o=n.garbageCollect=[],n.font=e),t.font=e;var r=0;ut.each(i,function(e){null!=e&&!0!==ut.isArray(e)?r=ut.measureText(t,a,o,r,e):ut.isArray(e)&&ut.each(e,function(e){null==e||ut.isArray(e)||(r=ut.measureText(t,a,o,r,e))})});var s=o.length/2;if(s>i.length){for(var l=0;l<s;l++)delete a[o[l]];o.splice(0,s)}return r},ut.measureText=function(t,e,i,n,a){var o=e[a];return o||(o=e[a]=t.measureText(a).width,i.push(a)),o>n&&(n=o),n},ut.numberOfLabelLines=function(t){var e=1;return ut.each(t,function(t){ut.isArray(t)&&t.length>e&&(e=t.length)}),e},ut.color=X?function(t){return t instanceof CanvasGradient&&(t=st.global.defaultColor),X(t)}:function(t){return console.error("Color.js not found!"),t},ut.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:ut.color(t).saturate(.5).darken(.1).rgbString()}}(),ai._adapters=si,ai.Animation=vt,ai.animationService=bt,ai.controllers=ue,ai.DatasetController=Mt,ai.defaults=st,ai.Element=pt,ai.elements=Wt,ai.Interaction=ve,ai.layouts=ke,ai.platform=Ve,ai.plugins=Ee,ai.Scale=fi,ai.scaleService=He,ai.Ticks=li,ai.Tooltip=Je,ai.helpers.each(tn,function(t,e){ai.scaleService.registerScaleType(e,t,t._defaults)}),yn)yn.hasOwnProperty(_n)&&ai.plugins.register(yn[_n]);ai.platform.initialize();var Cn=ai;return"undefined"!=typeof window&&(window.Chart=ai),ai.Chart=ai,ai.Legend=yn.legend._element,ai.Title=yn.title._element,ai.pluginService=ai.plugins,ai.PluginBase=ai.Element.extend({}),ai.canvasHelpers=ai.helpers.canvas,ai.layoutService=ai.layouts,ai.LinearScaleBase=bi,ai.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(t){ai[t]=function(e,i){return new ai(e,ai.helpers.merge(i||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}}),Cn}); diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/CONTRIBUTING.md b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..09bf774aaab77809f2ffcd19027731e3ee0aedd1 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/CONTRIBUTING.md @@ -0,0 +1,28 @@ +# Contribution + +# Git Flow + +The crypto-js project uses [git flow](https://github.com/nvie/gitflow) to manage branches. +Do your changes on the `develop` or even better on a `feature/*` branch. Don't do any changes on the `master` branch. + +# Pull request + +Target your pull request on `develop` branch. Other pull request won't be accepted. + +# How to build + +1. Clone + +2. Run + + ```sh + npm install + ``` + +3. Run + + ```sh + npm run build + ``` + +4. Check `build` folder \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/LICENSE b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..b0828e52a6b3f0716727bc4e03c4634d25a7568c --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/LICENSE @@ -0,0 +1,24 @@ +# License + +[The MIT License (MIT)](http://opensource.org/licenses/MIT) + +Copyright (c) 2009-2013 Jeff Mott +Copyright (c) 2013-2016 Evan Vosberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/README.md b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1f4b0efab5077451208469f81f8c7ed2ed2837fd --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/README.md @@ -0,0 +1,198 @@ +# crypto-js + +JavaScript library of crypto standards. + +## Node.js (Install) + +Requirements: + +- Node.js +- npm (Node.js package manager) + +```bash +npm install crypto-js +``` + +### Usage + +Modular include: + +```javascript +var AES = require("crypto-js/aes"); +var SHA256 = require("crypto-js/sha256"); +... +console.log(SHA256("Message")); +``` + +Including all libraries, for access to extra methods: + +```javascript +var CryptoJS = require("crypto-js"); +console.log(CryptoJS.HmacSHA1("Message", "Key")); +``` + +## Client (browser) + +Requirements: + +- Node.js +- Bower (package manager for frontend) + +```bash +bower install crypto-js +``` + +### Usage + +Modular include: + +```javascript +require.config({ + packages: [ + { + name: 'crypto-js', + location: 'path-to/bower_components/crypto-js', + main: 'index' + } + ] +}); + +require(["crypto-js/aes", "crypto-js/sha256"], function (AES, SHA256) { + console.log(SHA256("Message")); +}); +``` + +Including all libraries, for access to extra methods: + +```javascript +// Above-mentioned will work or use this simple form +require.config({ + paths: { + 'crypto-js': 'path-to/bower_components/crypto-js/crypto-js' + } +}); + +require(["crypto-js"], function (CryptoJS) { + console.log(CryptoJS.HmacSHA1("Message", "Key")); +}); +``` + +### Usage without RequireJS + +```html +<script type="text/javascript" src="path-to/bower_components/crypto-js/crypto-js.js"></script> +<script type="text/javascript"> + var encrypted = CryptoJS.AES(...); + var encrypted = CryptoJS.SHA256(...); +</script> +``` + +## API + +See: https://code.google.com/p/crypto-js + +### AES Encryption + +#### Plain text encryption + +```javascript +var CryptoJS = require("crypto-js"); + +// Encrypt +var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123'); + +// Decrypt +var bytes = CryptoJS.AES.decrypt(ciphertext.toString(), 'secret key 123'); +var plaintext = bytes.toString(CryptoJS.enc.Utf8); + +console.log(plaintext); +``` + +#### Object encryption + +```javascript +var CryptoJS = require("crypto-js"); + +var data = [{id: 1}, {id: 2}] + +// Encrypt +var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123'); + +// Decrypt +var bytes = CryptoJS.AES.decrypt(ciphertext.toString(), 'secret key 123'); +var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); + +console.log(decryptedData); +``` + +### List of modules + + +- ```crypto-js/core``` +- ```crypto-js/x64-core``` +- ```crypto-js/lib-typedarrays``` + +--- + +- ```crypto-js/md5``` +- ```crypto-js/sha1``` +- ```crypto-js/sha256``` +- ```crypto-js/sha224``` +- ```crypto-js/sha512``` +- ```crypto-js/sha384``` +- ```crypto-js/sha3``` +- ```crypto-js/ripemd160``` + +--- + +- ```crypto-js/hmac-md5``` +- ```crypto-js/hmac-sha1``` +- ```crypto-js/hmac-sha256``` +- ```crypto-js/hmac-sha224``` +- ```crypto-js/hmac-sha512``` +- ```crypto-js/hmac-sha384``` +- ```crypto-js/hmac-sha3``` +- ```crypto-js/hmac-ripemd160``` + +--- + +- ```crypto-js/pbkdf2``` + +--- + +- ```crypto-js/aes``` +- ```crypto-js/tripledes``` +- ```crypto-js/rc4``` +- ```crypto-js/rabbit``` +- ```crypto-js/rabbit-legacy``` +- ```crypto-js/evpkdf``` + +--- + +- ```crypto-js/format-openssl``` +- ```crypto-js/format-hex``` + +--- + +- ```crypto-js/enc-latin1``` +- ```crypto-js/enc-utf8``` +- ```crypto-js/enc-hex``` +- ```crypto-js/enc-utf16``` +- ```crypto-js/enc-base64``` + +--- + +- ```crypto-js/mode-cfb``` +- ```crypto-js/mode-ctr``` +- ```crypto-js/mode-ctr-gladman``` +- ```crypto-js/mode-ofb``` +- ```crypto-js/mode-ecb``` + +--- + +- ```crypto-js/pad-pkcs7``` +- ```crypto-js/pad-ansix923``` +- ```crypto-js/pad-iso10126``` +- ```crypto-js/pad-iso97971``` +- ```crypto-js/pad-zeropadding``` +- ```crypto-js/pad-nopadding``` diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/aes.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/aes.js new file mode 100644 index 0000000000000000000000000000000000000000..508d512772164ea04bec7b6d3ecc6fe0e1d6caec --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/aes.js @@ -0,0 +1,232 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + var t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + return CryptoJS.AES; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/bower.json b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/bower.json new file mode 100644 index 0000000000000000000000000000000000000000..a995f687cc9eba1f5afe5ca267dcd36f1e3d47a9 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/bower.json @@ -0,0 +1,35 @@ +{ + "name": "crypto-js", + "version": "3.1.9", + "description": "JavaScript library of crypto standards.", + "license": "MIT", + "homepage": "http://github.com/brix/crypto-js", + "repository": { + "type": "git", + "url": "http://github.com/brix/crypto-js.git" + }, + "keywords": [ + "security", + "crypto", + "Hash", + "MD5", + "SHA1", + "SHA-1", + "SHA256", + "SHA-256", + "RC4", + "Rabbit", + "AES", + "DES", + "PBKDF2", + "HMAC", + "OFB", + "CFB", + "CTR", + "CBC", + "Base64" + ], + "main": "index.js", + "dependencies": {}, + "ignore": [] +} diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/cipher-core.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/cipher-core.js new file mode 100644 index 0000000000000000000000000000000000000000..751c816684ac75ee23ed9aa1ed796f63b642ec7b --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/cipher-core.js @@ -0,0 +1,880 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./evpkdf")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./evpkdf"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + var block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + var modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + var modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + var wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + var salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/core.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/core.js new file mode 100644 index 0000000000000000000000000000000000000000..28e34c13c1ebedfc2ffdd22a0c9cd8aa0af7cca9 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/core.js @@ -0,0 +1,760 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + /* + * Local polyfil of Object.create + */ + var create = Object.create || (function () { + function F() {}; + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()) + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var i = 0; i < thatSigBytes; i += 4) { + thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + var r = (function (m_w) { + var m_w = m_w; + var m_z = 0x3ade68b1; + var mask = 0xffffffff; + + return function () { + m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; + m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; + var result = ((m_z << 0x10) + m_w) & mask; + result /= 0x100000000; + result += 0.5; + return result * (Math.random() > .5 ? 1 : -1); + } + }); + + for (var i = 0, rcache; i < nBytes; i += 4) { + var _r = r((rcache || Math.random()) * 0x100000000); + + rcache = _r() * 0x3ade67b7; + words.push((_r() * 0x100000000) | 0); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + var processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/crypto-js.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/crypto-js.js new file mode 100644 index 0000000000000000000000000000000000000000..17f2b1163a74d56fd16b4e2de193d975a0f464d2 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/crypto-js.js @@ -0,0 +1,5988 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + /* + * Local polyfil of Object.create + */ + var create = Object.create || (function () { + function F() {}; + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()) + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var i = 0; i < thatSigBytes; i += 4) { + thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + var r = (function (m_w) { + var m_w = m_w; + var m_z = 0x3ade68b1; + var mask = 0xffffffff; + + return function () { + m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; + m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; + var result = ((m_z << 0x10) + m_w) & mask; + result /= 0x100000000; + result += 0.5; + return result * (Math.random() > .5 ? 1 : -1); + } + }); + + for (var i = 0, rcache; i < nBytes; i += 4) { + var _r = r((rcache || Math.random()) * 0x100000000); + + rcache = _r() * 0x3ade67b7; + words.push((_r() * 0x100000000) | 0); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + var processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<<n) | (x>>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + var block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low;; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + var Wih = Wi.high = M[offset + i * 2] | 0; + var Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + var Wil = gamma0l + Wi7l; + var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + var Wil = Wil + gamma1l; + var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + var Wil = Wil + Wi16l; + var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + var block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + var modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + var modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + var wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + var salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + var keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + var t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); + this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); + this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + i--; + } + data.sigBytes = i + 1; + } + }; + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-base64.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-base64.js new file mode 100644 index 0000000000000000000000000000000000000000..d5d40824d698242de4536c5c825beb43932560a6 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-base64.js @@ -0,0 +1,135 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + return CryptoJS.enc.Base64; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-hex.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-hex.js new file mode 100644 index 0000000000000000000000000000000000000000..88161ff5f629c5b7a14598614c4e9df7a677e4f8 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-hex.js @@ -0,0 +1,18 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.enc.Hex; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-latin1.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-latin1.js new file mode 100644 index 0000000000000000000000000000000000000000..ade56dcd49425fdaac7bd87645f5592a39d31d9a --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-latin1.js @@ -0,0 +1,18 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.enc.Latin1; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-utf16.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-utf16.js new file mode 100644 index 0000000000000000000000000000000000000000..7de62457a52e57f3cf3dc53db0023764bc522920 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-utf16.js @@ -0,0 +1,149 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + return CryptoJS.enc.Utf16; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-utf8.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-utf8.js new file mode 100644 index 0000000000000000000000000000000000000000..e7a251d885bd88af5a67078b3e65b866fd8de36d --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/enc-utf8.js @@ -0,0 +1,18 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.enc.Utf8; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/evpkdf.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/evpkdf.js new file mode 100644 index 0000000000000000000000000000000000000000..3fe5c01c843aa766a8138a08981740e0fbd9eb65 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/evpkdf.js @@ -0,0 +1,132 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha1", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + var block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + return CryptoJS.EvpKDF; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/format-hex.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/format-hex.js new file mode 100644 index 0000000000000000000000000000000000000000..2e9a861f0cbaedcdc97a65034acb7ae590cd70e3 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/format-hex.js @@ -0,0 +1,66 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + return CryptoJS.format.Hex; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/format-openssl.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/format-openssl.js new file mode 100644 index 0000000000000000000000000000000000000000..3373edc6a66fbaaaa5f31e22d230bb56ca7e1a42 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/format-openssl.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.format.OpenSSL; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-md5.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-md5.js new file mode 100644 index 0000000000000000000000000000000000000000..ad7a90adc27f6b407f7d278d5c4bb21d0dd5ad0d --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-md5.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./md5"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./md5", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacMD5; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-ripemd160.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-ripemd160.js new file mode 100644 index 0000000000000000000000000000000000000000..73d55a77013f5d8b318d2e6bc550e203aae78697 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-ripemd160.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./ripemd160"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./ripemd160", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacRIPEMD160; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha1.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha1.js new file mode 100644 index 0000000000000000000000000000000000000000..0b570cbc31a5651d1a9287028848a1252b7f56c3 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha1.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha1", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA1; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha224.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha224.js new file mode 100644 index 0000000000000000000000000000000000000000..3778863ac416f03e7ffff1dc69c13f35628e7e5c --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha224.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256"), require("./sha224"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256", "./sha224", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA224; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha256.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha256.js new file mode 100644 index 0000000000000000000000000000000000000000..33b0c9fec202fd6a2262ace762f4e32156eb4c40 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha256.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA256; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha3.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha3.js new file mode 100644 index 0000000000000000000000000000000000000000..1248804966613af18ce1ab4d65f19edaef32e11e --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha3.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha3"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha3", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA3; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha384.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha384.js new file mode 100644 index 0000000000000000000000000000000000000000..0036e2b887c69f0ae89073354a3792b88c20dfdd --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha384.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./sha384"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha512", "./sha384", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA384; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha512.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha512.js new file mode 100644 index 0000000000000000000000000000000000000000..c1005b6ac5223132073e0183e090c4c02eb9cb87 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac-sha512.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha512", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA512; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac.js new file mode 100644 index 0000000000000000000000000000000000000000..8c098511429d0c01ebd7adb44df4acaacdf2ae25 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/hmac.js @@ -0,0 +1,143 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/index.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/index.js new file mode 100644 index 0000000000000000000000000000000000000000..c93556a71598fddb82ab62ed06c5d51e44cdb1de --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/index.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/lib-typedarrays.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/lib-typedarrays.js new file mode 100644 index 0000000000000000000000000000000000000000..264b210742682d09a07094f3ccda90064fb6b0cf --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/lib-typedarrays.js @@ -0,0 +1,76 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + return CryptoJS.lib.WordArray; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/md5.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/md5.js new file mode 100644 index 0000000000000000000000000000000000000000..12b0fdd4b4f00066c52969ead2bac439f668df2d --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/md5.js @@ -0,0 +1,268 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + return CryptoJS.MD5; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-cfb.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-cfb.js new file mode 100644 index 0000000000000000000000000000000000000000..86231f1b3f1e376f25fb566e654e742f6f860d28 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-cfb.js @@ -0,0 +1,78 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + var keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + return CryptoJS.mode.CFB; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ctr-gladman.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ctr-gladman.js new file mode 100644 index 0000000000000000000000000000000000000000..bbc56876e3cf854f7620aae07c2125eb3dbb19a5 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ctr-gladman.js @@ -0,0 +1,116 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + return CryptoJS.mode.CTRGladman; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ctr.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ctr.js new file mode 100644 index 0000000000000000000000000000000000000000..c3d470a6fac667465c5fe460a85bd3a7ad1c70a5 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ctr.js @@ -0,0 +1,58 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + return CryptoJS.mode.CTR; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ecb.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ecb.js new file mode 100644 index 0000000000000000000000000000000000000000..ff0692175b6dd588c023f25b10798ee25bd6d374 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ecb.js @@ -0,0 +1,40 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + return CryptoJS.mode.ECB; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ofb.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ofb.js new file mode 100644 index 0000000000000000000000000000000000000000..c01314c2284da6d92910ccb4d98e76f5e5fe1564 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/mode-ofb.js @@ -0,0 +1,54 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + return CryptoJS.mode.OFB; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/package.json b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/package.json new file mode 100644 index 0000000000000000000000000000000000000000..dae37ed2fccb40c8acf8343072f845773a405c5c --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/package.json @@ -0,0 +1,38 @@ +{ + "name": "crypto-js", + "version": "3.1.9", + "description": "JavaScript library of crypto standards.", + "license": "MIT", + "author": { + "name": "Evan Vosberg", + "url": "http://github.com/evanvosberg" + }, + "homepage": "http://github.com/brix/crypto-js", + "repository": { + "type": "git", + "url": "http://github.com/brix/crypto-js.git" + }, + "keywords": [ + "security", + "crypto", + "Hash", + "MD5", + "SHA1", + "SHA-1", + "SHA256", + "SHA-256", + "RC4", + "Rabbit", + "AES", + "DES", + "PBKDF2", + "HMAC", + "OFB", + "CFB", + "CTR", + "CBC", + "Base64" + ], + "main": "index.js", + "dependencies": {} +} diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-ansix923.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-ansix923.js new file mode 100644 index 0000000000000000000000000000000000000000..f01f21e45cc2e54e78fe9968a42e4e0f9c5372e1 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-ansix923.js @@ -0,0 +1,49 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + return CryptoJS.pad.Ansix923; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-iso10126.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-iso10126.js new file mode 100644 index 0000000000000000000000000000000000000000..6e2aefd8394228ed4573b4294ff7f7a6a65649f1 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-iso10126.js @@ -0,0 +1,44 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + return CryptoJS.pad.Iso10126; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-iso97971.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-iso97971.js new file mode 100644 index 0000000000000000000000000000000000000000..41049b45fc335ce11af619c9af5622fc5cda4621 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-iso97971.js @@ -0,0 +1,40 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + return CryptoJS.pad.Iso97971; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-nopadding.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-nopadding.js new file mode 100644 index 0000000000000000000000000000000000000000..c7787c94d2e01d979ba45d2163b90ed05e902e35 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-nopadding.js @@ -0,0 +1,30 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + return CryptoJS.pad.NoPadding; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-pkcs7.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-pkcs7.js new file mode 100644 index 0000000000000000000000000000000000000000..3555168566e57e7baf9e13cdd48002ed92f8ea3e --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-pkcs7.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.pad.Pkcs7; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-zeropadding.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-zeropadding.js new file mode 100644 index 0000000000000000000000000000000000000000..0e8a859cfdcf13f16127ff18e7988e2c4f745a5b --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pad-zeropadding.js @@ -0,0 +1,45 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + i--; + } + data.sigBytes = i + 1; + } + }; + + + return CryptoJS.pad.ZeroPadding; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pbkdf2.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pbkdf2.js new file mode 100644 index 0000000000000000000000000000000000000000..1258251a58f9c46b68d9d7552680fa2010c25704 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/pbkdf2.js @@ -0,0 +1,145 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha1", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + return CryptoJS.PBKDF2; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rabbit-legacy.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rabbit-legacy.js new file mode 100644 index 0000000000000000000000000000000000000000..e118b6b6a28b3ddc6d1547e42f16f8f34715e486 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rabbit-legacy.js @@ -0,0 +1,190 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + return CryptoJS.RabbitLegacy; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rabbit.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rabbit.js new file mode 100644 index 0000000000000000000000000000000000000000..1b0683362026c7143324e142515310e6f80fde00 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rabbit.js @@ -0,0 +1,192 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + return CryptoJS.Rabbit; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rc4.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rc4.js new file mode 100644 index 0000000000000000000000000000000000000000..0e4bdff517f01602ac862305889b2fbaeee1bf36 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/rc4.js @@ -0,0 +1,139 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + return CryptoJS.RC4; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/ripemd160.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/ripemd160.js new file mode 100644 index 0000000000000000000000000000000000000000..24feb47c75f2ba14079a0fe0b2ec44e7bfc5f8b3 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/ripemd160.js @@ -0,0 +1,267 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<<n) | (x>>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + return CryptoJS.RIPEMD160; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha1.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha1.js new file mode 100644 index 0000000000000000000000000000000000000000..669114962a3ffcaebcf98cff345d2043f6ae5e45 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha1.js @@ -0,0 +1,150 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + return CryptoJS.SHA1; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha224.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha224.js new file mode 100644 index 0000000000000000000000000000000000000000..d8ce9885268313ae356a655ed641c71f5163c4f2 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha224.js @@ -0,0 +1,80 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + return CryptoJS.SHA224; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha256.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha256.js new file mode 100644 index 0000000000000000000000000000000000000000..de2d7fca1019d0e23a0f85055f28aaf51b7e0f21 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha256.js @@ -0,0 +1,199 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + return CryptoJS.SHA256; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha3.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha3.js new file mode 100644 index 0000000000000000000000000000000000000000..4fb27fe45e180331a225ada078d3311bab123bc8 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha3.js @@ -0,0 +1,323 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low;; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + return CryptoJS.SHA3; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha384.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha384.js new file mode 100644 index 0000000000000000000000000000000000000000..a0b95bf6328b2dae9d44554f35dfce7c82d57407 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha384.js @@ -0,0 +1,83 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha512"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + return CryptoJS.SHA384; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha512.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha512.js new file mode 100644 index 0000000000000000000000000000000000000000..335931585567e61d38c9fd4e1dfa96d3008051e1 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/sha512.js @@ -0,0 +1,323 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + var Wih = Wi.high = M[offset + i * 2] | 0; + var Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + var Wil = gamma0l + Wi7l; + var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + var Wil = Wil + gamma1l; + var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + var Wil = Wil + Wi16l; + var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + return CryptoJS.SHA512; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/tripledes.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/tripledes.js new file mode 100644 index 0000000000000000000000000000000000000000..c7becf3b70ad64bd271e718a73db61286f114356 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/tripledes.js @@ -0,0 +1,770 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); + this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); + this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + return CryptoJS.TripleDES; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/x64-core.js b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/x64-core.js new file mode 100644 index 0000000000000000000000000000000000000000..57dcc144b042207243d12dc0a488545ea4d794e6 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/crypto-js-3.1.9-1/x64-core.js @@ -0,0 +1,304 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/dashboard_1_operation.js b/src/vitis/vas/doc/suivi_prod_immo/js/dashboard_1_operation.js new file mode 100644 index 0000000000000000000000000000000000000000..541e16a22145f8c7c3576532bc129fafe1e175eb --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/dashboard_1_operation.js @@ -0,0 +1,137 @@ + +// Pie +var config = { + type: 'pie', + data: { + datasets: [{ + data: aDataSdpPrev, + backgroundColor: ['rgb(255, 159, 64)','rgb(54, 162, 235)','rgb(255, 205, 86)','rgb(112, 189, 59)','rgb(134, 59, 189)'], + label: 'Dataset 1' + }], + labels: ['Logements','Bureaux','Commerces','Activités - Industries','Équipements'] + }, + options: { + responsive: true, + legend: {position: 'bottom'}, + title: { + display: true, + text: 'Répartition de l\'opération prévisionnelle (SDP en m²)', + fontSize: 16, + fontStyle: 'normal' + }, + tooltips: { + callbacks: { + label: function(tooltipItem, data) { + var dataset = data.datasets[tooltipItem.datasetIndex]; + var total = dataset.data.reduce(function(previousValue, currentValue, currentIndex, array) { + return previousValue + currentValue; + }); + var currentValue = dataset.data[tooltipItem.index]; + var precentage = Math.floor(((currentValue/total) * 100)+0.5); + return currentValue + ' m² (' + precentage + "%)"; + } + } + } + } +}; + +var config2={ + type: 'bar', + data: { + labels: ['LOGEMENTS', 'BUREAUX', 'COMMERCES', 'ACTIVITÉS- INDUSTRIES', 'ÉQUIPEMENTS'], + datasets: [{ + label: 'prévisionnel', + backgroundColor: ['rgba(255,159,64,1)', 'rgba(54,162,235,1)', 'rgba(255,205,86,1)','rgba(112,189,59,1)','rgba(134,59,189,1)'], + stack: 'Stack 0', + data: aDataAvancementPrev + }, { + label: 'engagé', + backgroundColor: ['rgba(255,159,64,0.5)','rgba(54,162,235,0.5)','rgba(255,205,86,0.5)','rgba(112,189,59,0.5)','rgb(134,59,189,0.5)'], + stack: 'Stack 1', + data: aDataAvancementEngag + }] + }, + options: { + title: { + display: false, + text: 'Répartition des logements selon le type et la granulométrie', + fontSize: 16, + fontStyle: 'normal' + }, + legend: {position: 'right'}, + tooltips: {mode: 'index',intersect: false}, + responsive: true, + scales: {xAxes: [{stacked: true}], yAxes: [{stacked: true,scaleLabel: {display: true,labelString: 'SDP en m²'}}]} + } +}; + +var config3 = { + type: 'pie', + data: { + datasets: [{ + data: aDataGanulometrie, + backgroundColor: ['rgb(174,214,241)','rgb(93,173,226)','rgb(52, 152, 219 )','rgb(46, 134, 193)','rgb(40, 116, 166 )','rgb(33, 97, 140)'], + label: 'Dataset 2' + }], + labels: ['T1','T2','T3','T4','T5','T6 et +'] + }, + options: { + responsive: true, + legend: {position: 'bottom'}, + title: { + display: true, + text: 'Nombre de logements par granulométrie', + fontSize: 16, + fontStyle: 'normal' + }, + tooltips: { + callbacks: { + label: function(tooltipItem, data) { + var dataset = data.datasets[tooltipItem.datasetIndex]; + var total = dataset.data.reduce(function(previousValue, currentValue, currentIndex, array) { + return previousValue + currentValue; + }); + var currentValue = dataset.data[tooltipItem.index]; + var _label = data.labels[tooltipItem.index]; + var precentage = Math.floor(((currentValue/total) * 100)+0.5); + return _label + ' ' + precentage + "%"; + } + } + } + } +}; + +var config4={ + type: 'bar', + data: { + labels: ['T1', 'T2', 'T3', 'T4', 'T5', 'T6 et +'], + datasets: [ + {label: 'Accession', backgroundColor: 'rgb(33, 97, 140 )', stack: 'Stack 0', data: aDataGanulometrieAccession}, + {label: 'Location (sociale ou intermédiaire)', backgroundColor: 'rgb(52, 152, 219)', stack: 'Stack 0', data: aDataGanulometrieLoc}, + {label: 'Habitat spécifique', backgroundColor: 'rgb(174, 214, 241)', stack: 'Stack 1', data: aDataGanulometrieHabSpe} + ] + }, + options: { + title: { + display: true, + text: 'Répartition des logements selon le type et la granulométrie', + fontSize: 16, + fontStyle: 'normal' + }, + tooltips: {mode: 'index',intersect: false}, + responsive: true, + scales: {xAxes: [{stacked: true,}], yAxes: [{stacked: true}]} + } +}; +window.onload = function() { + var ctx = document.getElementById('chart_sdp').getContext('2d'); + window.myPie = new Chart(ctx, config); + var ctx2 = document.getElementById('barchart_avancement').getContext('2d'); + //var ctx2 = $('#barchart_avancement'); + // ctx2.height(100); + window.myBar = new Chart(ctx2, config2); + var ctx3 = document.getElementById('chart_granulometrie').getContext('2d'); + window.myPie3 = new Chart(ctx3, config3); + var ctx4 = document.getElementById('barchart_granulometrie').getContext('2d'); + window.myBar2 = new Chart(ctx4, config4); +}; \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/dashboard_4_logement.js b/src/vitis/vas/doc/suivi_prod_immo/js/dashboard_4_logement.js new file mode 100644 index 0000000000000000000000000000000000000000..541e16a22145f8c7c3576532bc129fafe1e175eb --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/dashboard_4_logement.js @@ -0,0 +1,137 @@ + +// Pie +var config = { + type: 'pie', + data: { + datasets: [{ + data: aDataSdpPrev, + backgroundColor: ['rgb(255, 159, 64)','rgb(54, 162, 235)','rgb(255, 205, 86)','rgb(112, 189, 59)','rgb(134, 59, 189)'], + label: 'Dataset 1' + }], + labels: ['Logements','Bureaux','Commerces','Activités - Industries','Équipements'] + }, + options: { + responsive: true, + legend: {position: 'bottom'}, + title: { + display: true, + text: 'Répartition de l\'opération prévisionnelle (SDP en m²)', + fontSize: 16, + fontStyle: 'normal' + }, + tooltips: { + callbacks: { + label: function(tooltipItem, data) { + var dataset = data.datasets[tooltipItem.datasetIndex]; + var total = dataset.data.reduce(function(previousValue, currentValue, currentIndex, array) { + return previousValue + currentValue; + }); + var currentValue = dataset.data[tooltipItem.index]; + var precentage = Math.floor(((currentValue/total) * 100)+0.5); + return currentValue + ' m² (' + precentage + "%)"; + } + } + } + } +}; + +var config2={ + type: 'bar', + data: { + labels: ['LOGEMENTS', 'BUREAUX', 'COMMERCES', 'ACTIVITÉS- INDUSTRIES', 'ÉQUIPEMENTS'], + datasets: [{ + label: 'prévisionnel', + backgroundColor: ['rgba(255,159,64,1)', 'rgba(54,162,235,1)', 'rgba(255,205,86,1)','rgba(112,189,59,1)','rgba(134,59,189,1)'], + stack: 'Stack 0', + data: aDataAvancementPrev + }, { + label: 'engagé', + backgroundColor: ['rgba(255,159,64,0.5)','rgba(54,162,235,0.5)','rgba(255,205,86,0.5)','rgba(112,189,59,0.5)','rgb(134,59,189,0.5)'], + stack: 'Stack 1', + data: aDataAvancementEngag + }] + }, + options: { + title: { + display: false, + text: 'Répartition des logements selon le type et la granulométrie', + fontSize: 16, + fontStyle: 'normal' + }, + legend: {position: 'right'}, + tooltips: {mode: 'index',intersect: false}, + responsive: true, + scales: {xAxes: [{stacked: true}], yAxes: [{stacked: true,scaleLabel: {display: true,labelString: 'SDP en m²'}}]} + } +}; + +var config3 = { + type: 'pie', + data: { + datasets: [{ + data: aDataGanulometrie, + backgroundColor: ['rgb(174,214,241)','rgb(93,173,226)','rgb(52, 152, 219 )','rgb(46, 134, 193)','rgb(40, 116, 166 )','rgb(33, 97, 140)'], + label: 'Dataset 2' + }], + labels: ['T1','T2','T3','T4','T5','T6 et +'] + }, + options: { + responsive: true, + legend: {position: 'bottom'}, + title: { + display: true, + text: 'Nombre de logements par granulométrie', + fontSize: 16, + fontStyle: 'normal' + }, + tooltips: { + callbacks: { + label: function(tooltipItem, data) { + var dataset = data.datasets[tooltipItem.datasetIndex]; + var total = dataset.data.reduce(function(previousValue, currentValue, currentIndex, array) { + return previousValue + currentValue; + }); + var currentValue = dataset.data[tooltipItem.index]; + var _label = data.labels[tooltipItem.index]; + var precentage = Math.floor(((currentValue/total) * 100)+0.5); + return _label + ' ' + precentage + "%"; + } + } + } + } +}; + +var config4={ + type: 'bar', + data: { + labels: ['T1', 'T2', 'T3', 'T4', 'T5', 'T6 et +'], + datasets: [ + {label: 'Accession', backgroundColor: 'rgb(33, 97, 140 )', stack: 'Stack 0', data: aDataGanulometrieAccession}, + {label: 'Location (sociale ou intermédiaire)', backgroundColor: 'rgb(52, 152, 219)', stack: 'Stack 0', data: aDataGanulometrieLoc}, + {label: 'Habitat spécifique', backgroundColor: 'rgb(174, 214, 241)', stack: 'Stack 1', data: aDataGanulometrieHabSpe} + ] + }, + options: { + title: { + display: true, + text: 'Répartition des logements selon le type et la granulométrie', + fontSize: 16, + fontStyle: 'normal' + }, + tooltips: {mode: 'index',intersect: false}, + responsive: true, + scales: {xAxes: [{stacked: true,}], yAxes: [{stacked: true}]} + } +}; +window.onload = function() { + var ctx = document.getElementById('chart_sdp').getContext('2d'); + window.myPie = new Chart(ctx, config); + var ctx2 = document.getElementById('barchart_avancement').getContext('2d'); + //var ctx2 = $('#barchart_avancement'); + // ctx2.height(100); + window.myBar = new Chart(ctx2, config2); + var ctx3 = document.getElementById('chart_granulometrie').getContext('2d'); + window.myPie3 = new Chart(ctx3, config3); + var ctx4 = document.getElementById('barchart_granulometrie').getContext('2d'); + window.myBar2 = new Chart(ctx4, config4); +}; \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/js/form.js b/src/vitis/vas/doc/suivi_prod_immo/js/form.js new file mode 100644 index 0000000000000000000000000000000000000000..b9f2cc943b768098ccdf62e7337295c306cb3da8 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/js/form.js @@ -0,0 +1,79 @@ + +$(document).ready(function(){ + + // bouton "Afficher la fiche" + $("#get_operation").on('click', function(event) { + var sIdOperation = $("#l_operation").val(); + if(sIdOperation==''){ + alert('Veuillez sélectioner une opération dans la liste.'); + }else{ + window.open('https://geo.urbalyon.org/doc/suivi_prod_immo/get_1_operation.php?token='+sToken+'&id_operation='+sIdOperation); + } + }); + $("#get_type").on('click', function(event) { + var iIdCommune = $("#l_commune").val(); + if(iIdCommune!='') iIdCommune='&id_commune='+iIdCommune; + var iIdCTM = ''; + if (iIdCommune==''){ + var iIdCTM = $("#l_ctm").val(); + if(iIdCTM!='') iIdCTM='&id_ctm='+iIdCTM; + if(iIdCTM==''){ + alert('Veuillez sélectioner une Conférence territoriale des Maires dans la liste.'); + } + } + if(iIdCTM!='' || iIdCommune!=''){ + // iIdCTM='&id_ctm='+iIdCTM; + // get code_procedure_amenagement + var iCodeProcedureAmenagement = $("#l_procedure_amenagement").val(); + if(iCodeProcedureAmenagement!='') iIdCTM=iIdCTM+'&code_procedure_amenagement='+iCodeProcedureAmenagement; + // get code_financement + var iCodeFinancement = $("#l_financement").val(); + if(iCodeFinancement!='') iIdCTM=iIdCTM+'&code_financement_equ_public='+iCodeFinancement; + // get code_suivi + var iCodeSuivi = $("#l_suivi").val(); + if(iCodeSuivi!='') iIdCTM=iIdCTM+'&code_suivi='+iCodeSuivi; + window.open('https://geo.urbalyon.org/doc/suivi_prod_immo/get_2_type.php?token='+sToken+iIdCommune+iIdCTM); + // alert('En cours de développement.'); + } + }); + $("#get_porteur").on('click', function(event) { + var sNomAmenageur = $("#l_amenageur").val(); + if(sNomAmenageur==''){ + alert('Veuillez sélectioner un aménageur dans la liste.'); + }else{ + window.open('https://geo.urbalyon.org/doc/suivi_prod_immo/get_3_porteur.php?token='+sToken+'&nom_amenageur='+sNomAmenageur); + } + }); + $("#get_logement").on('click', function(event) { + var sCodeFinancement = $("#l_financement").val(); + if (sCodeFinancement!='') sCodeFinancement='&code_financement='+sCodeFinancement; + var iIdCommune = $("#l_commune").val(); + if(iIdCommune!='') iIdCommune='&id_commune='+iIdCommune; + var iIdCTM = ''; + if (iIdCommune==''){ + var iIdCTM = $("#l_ctm").val(); + if(iIdCTM!='') iIdCTM='&id_ctm='+iIdCTM; + } + window.open('https://geo.urbalyon.org/doc/suivi_prod_immo/get_4_logement.php?token='+sToken+sCodeFinancement+iIdCommune+iIdCTM); + }); + + // bouton "Export" + $("#get_operation_excel").on('click', function(event) { + var sIdOperation = $("#l_operation").val(); + if (sIdOperation==''){ + alert('Veuillez sélectioner une opération dans la liste.'); + }else{ + // window.open('https://geo.urbalyon.org/doc/suivi_prod_immo/get_1_operation.php?token='+sToken+'&id_operation='+sIdOperation); + alert('En cours de développement.'); + } + }); + $("#get_porteur_excel").on('click', function(event) { + var sNomAmenageur = $("#l_amenageur").val(); + if(sNomAmenageur==''){ + alert('Veuillez sélectioner un aménageur dans la liste.'); + }else{ + window.open('https://geo.urbalyon.org/doc/suivi_prod_immo/get_3_porteur_excel.php?token='+sToken+'&nom_amenageur='+sNomAmenageur); + } + }); + +}); \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/lib/Encryption.php b/src/vitis/vas/doc/suivi_prod_immo/lib/Encryption.php new file mode 100644 index 0000000000000000000000000000000000000000..a9d4dac38dcf31ba90a4eaa7f010bd45692c7b1c --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/lib/Encryption.php @@ -0,0 +1,110 @@ +<?php + + +/** + * Encryption class for encrypt/decrypt that works between programming languages. + * + * @author Vee Winch. + * @link https://stackoverflow.com/questions/41222162/encrypt-in-php-openssl-and-decrypt-in-javascript-cryptojs Reference. + */ +class Encryption +{ + + + /** + * @link http://php.net/manual/en/function.openssl-get-cipher-methods.php Available methods. + * @var string Cipher method. Recommended AES-128-CBC, AES-192-CBC, AES-256-CBC + */ + protected $encryptMethod = 'AES-256-CBC'; + + + /** + * Decrypt string. + * + * @link https://stackoverflow.com/questions/41222162/encrypt-in-php-openssl-and-decrypt-in-javascript-cryptojs Reference. + * @param string $encryptedString The encrypted string that is base64 encode. + * @param string $key The key. + * @return mixed Return original string value. Return null for failure get salt, iv. + */ + public function decrypt($encryptedString, $key) + { + $json = json_decode(base64_decode($encryptedString), true); + + try { + $salt = hex2bin($json["salt"]); + $iv = hex2bin($json["iv"]); + } catch (Exception $e) { + return null; + } + + $cipherText = base64_decode($json['ciphertext']); + + $iterations = intval(abs($json['iterations'])); + if ($iterations <= 0) { + $iterations = 999; + } + $hashKey = hash_pbkdf2('sha512', $key, $salt, $iterations, ($this->encryptMethodLength() / 4)); + unset($iterations, $json, $salt); + + $decrypted= openssl_decrypt($cipherText , $this->encryptMethod, hex2bin($hashKey), OPENSSL_RAW_DATA, $iv); + unset($cipherText, $hashKey, $iv); + + return $decrypted; + }// decrypt + + + /** + * Encrypt string. + * + * @link https://stackoverflow.com/questions/41222162/encrypt-in-php-openssl-and-decrypt-in-javascript-cryptojs Reference. + * @param string $string The original string to be encrypt. + * @param string $key The key. + * @return string Return encrypted string. + */ + public function encrypt($string, $key) + { + $ivLength = openssl_cipher_iv_length($this->encryptMethod); + $iv = openssl_random_pseudo_bytes($ivLength); + + $salt = openssl_random_pseudo_bytes(256); + $iterations = 999; + $hashKey = hash_pbkdf2('sha512', $key, $salt, $iterations, ($this->encryptMethodLength() / 4)); + + $encryptedString = openssl_encrypt($string, $this->encryptMethod, hex2bin($hashKey), OPENSSL_RAW_DATA, $iv); + + $encryptedString = base64_encode($encryptedString); + unset($hashKey); + + $output = ['ciphertext' => $encryptedString, 'iv' => bin2hex($iv), 'salt' => bin2hex($salt), 'iterations' => $iterations]; + unset($encryptedString, $iterations, $iv, $ivLength, $salt); + + return base64_encode(json_encode($output)); + }// encrypt + + + /** + * Get encrypt method length number (128, 192, 256). + * + * @return integer. + */ + protected function encryptMethodLength() + { + $number = filter_var($this->encryptMethod, FILTER_SANITIZE_NUMBER_INT); + + return intval(abs($number)); + }// encryptMethodLength + + + /** + * Set encryption method. + * + * @link http://php.net/manual/en/function.openssl-get-cipher-methods.php Available methods. + * @param string $cipherMethod + */ + public function setCipherMethod($cipherMethod) + { + $this->encryptMethod = $cipherMethod; + }// setCipherMethod + + +} \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/login.php b/src/vitis/vas/doc/suivi_prod_immo/login.php new file mode 100644 index 0000000000000000000000000000000000000000..7dd5e25c5e4fad0c10381ccde23edbc7edc5a2ef --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/login.php @@ -0,0 +1,40 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/login.php?login=fabien +session_start(); + +if (isset($_REQUEST['login']) && !is_null($_REQUEST['login'])){ + $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; + if (isset($_REQUEST['password']) && !is_null($_REQUEST['password'])){ + // Try to log + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + require 'lib/Encryption.php'; + $Encryption = new Encryption(); + $sPassword=$Encryption->decrypt($_REQUEST['password'], $_REQUEST['encrypt_key']); + $aReturn['password']=$sPassword; + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $_REQUEST['login'], $sPassword); + if($oConn){ + // store session + $sToken = md5(uniqid()); + $_SESSION['token_bd_prod_immo']=$sToken; + // connect + $aReturn['location']=$properties['access_page']; + $aReturn['token']=$sToken; + }else{ + $aReturn['error']="Erreur de connexion vérifier vos identifiants."; + } + }catch (PDOException $e){ + $aReturn['error']="Erreur : ".$e->getMessage(); + } + }else{ + $aReturn['error']="Erreur pas de mot de passe."; + } +}else{ + $aReturn['error']="Erreur pas de login."; +} + +header('Content-type: application/json'); +echo json_encode($aReturn); + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/properties_suivi_prod_immo.inc b/src/vitis/vas/doc/suivi_prod_immo/properties_suivi_prod_immo.inc new file mode 100644 index 0000000000000000000000000000000000000000..6f2487334242c49bee4f68323ea095ac4b1598f7 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/properties_suivi_prod_immo.inc @@ -0,0 +1,14 @@ +<?php + +// BD +$properties['db_prod_immo']='suivi_prod_immo'; +$properties['db_user_prod_immo']='prod_immo'; +$properties['db_pass_prod_immo']='urbalyon6!'; +$properties['schema_prod_immo']='prod_immo'; +// page d'acceuil +$properties['access_page']='form_1_operation.php'; + +$properties['server'] = 'srv-postgres'; +$properties['port'] = 5432; + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/signin.html b/src/vitis/vas/doc/suivi_prod_immo/signin.html new file mode 100644 index 0000000000000000000000000000000000000000..f7b044c9f06442450629f6137c22b7fbd0ef70cf --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/signin.html @@ -0,0 +1,79 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>BD PROD IMMO - Analyse</title> + <link rel="stylesheet" href="css/bootstrap_4.3.1/bootstrap.min.css"> + <link rel="stylesheet" href="css/signin.css"> +</head> +<body> + <div class="container"> + <div class="row"> + <div class="col-sm-6 offset-sm-3 text-center"> + <form class="form-signin"> + <img class="mb-4" src="images/urbalyon.png" alt="Urbalyon" width="150" height="150"> + <div class="alert alert-danger" role="alert" id="alert_box"><span data-feather="alert-triangle"></span></div> + <h1 class="h3 mb-3 font-weight-normal">Veuillez vous identifier</h1> + <label for="login" class="sr-only">Utilisateur</label> + <input type="text" id="login" class="form-control" placeholder="Utilisateur" <?php echo ($sLogin!='') ? 'value="'.$sLogin.'"' : 'autofocus'; ?> required> + <label for="password" class="sr-only">Mot de passe</label> + <input type="password" id="password" class="form-control" placeholder="Mot de passe" required <?php if($sLogin!='') echo 'autofocus'; ?>> + <!--<div class="checkbox mb-3"> + <label> + <input type="checkbox" value="remember-me"> Se souvenir de moi + </label> + </div>--> + <button class="btn btn-lg btn-primary btn-block" type="submit" id="submit">Connexion</button> + <p class="mt-5 mb-3 text-muted">Urbalyon © 2019</p> + </form> + </div> + </div> + </div> + <!-- Icons --> + <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> + <script> + feather.replace(); + </script> + <script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script> + <script src="js/crypto-js-3.1.9-1/crypto-js.js"></script><!-- https://github.com/brix/crypto-js/releases crypto-js.js can be download from here --> + <script src="js/Encryption.js"></script> +</body> +</html> + +<script> +var sEncryptKey = '<?php echo $randomString; ?>'; + + $(document).ready(function(){ + let encryption = new Encryption(); + + $("#alert_box").hide(); + $("#submit").click(function(e){ + $("#alert_box").hide(); + e.preventDefault(); + $.post( + 'login.php', + { + login : $("#login").val(), + password : encryption.encrypt($("#password").val(), sEncryptKey), + encrypt_key : sEncryptKey + }, + + function(data){ + data2=JSON.parse(data); + if (typeof data2.error == "undefined") { + // connected + window.location.href = data2.location+"?token="+data2.token; + }else{ + // error + $("#alert_box").html('<span data-feather="alert-triangle"></span> '+data2.error); + feather.replace(); + $("#alert_box").show(); + } + }, + 'text' + ); + }); +}); + +</script> diff --git a/src/vitis/vas/doc/suivi_prod_immo/signin.php b/src/vitis/vas/doc/suivi_prod_immo/signin.php new file mode 100644 index 0000000000000000000000000000000000000000..ecbd0debf88cf0d2a2fa0a08ce5529bac5c98ad2 --- /dev/null +++ b/src/vitis/vas/doc/suivi_prod_immo/signin.php @@ -0,0 +1,47 @@ +<?php +// https://geo.urbalyon.org/doc/suivi_prod_immo/signin.php?login=fabien +session_start(); + +//Genrate Random Key +$characters = '0123456789abcdefghijklmnopqrstuvwxyz'; +$charactersLength = strlen($characters); +$randomString = ''; +for ($i = 0; $i < 32; $i++){ + $randomString .= $characters[rand(0, $charactersLength - 1)]; +} + +$sLogin=''; +if (isset($_REQUEST['login']) && !is_null($_REQUEST['login'])){ + $sLogin=$_REQUEST['login']; + $_SESSION['login_bd_prod_immo']=$_REQUEST['login']; +}else{ + if (isset($_SESSION['login_bd_prod_immo']) && !is_null($_SESSION['login_bd_prod_immo'])) $sLogin=$_SESSION['login_bd_prod_immo']; +} + + /*if (isset($_REQUEST['password']) && !is_null($_REQUEST['password'])){ + // Try to log + require_once("../../rest/conf/properties.inc"); + require_once("properties_suivi_prod_immo.inc"); + try{ + $oConn = new PDO('pgsql:host='.$properties['server'].';port='.$properties['port'].';dbname='.$properties['db_prod_immo'], $sLogin, $_REQUEST['password']); + if($oConn){ + // store session + $sToken = md5(uniqid()); + $_SESSION['token_bd_prod_immo']=$sToken; + // connect + header ('location: '.$properties['access_page'].'?token='.$sToken); + exit(); + }else{ + $sError="Erreur de connexion vérifier vos identifiants."; + include ('signin.html'); + } + }catch (PDOException $e){ + $sError="ERROR : ".$e->getMessage(); + include ('signin.html'); + } + }else{ + include ('signin.html'); + } */ +include ('signin.html'); + +?> \ No newline at end of file diff --git a/src/vitis/vas/doc/suivi_prod_immo/template/template_3_porteur.xlsx b/src/vitis/vas/doc/suivi_prod_immo/template/template_3_porteur.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e390a2ba63a8fe259627e6bdb85135219cc6b1ea Binary files /dev/null and b/src/vitis/vas/doc/suivi_prod_immo/template/template_3_porteur.xlsx differ diff --git a/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc b/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc index ebc3ce8da5e35139d1d9353169bcfb7df3a1d94f..a09f027dea5edbb811af6b771f5301118943d56b 100755 --- a/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc +++ b/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc @@ -28,6 +28,8 @@ class Files_manager{ // Dans tous les cas on peut avoir besoin d'accéder au système local $this->oLocalInterface = new Local_files ($oProperties); // Séléction du mode principal + error_log('File System : '); + error_log($oProperties["filesystem"]); switch ($oProperties["filesystem"]) { case 'fs': $this->oFileInterface = $this->oLocalInterface;