diff --git a/.travis.yml b/.travis.yml index ed046ac10..4cad6d16b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,16 +21,3 @@ script: after_success: - ./scripts/publish-ghpages.sh -t docs - -# OpenShift expects its deployment branch to be "master-dist". This can be changed using: -# rhc app-configure patternfly/angular --deployment-branch master-dist -deploy: - provider: openshift - user: "$OPENSHIFT_USER" - password: "$OPENSHIFT_PWD" - domain: "patternfly" - app: angular - skip_cleanup: true - on: # The branch and repo that triggered the build - branch: master - condition: $TRAVIS_REPO_SLUG = "patternfly/angular-patternfly" \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 12aa4b709..8a4aacc3b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -65,15 +65,9 @@ module.exports = function (grunt) { dest: 'docs', expand: true }, - styles: { - cwd: 'styles/', - src: ['*.css', '!*.min.css'], - dest: 'dist/styles', - expand: true - }, img: { cwd: 'misc/', - src: 'patternfly-orb.svg', + src: ['patternfly-orb.svg', '*.png'], dest: 'docs/img', expand: true }, @@ -82,13 +76,30 @@ module.exports = function (grunt) { src: ['**'], dest: 'dist/docs', expand: true + }, + distimg: { + cwd: 'misc', + src: ['canvas-dot-grid.png'], + dest: 'dist/imgs', + expand: true + } + }, + less: { + patternfly: { + files: { + 'dist/styles/angular-patternfly.css': 'styles/angular-patternfly.less' + }, + options: { + paths: ['src/less/'], + strictMath: true + } } }, cssmin: { target: { files: [{ expand: true, - cwd: 'styles', + cwd: 'dist/styles', src: ['*.css', '!*.min.css'], dest: 'dist/styles', ext: '.min.css' @@ -126,6 +137,7 @@ module.exports = function (grunt) { image: 'misc/logo-alt.svg', scripts: [ 'node_modules/jquery/dist/jquery.js', + 'node_modules/components-jqueryui/jquery-ui.min.js', 'node_modules/datatables.net/js/jquery.dataTables.js', 'node_modules/datatables.net-select/js/dataTables.select.js', 'node_modules/moment/moment.js', @@ -135,6 +147,7 @@ module.exports = function (grunt) { 'node_modules/patternfly/dist/js/patternfly-settings-colors.js', 'node_modules/patternfly/dist/js/patternfly-settings-charts.js', 'node_modules/angular/angular.js', + 'node_modules/angular-dragdrop/src/angular-dragdrop.js', 'node_modules/angular-datatables/dist/angular-datatables.min.js', 'node_modules/angular-datatables/dist/plugins/select/angular-datatables.select.min.js', 'node_modules/angular-sanitize/angular-sanitize.js', @@ -143,7 +156,8 @@ module.exports = function (grunt) { 'misc/angular-bootstrap-prettify.js', 'node_modules/lodash/lodash.min.js', 'dist/angular-patternfly.js', - 'node_modules/angular-ui-router/release/angular-ui-router.min.js'], + 'node_modules/angular-ui-router/release/angular-ui-router.min.js', + 'node_modules/angular-drag-and-drop-lists/angular-drag-and-drop-lists.js'], html5Mode: false, template: 'grunt-ngdocs-index.tmpl', styles: ['node_modules/datatables.net-dt/css/jquery.dataTables.css', @@ -233,6 +247,11 @@ module.exports = function (grunt) { cwd: 'src/', src: ['wizard/**/*.html'], dest: 'templates/wizard.js' + }, + 'patternfly.canvas': { + cwd: 'src/', + src: ['canvas-view/**/*.html'], + dest: 'templates/canvas.js' } }, // ng-annotate tries to make the code safe for minification automatically @@ -270,7 +289,7 @@ module.exports = function (grunt) { tasks: ['test'] }, all: { - files: ['Gruntfile.js', 'src/**/*.js', 'src/**/*.html', 'styles/**/*.css'], + files: ['Gruntfile.js', 'src/**/*.js', 'src/**/*.html', 'styles/**/*.css', '**/*.less'], tasks: ['build'], options: { livereload: 35722 @@ -279,7 +298,7 @@ module.exports = function (grunt) { } }); - grunt.registerTask('copymain', ['copy:docdata', 'copy:fa', 'copy:styles', 'copy:img']); + grunt.registerTask('copymain', ['copy:docdata', 'copy:fa', 'copy:img', 'copy:distimg']); // You can specify which modules to build as arguments of the build task. grunt.registerTask('build', 'Create bootstrap build files', function () { @@ -299,13 +318,13 @@ module.exports = function (grunt) { concatSrc = 'src/**/*.js'; } - grunt.task.run(['clean', 'lint', 'test', 'ngtemplates', 'concat', 'ngAnnotate', 'uglify:build', 'cssmin', 'copymain', 'ngdocs', 'clean:templates']); + grunt.task.run(['clean', 'lint', 'test', 'ngtemplates', 'concat', 'ngAnnotate', 'uglify:build', 'less', 'cssmin', 'copymain', 'ngdocs', 'clean:templates']); }); // Runs all the tasks of build with the exception of tests grunt.registerTask('deploy', 'Prepares the project for deployment. Does not run unit tests', function () { var concatSrc = 'src/**/*.js'; - grunt.task.run(['clean', 'lint', 'ngtemplates', 'concat', 'ngAnnotate', 'uglify:build', 'cssmin', 'copymain', 'ngdocs', 'clean:templates']); + grunt.task.run(['clean', 'lint', 'ngtemplates', 'concat', 'ngAnnotate', 'uglify:build', 'less', 'cssmin', 'copymain', 'ngdocs', 'clean:templates']); }); grunt.registerTask('default', ['build']); diff --git a/README.md b/README.md index 149614736..6336b09fb 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This project will provide a set of common AngularJS directives for use with the PatternFly reference implementation. * Web site: https://www.patternfly.org -* API Docs: http://angular-patternfly.rhcloud.com/#/api +* API Docs: http://www.patternfly.org/angular-patternfly/#/api * Build Status: https://travis-ci.org/patternfly/angular-patternfly.svg?branch=master ## Getting started @@ -80,7 +80,7 @@ Note: 5. (optional) The 'patternfly.charts' module is not a dependency in the default angular 'patternfly' module. - In order to use patternfly charts you must add 'patternfly.charts' as a dependency in your application: + In order to use patternfly charts you must add it as a dependency in your application: my-app.module.js: @@ -89,6 +89,61 @@ Note: 'patternfly.charts' ]); +6. (optional) The 'patternfly.table' module is not a dependency in the default angular 'patternfly' module. + In order to use pfTableView, you must add 'patternfly.table' as a dependency in your application: + + my-app.module.js: + + angular.module('myApp', [ + 'patternfly', + 'patternfly.table' + ]); + + Add the following CSS includes to your HTML file(s): + + + + + Add the following Javascript includes to your HTML file(s): + + + + + + + +7. (optional) The 'patternfly.canvas' module is not a dependency in the default angular 'patternfly' module. + In order to use pfCanvasEditor or pfCanvas, you must add 'patternfly.canvas' as a dependency in your application: + + my-app.module.js: + + angular.module('myApp', [ + 'patternfly', + 'patternfly.canvas' + ]); + + Add the following Javascript includes to your HTML file(s): + + + + + + + + + + + Also, the canvas background grid image is located in 'node_modules/angular-patternfly/dist/imgs/canvas-dot-grid.png' + please copy this image to your application's main images directory and reference it by overridding the '.canvas' css + class: + + + ### Using with Webpack In order to use Angular-Patternfly in a Webpack-bundled application there are some things you need to keep in mind: diff --git a/bower.json b/bower.json index 546428e0a..9d47976da 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "angular-patternfly", - "version": "4.0.0-alpha.2", + "version": "4.0.0-alpha.3", "authors": [ "Red Hat" ], @@ -39,13 +39,15 @@ "dependencies": { "angular": "1.5.*", "angular-animate": "1.5.*", - "angular-sanitize": "1.5.*", "angular-bootstrap": "2.2.x", - "lodash": "4.x", + "angular-dragdrop": "1.0.13", "angular-datatables": "^0.5.6", + "angular-drag-and-drop-lists": "2.0.0", + "angular-sanitize": "1.5.*", "datatables.net": "^1.10.12", "datatables.net-select": "~1.2.0", - "patternfly": "~4.0.0-alpha.2" + "lodash": "4.x", + "patternfly": "~4.0.0-alpha.3" }, "devDependencies": { "angular-mocks": "1.5.*", diff --git a/dist/angular-patternfly.js b/dist/angular-patternfly.js index 0c084f2bd..99ce919eb 100644 --- a/dist/angular-patternfly.js +++ b/dist/angular-patternfly.js @@ -1,4 +1,12 @@ /** + * @name patternfly canvas + * + * @description + * Canvas module for patternfly. + * + */ +angular.module('patternfly.canvas', ['dragging', 'ngDragDrop', 'ui.bootstrap']); +;/** * @name patternfly card * * @description @@ -122,7 +130,7 @@ angular.module( 'patternfly.utils', ['ui.bootstrap'] ); * Views module for patternfly. * */ -angular.module('patternfly.views', ['patternfly.utils', 'patternfly.filters', 'patternfly.sort', 'patternfly.charts']); +angular.module('patternfly.views', ['patternfly.utils', 'patternfly.filters', 'patternfly.sort', 'patternfly.charts', 'dndLists']); ;/** * @name PatternFly Wizard * @@ -193,242 +201,2957 @@ angular.module('patternfly.autofocus', []).directive('pfFocused', ["$timeout", f } }; }]); -;/** - * @ngdoc directive - * @name patternfly.card.component:pfAggregateStatusCard - * @restrict E - * - * @param {object} status Status configuration information
- * - * When layout='mini', only one notification can be specified:
- * - * @param {boolean=} show-top-border Show/hide the top border, true shows top border, false (default) hides top border - * @param {string=} layout Various alternative layouts the aggregate status card may have:
- * - * @deprecated {boolean=} alt-layout Display the aggregate status card in a 'alternate tall' layout. false (default) displays normal layout, true displays tall layout - * - * @description - * Component for easily displaying status information - * - * @example - +;(function () { + 'use strict'; - -
-
- - -
- - -
- - - -
- - -
- - (depreciated, use layout = 'tall' instead) -

- -
-
-
+ angular.module('patternfly.canvas').component('pfCanvasEditor', { - - angular.module( 'patternfly.card' ).controller( 'CardDemoCtrl', function( $scope ) { - $scope.status = { - "title":"Nodes", - "count":793, - "href":"#", - "iconClass": "fa fa-shield", - "notifications":[ - { - "iconClass":"pficon pficon-error-circle-o", - "count":4, - "href":"#" - }, - { - "iconClass":"pficon pficon-warning-triangle-o", - "count":1 - } - ] - }; + bindings: { + chartDataModel: "=", + chartViewModel: "=?", + toolboxTabs: "=", + readOnly: 'ul").addClass('nav-tabs-pf'); + angular.element("#filterFld").focus(); + }); + }; + + ctrl.hideToolbox = function () { + ctrl.toolboxVisible = false; + }; + + ctrl.toggleToolbox = function () { + if (!ctrl.readOnly && !ctrl.chartViewModel.inConnectingMode) { + if (ctrl.toolboxVisible === true) { + ctrl.hideToolbox(); + } else { + ctrl.showToolbox(); + } } - }; - }); - + }; -
- */ + ctrl.tabClicked = function () { + angular.element("#filterFld").focus(); + }; -angular.module( 'patternfly.card' ).component('pfAggregateStatusCard', { - bindings: { - status: '=', - showTopBorder: '@?', - altLayout: '@?', - layout: '@?' - }, - templateUrl: 'card/aggregate-status/aggregate-status-card.html', - controller: function () { - 'use strict'; - var ctrl = this; - ctrl.$onInit = function () { - ctrl.shouldShowTopBorder = (ctrl.showTopBorder === 'true'); - ctrl.isAltLayout = (ctrl.altLayout === 'true' || ctrl.layout === 'tall'); - ctrl.isMiniLayout = (ctrl.layout === 'mini'); - }; - } -}); -;/** - * @ngdoc directive - * @name patternfly.card.component:pfCard - Utilization - * @restrict E - * - * @param {string} headTitle Title for the card - * @param {string=} subTitle Sub-Title for the card - * @param {boolean=} showTopBorder Show/Hide the blue top border. True shows top border, false (default) hides top border - * @param {boolean=} showTitlesSeparator Show/Hide the grey line between the title and sub-title. - * True (default) shows the line, false hides the line - * @param {object=} footer footer configuration properties:
- * - * *Note: If a href link and a callBackFn are specified, the href link will be called - * @param {object=} filter filter configuration properties:
- * - * @description - * Component for easily displaying a card with html content - * - * @example - + /*** Toolbox ***/ - -
- - - - - - - -
-
- - angular.module( 'demo', ['patternfly.charts', 'patternfly.card'] ).controller( 'ChartCtrl', function( $scope ) { + ctrl.startCallback = function (event, ui, item) { + ctrl.draggedItem = item; + }; - $scope.title2 = 'Memory'; - $scope.units2 = 'GB'; + ctrl.dropCallback = function (event, ui) { + var newNode = angular.copy(ctrl.draggedItem); + newNodeCount++; + newNode.x = event.clientX - 600; + newNode.y = event.clientY - 200; + newNode.backgroundColor = newNode.backgroundColor ? newNode.backgroundColor : '#fff'; - $scope.data2 = { - 'used': '25', - 'total': '100' - }; + ctrl.chartViewModel.addNode(newNode); + }; - $scope.title3 = 'CPU Usage'; - $scope.units3 = 'MHz'; + ctrl.addNodeByClick = function (item) { + var newNode = angular.copy(item); + newNodeCount++; + newNode.x = 250 + (newNodeCount * 4 + 160); + newNode.y = 200 + (newNodeCount * 4 + 160); + newNode.backgroundColor = newNode.backgroundColor ? newNode.backgroundColor : '#fff'; - $scope.data3 = { - 'used': '420', - 'total': '500', - }; + ctrl.chartViewModel.addNode(newNode); + }; - $scope.title4 = 'Disk Usage'; - $scope.units4 = 'TB'; - $scope.data4 = { - 'used': '350', - 'total': '500', - }; + ctrl.tabClicked = function () { + angular.element("#filterFld").focus(); + }; - $scope.title5 = 'Disk I/O'; - $scope.units5 = 'I/Ops'; - $scope.data5 = { - 'used': '450', - 'total': '500', - }; + ctrl.activeTab = function () { + return ctrl.toolboxTabs.filter(function (tab) { + return tab.active; + })[0]; + }; - $scope.layoutInline = { - 'type': 'inline' - }; - }); - -
- */ -angular.module('patternfly.card').component('pfCard', { + ctrl.activeSubTab = function () { + var activeTab = ctrl.activeTab(); + if (activeTab && activeTab.subtabs) { + return activeTab.subtabs.filter(function (subtab) { + return subtab.active; + })[0]; + } + }; + + ctrl.activeSubSubTab = function () { + var activeSubTab = ctrl.activeSubTab(); + if (activeSubTab && activeSubTab.subtabs) { + return activeSubTab.subtabs.filter(function (subsubtab) { + return subsubtab.active; + })[0]; + } + }; + + /*** Zoom ***/ + + ctrl.maxZoom = function () { + if (ctrl.chartViewModel && ctrl.chartViewModel.zoom) { + return ctrl.chartViewModel.zoom.isMax(); + } + + return false; + }; + + ctrl.minZoom = function () { + if (ctrl.chartViewModel && ctrl.chartViewModel.zoom) { + return ctrl.chartViewModel.zoom.isMin(); + } + + return false; + }; + + ctrl.zoomIn = function () { + ctrl.chartViewModel.zoom.in(); + }; + + ctrl.zoomOut = function () { + ctrl.chartViewModel.zoom.out(); + }; + }] // controller + }); // module +})(); +;/* eslint-disable */ +(function() { + 'use strict'; + + angular.module('patternfly.canvas') + .directive('toolboxItems', toolboxItemsDirective); + + function toolboxItemsDirective() { + var directive = { + restrict: 'E', + scope: { + items: '=', + startDragCallback: '=', + clickCallback: '=', + searchText: '=' + }, + controller: toolboxItemsController, + templateUrl: 'canvas-view/canvas-editor/toolbox-items.html', + controllerAs: 'vm', + bindToController: true + }; + + return directive; + + function toolboxItemsController() { + var vm = this; + + vm.clickCallbackfmDir = function(item) { + if (!item.disableInToolbox) { + vm.clickCallback(item); + } + }; + + vm.startDragCallbackfmDir = function(event, ui, item) { + vm.startDragCallback(event, ui, item); + }; + } + } +})(); +;(function () { + 'use strict'; + + angular.module('patternfly.canvas') + .filter('trustAsResourceUrl', ['$sce', function ($sce) { + return function (val) { + return $sce.trustAsResourceUrl(val); + }; + }]) + + // + // Directive that generates the rendered chart from the data model. + // + .directive('pfCanvas', ["$document", function ($document) { + return { + restrict: 'E', + templateUrl: "canvas-view/canvas/canvas.html", + replace: true, + scope: { + chartDataModel: "=", + chartViewModel: "=?", + readOnly: "=?", + hideConnectors: "=?" + }, + controller: 'CanvasController', + link: link + }; + function link (scope) { + var deleteKeyCode = 46; + var ctrlKeyCode = 17; + var ctrlDown = false; + var aKeyCode = 65; + var dKeyCode = 68; + var escKeyCode = 27; + + $document.find('body').keydown(function (evt) { + if (evt.keyCode === ctrlKeyCode) { + ctrlDown = true; + evt.stopPropagation(); + evt.preventDefault(); + } + + if (evt.keyCode === aKeyCode && ctrlDown) { + // + // Ctrl + A + // + scope.selectAll(); + scope.$digest(); + evt.stopPropagation(); + evt.preventDefault(); + } + }); + + $document.find('body').keyup(function (evt) { + if (evt.keyCode === deleteKeyCode) { + scope.deleteSelected(); + scope.$digest(); + } + + if (evt.keyCode === escKeyCode) { + scope.deselectAll(); + scope.$digest(); + } + + if (evt.keyCode === ctrlKeyCode) { + ctrlDown = false; + evt.stopPropagation(); + evt.preventDefault(); + } + }); + } + }]) + // + // Controller for the canvas directive. + // Having a separate controller is better for unit testing, otherwise + // it is painful to unit test a directive without instantiating the DOM + // (which is possible, just not ideal). + // + .controller('CanvasController', ['$scope', 'dragging', '$element', '$document', function CanvasController ($scope, dragging, $element, $document) { + var controller = this; + + $scope.chart = new pfCanvas.ChartViewModel($scope.chartDataModel); + $scope.chartViewModel = $scope.chart; + // + // Reference to the document and jQuery, can be overridden for testting. + // + this.document = document; + + // + // Wrap jQuery so it can easily be mocked for testing. + // + this.jQuery = function (element) { + return angular.element(element); + }; + + // + // Init data-model variables. + // + $scope.draggingConnection = false; + $scope.connectorSize = 6; + $scope.dragSelecting = false; + + // + // Reference to the connection, connector or node that the mouse is currently over. + // + $scope.mouseOverConnector = null; + $scope.mouseOverConnection = null; + $scope.mouseOverNode = null; + + // + // The class for connections and connectors. + // + this.connectionClass = 'connection'; + this.connectorClass = 'connector'; + this.nodeClass = 'node'; + + // + // Translate the coordinates so they are relative to the svg element. + // + this.translateCoordinates = function (x, y, evt) { + var svgElem = $element.get(0); + var matrix = svgElem.getScreenCTM(); + var point = svgElem.createSVGPoint(); + point.x = (x - evt.view.pageXOffset) / $scope.zoomLevel(); + point.y = (y - evt.view.pageYOffset) / $scope.zoomLevel(); + + return point.matrixTransform(matrix.inverse()); + }; + + $scope.hideConnectors = $scope.hideConnectors ? $scope.hideConnectors : false; + + $scope.isConnectorConnected = function (connector) { + return (connector && connector.connected()); + }; + + $scope.isConnectorUnconnectedAndValid = function (connector) { + return (connector && !connector.connected() && !connector.invalid() && + connector.parentNode() !== $scope.connectingModeSourceNode); + }; + + // determins if a dest. connector is connected to the source node + $scope.isConnectedTo = function (connector, node) { + var i,connection; + var connections = $scope.chart.connections; + for (i = 0; i < connections.length; i++) { + connection = connections[i]; + if (connection.dest === connector && connection.source.parentNode() === node) { + return true; + } + } + + return false; + }; + + $scope.availableConnections = function () { + return $scope.chart.validConnections; + }; + + $scope.foreignObjectSupported = function () { + return $document[0].implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Extensibility', '1.1'); + }; + + $scope.addNodeToCanvas = function (newNode) { + $scope.chart.addNode(newNode); + }; + + $scope.$on('selectAll', function (evt, args) { + $scope.selectAll(); + }); + + $scope.selectAll = function () { + $scope.chart.selectAll(); + }; + + $scope.$on('deselectAll', function (evt, args) { + $scope.deselectAll(); + }); + + $scope.deselectAll = function () { + $scope.chart.deselectAll(); + }; + + $scope.$on('deleteSelected', function (evt, args) { + $scope.deleteSelected(); + }); + + $scope.deleteSelected = function () { + $scope.chart.deleteSelected(); + }; + + // + // Called on mouse down in the chart. + // + $scope.mouseDown = function (evt) { + if ($scope.readOnly) { + return; + } + + if ($scope.chart.inConnectingMode ) { + // camceling out of connection mode, remove unused output connector + $scope.cancelConnectingMode(); + } + + $scope.chart.deselectAll(); + + $scope.chart.clickedOnChart = true; + + dragging.startDrag(evt, { + + // + // Commence dragging... setup variables to display the drag selection rect. + // + dragStarted: function (x, y) { + var startPoint; + $scope.dragSelecting = true; + startPoint = controller.translateCoordinates(x, y, evt); + $scope.dragSelectionStartPoint = startPoint; + $scope.dragSelectionRect = { + x: startPoint.x, + y: startPoint.y, + width: 0, + height: 0, + }; + }, + + // + // Update the drag selection rect while dragging continues. + // + dragging: function (x, y) { + var startPoint = $scope.dragSelectionStartPoint; + var curPoint = controller.translateCoordinates(x, y, evt); + + $scope.dragSelectionRect = { + x: curPoint.x > startPoint.x ? startPoint.x : curPoint.x, + y: curPoint.y > startPoint.y ? startPoint.y : curPoint.y, + width: curPoint.x > startPoint.x ? curPoint.x - startPoint.x : startPoint.x - curPoint.x, + height: curPoint.y > startPoint.y ? curPoint.y - startPoint.y : startPoint.y - curPoint.y, + }; + }, + + // + // Dragging has ended... select all that are within the drag selection rect. + // + dragEnded: function () { + $scope.dragSelecting = false; + $scope.chart.applySelectionRect($scope.dragSelectionRect); + delete $scope.dragSelectionStartPoint; + delete $scope.dragSelectionRect; + }, + }); + }; + + // + // Handle nodeMouseOver on an node. + // + $scope.nodeMouseOver = function (evt, node) { + if (!$scope.readOnly) { + $scope.mouseOverNode = node; + } + }; + + // + // Handle nodeMouseLeave on an node. + // + $scope.nodeMouseLeave = function (evt, node) { + $scope.mouseOverNode = null; + }; + + // + // Handle mousedown on a node. + // + $scope.nodeMouseDown = function (evt, node) { + var chart = $scope.chart; + var lastMouseCoords; + + if ($scope.readOnly) { + return; + } + + dragging.startDrag(evt, { + + // + // Node dragging has commenced. + // + dragStarted: function (x, y) { + lastMouseCoords = controller.translateCoordinates(x, y, evt); + + // + // If nothing is selected when dragging starts, + // at least select the node we are dragging. + // + if (!node.selected()) { + chart.deselectAll(); + node.select(); + } + }, + + // + // Dragging selected nodes... update their x,y coordinates. + // + dragging: function (x, y) { + var curCoords = controller.translateCoordinates(x, y, evt); + var deltaX = curCoords.x - lastMouseCoords.x; + var deltaY = curCoords.y - lastMouseCoords.y; + + chart.updateSelectedNodesLocation(deltaX, deltaY); + + lastMouseCoords = curCoords; + }, + + // + // The node wasn't dragged... it was clicked. + // + clicked: function () { + chart.handleNodeClicked(node, evt.ctrlKey); + }, + + }); + }; + + // + // Listen for node action + // + $scope.$on('nodeActionClicked', function (evt, args) { + var action = args.action; + var node = args.node; + + if (action === 'nodeActionConnect') { + $scope.startConnectingMode(node); + } + }); + + $scope.$on('nodeActionClosed', function () { + $scope.mouseOverNode = null; + }); + + $scope.connectingModeOutputConnector = null; + $scope.connectingModeSourceNode = null; + + $scope.startConnectingMode = function (node) { + $scope.chart.inConnectingMode = true; + $scope.hideConnectors = false; + $scope.connectingModeSourceNode = node; + $scope.connectingModeSourceNode.select(); + $scope.connectingModeOutputConnector = node.getOutputConnector(); + $scope.chart.updateValidNodesAndConnectors($scope.connectingModeSourceNode); + }; + + $scope.cancelConnectingMode = function () { + // if output connector not connected to something, remove it + if (!$scope.connectingModeOutputConnector.connected()) { + $scope.chart.removeOutputConnector($scope.connectingModeOutputConnector); + } + $scope.stopConnectingMode(); + }; + + $scope.stopConnectingMode = function () { + $scope.chart.inConnectingMode = false; + $scope.chart.resetValidNodesAndConnectors(); + }; + + // + // Handle connectionMouseOver on an connection. + // + $scope.connectionMouseOver = function (evt, connection) { + if (!$scope.draggingConnection && !$scope.readOnly) { // Only allow 'connection mouse over' when not dragging out a connection. + $scope.mouseOverConnection = connection; + } + }; + + // + // Handle connectionMouseLeave on an connection. + // + $scope.connectionMouseLeave = function (evt, connection) { + $scope.mouseOverConnection = null; + }; + + // + // Handle mousedown on a connection. + // + $scope.connectionMouseDown = function (evt, connection) { + var chart = $scope.chart; + if (!$scope.readOnly) { + chart.handleConnectionMouseDown(connection, evt.ctrlKey); + } + // Don't let the chart handle the mouse down. + evt.stopPropagation(); + evt.preventDefault(); + }; + + // + // Handle connectorMouseOver on an connector. + // + $scope.connectorMouseOver = function (evt, node, connector, connectorIndex, isInputConnector) { + if (!$scope.readOnly) { + $scope.mouseOverConnector = connector; + } + }; + + // + // Handle connectorMouseLeave on an connector. + // + $scope.connectorMouseLeave = function (evt, node, connector, connectorIndex, isInputConnector) { + $scope.mouseOverConnector = null; + }; + + // + // Handle mousedown on an input connector. + // + $scope.connectorMouseDown = function (evt, node, connector, connectorIndex, isInputConnector) { + if ($scope.chart.inConnectingMode && node !== $scope.connectingModeSourceNode) { + $scope.chart.createNewConnection($scope.connectingModeOutputConnector, $scope.mouseOverConnector); + $scope.stopConnectingMode(); + } + }; + + // + // zoom. + // + $scope.$on('zoomIn', function (evt, args) { + $scope.chart.zoom.in(); + }); + + $scope.$on('zoomOut', function (evt, args) { + $scope.chart.zoom.out(); + }); + + $scope.maxZoom = function () { + return ($scope.chart.chartViewModel && $scope.chart.chartViewModel.zoom) ? $scope.chart.chartViewModel.zoom.isMax() : false; + }; + $scope.minZoom = function () { + return ($scope.chart.chartViewModel && $scope.chart.chartViewModel.zoom) ? $scope.chart.chartViewModel.zoom.isMin() : false; + }; + + $scope.zoomLevel = function () { + return $scope.chart.zoom.getLevel(); + }; + } + ]); +})(); +;/* eslint-disable */ +// +// Global accessor. +// +var pfCanvas = {}; + +// Module. +(function() { + // + // Height of flow chart. + // + pfCanvas.defaultHeight = 756; + + // + // Width of flow chart. + // + pfCanvas.defaultWidth = 1396; + + pfCanvas.defaultBgImageSize = 24; + + // + // Width of a node. + // + pfCanvas.defaultNodeWidth = 150; + + // + // Height of a node. + // + pfCanvas.defaultNodeHeight = 150; + + // + // Amount of space reserved for displaying the node's name. + // + pfCanvas.nodeNameHeight = 40; + + // + // Height of a connector in a node. + // + pfCanvas.connectorHeight = 25; + + // + // Compute the Y coordinate of a connector, given its index. + // + pfCanvas.computeConnectorY = function(connectorIndex) { + return pfCanvas.defaultNodeHeight / 2 + connectorIndex * pfCanvas.connectorHeight; + }; + + // + // Compute the position of a connector in the graph. + // + pfCanvas.computeConnectorPos = function(node, connectorIndex, inputConnector) { + return { + x: node.x() + (inputConnector ? 0 : node.width ? node.width() : pfCanvas.defaultNodeWidth), + y: node.y() + pfCanvas.computeConnectorY(connectorIndex), + }; + }; + + // + // View model for a connector. + // + pfCanvas.ConnectorViewModel = function(connectorDataModel, x, y, parentNode) { + this.data = connectorDataModel; + + this._parentNode = parentNode; + this._x = x; + this._y = y; + + // + // The name of the connector. + // + this.name = function() { + return this.data.name; + }; + + // + // X coordinate of the connector. + // + this.x = function() { + return this._x; + }; + + // + // Y coordinate of the connector. + // + this.y = function() { + return this._y; + }; + + // + // The parent node that the connector is attached to. + // + this.parentNode = function() { + return this._parentNode; + }; + + // + // Is this connector connected? + // + this.connected = function() { + return this.data.connected; + }; + + // + // set connector connected + // + this.setConnected = function(value) { + this.data.connected = value; + }; + + // + // Is this connector invalid for a connecton? + // + this.invalid = function() { + return this.data.invalid; + }; + + // + // set connector invalid + // + this.setInvalid = function(value) { + this.data.invalid = value; + }; + + // + // Font Family for the the node. + // + this.fontFamily = function() { + return this.data.fontFamily || ""; + }; + + // + // Font Content for the the node. + // + this.fontContent = function() { + return this.data.fontContent || ""; + }; + }; + + // + // Create view model for a list of data models. + // + var createConnectorsViewModel = function(connectorDataModels, x, parentNode) { + var viewModels = []; + + if (connectorDataModels) { + for (var i = 0; i < connectorDataModels.length; ++i) { + var connectorViewModel = new pfCanvas.ConnectorViewModel(connectorDataModels[i], x, pfCanvas.computeConnectorY(i), parentNode); + viewModels.push(connectorViewModel); + } + } + + return viewModels; + }; + + // + // View model for a node. + // + pfCanvas.NodeViewModel = function(nodeDataModel) { + this.data = nodeDataModel; + + // set the default width value of the node + if (!this.data.width || this.data.width < 0) { + this.data.width = pfCanvas.defaultNodeWidth; + } + this.inputConnectors = createConnectorsViewModel(this.data.inputConnectors, 0, this); + this.outputConnectors = createConnectorsViewModel(this.data.outputConnectors, this.data.width, this); + + // Set to true when the node is selected. + this._selected = false; + + // + // Name of the node. + // + this.name = function() { + return this.data.name || ""; + }; + + // + // id of the node. + // + this.id = function() { + return this.data.id || -1; + }; + + // + // Image for the the node. + // + this.image = function() { + return this.data.image || ""; + }; + + // + // Icon for the the node. + // + this.icon = function() { + return this.data.icon || ""; + }; + + // + // Is node a bundle + // + this.bundle = function() { + return this.data.bundle || ""; + }; + + // + // background color for the node. + // + this.backgroundColor = function() { + return this.data.backgroundColor; + }; + + // + // X coordinate of the node. + // + this.x = function() { + return this.data.x; + }; + + // + // Y coordinate of the node. + // + this.y = function() { + return this.data.y; + }; + + // + // Width of the node. + // + this.width = function() { + return this.data.width; + }; + + // + // Font Family for the the node. + // + this.fontFamily = function() { + return this.data.fontFamily || ""; + }; + + // + // Font size for the the icon + // + this.fontSize = function() { + return this.data.fontSize || ""; + }; + + // + // Font Content for the the node. + // + this.fontContent = function() { + return this.data.fontContent || ""; + }; + + // + // Returns valid connection types for the node. + // + this.validConnectionTypes = function() { + return this.data.validConnectionTypes || []; + }; + + // + // Is this node valid for current connection? + // + this.invalid = function() { + return this.data.invalid; + }; + + // + // set node valid + // + this.setInvalid = function(value) { + this.data.invalid = value; + }; + + // + // Height of the node. + // + this.height = function() { + /* + var numConnectors = + Math.max( + this.inputConnectors.length, + this.outputConnectors.length); + + return pfCanvas.computeConnectorY(numConnectors); + */ + + return pfCanvas.defaultNodeHeight; + }; + + // + // Select the node. + // + this.select = function() { + this._selected = true; + }; + + // + // Deselect the node. + // + this.deselect = function() { + this._selected = false; + }; + + // + // Toggle the selection state of the node. + // + this.toggleSelected = function() { + this._selected = !this._selected; + }; + + // + // Returns true if the node is selected. + // + this.selected = function() { + return this._selected; + }; + + // + // Internal function to add a connector. + this._addConnector = function(connectorDataModel, x, connectorsDataModel, connectorsViewModel) { + var connectorViewModel = new pfCanvas.ConnectorViewModel(connectorDataModel, x, + pfCanvas.computeConnectorY(connectorsViewModel.length), this); + + connectorsDataModel.push(connectorDataModel); + + // Add to node's view model. + connectorsViewModel.push(connectorViewModel); + + return connectorViewModel; + }; + + // + // Internal function to remove a connector. + this._removeConnector = function(connectorDataModel, connectorsDataModel, connectorsViewModel) { + var connectorIndex = connectorsDataModel.indexOf(connectorDataModel); + connectorsDataModel.splice(connectorIndex, 1); + connectorsViewModel.splice(connectorIndex, 1); + }; + + // + // Add an input connector to the node. + // + this.addInputConnector = function(connectorDataModel) { + if (!this.data.inputConnectors) { + this.data.inputConnectors = []; + } + this._addConnector(connectorDataModel, 0, this.data.inputConnectors, this.inputConnectors); + }; + + // + // Get the single ouput connector for the node. + // + this.getOutputConnector = function() { + if (!this.data.outputConnectors) { + this.data.outputConnectors = []; + } + + if (this.data.outputConnectors.length === 0) { + var connectorDataModel = {name: 'out'}; + + return this._addConnector(connectorDataModel, this.data.width, this.data.outputConnectors, this.outputConnectors); + } else { + return this.outputConnectors[0]; + } + }; + + // + // Remove an ouput connector from the node. + // + this.removeOutputConnector = function(connectorDataModel) { + if (this.data.outputConnectors) { + this._removeConnector(connectorDataModel, this.data.outputConnectors, this.outputConnectors); + } + }; + + this.tags = function() { + return this.data.tags; + }; + }; + + // + // Wrap the nodes data-model in a view-model. + // + var createNodesViewModel = function(nodesDataModel) { + var nodesViewModel = []; + + if (nodesDataModel) { + for (var i = 0; i < nodesDataModel.length; ++i) { + nodesViewModel.push(new pfCanvas.NodeViewModel(nodesDataModel[i])); + } + } + + return nodesViewModel; + }; + + // + // View model for a node action. + // + pfCanvas.NodeActionViewModel = function(nodeActionDataModel) { + this.data = nodeActionDataModel; + + // + // id of the node action. + // + this.id = function() { + return this.data.id || ""; + }; + + // + // Name of the node action. + // + this.name = function() { + return this.data.name || ""; + }; + + // + // Font Family for the the node. + // + this.iconClass = function() { + return this.data.iconClass || ""; + }; + + // + // Font Content for the the node. + // + this.action = function() { + return this.data.action || ""; + }; + }; + + // + // Wrap the node actions data-model in a view-model. + // + var createNodeActionsViewModel = function(nodeActionsDataModel) { + var nodeActionsViewModel = []; + + if (nodeActionsDataModel) { + for (var i = 0; i < nodeActionsDataModel.length; ++i) { + nodeActionsViewModel.push(new pfCanvas.NodeActionViewModel(nodeActionsDataModel[i])); + } + } + + return nodeActionsViewModel; + }; + + // + // View model for a connection. + // + pfCanvas.ConnectionViewModel = function(connectionDataModel, sourceConnector, destConnector) { + this.data = connectionDataModel; + this.source = sourceConnector; + this.dest = destConnector; + + // Set to true when the connection is selected. + this._selected = false; + + this.name = function() { + return destConnector.name() || ""; + }; + + this.sourceCoordX = function() { + return this.source.parentNode().x() + this.source.x(); + }; + + this.sourceCoordY = function() { + return this.source.parentNode().y() + this.source.y(); + }; + + this.sourceCoord = function() { + return { + x: this.sourceCoordX(), + y: this.sourceCoordY(), + }; + }; + + this.sourceTangentX = function() { + return pfCanvas.computeConnectionSourceTangentX(this.sourceCoord(), this.destCoord()); + }; + + this.sourceTangentY = function() { + return pfCanvas.computeConnectionSourceTangentY(this.sourceCoord(), this.destCoord()); + }; + + this.destCoordX = function() { + return this.dest.parentNode().x() + this.dest.x(); + }; + + this.destCoordY = function() { + return this.dest.parentNode().y() + this.dest.y(); + }; + + this.destCoord = function() { + return { + x: this.destCoordX(), + y: this.destCoordY(), + }; + }; + + this.destTangentX = function() { + return pfCanvas.computeConnectionDestTangentX(this.sourceCoord(), this.destCoord()); + }; + + this.destTangentY = function() { + return pfCanvas.computeConnectionDestTangentY(this.sourceCoord(), this.destCoord()); + }; + + this.middleX = function(scale) { + if (angular.isUndefined(scale)) { + scale = 0.5; + } + + return this.sourceCoordX() * (1 - scale) + this.destCoordX() * scale; + }; + + this.middleY = function(scale) { + if (angular.isUndefined(scale)) { + scale = 0.5; + } + + return this.sourceCoordY() * (1 - scale) + this.destCoordY() * scale; + }; + + // + // Select the connection. + // + this.select = function() { + this._selected = true; + }; + + // + // Deselect the connection. + // + this.deselect = function() { + this._selected = false; + }; + + // + // Toggle the selection state of the connection. + // + this.toggleSelected = function() { + this._selected = !this._selected; + }; + + // + // Returns true if the connection is selected. + // + this.selected = function() { + return this._selected; + }; + }; + + // + // Helper function. + // + var computeConnectionTangentOffset = function(pt1, pt2) { + return (pt2.x - pt1.x) / 2; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionSourceTangentX = function(pt1, pt2) { + return pt1.x + computeConnectionTangentOffset(pt1, pt2); + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionSourceTangentY = function(pt1, pt2) { + return pt1.y; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionSourceTangent = function(pt1, pt2) { + return { + x: pfCanvas.computeConnectionSourceTangentX(pt1, pt2), + y: pfCanvas.computeConnectionSourceTangentY(pt1, pt2), + }; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionDestTangentX = function(pt1, pt2) { + return pt2.x - computeConnectionTangentOffset(pt1, pt2); + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionDestTangentY = function(pt1, pt2) { + return pt2.y; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionDestTangent = function(pt1, pt2) { + return { + x: pfCanvas.computeConnectionDestTangentX(pt1, pt2), + y: pfCanvas.computeConnectionDestTangentY(pt1, pt2), + }; + }; + + // + // View model for the chart. + // + pfCanvas.ChartViewModel = function(chartDataModel) { + // + // Find a specific node within the chart. + // + this.findNode = function(nodeID) { + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + if (node.data.id === nodeID) { + return node; + } + } + + throw new Error("Failed to find node " + nodeID); + }; + + // + // Find a specific input connector within the chart. + // + this.findInputConnector = function(nodeID, connectorIndex) { + var node = this.findNode(nodeID); + + if (!node.inputConnectors || node.inputConnectors.length <= connectorIndex) { + throw new Error("Node " + nodeID + " has invalid input connectors."); + } + + return node.inputConnectors[connectorIndex]; + }; + + // + // Find a specific output connector within the chart. + // + this.findOutputConnector = function(nodeID, connectorIndex) { + var node = this.findNode(nodeID); + + /*if (!node.outputConnectors || node.outputConnectors.length < connectorIndex) { + throw new Error("Node " + nodeID + " has invalid output connectors."); + } + + return node.outputConnectors[connectorIndex];*/ + return node.getOutputConnector(); + }; + + // + // Create a view model for connection from the data model. + // + this._createConnectionViewModel = function(connectionDataModel) { + var sourceConnector = this.findOutputConnector(connectionDataModel.source.nodeID, connectionDataModel.source.connectorIndex); + var destConnector = this.findInputConnector(connectionDataModel.dest.nodeID, connectionDataModel.dest.connectorIndex); + + sourceConnector.setConnected(true); + destConnector.setConnected(true); + return new pfCanvas.ConnectionViewModel(connectionDataModel, sourceConnector, destConnector); + }; + + // + // Wrap the connections data-model in a view-model. + // + this._createConnectionsViewModel = function(connectionsDataModel) { + var connectionsViewModel = []; + + if (connectionsDataModel) { + for (var i = 0; i < connectionsDataModel.length; ++i) { + connectionsViewModel.push(this._createConnectionViewModel(connectionsDataModel[i])); + } + } + + return connectionsViewModel; + }; + + // Reference to the underlying data. + this.data = chartDataModel; + + // Create a view-model for nodes. + this.nodes = createNodesViewModel(this.data.nodes); + + // Create a view-model for nodes. + this.nodeActions = createNodeActionsViewModel(this.data.nodeActions); + + // Create a view-model for connections. + this.connections = this._createConnectionsViewModel(this.data.connections); + + // Are there any valid connections (used in connection mode) ? + this.validConnections = true; + + // Create a view-model for zoom. + this.zoom = new pfCanvas.ZoomViewModel(); + + // Flag to indicate in connecting mode + this.inConnectingMode = false; + + // Flag to indicate whether the chart was just clicked on. + this.clickedOnChart = false; + + // + // Create a view model for a new connection. + // + this.createNewConnection = function(startConnector, endConnector) { + var connectionsDataModel = this.data.connections; + if (!connectionsDataModel) { + connectionsDataModel = this.data.connections = []; + } + + var connectionsViewModel = this.connections; + if (!connectionsViewModel) { + connectionsViewModel = this.connections = []; + } + + var startNode = startConnector.parentNode(); + var startConnectorIndex = startNode.outputConnectors.indexOf(startConnector); + startConnector = startNode.outputConnectors[startConnectorIndex]; + var startConnectorType = 'output'; + if (startConnectorIndex === -1) { + startConnectorIndex = startNode.inputConnectors.indexOf(startConnector); + startConnectorType = 'input'; + if (startConnectorIndex === -1) { + throw new Error("Failed to find source connector within either inputConnectors or outputConnectors of source node."); + } + } + + var endNode = endConnector.parentNode(); + var endConnectorIndex = endNode.inputConnectors.indexOf(endConnector); + endConnector = endNode.inputConnectors[endConnectorIndex]; + var endConnectorType = 'input'; + if (endConnectorIndex === -1) { + endConnectorIndex = endNode.outputConnectors.indexOf(endConnector); + endConnectorType = 'output'; + if (endConnectorIndex === -1) { + throw new Error("Failed to find dest connector within inputConnectors or outputConnectors of dest node."); + } + } + + if (startConnectorType === endConnectorType) { + throw new Error("Failed to create connection. Only output to input connections are allowed."); + } + + if (startNode === endNode) { + throw new Error("Failed to create connection. Cannot link a node with itself."); + } + + startNode = { + nodeID: startNode.data.id, + connectorIndex: startConnectorIndex, + }; + + endNode = { + nodeID: endNode.data.id, + connectorIndex: endConnectorIndex, + }; + + var connectionDataModel = { + source: startConnectorType === 'output' ? startNode : endNode, + dest: startConnectorType === 'output' ? endNode : startNode, + }; + connectionsDataModel.push(connectionDataModel); + + var outputConnector = startConnectorType === 'output' ? startConnector : endConnector; + var inputConnector = startConnectorType === 'output' ? endConnector : startConnector; + + var connectionViewModel = new pfCanvas.ConnectionViewModel(connectionDataModel, outputConnector, inputConnector); + connectionsViewModel.push(connectionViewModel); + + startConnector.setConnected(true); + endConnector.setConnected(true); + }; + + // + // Add a node to the view model. + // + this.addNode = function(nodeDataModel) { + if (!this.data.nodes) { + this.data.nodes = []; + } + + // + // Update the data model. + // + this.data.nodes.push(nodeDataModel); + + // + // Update the view model. + // + this.nodes.push(new pfCanvas.NodeViewModel(nodeDataModel)); + }; + + // + // Select all nodes and connections in the chart. + // + this.selectAll = function() { + var nodes = this.nodes; + for (var i = 0; i < nodes.length; ++i) { + var node = nodes[i]; + node.select(); + } + + var connections = this.connections; + for (i = 0; i < connections.length; ++i) { + var connection = connections[i]; + connection.select(); + } + }; + + // + // Deselect all nodes and connections in the chart. + // + this.deselectAll = function() { + var nodes = this.nodes; + for (var i = 0; i < nodes.length; ++i) { + var node = nodes[i]; + node.deselect(); + // close any/all open toolbar dialogs + node.toolbarDlgOpen = false; + } + + var connections = this.connections; + for (i = 0; i < connections.length; ++i) { + var connection = connections[i]; + connection.deselect(); + } + }; + + // + // Mark nodes & connectors as valid/invalid based on source node's + // valid connection types + // + this.updateValidNodesAndConnectors = function(sourceNode) { + this.validConnections = false; + var validConnectionTypes = sourceNode.validConnectionTypes(); + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + node.setInvalid(true); + for (var c = 0; c < node.inputConnectors.length; c++) { + var inputConnector = node.inputConnectors[c]; + inputConnector.setInvalid(validConnectionTypes.indexOf(inputConnector.data.type) === -1); + if (!inputConnector.invalid() && node !== sourceNode && !inputConnector.connected()) { + node.setInvalid(false); + this.validConnections = true; + } + } + } + }; + + // + // Mark nodes & connectors as valid + // + this.resetValidNodesAndConnectors = function() { + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + node.setInvalid(false); + for (var c = 0; c < node.inputConnectors.length; c++) { + var inputConnector = node.inputConnectors[c]; + inputConnector.setInvalid(false); + } + } + }; + + this.removeOutputConnector = function(connectorViewModel) { + var parentNode = connectorViewModel.parentNode(); + parentNode.removeOutputConnector(connectorViewModel.data); + }; + + // + // Update the location of the node and its connectors. + // + this.updateSelectedNodesLocation = function(deltaX, deltaY) { + var selectedNodes = this.getSelectedNodes(); + + for (var i = 0; i < selectedNodes.length; ++i) { + var node = selectedNodes[i]; + node.data.x += deltaX; + node.data.y += deltaY; + } + }; + + // + // Handle mouse click on a particular node. + // + this.handleNodeClicked = function(node, ctrlKey) { + if (ctrlKey) { + node.toggleSelected(); + } else { + this.deselectAll(); + node.select(); + } + + // Move node to the end of the list so it is rendered after all the other. + // This is the way Z-order is done in SVG. + + var nodeIndex = this.nodes.indexOf(node); + if (nodeIndex === -1) { + throw new Error("Failed to find node in view model!"); + } + this.nodes.splice(nodeIndex, 1); + this.nodes.push(node); + }; + + // + // Handle mouse down on a connection. + // + this.handleConnectionMouseDown = function(connection, ctrlKey) { + if (ctrlKey) { + connection.toggleSelected(); + } else { + this.deselectAll(); + connection.select(); + } + }; + + // + // Delete all nodes and connections that are selected. + // + this.duplicateSelectedNode = function() { + var duplicatedNode = angular.copy(this.getSelectedNodes()[0]); + delete duplicatedNode.data.outputConnectors; + return duplicatedNode.data; + }; + + // + // Delete all nodes and connections that are selected. + // + this.deleteSelected = function() { + var newNodeViewModels = []; + var newNodeDataModels = []; + + var deletedNodeIds = []; + + // + /* Sort nodes into: + * nodes to keep and + * nodes to delete. + */ + + for (var nodeIndex = 0; nodeIndex < this.nodes.length; ++nodeIndex) { + var node = this.nodes[nodeIndex]; + if (!node.selected()) { + // Only retain non-selected nodes. + newNodeViewModels.push(node); + newNodeDataModels.push(node.data); + } else { + // Keep track of nodes that were deleted, so their connections can also + // be deleted. + deletedNodeIds.push(node.data.id); + } + } + + var newConnectionViewModels = []; + var newConnectionDataModels = []; + + // + // Remove connections that are selected. + // Also remove connections for nodes that have been deleted. + // + for (var connectionIndex = 0; connectionIndex < this.connections.length; ++connectionIndex) { + var connection = this.connections[connectionIndex]; + if (!connection.selected()) { + if (deletedNodeIds.indexOf(connection.data.source.nodeID) === -1 + && deletedNodeIds.indexOf(connection.data.dest.nodeID) === -1) { + // + // The nodes this connection is attached to, where not deleted, + // so keep the connection. + // + newConnectionViewModels.push(connection); + newConnectionDataModels.push(connection.data); + } + } else { + // connection selected, so it will be deleted (ie. not included in the 'newConnection models) + // also delete the connection's source node's output connector (if source node hasn't been deleteed + if (deletedNodeIds.indexOf(connection.data.source.nodeID) === -1) { + var sourceConnectorViewModel = connection.source; + if (sourceConnectorViewModel) { + sourceConnectorViewModel._parentNode.removeOutputConnector(sourceConnectorViewModel.data); + // also set connected to false on the dest node + var destConnectorViewModel = connection.dest; + if (destConnectorViewModel) { + destConnectorViewModel.setConnected(false); + } else { + throw new Error("Failed to find dest node of deleted connection!"); + } + } else { + throw new Error("Failed to find source node of deleted connection!"); + } + } + } + } + + // + // Update nodes and connections. + // + this.nodes = newNodeViewModels; + this.data.nodes = newNodeDataModels; + this.connections = newConnectionViewModels; + this.data.connections = newConnectionDataModels; + }; + + // + // Select nodes and connections that fall within the selection rect. + // + this.applySelectionRect = function(selectionRect) { + this.deselectAll(); + + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + if (node.x() >= selectionRect.x + && node.y() >= selectionRect.y + && node.x() + node.width() <= selectionRect.x + selectionRect.width + && node.y() + node.height() <= selectionRect.y + selectionRect.height) { + // Select nodes that are within the selection rect. + node.select(); + } + } + + for (i = 0; i < this.connections.length; ++i) { + var connection = this.connections[i]; + if (connection.source.parentNode().selected() + && connection.dest.parentNode().selected()) { + // Select the connection if both its parent nodes are selected. + connection.select(); + } + } + }; + + // + // Get the array of nodes that are currently selected. + // + this.getSelectedNodes = function() { + var selectedNodes = []; + + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + if (node.selected()) { + selectedNodes.push(node); + } + } + + return selectedNodes; + }; + + // + // Is only one node selected + // + this.isOnlyOneNodeSelected = function() { + return this.getSelectedNodes().length === 1; + }; + + // + // Are any nodes selected + // + this.areAnyNodesSelected = function() { + return this.getSelectedNodes().length > 0; + }; + + // + // Get the array of connections that are currently selected. + // + this.getSelectedConnections = function() { + var selectedConnections = []; + + for (var i = 0; i < this.connections.length; ++i) { + var connection = this.connections[i]; + if (connection.selected()) { + selectedConnections.push(connection); + } + } + + return selectedConnections; + }; + }; + + // + // Zoom view model + // + pfCanvas.ZoomViewModel = function() { + this.max = 1; // Max zoom level + this.min = parseFloat(".5"); // Min zoom level + this.inc = parseFloat(".25"); // Zoom level increment + this.level = this.max; // Zoom level + + // + // Is max zoom + // + this.isMax = function() { + return (this.level === this.max); + }; + + // + // Is min zoom + // + this.isMin = function() { + return (this.level === this.min); + }; + + // + // Get background image size + // + this.getBackgroundSize = function() { + var size = pfCanvas.defaultBgImageSize * this.getLevel(); + + return size; + }; + + // + // Get height to accomodate flow chart + // + this.getChartHeight = function() { + var height = (pfCanvas.defaultHeight / this.min) * this.getLevel(); + + return height; + }; + + // + // Get width to accomodate flow chart + // + this.getChartWidth = function() { + var width = (pfCanvas.defaultWidth / this.min) * this.getLevel(); + + return width; + }; + + // + // Zoom level + // + this.getLevel = function() { + return this.level; + }; + + // + // Zoom in + // + this.in = function() { + if (!this.isMax()) { + this.level = (this.level * 10 + this.inc * 10) / 10; + } + }; + + // + // Zoom out + // + this.out = function() { + if (!this.isMin()) { + this.level = (this.level * 10 - this.inc * 10) / 10; + } + }; + }; +})(); +;(function () { + 'use strict'; + + // Service used to help with dragging and clicking on elements. + angular.module('dragging', ['mouseCapture']) + .factory('dragging', ['mouseCapture', Factory]); + + function Factory (mouseCapture) { + // + // Threshold for dragging. + // When the mouse moves by at least this amount dragging starts. + // + var threshold = 5; + + return { + + // + // Called by users of the service to register a mousedown event and start dragging. + // Acquires the 'mouse capture' until the mouseup event. + // + startDrag: function (evt, config) { + var dragging = false; + var x = evt.pageX; + var y = evt.pageY; + + // + // Handler for mousemove events while the mouse is 'captured'. + // + var mouseMove = function (evt) { + if (!dragging) { + if (Math.abs(evt.pageX - x) > threshold + || Math.abs(evt.pageY - y) > threshold) { + dragging = true; + + if (config.dragStarted) { + config.dragStarted(x, y, evt); + } + + if (config.dragging) { + // First 'dragging' call to take into account that we have + // already moved the mouse by a 'threshold' amount. + config.dragging(evt.pageX, evt.pageY, evt); + } + } + } else { + if (config.dragging) { + config.dragging(evt.pageX, evt.pageY, evt); + } + + x = evt.pageX; + y = evt.pageY; + } + }; + + // + // Handler for when mouse capture is released. + // + var released = function () { + if (dragging) { + if (config.dragEnded) { + config.dragEnded(); + } + } else { + if (config.clicked) { + config.clicked(); + } + } + }; + + // + // Handler for mouseup event while the mouse is 'captured'. + // Mouseup releases the mouse capture. + // + var mouseUp = function (evt) { + mouseCapture.release(); + + evt.stopPropagation(); + evt.preventDefault(); + }; + + // + // Acquire the mouse capture and start handling mouse events. + // + mouseCapture.acquire(evt, { + mouseMove: mouseMove, + mouseUp: mouseUp, + released: released, + }); + + evt.stopPropagation(); + evt.preventDefault(); + }, + + }; + } +})(); + +;(function () { + "use strict"; + + // Service used to acquire 'mouse capture' then receive dragging events while the mouse is captured. + angular.module('mouseCapture', []) + .factory('mouseCapture', ['$rootScope', Factory]) + .directive('mouseCapture', [ComponentDirective]); + + function Factory ($rootScope) { + // + // Element that the mouse capture applies to, defaults to 'document' + // unless the 'mouse-capture' directive is used. + // + var $element = document; + + // + // Set when mouse capture is acquired to an object that contains + // handlers for 'mousemove' and 'mouseup' events. + // + var mouseCaptureConfig = null; + + // + // Handler for mousemove events while the mouse is 'captured'. + // + var mouseMove = function (evt) { + if (mouseCaptureConfig && mouseCaptureConfig.mouseMove) { + mouseCaptureConfig.mouseMove(evt); + + $rootScope.$digest(); + } + }; + + // + // Handler for mouseup event while the mouse is 'captured'. + // + var mouseUp = function (evt) { + if (mouseCaptureConfig && mouseCaptureConfig.mouseUp) { + mouseCaptureConfig.mouseUp(evt); + + $rootScope.$digest(); + } + }; + + return { + + // + // Register an element to use as the mouse capture element instead of + // the default which is the document. + // + registerElement: function (element) { + $element = element; + }, + + // + // Acquire the 'mouse capture'. + // After acquiring the mouse capture mousemove and mouseup events will be + // forwarded to callbacks in 'config'. + // + acquire: function (evt, config) { + // + // Release any prior mouse capture. + // + this.release(); + + mouseCaptureConfig = config; + + // + // In response to the mousedown event register handlers for mousemove and mouseup + // during 'mouse capture'. + // + $element.mousemove(mouseMove); + $element.mouseup(mouseUp); + }, + + // + // Release the 'mouse capture'. + // + release: function () { + if (mouseCaptureConfig) { + if (mouseCaptureConfig.released) { + // + // Let the client know that their 'mouse capture' has been released. + // + mouseCaptureConfig.released(); + } + + mouseCaptureConfig = null; + } + + $element.unbind("mousemove", mouseMove); + $element.unbind("mouseup", mouseUp); + }, + }; + } + + function ComponentDirective () { + return { + restrict: 'A', + controller: ['$scope', '$element', '$attrs', 'mouseCapture', + function ($scope, $element, $attrs, mouseCapture) { + // + // Register the directives element as the mouse capture element. + // + mouseCapture.registerElement($element); + }], + + }; + } +})(); + +;(function () { + 'use strict'; + + nodeToolbarDirective.$inject = ["$document"]; + angular.module('patternfly.canvas') + .directive('nodeToolbar', nodeToolbarDirective); + + function nodeToolbarDirective ($document) { + var directive = { + restrict: 'E', + scope: { + node: '=', + nodeActions: '=', + }, + controller: NodeToolbarController, + templateUrl: 'canvas-view/canvas/node-toolbar.html', + controllerAs: 'vm', + bindToController: true, + }; + + return directive; + + function NodeToolbarController ($scope) { + var vm = this; + vm.selectedAction = "none"; + + $scope.actionIconClicked = function (action) { + vm.selectedAction = action; + $scope.$emit('nodeActionClicked', {'action': action, 'node': vm.node}); + }; + + $scope.close = function () { + vm.selectedAction = 'none'; + $scope.$emit('nodeActionClosed'); + }; + } + } +})(); +;/** + * @ngdoc directive + * @name patternfly.canvas.directive:pfCanvas + * @restrict E + * + * @description + * Directive for core operations and rendering of a canvas. Does not work in IE 11 or lower because they do not support + * latest svg specification's 'foreignObject' api. Tested in FireFox, Chrome, and MS-Edge. + * @param {object} chartDataModel Chart data object which defines the nodes and connections on the canvas + * + * @param {object} chartViewModel (Optional) The chartViewModel is initialized from the chartDataModel and contains additional helper methods such as chartViewModel.isOnlyOneNodeSelected() and + * chartViewModel.getSelectedNodes(). You only need to specify a chartViewModel object if you plan on using advanced canvas operations. + * @param {boolean} readOnly A flag indicating whether the canvas is in 'read-only' mode. When in 'read-only' mode nodes cannot be moved, selected, or deleted, and the node action toolbar is hidden. + * @param {boolean} hideConnectors A flag indicating whether connections should be hidden or shown on the canvas + * @example + + + +
+
+ + +
+
+
+ + + + + + + + + + + + +
+
+ +
+
+ +
+
+
+ + + angular.module('patternfly.canvas.demo', ['patternfly.canvas']); + + + + angular.module( 'patternfly.canvas.demo' ).controller( 'CanvasDemoCtrl', function( $scope ) { + $scope.chartDataModel = { + "nodes": [ + { + "name": "Nuage", + "x": 345, + "y": 67, + "id": 1, + "image": "/img/OpenShift-logo.svg", + "width": 150, + "bundle": true, + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container"] + }, + { + "name": "Vmware", + "x": 100, + "y": 290, + "id": 2, + "image": "/img/kubernetes.svg", + "width": 150, + "backgroundColor": "#fff", + "validConnectionTypes": ["storage"], + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + }, + { + "name": "NetApp", + "x": 350, + "y": 291, + "id": 3, + "width": 150, + "icon": "pf pficon-service", + "fontSize": "76px", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network"] + }, + { + "name": "OpenShift", + "x": 105, + "y": 67, + "id": 4, + "width": 150, + "fontFamily": "fontawesome", + "fontContent": "\uf0c2", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container", "storage"] + } + ], + "nodeActions" : [ + { + "id": 1, + "name": "connect", + "iconClass": "fa fa-share-alt", + "action": "nodeActionConnect", + }, + { + "id": 2, + "name": "edit", + "iconClass": "pf pficon-edit", + "action": "nodeActionEdit", + }, + { + "id": 3, + "name": "tag", + "iconClass": "fa fa-tag", + "action": "nodeActionTag", + }, + ], + "connections": [ + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 1, + "connectorIndex": 1 + } + }, + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 3, + "connectorIndex": 0 + } + } + ] + }; + + $scope.newNode = { + "name": "NetApp", + "id": 1000, + "width": 150, + "icon": "pf pficon-service", + "fontSize": "76px", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network"] + }; + + $scope.chartViewModel; + $scope.readOnly = false; + $scope.hideConnectors = false; + $scope.eventText = ""; + + var numNewNodes = 1; + + $scope.addNode = function() { + var newNode = angular.copy($scope.newNode); + newNode.id ++; + newNode.name = newNode.name + " " + numNewNodes++; + newNode.x = 250 + (numNewNodes * 4 + 160); + newNode.y = 200 + (numNewNodes * 4 + 160); + + $scope.chartViewModel.addNode(newNode); + } + + $scope.$on('nodeActionClicked', function(evt, args) { + var action = args.action; + var node = args.node; + $scope.eventText = node.name() + ' ' + action + '\r\n' + $scope.eventText; + }); + + $scope.zoomIn = function() { + $scope.$broadcast('zoomIn'); + } + $scope.zoomOut = function() { + $scope.$broadcast('zoomOut'); + } + + $scope.selectAll = function() { + $scope.$broadcast('selectAll'); + } + $scope.deselectAll = function() { + $scope.$broadcast('deselectAll'); + } + $scope.deleteSelected = function() { + $scope.$broadcast('deleteSelected'); + } + }); + +
+ */ +;/** + * @ngdoc directive + * @name patternfly.canvas.directive:pfCanvasEditor + * @restrict E + * + * @description + * Component for canvas editor which adds a toolbox where items can be dragged and dropped onto canvas, as well as other canvas + * operations such as: Zoom In, Zoom Out, Hide Connections, Remove Node, and Duplicate Node. Does not work in IE 11 or lower because they do not support + * latest svg specification's 'foreignObject' api. Tested in FireFox, Chrome, and MS-Edge. + * + * @param {object} chartDataModel Chart data object which defines the nodes and connections on the canvas. See {@link patternfly.canvas.directive:pfCanvas} for detailed information. + * @param {object} chartViewModel (Optional) The chartViewModel is initialized from the chartDataModel and contains additional helper methods such as chartViewModel.isOnlyOneNodeSelected() and + * chartViewModel.getSelectedNodes(). + * @param {boolean} toolboxTabs An array of Tab objects used in the Toolbox. Each Tab object many contain 'subtabs' and/or 'items'. Items may be dragged onto the canvas. + * + * @param {boolean} readOnly (Optional) A flag indicating whether the canvas is in 'read-only' mode. When in 'read-only' mode nodes cannot be moved, selected, or deleted, and the node action toolbar is hidden. + * @example + + + +
+ + + + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+
+
+ + + angular.module('patternfly.canvaseditor.demo', ['patternfly.canvas']); + + + + angular.module( 'patternfly.canvaseditor.demo' ).controller( 'CanvasEditorDemoCtrl', function( $scope, $filter ) { + $scope.chartDataModel = { + "nodes": [ + { + "name": "Nuage", + "x": 345, + "y": 67, + "id": 1, + "image": "/img/OpenShift-logo.svg", + "width": 150, + "bundle": true, + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container"] + }, + { + "name": "Vmware", + "x": 100, + "y": 290, + "id": 2, + "image": "/img/kubernetes.svg", + "width": 150, + "backgroundColor": "#fff", + "validConnectionTypes": ["storage"], + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + }, + { + "name": "NetApp", + "x": 350, + "y": 291, + "id": 3, + "width": 150, + "icon": "pf pficon-service", + "fontSize": "76px", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network"] + }, + { + "name": "OpenShift", + "x": 105, + "y": 67, + "id": 4, + "width": 150, + "fontFamily": "fontawesome", + "fontContent": "\uf0c2", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container", "storage"] + } + ], + "nodeActions" : [ + { + "id": 1, + "name": "connect", + "iconClass": "fa fa-share-alt", + "action": "nodeActionConnect", + }, + { + "id": 2, + "name": "edit", + "iconClass": "pf pficon-edit", + "action": "nodeActionEdit", + }, + { + "id": 3, + "name": "tag", + "iconClass": "fa fa-tag", + "action": "nodeActionTag", + }, + ], + "connections": [ + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 1, + "connectorIndex": 1 + } + }, + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 3, + "connectorIndex": 0 + } + } + ] + }; + + $scope.toolboxTabs = [ + { + "preTitle": "Toolbox", + "title": "Items A", + "active": true, + "items": [ + { + "name": "Nuage", + "id": 10000000000004, + "image": "/img/OpenShift-logo.svg" + }, + { + "name": "Vmware", + "id": 10000000000010, + "image": "/img/kubernetes.svg" + } + ] + }, + { + "preTitle": "Toolbox", + "title": "Items B", + "active": true, + "items": [ + { + "name": "NetApp", + "id": 10000000000014, + "icon": "pf pficon-service" + }, + { + "name": "OpenShift", + "id": 10000000000021, + "icon": "fa fa-cloud" + }, + { + "name": "OpenStack", + "id": 10000000000022, + "icon": "pf pficon-network" + }, + { + "name": "Storage", + "id": 10000000000026, + "icon": "pf pficon-storage-domain" + }, + { + "name": "VM", + "id": 10000000000023, + "icon": "pf pficon-virtual-machine" + }, + { + "name": "Replicatore", + "id": 10000000000027, + "icon": "pf pficon-replicator" + } + ] + } + ]; + + $scope.chartViewModel; + $scope.readOnly = false; + $scope.eventText = ""; + + $scope.$on('nodeActionClicked', function(evt, args) { + var action = args.action; + var node = args.node; + $scope.eventText = node.name() + ' ' + action + '\r\n' + $scope.eventText; + }); + + $scope.deleteNodes = function() { + if ($scope.chartViewModel.inConnectingMode) { + return; + } + + $scope.chartViewModel.deleteSelected(); + + angular.element("#deleteNodes").blur(); + }; + + $scope.duplicateNode = function() { + if ($scope.chartViewModel.inConnectingMode) { + return; + } + + var duplicatedNode = $scope.chartViewModel.duplicateSelectedNode(); + + // Note: node id will be used in connections to/from this duplicated node + // If id changes, connections array/obj will need to be updated as well + duplicatedNode.id = Math.floor((Math.random() * 600) + 1); // random number between 1 and 600 + duplicatedNode.name = getCopyName(duplicatedNode.name); + duplicatedNode.backgroundColor = '#fff'; + + duplicatedNode.x = duplicatedNode.x + 15 * $scope.chartDataModel.nodes.length; + duplicatedNode.y = duplicatedNode.y + 15 * $scope.chartDataModel.nodes.length; + + $scope.chartViewModel.addNode(duplicatedNode); + + angular.element("#duplicateItem").blur(); + } + + function getCopyName(baseName) { + // Test to see if we are duplicating an existing 'Copy' + var baseNameLength = baseName.indexOf(' Copy'); + if (baseNameLength === -1) { + baseNameLength = baseName.length; + } + baseName = baseName.substr(0, baseNameLength); + var filteredArray = $filter('filter')($scope.chartDataModel.nodes, {name: baseName}, false); + var copyName = baseName + " Copy" + ((filteredArray.length === 1) ? "" : " " + filteredArray.length); + + return copyName; + } + }); + +
+ */ +;/** + * @ngdoc directive + * @name patternfly.card.component:pfAggregateStatusCard + * @restrict E + * + * @param {object} status Status configuration information
+ * + * When layout='mini', only one notification can be specified:
+ * + * @param {boolean=} show-top-border Show/hide the top border, true shows top border, false (default) hides top border + * @param {string=} layout Various alternative layouts the aggregate status card may have:
+ * + * @deprecated {boolean=} alt-layout Display the aggregate status card in a 'alternate tall' layout. false (default) displays normal layout, true displays tall layout + * + * @description + * Component for easily displaying status information + * + * @example + + + +
+
+ + +
+ + +
+ + + +
+ + +
+ + (depreciated, use layout = 'tall' instead) +

+ +
+
+
+ + + angular.module( 'patternfly.card' ).controller( 'CardDemoCtrl', function( $scope ) { + $scope.status = { + "title":"Nodes", + "count":793, + "href":"#", + "iconClass": "fa fa-shield", + "notifications":[ + { + "iconClass":"pficon pficon-error-circle-o", + "count":4, + "href":"#" + }, + { + "iconClass":"pficon pficon-warning-triangle-o", + "count":1 + } + ] + }; + + $scope.aggStatusAlt = { + "title":"Providers", + "count":3, + "notifications":[ + { + "iconImage":"img/kubernetes.svg", + "count":1, + "href":"#" + }, + { + "iconImage":"img/OpenShift-logo.svg", + "count":2, + "href":"#" + } + ] + }; + + $scope.miniAggStatus = { + "iconClass":"pficon pficon-container-node", + "title":"Nodes", + "count":52, + "href":"#", + "notification": { + "iconClass":"pficon pficon-error-circle-o", + "count":3 + } + }; + + $scope.miniAggStatus2 = { + "iconClass":"pficon pficon-cluster", + "title":"Adipiscing", + "count":9, + "href":"#", + "notification":{ + "iconClass":"pficon pficon-ok" + } + }; + }); + + +
+ */ + +angular.module( 'patternfly.card' ).component('pfAggregateStatusCard', { + bindings: { + status: '=', + showTopBorder: '@?', + altLayout: '@?', + layout: '@?' + }, + templateUrl: 'card/aggregate-status/aggregate-status-card.html', + controller: function () { + 'use strict'; + var ctrl = this; + ctrl.$onInit = function () { + ctrl.shouldShowTopBorder = (ctrl.showTopBorder === 'true'); + ctrl.isAltLayout = (ctrl.altLayout === 'true' || ctrl.layout === 'tall'); + ctrl.isMiniLayout = (ctrl.layout === 'mini'); + }; + } +}); +;/** + * @ngdoc directive + * @name patternfly.card.component:pfCard - Utilization + * @restrict E + * + * @param {string} headTitle Title for the card + * @param {string=} subTitle Sub-Title for the card + * @param {boolean=} showTopBorder Show/Hide the blue top border. True shows top border, false (default) hides top border + * @param {boolean=} showTitlesSeparator Show/Hide the grey line between the title and sub-title. + * True (default) shows the line, false hides the line + * @param {object=} footer footer configuration properties:
+ * + * *Note: If a href link and a callBackFn are specified, the href link will be called + * @param {object=} filter filter configuration properties:
+ * + * @description + * Component for easily displaying a card with html content + * + * @example + + + +
+ + + + + + + +
+
+ + angular.module( 'demo', ['patternfly.charts', 'patternfly.card'] ).controller( 'ChartCtrl', function( $scope ) { + + $scope.title2 = 'Memory'; + $scope.units2 = 'GB'; + + $scope.data2 = { + 'used': '25', + 'total': '100' + }; + + $scope.title3 = 'CPU Usage'; + $scope.units3 = 'MHz'; + + $scope.data3 = { + 'used': '420', + 'total': '500', + }; + + $scope.title4 = 'Disk Usage'; + $scope.units4 = 'TB'; + $scope.data4 = { + 'used': '350', + 'total': '500', + }; + + $scope.title5 = 'Disk I/O'; + $scope.units5 = 'I/Ops'; + $scope.data5 = { + 'used': '450', + 'total': '500', + }; + + $scope.layoutInline = { + 'type': 'inline' + }; + }); + +
+ */ +angular.module('patternfly.card').component('pfCard', { transclude: true, templateUrl: 'card/basic/card.html', bindings: { @@ -1746,76 +4469,322 @@ angular.module('patternfly.charts').component('pfHeatmap', { ctrl.rangeTooltips = rangeTooltipDefaults; } - if (!ctrl.thresholds) { - ctrl.thresholds = thresholdDefaults; - } + if (!ctrl.thresholds) { + ctrl.thresholds = thresholdDefaults; + } + + if (!ctrl.heatmapColorPattern) { + ctrl.heatmapColorPattern = heatmapColorPatternDefaults; + } + + if (!ctrl.legendLabels) { + ctrl.legendLabels = legendLabelDefaults; + } + ctrl.height = ctrl.height || heightDefault; + ctrl.showLegend = ctrl.showLegend || (ctrl.showLegend === undefined); + ctrl.loadingDone = false; + + angular.element($window).bind('resize', function () { + setSizes(); + redraw(); + }); + + ctrl.thisComponent = $element[0].querySelector('.heatmap-pf-svg'); + + $timeout(function () { + setStyles(); + setSizes(); + redraw(); + }); + }; + + ctrl.$onChanges = function (changesObj) { + if (changesObj.chartDataAvailable && !changesObj.chartDataAvailable.isFirstChange()) { + setStyles(); + } else { + ctrl.updateAll(); + ctrl.loadingDone = true; + } + }; + + ctrl.$doCheck = function () { + // do a deep compare on chartData and config + if (!angular.equals(ctrl.data, prevData)) { + setStyles(); + if (ctrl.chartDataAvailable !== false) { + setSizes(); + redraw(); + } + } + }; + + ctrl.$postLink = function () { + setStyles(); + setSizes(); + redraw(); + }; + }] +}); +;/** + * @ngdoc directive + * @name patternfly.charts.component:pfLineChart + * @restrict E + * + * @description + * Component for rendering a line chart. + *

+ * See http://c3js.org/reference.html for a full list of C3 chart options. + * + * @param {object} config configuration settings for the line chart:
+ * + * + * @param {object} chartData the data to be shown as an area chart
+ * First and second Array elements, xData and yData, must exist, next data arrays are optional.
+ * + * + * @param {boolean=} showXAxis override config settings for showing the X Axis + * @param {boolean=} showYAxis override config settings for showing the Y Axis + * @param {boolean=} setAreaChart override config settings for showing area type chart + + * @example + + +
+
+ +
+
+
+
+
+
+
+ + + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ + + angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope, pfUtils ) { + + $scope.config = { + chartId: 'exampleLine', + grid: {y: {show: false}}, + point: {r: 1}, + color: {pattern: [pfUtils.colorPalette.blue, pfUtils.colorPalette.green]} + }; + + var today = new Date(); + var dates = ['dates']; + for (var d = 20 - 1; d >= 0; d--) { + dates.push(new Date(today.getTime() - (d * 24 * 60 * 60 * 1000))); + } + + $scope.data = { + dataAvailable: true, + xData: dates, + yData0: ['Created', 12, 10, 10, 62, 17, 10, 15, 13, 17, 10, 12, 10, 10, 12, 17, 16, 15, 13, 17, 10], + yData1: ['Deleted', 10, 17, 76, 14, 10, 10, 10, 10, 10, 10, 10, 17, 17, 14, 10, 10, 10, 10, 10, 10] + }; + + $scope.custShowXAxis = false; + $scope.custShowYAxis = false; + $scope.custAreaChart = false; + + $scope.addDataPoint = function () { + $scope.data.xData.push(new Date($scope.data.xData[$scope.data.xData.length - 1].getTime() + (24 * 60 * 60 * 1000))); + $scope.data.yData0.push(Math.round(Math.random() * 100)); + $scope.data.yData1.push(Math.round(Math.random() * 100)); + }; + + $scope.resetData = function () { + $scope.data = { + xData: dates, + yData0: ['Created', 12, 10, 10, 62], + yData1: ['Deleted', 10, 17, 76, 14] + }; + }; + }); + +
+ */ +angular.module('patternfly.charts').component('pfLineChart', { + bindings: { + config: '<', + chartData: '<', + showXAxis: '
* See http://c3js.org/reference.html for a full list of C3 chart options. * - * @param {object} config configuration settings for the line chart:
+ * @param {object} config configuration settings for the sparkline chart:
* * * @param {object} chartData the data to be shown as an area chart
- * First and second Array elements, xData and yData, must exist, next data arrays are optional.
* * + * @param {int=} chartHeight height of the sparkline chart * @param {boolean=} showXAxis override config settings for showing the X Axis * @param {boolean=} showYAxis override config settings for showing the Y Axis - * @param {boolean=} setAreaChart override config settings for showing area type chart * @example
- +

+
+
+ +
+ + + + +
+
+ +
-
- -
-
-
-
-
-
-
+
- + +
+
+
+ +
+
+
+
+
+
+ +
+
+
- angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope, pfUtils ) { + angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope ) { $scope.config = { - chartId: 'exampleLine', - grid: {y: {show: false}}, - point: {r: 1}, - color: {pattern: [pfUtils.colorPalette.blue, pfUtils.colorPalette.green]} + chartId: 'exampleSparkline', + tooltipType: 'default' }; var today = new Date(); @@ -1903,33 +4893,32 @@ angular.module('patternfly.charts').component('pfHeatmap', { $scope.data = { dataAvailable: true, + total: 100, xData: dates, - yData0: ['Created', 12, 10,10, 62, 17, 10, 15, 13, 17, 10, 12, 10, 10, 12, 17, 16, 15, 13, 17, 10], - yData1: ['Deleted', 10, 17, 76,14, 10, 10, 10, 10, 10, 10, 10, 17, 17, 14, 10, 10, 10, 10, 10, 10] + yData: ['used', 10, 20, 30, 20, 30, 10, 14, 20, 25, 68, 54, 56, 78, 56, 67, 88, 76, 65, 87, 76] }; $scope.custShowXAxis = false; $scope.custShowYAxis = false; - $scope.custAreaChart = false; + $scope.custChartHeight = 60; $scope.addDataPoint = function () { $scope.data.xData.push(new Date($scope.data.xData[$scope.data.xData.length - 1].getTime() + (24 * 60 * 60 * 1000))); - $scope.data.yData0.push(Math.round(Math.random() * 100)); - $scope.data.yData1.push(Math.round(Math.random() * 100)); + $scope.data.yData.push(Math.round(Math.random() * 100)); }; });
*/ -angular.module('patternfly.charts').component('pfLineChart', { +angular.module('patternfly.charts').component('pfSparklineChart', { bindings: { config: '<', chartData: '<', + chartHeight: '' + + ' ' + + ' ' + + tipRows + + ' ' + + '
' + + ''; + }; + + ctrl.sparklineTooltip = function () { + return { + contents: function (d) { + var tipRows; + var percentUsed = 0; + + if (ctrl.config.tooltipFn) { + tipRows = ctrl.config.tooltipFn(d); + } else { + switch (ctrl.config.tooltipType) { + case 'usagePerDay': + if (ctrl.chartData.dataAvailable !== false && ctrl.chartData.total > 0) { + percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); + } + tipRows = + '' + + ' ' + d[0].x.toLocaleDateString() + '' + + '' + + '' + + ' ' + percentUsed + '%:' + '' + + ' ' + d[0].value + ' ' + (ctrl.config.units ? ctrl.config.units + ' ' : '') + d[0].name + '' + + ''; + break; + case 'valuePerDay': + tipRows = + '' + + ' ' + d[0].x.toLocaleDateString() + '' + + ' ' + d[0].value + ' ' + d[0].name + '' + + ''; + break; + case 'percentage': + percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); + tipRows = + '' + + ' ' + percentUsed + '%' + '' + + ''; + break; + default: + tipRows = patternfly.c3ChartDefaults().getDefaultSparklineTooltip().contents(d); + } + } + return ctrl.getTooltipTableHTML(tipRows); + }, + position: function (data, width, height, element) { + var center; + var top; + var chartBox; + var graphOffsetX; + var x; - // Will trigger c3 chart generation - ctrl.chartConfig = pfUtils.merge(ctrl.defaultConfig, ctrl.config); - }; + try { + center = parseInt(element.getAttribute('x')); + top = parseInt(element.getAttribute('y')); + chartBox = document.querySelector('#' + ctrl.sparklineChartId).getBoundingClientRect(); + graphOffsetX = document.querySelector('#' + ctrl.sparklineChartId + ' g.c3-axis-y').getBoundingClientRect().right; + x = Math.max(0, center + graphOffsetX - chartBox.left - Math.floor(width / 2)); - /* - * Convert the config data to C3 Data - */ - ctrl.getLineData = function (chartData) { - var lineData = { - type: ctrl.setAreaChart ? "area" : "line" + return { + top: top - height, + left: Math.min(x, chartBox.width - width) + }; + } catch (e) { + } + } }; - - if (chartData && chartData.dataAvailable !== false && chartData.xData) { - lineData.x = chartData.xData[0]; - // Convert the chartData dictionary into a C3 columns data arrays - lineData.columns = Object.keys(chartData).map(function (key) { - return chartData[key]; - }); - } - - return lineData; }; ctrl.$onChanges = function (changesObj) { @@ -2034,333 +5097,941 @@ angular.module('patternfly.charts').component('pfLineChart', { }); ;/** * @ngdoc directive - * @name patternfly.charts.component:pfSparklineChart + * @name patternfly.charts.component:pfTopology * @restrict E * * @description - * Component for rendering a sparkline chart. - *

- * See http://c3js.org/reference.html for a full list of C3 chart options. + * Component for rendering a topology chart. Individual nodes and relationships can be represented with this view. CSS is especially important for rendering the nodes and lines. The example inline contains specific examples that can be used to change the icon size and the line type of the relationships. * - * @param {object} config configuration settings for the sparkline chart:
- * * - * @param {object} chartData the data to be shown as an area chart
+ * @param {object} relations the object containing all of the node relationships:
* * - * @param {int=} chartHeight height of the sparkline chart - * @param {boolean=} showXAxis override config settings for showing the X Axis - * @param {boolean=} showYAxis override config settings for showing the Y Axis - + * @param {object} icons The different icons to be used in the node representations + * @param {object} selection The item to be selected + * @param {object} force Optional. A D3 force layout to use instead of creating one by default. The force layout size will be updated, and layout will be started as appropriate. + * @param {object} nodes The node configuration for the various types of nodes
+ * @param {string} searchText Search text which is watched for changes and highlights the nodes matching the search text + * @param {object} kinds The different kinds of nodes represented in the topology chart + * @param {function (vertices, added) } chartRendered The argument will be D3 selection of elements that correspond to items. Each item has its data set to one of the items. The default implementation of this event sets the title from Kubernetes metadata and tweaks the look of for certain statuses. Use event.preventDefault() to prevent this default behavior. + * @param {boolean} itemSelected A function that is dispatched when an item is selected (along with the node data associated with the function + * @param {boolean} showLabels A watched boolean that determines whether or not lables should be displayed beneath the nodes + * @param {function (node) } tooltipFunction A passed in tooltip function which can be used to overwrite the default tooltip behavior + * * @example - -
-
- -
-
-
-
-
- -
- - - - -
-
-
-
-
-
- -
- - -
-
-
-
-
-
- -
- -
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
+ +
+ + - - angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope ) { +
+ - $scope.config = { - chartId: 'exampleSparkline', - tooltipType: 'default' - }; + - var today = new Date(); - var dates = ['dates']; - for (var d = 20 - 1; d >= 0; d--) { - dates.push(new Date(today.getTime() - (d * 24 * 60 * 60 * 1000))); - } + + +
+
+
- $scope.data = { - dataAvailable: true, - total: 100, - xData: dates, - yData: ['used', 10, 20, 30, 20, 30, 10, 14, 20, 25, 68, 54, 56, 78, 56, 67, 88, 76, 65, 87, 76] - }; + + angular.module( 'patternfly.charts' ).controller( 'TopologyCtrl', function( $scope, $rootScope ) { + var index = 0; + var datasets = []; + + function sink(dataset) { + datasets.push(dataset); + } + + sink({ + "items": { + "ContainerManager10r20": { + "name": "ocp-master.example.com", + "kind": "ContainerManager", + "miq_id": 10000000000020, + "status": "Valid", + "display_kind": "OpenshiftEnterprise" + }, + "ContainerNode10r14": { + "name": "ocp-master.example.com", + "kind": "ContainerNode", + "miq_id": 10000000000014, + "status": "Ready", + "display_kind": "Node" + }, + "ContainerGroup10r240": { + "name": "docker-registry-2-vrguw", + "kind": "ContainerGroup", + "miq_id": 10000000000240, + "status": "Running", + "display_kind": "Pod" + }, + "Container10r235": { + "name": "registry", + "kind": "Container", + "miq_id": 10000000000235, + "status": "Error", + "display_kind": "Container" + }, + "ContainerReplicator10r56": { + "name": "docker-registry-2", + "kind": "ContainerReplicator", + "miq_id": 10000000000056, + "status": "OK", + "display_kind": "Replicator" + }, + "ContainerService10r61": { + "name": "docker-registry", + "kind": "ContainerService", + "miq_id": 10000000000061, + "status": "Unknown", + "display_kind": "Service" + }, + }, + "relations": [ + { + "source": "ContainerManager10r20", + "target": "ContainerNode10r14" + }, { + "source": "ContainerNode10r14", + "target": "ContainerGroup10r240" + }, { + "source": "ContainerGroup10r240", + "target": "Container10r235" + }, { + "source": "ContainerGroup10r240", + "target": "ContainerReplicator10r56" + }, { + "source": "ContainerGroup10r240", + "target": "ContainerService10r61" + }, { + "source": "ContainerNode10r14", + "target": "ContainerGroup10r241" + }, { + "source": "ContainerGroup10r241", + "target": "Container10r236" + }, { + "source": "ContainerGroup10r241", + "target": "ContainerReplicator10r57" + } + ], + "icons": { + "AvailabilityZone": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerReplicator": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerGroup": { + "type": "glyph", + "icon": "", + "fontfamily": "FontAwesome" + }, + "ContainerNode": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerService": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerRoute": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "Container": { + "type": "glyph", + "icon": "", + "fontfamily": "FontAwesome" + }, + "Host": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "Vm": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerManager": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + } + }, + }); + + $rootScope.data = datasets[index]; + + var nodeKinds = { + "ContainerReplicator": true, + "ContainerGroup": true, + "Container": true, + "ContainerNode": true, + "ContainerService": true, + "Host": true, + "Vm": true, + "ContainerRoute": true, + "ContainerManager": true + }; + + $rootScope.kinds = nodeKinds; + + var icons = $rootScope.data.icons; + $scope.nodes = {}; + for(var kind in nodeKinds) { + var icon = icons[kind]; + $scope.nodes[kind] = { + "name": kind, + "enabled": nodeKinds[kind], + "radius": 16, + "textX": 0, + "textY": 5, + "height": 18, + "width": 18, + "icon": icon.icon, + "fontFamily": icon.fontfamily + }; + } + + // Individual values can also be set for specific icons + $scope.nodes.ContainerService.textY = 9; + $scope.nodes.ContainerService.textX = -1; + + $scope.nodes.ContainerGroup.height = 30; + $scope.nodes.ContainerGroup.width = 30; + $scope.nodes.ContainerGroup.radius = 28; + $scope.nodes.ContainerGroup.textY = 8; + + $scope.itemSelected = function (item) { + var text = ""; + if (item) { + text = "Selected: " + item.name; + } + angular.element(document.getElementById("selected")).text(text); + }; + + $scope.removeKind = function () { + if($rootScope.kinds.ContainerNode) { + delete $rootScope.kinds.ContainerNode; + } + }; + + $scope.tooltip = function (node) { + var status = [ + 'Name: ' + node.item.name, + 'Type: ' + node.item.kind, + 'Status: ' + node.item.status + ]; + return status; + } + }); + + + + .pf-topology-svg g.Pod text { + font-family: FontAwesome; + font-size: 16px; + fill: #1186C1; + } + + .pf-topology-svg g.Node text { + fill: #636363; + } + + .pf-topology-svg g.Service text { + fill: #ff7f0e; + } + + .pf-topology-svg g.ReplicationController text { + fill: #9467bd; + font-size: 20px; + } + + .pf-topology-svg line.ReplicationControllerPod { + stroke-linecap: round; + stroke-dasharray: 5, 2; + } + + + .pf-topology-svg line.ContainerServiceContainerGroup, .pf-topology-svg line.ContainerReplicatorContainerGroup, .pf-topology-svg line.ContainerServiceContainerRoute, + .pf-topology-svg line.ContainerGroupContainerService, .pf-topology-svg line.ContainerGroupContainerReplicator { + stroke-linecap: round; + stroke-dasharray: 5.5; + } + + + .pf-topology-svg g.Container text.glyph { + font-size: 18px; + } + + .pf-topology-svg g.ContainerGroup text.glyph { + font-size: 28px; + } + + .pf-topology-svg g.Vm text.glyph, .pf-topology-svg g.Host text.glyph { + fill: #636363; + } - $scope.custShowXAxis = false; - $scope.custShowYAxis = false; - $scope.custChartHeight = 60; + .pf-topology-svg g.ContainerNode text.glyph { + font-size: 18px; + } + + .pf-topology-svg g.ContainerManager text.glyph { + font-size: 18px; + } + - $scope.addDataPoint = function () { - $scope.data.xData.push(new Date($scope.data.xData[$scope.data.xData.length - 1].getTime() + (24 * 60 * 60 * 1000))); - $scope.data.yData.push(Math.round(Math.random() * 100)); - }; - }); -
*/ -angular.module('patternfly.charts').component('pfSparklineChart', { +;angular.module('patternfly.charts').component('pfTopology', { bindings: { - config: '<', - chartData: '<', - chartHeight: ' d.floatpoint[0] + 5) || + (d.y < d.floatpoint[1] - 5 || d.y > d.floatpoint[1] + 5); + delete d.floatpoint; + } + d.fixed = moved && d.x > 3 && d.x < (width - 3) && d.y >= 3 && d.y < (height - 3); + d3.select(this).classed("fixed", d.fixed); + }); + + svg + .on("dblclick", function () { + svg.selectAll("g") + .classed("fixed", false) + .each(function (d) { + d.fixed = false; + }); + force.start(); + }) + .on("click", function (ev) { + if (!d3.select(d3.event.target).datum()) { + notify(null); + } + }); + + function select (item) { + if (item !== undefined) { + selection = item; + } + svg.selectAll("g") + .classed("selected", function (d) { + return d.item === selection; + }); + } + + function adjust () { + timeout = null; + width = outer.node().clientWidth; + height = outer.node().clientHeight; + force.size([width, height]); + svg.attr("viewBox", "0 0 " + width + " " + height); + update(); + } + + function update () { + var added; + + edges = svg.selectAll("line") + .data(links); + + edges.exit().remove(); + edges.enter().insert("line", ":first-child"); + + edges.attr("class", function (d) { + return d.kinds; + }); + + vertices = svg.selectAll("g") + .data(nodes, function (d) { + return d.id; + }); + + vertices.exit().remove(); + + added = vertices.enter().append("g") + .call(drag); + + select(selection); + + force + .nodes(nodes) + .links(links) + .start(); + + return added; + } + + function digest () { + var pnodes = nodes; + var plookup = lookup; + var item, id, kind, node; + var i, len, relation, s, t; + /* The actual data for the graph */ + nodes = []; + links = []; + lookup = {}; + + for (id in items) { + if (id) { + item = items[id]; + kind = item.kind; + + if (kinds && !kinds[kind]) { + continue; } + + /* Prevents flicker */ + node = pnodes[plookup[id]]; + if (!node) { + node = cache[id]; + delete cache[id]; + if (!node) { + node = {}; + } + } + + node.id = id; + node.item = item; + + lookup[id] = nodes.length; + nodes.push(node); + } + } + for (i = 0, len = relations.length; i < len; i++) { + relation = relations[i]; + + s = lookup[relation.source]; + t = lookup[relation.target]; + if (s === undefined || t === undefined) { + continue; } + + links.push({source: s, target: t, kinds: nodes[s].item.kind + nodes[t].item.kind}); + } + + if (width && height) { + return update(); + } + return d3.select(); + } + + function resized () { + window.clearTimeout(timeout); + timeout = window.setTimeout(adjust, 1); + } + + window.addEventListener('resize', resized); + + adjust(); + resized(); + + return { + select: select, + kinds: function (value) { + var added; + kinds = value; + added = digest(); + return [vertices, added]; }, - y: { - show: ctrl.showYAxis === true, - tick: { - format: function () { - return ''; + data: function (newItems, newRelations) { + var added; + items = newItems || {}; + relations = newRelations || []; + added = digest(); + return [vertices, added]; + }, + close: function () { + var id, node; + window.removeEventListener('resize', resized); + window.clearTimeout(timeout); + /* + * Keep the positions of these items cached, + * in case we are asked to make the same graph again. + */ + cache = {}; + for (id in lookup) { + if (id) { + node = nodes[lookup[id]]; + delete node.item; + cache[id] = node; } } + + nodes = []; + lookup = {}; } }; + } - // Setup the default configuration - ctrl.defaultConfig.tooltip = ctrl.sparklineTooltip(); - if (ctrl.chartHeight) { - ctrl.defaultConfig.size.height = ctrl.chartHeight; + function search (query) { + var svg = getSVG(); + var nodes = svg.selectAll("g"); + var selected, links; + if (query !== "") { + selected = nodes.filter(function (d) { + return d.item.name.indexOf(query) === -1; + }); + selected.style("opacity", "0.2"); + links = svg.selectAll("line"); + links.style("opacity", "0.2"); } - ctrl.defaultConfig.units = ''; + } - // Convert the given data to C3 chart format - ctrl.config.data = pfUtils.merge(ctrl.config.data, ctrl.getSparklineData(ctrl.chartData)); + function resetSearch (d3) { + // Display all topology nodes and links + d3.selectAll("g, line").transition() + .duration(2000) + .style("opacity", 1); + } - // Override defaults with callers specifications - ctrl.chartConfig = pfUtils.merge(ctrl.defaultConfig, ctrl.config); - }; + function toggleLabelVisibility () { + if (ctrl.showLabels) { + vs.selectAll("text.attached-label") + .classed("visible", true); + } else { + vs.selectAll("text.attached-label") + .classed("visible", false); + } + } - /* - * Convert the config data to C3 Data - */ - ctrl.getSparklineData = function (chartData) { - var sparklineData = { - type: 'area' - }; + function getSVG () { + var graph = d3.select("pf-topology"); + var svg = graph.select('svg'); + return svg; + } - if (chartData && chartData.dataAvailable !== false && chartData.xData && chartData.yData) { - sparklineData.x = chartData.xData[0]; - sparklineData.columns = [ - chartData.xData, - chartData.yData - ]; + function notify (item) { + ctrl.itemSelected({item: item}); + if ($attrs.selection === undefined) { + graph.select(item); } + } - return sparklineData; - }; + function icon (d) { + return '#' + d.item.kind; + } - ctrl.getTooltipTableHTML = function (tipRows) { - return '
' + - ' ' + - ' ' + - tipRows + - ' ' + - '
' + - '
'; - }; + function title (d) { + return d.item.name; + } - ctrl.sparklineTooltip = function () { - return { - contents: function (d) { - var tipRows; - var percentUsed = 0; + function render (args) { + var vertices = args[0]; + var added = args[1]; + var event; - if (ctrl.config.tooltipFn) { - tipRows = ctrl.config.tooltipFn(d); - } else { - switch (ctrl.config.tooltipType) { - case 'usagePerDay': - if (ctrl.chartData.dataAvailable !== false && ctrl.chartData.total > 0) { - percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); - } - tipRows = - '' + - ' ' + d[0].x.toLocaleDateString() + '' + - '' + - '' + - ' ' + percentUsed + '%:' + '' + - ' ' + d[0].value + ' ' + (ctrl.config.units ? ctrl.config.units + ' ' : '') + d[0].name + '' + - ''; - break; - case 'valuePerDay': - tipRows = - '' + - ' ' + d[0].x.toLocaleDateString() + '' + - ' ' + d[0].value + ' ' + d[0].name + '' + - ''; - break; - case 'percentage': - percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); - tipRows = - '' + - ' ' + percentUsed + '%' + '' + - ''; - break; - default: - tipRows = patternfly.c3ChartDefaults().getDefaultSparklineTooltip().contents(d); + // allow custom rendering of chart + if (angular.isFunction(ctrl.chartRendered)) { + event = ctrl.chartRendered({vertices: vertices, added: added}); + } + + if (!event || !event.defaultPrevented) { + added.attr("class", function (d) { + return d.item.kind; + }); + + added.append("circle") + .attr("r", function (d) { + return getDimensions(d).r; + }) + .attr('class', function (d) { + return getItemStatusClass(d); + }) + .on("contextmenu", function (d) { + contextMenu(ctrl, d); + }); + + added.append("title"); + + added.on("dblclick", function (d) { + return dblclick(d); + }); + + added.append("image") + .attr("xlink:href", function (d) { + // overwrite this . . . + var iconInfo = ctrl.icons[d.item.kind]; + switch (iconInfo.type) { + case 'image': + return iconInfo.icon; + case "glyph": + return null; } - } - return ctrl.getTooltipTableHTML(tipRows); - }, - position: function (data, width, height, element) { - var center; - var top; - var chartBox; - var graphOffsetX; - var x; + }) + .attr("height", function (d) { + var iconInfo = ctrl.icons[d.item.kind]; + if (iconInfo.type !== 'image') { + return 0; + } + return 40; + }) + .attr("width", function (d) { + var iconInfo = ctrl.icons[d.item.kind]; + if (iconInfo.type !== 'image') { + return 0; + } + return 40; + }) + .attr("y", function (d) { + return getDimensions(d).y; + }) + .attr("x", function (d) { + return getDimensions(d).x; + }) + .on("contextmenu", function (d) { + contextMenu(ctrl, d); + }); + + added.append("text") + .each(function (d) { + var iconInfo = ctrl.icons[d.item.kind]; + if (iconInfo.type !== 'glyph') { + return; + } + d3.select(this).text(iconInfo.icon) + .attr("class", "glyph") + .attr('font-family', iconInfo.fontfamily); + }) + + .attr("y", function (d) { + return getDimensions(d).y; + }) + .attr("x", function (d) { + return getDimensions(d).x; + }) + .on("contextmenu", function (d) { + contextMenu(this, d); + }); + + + added.append("text") + .attr("x", 26) + .attr("y", 24) + .text(function (d) { + return d.item.name; + }) + .attr('class', function () { + var className = "attached-label"; + if (ctrl.showLabels) { + return className + ' visible'; + } + return className; + }); + + added.selectAll("title").text(function (d) { + return tooltip(d).join("\n"); + }); + + vs = vertices; + } + graph.select(); + } + + function tooltip (d) { + if (ctrl.tooltipFunction) { + return ctrl.tooltipFunction({node: d}); + } + return 'Name: ' + d.item.name; + } + + function removeContextMenu () { + d3.event.preventDefault(); + d3.select('.popup').remove(); + contextMenuShowing = false; + } + + function contextMenu (that, data) { + var canvasSize, popupSize, canvas, mousePosition, popup; + + if (contextMenuShowing) { + removeContextMenu(); + } else { + d3.event.preventDefault(); + + canvas = d3.select('pf-topology'); + mousePosition = d3.mouse(canvas.node()); + + popup = canvas.append('div') + .attr('class', 'popup') + .style('left', mousePosition[0] + 'px') + .style('top', mousePosition[1] + 'px'); + popup.append('h5').text('Actions on ' + data.item.kind); - try { - center = parseInt(element.getAttribute('x')); - top = parseInt(element.getAttribute('y')); - chartBox = document.querySelector('#' + ctrl.sparklineChartId).getBoundingClientRect(); - graphOffsetX = document.querySelector('#' + ctrl.sparklineChartId + ' g.c3-axis-y').getBoundingClientRect().right; - x = Math.max(0, center + graphOffsetX - chartBox.left - Math.floor(width / 2)); + buildContextMenuOptions(popup, data); - return { - top: top - height, - left: Math.min(x, chartBox.width - width) - }; - } catch (e) { - } + canvasSize = [ + canvas.node().offsetWidth, + canvas.node().offsetHeight + ]; + + popupSize = [ + popup.node().offsetWidth, + popup.node().offsetHeight + ]; + + if (popupSize[0] + mousePosition[0] > canvasSize[0]) { + popup.style('left', 'auto'); + popup.style('right', 0); } - }; - }; - ctrl.$onChanges = function (changesObj) { - ctrl.updateAll(); - }; + if (popupSize[1] + mousePosition[1] > canvasSize[1]) { + popup.style('top', 'auto'); + popup.style('bottom', 0); + } + contextMenuShowing = !contextMenuShowing; + } + } - ctrl.$doCheck = function () { - // do a deep compare on chartData - if (!angular.equals(ctrl.chartData, prevChartData)) { - ctrl.updateAll(); + function buildContextMenuOptions (popup, data) { + if (data.item.kind === 'Tag') { + return false; } - }; + addContextMenuOption(popup, 'Go to summary page', data, dblclick); + } + + function dblclick (d) { + window.location.assign(d.url); + } + + function addContextMenuOption (popup, text, data, callback) { + popup.append('p').text(text).on('click', function () { + callback(data); + }); + } + + function getDimensions (d) { + var nodeEntry = ctrl.nodes[d.item.kind]; + var defaultDimensions = defaultElementDimensions(); + if (nodeEntry) { + if (nodeEntry.textX) { + defaultDimensions.x = nodeEntry.textX; + } + if (nodeEntry.textY) { + defaultDimensions.y = nodeEntry.textY; + } + + if (nodeEntry.radius) { + defaultDimensions.r = nodeEntry.radius; + } + } + return defaultDimensions; + } + + function defaultElementDimensions () { + return { x: 0, y: 9, r: 17 }; + } + + function getItemStatusClass (d) { + switch (d.item.status.toLowerCase()) { + case "ok": + case "active": + case "available": + case "on": + case "ready": + case "running": + case "succeeded": + case "valid": + return "success"; + case "notready": + case "failed": + case "error": + case "unreachable": + return "error"; + case 'warning': + case 'waiting': + case 'pending': + return "warning"; + case 'unknown': + case 'terminated': + return "unknown"; + } + } }] }); ;/** @@ -3159,11 +6830,12 @@ angular.module('patternfly.charts').component('pfUtilizationTrendChart', { var matchesFilter = function (item, filter) { var match = true; + var re = new RegExp(filter.value, 'i'); if (filter.id === 'name') { - match = item.name.match(filter.value) !== null; + match = item.name.match(re) !== null; } else if (filter.id === 'address') { - match = item.address.match(filter.value) !== null; + match = item.address.match(re) !== null; } else if (filter.id === 'birthMonth') { match = item.birthMonth === filter.value; } @@ -7151,8 +10823,9 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { * * @param {object} config Optional configuration object * * @param {object} dtOptions Optional angular-datatables DTOptionsBuilder configuration object. See {@link http://l-lin.github.io/angular-datatables/archives/#/api angular-datatables: DTOptionsBuilder} * @param {array} items Array of items to display in the table view. @@ -7173,31 +10846,46 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { *
  • .title - (String) Optional title, used for the tooltip *
  • .actionFn - (function(action)) Function to invoke when the action selected * + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @example - +
    -
    - -
    -
    - +
    +
    +
    +
    -
    +
    +
    +
    + +
    +
    + +
    +
    + + + + angular.module('patternfly.tableview.demo', ['patternfly.views','patternfly.table']); - angular.module('patternfly.table').controller('TableCtrl', ['$scope', + angular.module('patternfly.tableview.demo').controller('TableCtrl', ['$scope', function ($scope) { $scope.dtOptions = { order: [[2, "asc"]], @@ -7265,7 +10953,19 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.config = { onCheckBoxChange: handleCheckBoxChange, - selectionMatchProp: "name" + selectionMatchProp: "name", + itemsAvailable: true + }; + + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } }; function handleCheckBoxChange (item) { @@ -7335,8 +11035,9 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { * * @param {object} config Optional configuration object *
      - *
    • .selectionMatchProp - (string) Property of the items to use for determining matching, default is 'uuid' - *
    • .onCheckBoxChange - ( function(item) ) Called to notify when a checkbox selection changes, default is none + *
    • .selectionMatchProp - (string) Property of the items to use for determining matching, default is 'uuid' + *
    • .onCheckBoxChange - ( function(item) ) Called to notify when a checkbox selection changes, default is none + *
    • .itemsAvailable - (boolean) If 'false', displays the {@link patternfly.views.component:pfEmptyState Empty State} component. *
    * @param {object} dtOptions Optional angular-datatables DTOptionsBuilder configuration object. See {@link http://l-lin.github.io/angular-datatables/archives/#/api angular-datatables: DTOptionsBuilder} * @param {array} items Array of items to display in the table view. @@ -7357,6 +11058,7 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { *
  • .title - (String) Optional title, used for the tooltip *
  • .actionFn - (function(action)) Function to invoke when the action selected * + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @example @@ -7366,22 +11068,27 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', {
    - + --!> +

    @@ -7706,7 +11413,19 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.tableConfig = { onCheckBoxChange: handleCheckBoxChange, - selectionMatchProp: "name" + selectionMatchProp: "name", + itemsAvailable: true + }; + + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } }; $scope.tableActionButtons = [ @@ -7753,6 +11472,18 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { actionFn: performTableAction } ]; + + $scope.updateItemsAvailable = function () { + if(!$scope.tableConfig.itemsAvailable) { + $scope.toolbarConfig.filterConfig.resultsCount = 0; + $scope.toolbarConfig.filterConfig.totalCount = 0; + $scope.toolbarConfig.filterConfig.selectedCount = 0; + } else { + $scope.toolbarConfig.filterConfig.resultsCount = $scope.items.length; + $scope.toolbarConfig.filterConfig.totalCount = $scope.allItems.length; + handleCheckBoxChange(); + } + }; } ]); @@ -7765,7 +11496,8 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { colummns: '<', items: '<', actionButtons: '
    - +
    {{item.name}} @@ -8275,7 +12009,9 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', {
    - +
    {{item.name}}
    @@ -8290,9 +12026,17 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', {
    + items="items" + empty-state-config="emptyStateConfig">
    +
    +
    + +
    +

    @@ -8397,13 +12141,14 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { var matchesFilter = function (item, filter) { var match = true; + var re = new RegExp(filter.value, 'i'); if (filter.id === 'name') { - match = item.name.match(filter.value) !== null; + match = item.name.match(re) !== null; } else if (filter.id === 'age') { match = item.age === parseInt(filter.value); } else if (filter.id === 'address') { - match = item.address.match(filter.value) !== null; + match = item.address.match(re) !== null; } else if (filter.id === 'birthMonth') { match = item.birthMonth === filter.value; } @@ -8621,12 +12366,25 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.listConfig = { selectionMatchProp: 'name', checkDisabled: false, + itemsAvailable: true, onCheckBoxChange: handleCheckBoxChange }; + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; + $scope.tableConfig = { onCheckBoxChange: handleCheckBoxChange, - selectionMatchProp: "name" + selectionMatchProp: "name", + itemsAvailable: true, }; $scope.doAdd = function () { @@ -8637,6 +12395,19 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.actionsText = "Option " + option + " selected\n" + $scope.actionsText; }; + $scope.updateItemsAvailable = function () { + $scope.tableConfig.itemsAvailable = $scope.listConfig.itemsAvailable; + if(!$scope.listConfig.itemsAvailable) { + $scope.toolbarConfig.filterConfig.resultsCount = 0; + $scope.toolbarConfig.filterConfig.totalCount = 0; + $scope.toolbarConfig.filterConfig.selectedCount = 0; + } else { + $scope.toolbarConfig.filterConfig.resultsCount = $scope.items.length; + $scope.toolbarConfig.filterConfig.totalCount = $scope.allItems.length; + handleCheckBoxChange(); + } + }; + function handleCheckBoxChange (item) { var selectedItems = $filter('filter')($scope.allItems, {selected: true}); if (selectedItems) { @@ -9303,8 +13074,9 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout *
  • .onSelectionChange - ( function(items) ) Called to notify when item selections change, default is none *
  • .onClick - ( function(item, event) ) Called to notify when an item is clicked, default is none *
  • .onDblClick - ( function(item, event) ) Called to notify when an item is double clicked, default is none + *
  • .itemsAvailable - (boolean) If 'false', displays the {@link patternfly.views.component:pfEmptyState Empty State} component. * - * + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @param {Array} items the data to be shown in the cards
    * * @example @@ -9322,7 +13094,7 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout
    - +
    {{item.name}}
    @@ -9370,6 +13142,9 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout +
    @@ -9424,6 +13199,7 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout $scope.config = { selectItems: false, + itemsAvailable: true, multiSelect: false, dblClick: false, selectionMatchProp: 'name', @@ -9469,6 +13245,17 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout state: "New York" }, ] + + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; } ]); @@ -9477,12 +13264,13 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout angular.module('patternfly.views').component('pfCardView', { bindings: { config: '=?', + emptyStateConfig: '=?', items: '=', eventId: '@id' }, transclude: true, templateUrl: 'views/cardview/card-view.html', - controller: ["pfUtils", function (pfUtils) { + controller: function () { 'use strict'; var ctrl = this; ctrl.defaultConfig = { @@ -9585,13 +13373,171 @@ angular.module('patternfly.views').component('pfCardView', { }; ctrl.$onInit = function () { - ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Setting bound variables to new variables loses it's binding + // ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Instead, use _.defaults to update the existing variable + _.defaults(ctrl.config, ctrl.defaultConfig); if (ctrl.config.selectItems && ctrl.config.showSelectBox) { throw new Error('pfCardView - ' + 'Illegal use of pfCardView component! ' + 'Cannot allow both select box and click selection in the same card view.'); } }; + } +}); +;/** + * @ngdoc directive + * @name patternfly.views.component:pfEmptyState + * @restrict E + * + * @description + * Component for rendering an empty state. + * + * @param {object} config Optional configuration object + * + * @param {array} actionButtons Buttons to display under the icon, title, and informational paragraph. + * + * @example + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + + + angular.module('patternfly.views').controller('ViewCtrl', ['$scope', + function ($scope) { + $scope.eventText = ''; + + $scope.config = { + icon: 'pficon-add-circle-o', + title: 'Empty State Title', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; + + var performAction = function (action) { + $scope.eventText = action.name + " executed. \r\n" + $scope.eventText; + }; + + $scope.actionButtons = [ + { + name: 'Main Action', + title: 'Perform an action', + actionFn: performAction, + type: 'main' + }, + { + name: 'Secondary Action 1', + title: 'Perform an action', + actionFn: performAction + }, + { + name: 'Secondary Action 2', + title: 'Perform an action', + actionFn: performAction + }, + { + name: 'Secondary Action 3', + title: 'Perform an action', + actionFn: performAction + } + ]; + } + ]); + +
    +*/ +angular.module('patternfly.views').component('pfEmptyState', { + bindings: { + config: '.showSelectBox - (boolean) Show item selection boxes for each item, default is true *
  • .selectItems - (boolean) Allow row selection, default is false *
  • .dlbClick - (boolean) Handle double clicking (item remains selected on a double click). Default is false. + *
  • .dragEnabled - (boolean) Enable drag and drop. Default is false. + *
  • .dragEnd - ( function() ) Function to call when the drag operation ended, default is none + *
  • .dragMoved - ( function() ) Function to call when the drag operation moved an element, default is none + *
  • .dragStart - ( function(item) ) Function to call when the drag operation started, default is none *
  • .multiSelect - (boolean) Allow multiple row selections, selectItems must also be set, not applicable when dblClick is true. Default is false *
  • .useExpandingRows - (boolean) Allow row expansion for each list item. *
  • .selectionMatchProp - (string) Property of the items to use for determining matching, default is 'uuid' *
  • .selectedItems - (array) Current set of selected items + *
  • .itemsAvailable - (boolean) If 'false', displays the {@link patternfly.views.component:pfEmptyState Empty State} component. *
  • .checkDisabled - ( function(item) ) Function to call to determine if an item is disabled, default is none *
  • .onCheckBoxChange - ( function(item) ) Called to notify when a checkbox selection changes, default is none *
  • .onSelect - ( function(item, event) ) Called to notify of item selection, default is none @@ -9646,13 +13597,16 @@ angular.module('patternfly.views').component('pfCardView', { * @param {function (item))} menuClassForItemFn function(item) Used to specify a class for an item's dropdown kebab * @param {function (action, item))} updateMenuActionForItemFn function(action, item) Used to update a menu action based on the current item * @param {object} customScope Object containing any variables/functions used by the transcluded html, access via customScope. + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @example
    Show Expanding Rows + +
    + +
    +
    +
    +
    +
    @@ -9781,6 +13747,28 @@ angular.module('patternfly.views').component('pfCardView', { return $scope.showDisabled && (item.name === "John Smith"); }; + var dragEnd = function() { + $scope.eventText = 'drag end\r\n' + $scope.eventText; + }; + var dragMoved = function() { + var index = -1; + + for (var i = 0; i < $scope.items.length; i++) { + if ($scope.items[i] === $scope.dragItem) { + index = i; + break; + } + } + if (index >= 0) { + $scope.items.splice(index, 1); + } + $scope.eventText = 'drag moved\r\n' + $scope.eventText; + }; + var dragStart = function(item) { + $scope.dragItem = item; + $scope.eventText = item.name + ': drag start\r\n' + $scope.eventText; + }; + $scope.enableButtonForItemFn = function(action, item) { return !((action.name ==='Action 2') && (item.name === "Frank Livingston")) && !(action.name === 'Start' && item.started); @@ -9821,8 +13809,13 @@ angular.module('patternfly.views').component('pfCardView', { selectItems: false, multiSelect: false, dblClick: false, + dragEnabled: false, + dragEnd: dragEnd, + dragMoved: dragMoved, + dragStart: dragStart, selectionMatchProp: 'name', selectedItems: [], + itemsAvailable: true, checkDisabled: checkDisabledItem, showSelectBox: true, useExpandingRows: false, @@ -9833,6 +13826,17 @@ angular.module('patternfly.views').component('pfCardView', { onDblClick: handleDblClick }; + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; + $scope.items = [ { name: "Fred Flintstone", @@ -9990,13 +13994,14 @@ angular.module('patternfly.views').component('pfListView', { updateMenuActionForItemFn: '=?', actions: '=?', updateActionForItemFn: '=?', - customScope: '=?' + customScope: '=?', + emptyStateConfig: '=?' }, transclude: { expandedContent: '?listExpandedContent' }, templateUrl: 'views/listview/list-view.html', - controller: ["$timeout", "$window", "$element", "pfUtils", function ($timeout, $window, $element, pfUtils) { + controller: ["$window", "$element", function ($window, $element) { 'use strict'; var ctrl = this; @@ -10020,6 +14025,10 @@ angular.module('patternfly.views').component('pfListView', { selectItems: false, multiSelect: false, dblClick: false, + dragEnabled: false, + dragEnd: null, + dragMoved: null, + dragStart: null, selectionMatchProp: 'uuid', selectedItems: [], checkDisabled: false, @@ -10094,7 +14103,7 @@ angular.module('patternfly.views').component('pfListView', { // update the actions based on the current item ctrl.updateActions(item); - $timeout(function () { + $window.requestAnimationFrame(function () { var parentDiv = undefined; var nextElement; @@ -10199,7 +14208,10 @@ angular.module('patternfly.views').component('pfListView', { }; ctrl.$onInit = function () { - ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Setting bound variables to new variables loses it's binding + // ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Instead, use _.defaults to update the existing variable + _.defaults(ctrl.config, ctrl.defaultConfig); if (!ctrl.config.selectItems) { ctrl.config.selectedItems = []; } @@ -10212,6 +14224,30 @@ angular.module('patternfly.views').component('pfListView', { 'Cannot allow both select box and click selection in the same list view.'); } }; + + ctrl.dragEnd = function () { + if (angular.isFunction(ctrl.config.dragEnd)) { + ctrl.config.dragEnd(); + } + }; + + ctrl.dragMoved = function () { + if (angular.isFunction(ctrl.config.dragMoved)) { + ctrl.config.dragMoved(); + } + }; + + ctrl.isDragOriginal = function (item) { + return (item === ctrl.dragItem); + }; + + ctrl.dragStart = function (item) { + ctrl.dragItem = item; + + if (angular.isFunction(ctrl.config.dragStart)) { + ctrl.config.dragStart(item); + } + }; }] }); ;(function () { @@ -11380,6 +15416,43 @@ angular.module('patternfly.wizard').component('pfWizard', { }; }] }); +;angular.module('patternfly.canvas').run(['$templateCache', function($templateCache) { + 'use strict'; + + $templateCache.put('canvas-view/canvas-editor/canvas-editor.html', + "
    Hide Connectors
    {{tab.preTitle}}
    {{tab.title}}
    " + ); + + + $templateCache.put('canvas-view/canvas-editor/toolbox-items.html', + "
    • \"{{item.name}}\" {{ item.name }}
    " + ); + + + $templateCache.put('canvas-view/canvas/canvas.html', + "Select a second item to complete the connection or click on the canvas to cancelNo available connections! Click on the canvas to cancel{{node.name()}}

    {{node.name()}}

    {{node.fontContent()}}{{'\\ue918'}}{{connector.fontContent()}}{{connector.name()}}
    {{connection.name()}}
    " + ); + + + $templateCache.put('canvas-view/canvas/node-toolbar.html', + "
    " + ); + +}]); ;angular.module('patternfly.card').run(['$templateCache', function($templateCache) { 'use strict'; @@ -11583,7 +15656,7 @@ angular.module('patternfly.wizard').component('pfWizard', { 'use strict'; $templateCache.put('table/tableview/table-view.html', - "
    {{col.header}}Actions
    {{ value }} 0\" class=table-view-pf-actions ng-repeat=\"actionButton in $ctrl.actionButtons\">
    0\" class=\"table-view-pf-actions list-group-item-header\">
    " + "
    {{col.header}}Actions
    {{ value }} 0\" class=table-view-pf-actions ng-repeat=\"actionButton in $ctrl.actionButtons\">
    0\" class=\"table-view-pf-actions list-group-item-header\">
    " ); }]); @@ -11602,12 +15675,17 @@ angular.module('patternfly.wizard').component('pfWizard', { 'use strict'; $templateCache.put('views/cardview/card-view.html', - "
    " + "
    " + ); + + + $templateCache.put('views/empty-state.html', + "

    {{$ctrl.config.title}}

    {{$ctrl.config.info}}

    " ); $templateCache.put('views/listview/list-view.html', - "
    0) || ($ctrl.menuActions && $ctrl.menuActions.length > 0)\">
    " + "
    0) || ($ctrl.menuActions && $ctrl.menuActions.length > 0)\">
    " ); }]); diff --git a/dist/angular-patternfly.min.js b/dist/angular-patternfly.min.js index cb1a415d6..ec2ada970 100644 --- a/dist/angular-patternfly.min.js +++ b/dist/angular-patternfly.min.js @@ -1,5 +1,6 @@ -function mergeDeep(dst){"use strict";return angular.forEach(arguments,function(obj){obj!==dst&&angular.forEach(obj,function(value,key){dst[key]&&dst[key].constructor&&dst[key].constructor===Object?mergeDeep(dst[key],value):dst[key]=value})}),dst}angular.module("patternfly.card",["ui.bootstrap"]),angular.module("patternfly.charts",["patternfly.utils","ui.bootstrap","ngSanitize"]),angular.module("patternfly.filters",["ui.bootstrap"]),angular.module("patternfly.form",[]),angular.module("patternfly.modals",["ui.bootstrap.modal","ui.bootstrap.tpls"]),angular.module("patternfly.navigation",["ui.bootstrap"]),angular.module("patternfly.notification",["patternfly.utils","ui.bootstrap"]),angular.module("patternfly",["patternfly.autofocus","patternfly.card","patternfly.filters","patternfly.form","patternfly.modals","patternfly.navigation","patternfly.notification","patternfly.select","patternfly.sort","patternfly.toolbars","patternfly.utils","patternfly.validation","patternfly.views","patternfly.wizard"]),angular.module("patternfly.select",["ui.bootstrap"]),angular.module("patternfly.sort",["ui.bootstrap"]),angular.module("patternfly.table",["datatables","patternfly.utils","patternfly.filters","patternfly.sort"]),angular.module("patternfly.toolbars",["patternfly.utils","patternfly.filters","patternfly.sort","patternfly.views"]),angular.module("patternfly.utils",["ui.bootstrap"]),angular.module("patternfly.views",["patternfly.utils","patternfly.filters","patternfly.sort","patternfly.charts"]),angular.module("patternfly.wizard",["ui.bootstrap.modal","ui.bootstrap.tpls","patternfly.form"]),angular.module("patternfly.autofocus",[]).directive("pfFocused",["$timeout",function($timeout){"use strict";return{restrict:"A",link:function(scope,element,attrs){scope.$watch(attrs.pfFocused,function(newValue){$timeout(function(){newValue&&(element[0].focus(),element[0].select&&element[0].select())})})}}}]),angular.module("patternfly.card").component("pfAggregateStatusCard",{bindings:{status:"=",showTopBorder:"@?",altLayout:"@?",layout:"@?"},templateUrl:"card/aggregate-status/aggregate-status-card.html",controller:function(){"use strict";var ctrl=this;ctrl.$onInit=function(){ctrl.shouldShowTopBorder="true"===ctrl.showTopBorder,ctrl.isAltLayout="true"===ctrl.altLayout||"tall"===ctrl.layout,ctrl.isMiniLayout="mini"===ctrl.layout}}}),angular.module("patternfly.card").component("pfCard",{transclude:!0,templateUrl:"card/basic/card.html",bindings:{headTitle:"@",subTitle:"@?",showTopBorder:"@?",showTitlesSeparator:"@?",footer:"=?",filter:"=?"},controller:function(){"use strict";var ctrl=this;ctrl.filter&&!ctrl.currentFilter&&(ctrl.filter.defaultFilter?ctrl.currentFilter=ctrl.filter.filters[ctrl.filter.defaultFilter]:ctrl.currentFilter=ctrl.filter.filters[0]),ctrl.footerCallBackFn=function(){ctrl.footerCallBackResult=ctrl.footer.callBackFn()},ctrl.filterCallBackFn=function(f){ctrl.currentFilter=f,ctrl.filter.callBackFn&&(ctrl.filterCallBackResult=ctrl.filter.callBackFn(f))},ctrl.showHeader=function(){return ctrl.headTitle||ctrl.showFilterInHeader()},ctrl.showFilterInHeader=function(){return ctrl.filter&&ctrl.filter.filters&&ctrl.filter.position&&"header"===ctrl.filter.position},ctrl.showFilterInFooter=function(){return ctrl.filter&&ctrl.filter.filters&&(!ctrl.filter.position||"footer"===ctrl.filter.position)},ctrl.$onInit=function(){ctrl.shouldShowTitlesSeparator=!ctrl.showTitlesSeparator||"true"===ctrl.showTitlesSeparator}}}),function(){"use strict";var patternflyDefaults=patternfly.c3ChartDefaults();angular.module("patternfly.charts").constant("c3ChartDefaults",{getDefaultColors:patternflyDefaults.getDefaultColors,getDefaultDonut:patternflyDefaults.getDefaultDonut,getDefaultDonutSize:patternflyDefaults.getDefaultDonutSize,getDefaultDonutColor:patternflyDefaults.getDefaultDonutColors,getDefaultDonutLegend:patternflyDefaults.getDefaultDonutLegend,getDefaultDonutConfig:patternflyDefaults.getDefaultDonutConfig,getDefaultSparklineArea:patternflyDefaults.getDefaultSparklineArea,getDefaultSparklineSize:patternflyDefaults.getDefaultSparklineSize,getDefaultSparklineAxis:patternflyDefaults.getDefaultSparklineAxis,getDefaultSparklineColor:patternflyDefaults.getDefaultColors,getDefaultSparklineLegend:patternflyDefaults.getDefaultSparklineLegend,getDefaultSparklinePoint:patternflyDefaults.getDefaultSparklinePoint,getDefaultSparklineTooltip:patternflyDefaults.getDefaultSparklineTooltip,getDefaultSparklineConfig:patternflyDefaults.getDefaultSparklineConfig,getDefaultLineConfig:patternflyDefaults.getDefaultLineConfig})}(),function(){"use strict";angular.module("patternfly.charts").component("pfC3Chart",{bindings:{config:"<",getChartCallback:"<"},template:'
    ',controller:["$timeout","$attrs",function($timeout,$attrs){var prevConfig,ctrl=this;ctrl.generateChart=function(){var chart,chartData;prevConfig=angular.copy(ctrl.config),$timeout(function(){chartData=ctrl.config,chartData&&(chartData.bindto="#"+$attrs.id,chart=c3.generate(chartData),ctrl.getChartCallback(chart),prevConfig=angular.copy(ctrl.config))})},ctrl.$doCheck=function(){angular.equals(ctrl.config,prevConfig)||ctrl.generateChart()}}]})}(),angular.module("patternfly.charts").component("pfDonutPctChart",{bindings:{config:"<",data:"<",chartHeight:"=thresholds.error?(threshold="error",color=pfUtils.colorPalette.red):used>=thresholds.warning&&(threshold="warning",color=pfUtils.colorPalette.orange)),ctrl.threshold&&ctrl.threshold===threshold||(ctrl.threshold=threshold,ctrl.onThresholdChange({threshold:ctrl.threshold})),color},ctrl.statusDonutColor=function(){var color,percentUsed;return color={pattern:[]},percentUsed=ctrl.data.used/ctrl.data.total*100,color.pattern[0]=ctrl.getStatusColor(percentUsed,ctrl.config.thresholds),color.pattern[1]=pfUtils.colorPalette.black300,color},ctrl.donutTooltip=function(){return{contents:function(d){var tooltipHtml;return tooltipHtml=ctrl.config.tooltipFn?''+ctrl.config.tooltipFn(d)+"":''+Math.round(100*d[0].ratio)+"% "+ctrl.config.units+" "+d[0].name+""}}},ctrl.getDonutData=function(){return{columns:[["Used",ctrl.data.used],["Available",ctrl.data.available]],type:"donut",donut:{label:{show:!1}},groups:[["used","available"]],order:null}},ctrl.getCenterLabelText=function(){var centerLabelText;return centerLabelText={bigText:ctrl.data.used,smText:ctrl.config.units+" Used"},ctrl.config.centerLabelFn?(centerLabelText.bigText=ctrl.config.centerLabelFn(),centerLabelText.smText=""):"none"===ctrl.centerLabel?(centerLabelText.bigText="",centerLabelText.smText=""):"available"===ctrl.centerLabel?(centerLabelText.bigText=ctrl.data.available,centerLabelText.smText=ctrl.config.units+" Available"):"percent"===ctrl.centerLabel&&(centerLabelText.bigText=Math.round(ctrl.data.used/ctrl.data.total*100)+"%",centerLabelText.smText="of "+ctrl.data.total+" "+ctrl.config.units),centerLabelText},ctrl.updateAll=function(){prevData=angular.copy(ctrl.data),ctrl.config=pfUtils.merge(patternfly.c3ChartDefaults().getDefaultDonutConfig(),ctrl.config),ctrl.updateAvailable(),ctrl.config.data=pfUtils.merge(ctrl.config.data,ctrl.getDonutData()),ctrl.config.color=ctrl.statusDonutColor(ctrl),ctrl.config.tooltip=ctrl.donutTooltip(),ctrl.config.data.onclick=ctrl.config.onClickFn},ctrl.setupDonutChartTitle=function(){var donutChartTitle,centerLabelText;angular.isUndefined(ctrl.chart)||(donutChartTitle=d3.select(ctrl.chart.element).select("text.c3-chart-arcs-title"),donutChartTitle&&(centerLabelText=ctrl.getCenterLabelText(),donutChartTitle.selectAll("*").remove(),centerLabelText.bigText&&!centerLabelText.smText?donutChartTitle.text(centerLabelText.bigText):(donutChartTitle.insert("tspan").text(centerLabelText.bigText).classed("donut-title-big-pf",!0).attr("dy",0).attr("x",0),donutChartTitle.insert("tspan").text(centerLabelText.smText).classed("donut-title-small-pf",!0).attr("dy",20).attr("x",0))))},ctrl.setChart=function(chart){ctrl.chart=chart,ctrl.setupDonutChartTitle()},ctrl.$onChanges=function(changesObj){(changesObj.config||changesObj.data)&&ctrl.updateAll(),changesObj.chartHeight&&(ctrl.config.size.height=changesObj.chartHeight.currentValue),changesObj.centerLabel&&ctrl.setupDonutChartTitle()},ctrl.$doCheck=function(){angular.equals(ctrl.data,prevData)||ctrl.updateAll()}}]}),angular.module("patternfly.charts").component("pfEmptyChart",{bindings:{chartHeight:" 90%"];ctrl.$onInit=function(){ctrl.updateAll()},ctrl.updateAll=function(){var index,items=[];for(ctrl.legendColors||(ctrl.legendColors=heatmapColorPatternDefaults),ctrl.legend||(ctrl.legend=legendLabelDefaults),index=ctrl.legend.length-1;index>=0;index--)items.push({text:ctrl.legend[index],color:ctrl.legendColors[index]});ctrl.legendItems=items},ctrl.$onChanges=function(changesObj){changesObj.legend&&!changesObj.legend.isFirstChange()&&ctrl.updateAll(),changesObj.legendColors&&!changesObj.legendColors.isFirstChange()&&ctrl.updateAll()}}}),angular.module("patternfly.charts").component("pfHeatmap",{bindings:{data:"<",chartDataAvailable:" 90%"],rangeTooltipDefaults=["< 70%","70-80%","80-90%","> 90%"],heightDefault=200,setStyles=function(){ctrl.containerStyles={height:ctrl.height+"px",display:ctrl.chartDataAvailable===!1?"none":"block"}},setSizes=function(){var parentContainer=$element[0].querySelector(".heatmap-container");containerWidth=parentContainer.clientWidth,containerHeight=parentContainer.clientHeight,blockSize=determineBlockSize(),blockSize-ctrl.padding>ctrl.maxSize?(blockSize=ctrl.padding+ctrl.maxSize,numberOfRows=Math.ceil(Math.sqrt(ctrl.data.length)),(blockSize*numberOfRows>containerWidth||blockSize*numberOfRows>containerHeight)&&(numberOfRows=0===blockSize?0:Math.floor(containerHeight/blockSize))):blockSize-ctrl.paddingcontainerWidth||blockSize*numberOfRows>containerHeight)&&(numberOfRows=0===blockSize?0:Math.floor(containerHeight/blockSize))):numberOfRows=0===blockSize?0:Math.floor(containerHeight/blockSize)},determineBlockSize=function(){var sx,sy,x=containerWidth,y=containerHeight,n=ctrl.data?ctrl.data.length:0,px=Math.ceil(Math.sqrt(n*x/y)),py=Math.ceil(Math.sqrt(n*y/x));return sx=Math.floor(px*y/x)*px50&&(ctrl.maxSize=50)),void 0===ctrl.minBlockSize||isNaN(ctrl.minBlockSize)?ctrl.minSize=2:ctrl.minSize=parseInt(ctrl.minBlockSize),void 0===ctrl.blockPadding||isNaN(ctrl.blockPadding)?ctrl.padding=2:ctrl.padding=parseInt(ctrl.blockPadding),void 0===ctrl.rangeHoverSize||isNaN(ctrl.rangeHoverSize)?ctrl.rangeHoverSize=15:ctrl.rangeHoverSize=parseInt(ctrl.rangeHoverSize),ctrl.rangeOnHover=void 0===ctrl.rangeOnHover||ctrl.rangeOnHover?!0:!1,ctrl.rangeTooltips||(ctrl.rangeTooltips=rangeTooltipDefaults),ctrl.thresholds||(ctrl.thresholds=thresholdDefaults),ctrl.heatmapColorPattern||(ctrl.heatmapColorPattern=heatmapColorPatternDefaults),ctrl.legendLabels||(ctrl.legendLabels=legendLabelDefaults),ctrl.height=ctrl.height||heightDefault,ctrl.showLegend=ctrl.showLegend||void 0===ctrl.showLegend,ctrl.loadingDone=!1,angular.element($window).bind("resize",function(){setSizes(),redraw()}),ctrl.thisComponent=$element[0].querySelector(".heatmap-pf-svg"),$timeout(function(){setStyles(),setSizes(),redraw()})},ctrl.$onChanges=function(changesObj){changesObj.chartDataAvailable&&!changesObj.chartDataAvailable.isFirstChange()?setStyles():(ctrl.updateAll(),ctrl.loadingDone=!0)},ctrl.$doCheck=function(){angular.equals(ctrl.data,prevData)||(setStyles(),ctrl.chartDataAvailable!==!1&&(setSizes(),redraw()))},ctrl.$postLink=function(){setStyles(),setSizes(),redraw()}}]}),angular.module("patternfly.charts").component("pfLineChart",{bindings:{config:"<",chartData:"<",showXAxis:" '+tipRows+"
    "},ctrl.sparklineTooltip=function(){return{contents:function(d){var tipRows,percentUsed=0;if(ctrl.config.tooltipFn)tipRows=ctrl.config.tooltipFn(d);else switch(ctrl.config.tooltipType){case"usagePerDay":ctrl.chartData.dataAvailable!==!1&&ctrl.chartData.total>0&&(percentUsed=Math.round(d[0].value/ctrl.chartData.total*100)),tipRows=' '+d[0].x.toLocaleDateString()+' '+percentUsed+'%: '+d[0].value+" "+(ctrl.config.units?ctrl.config.units+" ":"")+d[0].name+"";break;case"valuePerDay":tipRows=' '+d[0].x.toLocaleDateString()+' '+d[0].value+" "+d[0].name+"";break;case"percentage":percentUsed=Math.round(d[0].value/ctrl.chartData.total*100),tipRows=' '+percentUsed+"%";break;default:tipRows=patternfly.c3ChartDefaults().getDefaultSparklineTooltip().contents(d)}return ctrl.getTooltipTableHTML(tipRows)},position:function(data,width,height,element){var center,top,chartBox,graphOffsetX,x;try{return center=parseInt(element.getAttribute("x")),top=parseInt(element.getAttribute("y")),chartBox=document.querySelector("#"+ctrl.sparklineChartId).getBoundingClientRect(),graphOffsetX=document.querySelector("#"+ctrl.sparklineChartId+" g.c3-axis-y").getBoundingClientRect().right,x=Math.max(0,center+graphOffsetX-chartBox.left-Math.floor(width/2)),{top:top-height,left:Math.min(x,chartBox.width-width)}}catch(e){}}}},ctrl.$onChanges=function(changesObj){ctrl.updateAll()},ctrl.$doCheck=function(){angular.equals(ctrl.chartData,prevChartData)||ctrl.updateAll()}}]}),angular.module("patternfly.charts").component("pfTrendsChart",{bindings:{config:"<",chartData:"<",chartHeight:"0&&(pctValue=Math.round(ctrl.getLatestValue()/ctrl.chartData.total*100)),pctValue},ctrl.getLatestValue=function(){var latestValue=0;return ctrl.chartData.yData&&ctrl.chartData.yData.length>0&&(latestValue=ctrl.chartData.yData[ctrl.chartData.yData.length-1]),latestValue},ctrl.getChartHeight=function(){var retValue=LARGE;return ctrl.chartHeight?retValue=ctrl.chartHeight:"small"===ctrl.config.layout&&(retValue=SMALL),retValue},ctrl.$onChanges=function(changesObj){ctrl.updateAll()},ctrl.$doCheck=function(){angular.equals(ctrl.chartData,prevChartData)&&angular.equals(ctrl.config,prevConfig)||ctrl.updateAll()}}]}),angular.module("patternfly.charts").component("pfUtilizationBarChart",{bindings:{chartData:"=",chartTitle:"=",chartFooter:"=",units:"=",thresholdError:"=?",thresholdWarning:"=?",footerLabelFormat:"@?",layout:"=?"},templateUrl:"charts/utilization-bar/utilization-bar-chart.html",controller:["$timeout",function($timeout){"use strict";var prevChartData,prevLayout,ctrl=this;ctrl.updateAll=function(){prevChartData=angular.copy(ctrl.chartData),prevLayout=angular.copy(ctrl.layout),ctrl.chartData.percentageUsed=Math.round(100*(ctrl.chartData.used/ctrl.chartData.total)),(ctrl.thresholdError||ctrl.thresholdWarning)&&(ctrl.isError=ctrl.chartData.percentageUsed>=ctrl.thresholdError,ctrl.isWarn=ctrl.chartData.percentageUsed>=ctrl.thresholdWarning&&ctrl.chartData.percentageUsedcharsMaxLimit&&($scope.ngModel=$scope.ngModel.substring(0,charsMaxLimit),charsLength=$scope.ngModel.length,remainingChars=charsMaxLimit-charsLength),$scope.remainingChars=remainingChars,$scope.remainingCharsWarning=charsWarnRemaining>=remainingChars?!0:!1,countRemainingFld.text(remainingChars),countRemainingFld.toggleClass("chars-warn-remaining-pf",charsWarnRemaining>=remainingChars),0>remainingChars?$scope.$emit("overCharsMaxLimit",$attributes.id):$scope.$emit("underCharsMaxLimit",$attributes.id)};$scope.$watch("ngModel",function(){checkCharactersRemaining()}),$element.bind("keypress",function(event){blockInputAtMaxLimit&&$element.val().length>=charsMaxLimit&&8!==event.keyCode&&event.preventDefault()})}}}]),angular.module("patternfly.modals").directive("pfAboutModalTransclude",["$parse",function($parse){"use strict";return{link:function(scope,element,attrs){element.append($parse(attrs.pfAboutModalTransclude)(scope))}}}]).component("pfModalContent",{templateUrl:"about-modal-template.html",bindings:{resolve:"<",close:"&",dismiss:"&"},controller:function(){"use strict";var $ctrl=this;$ctrl.$onInit=function(){$ctrl.additionalInfo=$ctrl.resolve.additionalInfo,$ctrl.copyright=$ctrl.resolve.copyright,$ctrl.imgAlt=$ctrl.resolve.imgAlt,$ctrl.imgSrc=$ctrl.resolve.imgSrc,$ctrl.isOpen=$ctrl.resolve.isOpen,$ctrl.productInfo=$ctrl.resolve.productInfo,$ctrl.title=$ctrl.resolve.title,$ctrl.template=$ctrl.resolve.content}}}).component("pfAboutModal",{bindings:{additionalInfo:"=?",copyright:"=?",close:"&onClose",imgAlt:"=?",imgSrc:"=?",isOpen:"0&&item.children.forEach(function(secondaryItem){secondaryItem.isHover&&(hover=!0)})}),hover},updateSecondaryCollapsedState=function(setCollapsed,collapsedItem){var bodyContentElement=getBodyContentElement();collapsedItem&&(collapsedItem.secondaryCollapsed=setCollapsed),setCollapsed?(ctrl.collapsedSecondaryNav=!0,bodyContentElement.addClass("collapsed-secondary-nav-pf")):(ctrl.items&&ctrl.items.forEach(function(item){item.secondaryCollasped=!1}),ctrl.collapsedSecondaryNav=!1,bodyContentElement.removeClass("collapsed-secondary-nav-pf"))},updateTertiaryCollapsedState=function(setCollapsed,collapsedItem){var bodyContentElement=getBodyContentElement();collapsedItem&&(collapsedItem.tertiaryCollapsed=setCollapsed),setCollapsed?(ctrl.collapsedTertiaryNav=!0,bodyContentElement.addClass("collapsed-tertiary-nav-pf"),updateSecondaryCollapsedState(!1)):(ctrl.items&&ctrl.items.forEach(function(item){item.children&&item.children.length>0&&item.children.forEach(function(secondaryItem){secondaryItem.tertiaryCollasped=!1})}),ctrl.collapsedTertiaryNav=!1,bodyContentElement.removeClass("collapsed-tertiary-nav-pf"))};ctrl.showBadges="true"===ctrl.showBadges,ctrl.persistentSecondary="true"===ctrl.persistentSecondary,ctrl.pinnableMenus="true"===ctrl.pinnableMenus,ctrl.hiddenIcons="true"===ctrl.hiddenIcons,ctrl.updateActiveItemsOnClick="true"===ctrl.updateActiveItemsOnClick,ctrl.ignoreMobile="true"===ctrl.ignoreMobile,ctrl.activeSecondary=!1,ctrl.showMobileNav=!1,ctrl.showMobileSecondary=!1,ctrl.showMobileTertiary=!1,ctrl.hoverSecondaryNav=!1,ctrl.hoverTertiaryNav=!1,ctrl.collapsedSecondaryNav=!1,ctrl.collapsedTertiaryNav=!1,ctrl.navCollapsed=!1,ctrl.forceHidden=!1,ctrl.clearActiveItems=function(){ctrl.items.forEach(function(item){item.isActive=!1,item.children&&item.children.forEach(function(secondary){secondary.isActive=!1,secondary.children&&secondary.children.forEach(function(tertiary){tertiary.isActive=!1})})})},ctrl.setActiveItems=function(){var updatedRoute="#"+$location.path();ctrl.items.forEach(function(topLevel){updatedRoute.indexOf(topLevel.href)>-1&&(topLevel.isActive=!0),topLevel.children&&topLevel.children.forEach(function(secondLevel){updatedRoute.indexOf(secondLevel.href)>-1&&(secondLevel.isActive=!0,topLevel.isActive=!0),secondLevel.children&&secondLevel.children.forEach(function(thirdLevel){updatedRoute.indexOf(thirdLevel.href)>-1&&(thirdLevel.isActive=!0,secondLevel.isActive=!0,topLevel.isActive=!0)})})})},ctrl.handleNavBarToggleClick=function(){ctrl.inMobileState?ctrl.showMobileNav?ctrl.showMobileNav=!1:(updateMobileMenu(),ctrl.showMobileNav=!0):ctrl.navCollapsed?expandMenu():collapseMenu()},ctrl.handlePrimaryClick=function(item,event){ctrl.inMobileState?item.children&&item.children.length>0?updateMobileMenu(item):(updateMobileMenu(),navigateToItem(item)):navigateToItem(item)},ctrl.handleSecondaryClick=function(primary,secondary,event){ctrl.inMobileState?secondary.children&&secondary.children.length>0?updateMobileMenu(primary,secondary):(updateMobileMenu(),navigateToItem(secondary)):navigateToItem(secondary)},ctrl.handleTertiaryClick=function(primary,secondary,tertiary,event){ctrl.inMobileState&&updateMobileMenu(),navigateToItem(tertiary)},ctrl.handlePrimaryHover=function(item){item.children&&item.children.length>0&&(ctrl.inMobileState||(void 0!==item.navUnHoverTimeout?($timeout.cancel(item.navUnHoverTimeout),item.navUnHoverTimeout=void 0):void 0!==ctrl.navHoverTimeout||item.isHover||(item.navHoverTimeout=$timeout(function(){ctrl.hoverSecondaryNav=!0,item.isHover=!0,item.navHoverTimeout=void 0},hoverDelay))))},ctrl.handlePrimaryUnHover=function(item){item.children&&item.children.length>0&&(void 0!==item.navHoverTimeout?($timeout.cancel(item.navHoverTimeout),item.navHoverTimeout=void 0):void 0===item.navUnHoverTimeout&&item.isHover&&(item.navUnHoverTimeout=$timeout(function(){item.isHover=!1,primaryHover()||(ctrl.hoverSecondaryNav=!1),item.navUnHoverTimeout=void 0},hideDelay)))},ctrl.handleSecondaryHover=function(item){item.children&&item.children.length>0&&(ctrl.inMobileState||(void 0!==item.navUnHoverTimeout?($timeout.cancel(item.navUnHoverTimeout),item.navUnHoverTimeout=void 0):void 0===ctrl.navHoverTimeout&&(item.navHoverTimeout=$timeout(function(){ctrl.hoverTertiaryNav=!0,item.isHover=!0,item.navHoverTimeout=void 0},hoverDelay))))},ctrl.handleSecondaryUnHover=function(item){item.children&&item.children.length>0&&(void 0!==item.navHoverTimeout?($timeout.cancel(item.navHoverTimeout),item.navHoverTimeout=void 0):void 0===item.navUnHoverTimeout&&(item.navUnHoverTimeout=$timeout(function(){item.isHover=!1,secondaryHover()||(ctrl.hoverTertiaryNav=!1),item.navUnHoverTimeout=void 0},hideDelay)))},ctrl.collapseSecondaryNav=function(item,event){ctrl.inMobileState?updateMobileMenu():item.secondaryCollapsed?(updateSecondaryCollapsedState(!1,item),forceHideSecondaryMenu()):updateSecondaryCollapsedState(!0,item),ctrl.hoverSecondaryNav=!1,event.stopImmediatePropagation()},ctrl.collapseTertiaryNav=function(item,event){ctrl.inMobileState?ctrl.items.forEach(function(primaryItem){primaryItem.children&&primaryItem.children.forEach(function(secondaryItem){secondaryItem===item&&updateMobileMenu(primaryItem)})}):item.tertiaryCollapsed?(updateTertiaryCollapsedState(!1,item),forceHideSecondaryMenu()):updateTertiaryCollapsedState(!0,item),ctrl.hoverSecondaryNav=!1,ctrl.hoverTertiaryNav=!1,event.stopImmediatePropagation()},ctrl.$onInit=function(){$injector.has("$state")&&($state=$injector.get("$state")),ctrl.updateActiveItemsOnClick||$rootScope&&(routeChangeListener=$rootScope.$on("$routeChangeSuccess",function(event,next,current){ctrl.clearActiveItems(),ctrl.setActiveItems()})),initBodyElement(),checkNavState(),angular.element($window).bind("resize",function(){checkNavState()})},ctrl.$onDestroy=function(){_.isFunction(routeChangeListener)&&routeChangeListener()}}]}),angular.module("patternfly.notification").component("pfInlineNotification",{bindings:{pfNotificationType:"=",pfNotificationMessage:"=",pfNotificationHeader:"=",pfNotificationPersistent:"=",pfNotificationIndex:"=",pfNotificationRemove:"&?"},templateUrl:"notification/inline-notification.html"}),angular.module("patternfly.notification").component("pfNotificationDrawer",{bindings:{drawerHidden:"0&&(void 0===ctrl.config.currentField&&(ctrl.config.currentField=ctrl.config.fields[0],updated=!0),void 0===ctrl.config.isAscending&&(ctrl.config.isAscending=!0,updated=!0)),updated===!0&&ctrl.config.onSortChange&&ctrl.config.onSortChange(ctrl.config.currentField,ctrl.config.isAscending)}function selectField(field){ctrl.config.currentField=field,ctrl.config.onSortChange&&ctrl.config.onSortChange(ctrl.config.currentField,ctrl.config.isAscending)}function changeDirection(){ctrl.config.isAscending=!ctrl.config.isAscending,ctrl.config.onSortChange&&ctrl.config.onSortChange(ctrl.config.currentField,ctrl.config.isAscending)}function getSortIconClass(){var iconClass;return iconClass="numeric"===ctrl.config.currentField.sortType?ctrl.config.isAscending?"fa fa-sort-numeric-asc":"fa fa-sort-numeric-desc":ctrl.config.isAscending?"fa fa-sort-alpha-asc":"fa fa-sort-alpha-desc"}var prevConfig,ctrl=this;ctrl.$onInit=function(){angular.isDefined(ctrl.config)&&angular.isUndefined(ctrl.config.show)&&(ctrl.config.show=!0),angular.extend(ctrl,{selectField:selectField,changeDirection:changeDirection,getSortIconClass:getSortIconClass})},ctrl.$onChanges=function(){setupConfig()},ctrl.$doCheck=function(){angular.equals(ctrl.config,prevConfig)||setupConfig()}}}),angular.module("patternfly.table").component("pfTableView",{bindings:{config:"0)for(actnBtns=1;actnBtns<=ctrl.actionButtons.length;actnBtns++)ctrl.dtColumnDefs.push(DTColumnDefBuilder.newColumnDef(i++).notSortable());ctrl.menuActions&&ctrl.menuActions.length>0&&ctrl.dtColumnDefs.push(DTColumnDefBuilder.newColumnDef(i++).notSortable())}function listenForDraw(){var oTable,dtInstance=ctrl.dtInstance;dtInstance&&dtInstance.dataTable&&(oTable=dtInstance.dataTable,ctrl.tableId=oTable[0].id,oTable.on("draw.dt",function(){ctrl.debug&&$log.debug("--> redraw"),selectRowsByChecked()}))}function validSelectionMatchProp(){var prop,retVal=!1,item=ctrl.items[0];for(prop in item)item.hasOwnProperty(prop)&&ctrl.config.selectionMatchProp===prop&&(retVal=!0);return retVal}function getItemFromRow(matchPropValue){var item,retVals,filterObj={};return filterObj[ctrl.config.selectionMatchProp]=matchPropValue,retVals=$filter("filter")(ctrl.items,filterObj),retVals&&1===retVals.length&&(item=retVals[0]),item}function selectRowsByChecked(){$timeout(function(){var oTable,rows,checked;oTable=ctrl.dtInstance.DataTable,ctrl.debug&&$log.debug(" selectRowsByChecked"),angular.isUndefined(oTable)||(ctrl.debug&&$log.debug(" ...oTable defined"),rows=oTable.rows(),rows.deselect(),rows=oTable.rows(function(idx,data,node){return checked=node.children[0].children[0].checked}),ctrl.debug&&$log.debug(" ... #checkedRows = "+rows[0].length),rows[0].length>0&&rows.select(),setSelectAllCheckbox())})}function setSelectAllCheckbox(){var numVisibleRows,numCheckedRows;ctrl.debug&&$log.debug(" setSelectAllCheckbox"),numVisibleRows=getVisibleRows().length,numCheckedRows=document.querySelectorAll("#"+ctrl.tableId+" tbody tr.even.selected").length+document.querySelectorAll("#"+ctrl.tableId+" tbody tr.odd.selected").length,ctrl.selectAll=numVisibleRows===numCheckedRows}function getVisibleRows(){var i,rowData,visibleRows=new Array,oTable=ctrl.dtInstance.dataTable,anNodes=document.querySelectorAll("#"+ctrl.tableId+" tbody tr");for(i=0;i dtInstanceCallback"),ctrl.dtInstance=_dtInstance,listenForDraw(),selectRowsByChecked()},ctrl.$onChanges=function(changesObj){ctrl.debug&&$log.debug("$onChanges"),changesObj.config&&!changesObj.config.isFirstChange()&&(ctrl.debug&&$log.debug("...updateConfigOptions"),ctrl.updateConfigOptions())},ctrl.$doCheck=function(){ctrl.debug&&$log.debug("$doCheck"),angular.equals(ctrl.dtOptions,prevDtOptions)||(ctrl.debug&&$log.debug(" dtOptions !== prevDtOptions"),ctrl.updateConfigOptions()),angular.equals(ctrl.items,prevItems)||(ctrl.debug&&$log.debug(" items !== prevItems"),prevItems=angular.copy(ctrl.items),selectRowsByChecked())},ctrl.$postLink=function(){ctrl.debug&&$log.debug(" $postLink")},ctrl.$onDestroy=function(){ctrl.debug&&$log.debug(" $onDestroy"),ctrl.dtInstance={}},ctrl.toggleAll=function(){var item,visibleRows=getVisibleRows();angular.forEach(visibleRows,function(row){item=getItemFromRow(row),item.selected!==ctrl.selectAll&&(item.selected=ctrl.selectAll,ctrl.config&&ctrl.config.onCheckBoxChange&&ctrl.config.onCheckBoxChange(item))})},ctrl.toggleOne=function(item){ctrl.config&&ctrl.config.onCheckBoxChange&&ctrl.config.onCheckBoxChange(item)},ctrl.handleButtonAction=function(action,item){action&&action.actionFn&&action.actionFn(action,item)},ctrl.isColItemFld=function(key){var retVal=!1,tableCol=$filter("filter")(ctrl.colummns,{itemField:key});return tableCol&&1===tableCol.length&&(retVal=!0),retVal},ctrl.areActions=function(){return ctrl.actionButtons&&ctrl.actionButtons.length>0||ctrl.menuActions&&ctrl.menuActions.length>0},ctrl.calcActionsColspan=function(){var colspan=0;return ctrl.actionButtons&&ctrl.actionButtons.length>0&&(colspan+=ctrl.actionButtons.length),ctrl.menuActions&&ctrl.menuActions.length>0&&(colspan+=1),colspan},ctrl.handleMenuAction=function(action,item){!ctrl.checkDisabled(item)&&action&&action.actionFn&&action.isDisabled!==!0&&action.actionFn(action,item)},ctrl.setupActions=function(item,event){$timeout(function(){var nextElement,parentDiv=void 0;for(nextElement=event.target;nextElement&&!parentDiv;)-1!==nextElement.className.indexOf("dropdown-kebab-pf")&&(parentDiv=nextElement,-1!==nextElement.className.indexOf("open")&&setDropMenuLocation(parentDiv)),nextElement=nextElement.parentElement})},ctrl.checkDisabled=function(item){return!1}}]}),angular.module("patternfly.toolbars").component("pfToolbar",{bindings:{config:"="},transclude:{actions:"?"},templateUrl:"toolbars/toolbar.html",controller:function(){"use strict";function setupConfig(){prevConfig=angular.copy(ctrl.config),ctrl.config&&ctrl.config.viewsConfig&&ctrl.config.viewsConfig.views&&(ctrl.config.viewsConfig.viewsList=angular.copy(ctrl.config.viewsConfig.views),ctrl.config.viewsConfig.currentView||(ctrl.config.viewsConfig.currentView=ctrl.config.viewsConfig.viewsList[0]))}function viewSelected(viewId){ctrl.config.viewsConfig.currentView=viewId,ctrl.config.viewsConfig.onViewSelect&&!ctrl.checkViewDisabled(viewId)&&ctrl.config.viewsConfig.onViewSelect(viewId)}function isViewSelected(viewId){return ctrl.config.viewsConfig&&ctrl.config.viewsConfig.currentView===viewId}function checkViewDisabled(view){return ctrl.config.viewsConfig.checkViewDisabled&&ctrl.config.viewsConfig.checkViewDisabled(view)}function filterExists(filter){var foundFilter=_.find(ctrl.config.filterConfig.appliedFilters,{title:filter.title,value:filter.value});return void 0!==foundFilter}function enforceSingleSelect(filter){_.remove(ctrl.config.appliedFilters,{title:filter.title})}function addFilter(field,value){var newFilter={id:field.id,title:field.title,value:value};filterExists(newFilter)||("select"===newFilter.type&&enforceSingleSelect(newFilter),ctrl.config.filterConfig.appliedFilters.push(newFilter),ctrl.config.filterConfig.onFilterChange&&ctrl.config.filterConfig.onFilterChange(ctrl.config.filterConfig.appliedFilters))}function handleAction(action){action&&action.actionFn&&action.isDisabled!==!0&&action.actionFn(action)}var prevConfig,ctrl=this;ctrl.$onInit=function(){angular.isDefined(ctrl.config.sortConfig)&&angular.isUndefined(ctrl.config.sortConfig.show)&&(ctrl.config.sortConfig.show=!0),angular.extend(ctrl,{viewSelected:viewSelected,isViewSelected:isViewSelected,checkViewDisabled:checkViewDisabled,addFilter:addFilter,handleAction:handleAction})},ctrl.$onChanges=function(){setupConfig()},ctrl.$doCheck=function(){angular.equals(ctrl.config,prevConfig)||setupConfig()}}}),angular.module("patternfly.utils").directive("pfFixedAccordion",["$window","$timeout",function($window,$timeout){"use strict";return{restrict:"A",scope:{scrollSelector:"@",groupHeight:"@",groupClass:"@"},link:function($scope,$element,$attrs){var setBodyScrollHeight=function(parentElement,bodyHeight){var collapsePanel,scrollElement,panelContents,nextContent,innerHeight,scroller,collapsePanels=parentElement[0].querySelectorAll(".panel-collapse");angular.forEach(collapsePanels,function(collapseElement){collapsePanel=angular.element(collapseElement),scrollElement=collapsePanel,innerHeight=0,angular.isDefined($scope.scrollSelector)&&(scroller=angular.element(collapsePanel[0].querySelector($scope.scrollSelector)),1===scroller.length&&(scrollElement=angular.element(scroller[0]),panelContents=collapsePanel.children(),angular.forEach(panelContents,function(contentElement){nextContent=angular.element(contentElement),nextContent[0]!==scrollElement[0]&&(innerHeight+=nextContent[0].offsetHeight,innerHeight+=parseInt(getComputedStyle(nextContent[0]).marginTop),innerHeight+=parseInt(getComputedStyle(nextContent[0]).marginBottom))}))),angular.element(scrollElement).css("max-height",bodyHeight-innerHeight+"px"),angular.element(scrollElement).css("overflow-y","auto")})},setCollapseHeights=function(){var height,openPanel,contentHeight,bodyHeight,headingElement,overflowY="hidden",parentElement=angular.element($element[0].querySelector(".panel-group")),headings=angular.element(parentElement).children();height=parentElement[0].clientHeight,openPanel=parentElement[0].querySelectorAll(".collapse.in"),openPanel&&openPanel.length>0&&angular.element(openPanel).removeClass("in"),contentHeight=0,angular.forEach(headings,function(heading){headingElement=angular.element(heading),contentHeight+=headingElement.prop("offsetHeight"),contentHeight+=parseInt(getComputedStyle(headingElement[0]).marginTop),contentHeight+=parseInt(getComputedStyle(headingElement[0]).marginBottom)}),bodyHeight=height-contentHeight,25>bodyHeight&&(bodyHeight=25,overflowY="auto"),openPanel&&openPanel.length>0&&angular.element(openPanel).addClass("in"),angular.element(parentElement).css("overflow-y",overflowY),$timeout(function(){setBodyScrollHeight(parentElement,bodyHeight)})};$scope.groupHeight&&angular.element($element[0].querySelector(".panel-group")).css("height",$scope.groupHeight),$scope.groupClass&&angular.element($element[0].querySelector(".panel-group")).addClass($scope.groupClass),$timeout(function(){setCollapseHeights()},100),$element.bind("resize",function(){setCollapseHeights()}),angular.element($window).bind("resize",function(){setCollapseHeights()})}}}]),angular.module("patternfly.utils").directive("pfTransclude",function(){"use strict";return{restrict:"A",link:function($scope,$element,$attrs,controller,$transclude){var iChildScope,iScopeType;if(!$transclude)throw new Error("pfTransclude - Illegal use of pfTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}");switch(iScopeType=$attrs.pfTransclude||"sibling"){case"sibling":$transclude(function(clone){$element.empty(),$element.append(clone)});break;case"parent":$transclude($scope,function(clone){$element.empty(),$element.append(clone)});break;case"child":iChildScope=$scope.$new(),$transclude(iChildScope,function(clone){$element.empty(),$element.append(clone),$element.on("$destroy",function(){iChildScope.$destroy()})})}}}}),function(){"use strict";angular.module("patternfly.utils").constant("pfUtils",{merge:function(source1,source2){var retValue;return retValue="function"==typeof angular.merge?this.angularMerge(source1,source2):"function"==typeof _.merge?this._merge(source1,source2):"function"==typeof $.extend?this.$extend(source1,source2):this.mergeDeep(source1,source2); -},angularMerge:function(source1,source2){return angular.merge({},source1,source2)},_merge:function(source1,source2){return _.merge({},source1,source2)},$extend:function(source1,source2){return $.extend(!0,angular.copy(source1),source2)},mergeDeep:function(source1,source2){return mergeDeep({},angular.copy(source1),angular.copy(source2))},colorPalette:patternfly.pfPaletteColors})}(),angular.module("patternfly.validation",[]).directive("pfValidation",["$timeout",function($timeout){"use strict";return{restrict:"A",require:"ngModel",scope:{pfValidation:"&",pfValidationDisabled:"="},link:function(scope,element,attrs,ctrl){function validate(){var valid,val=scope.inputCtrl.$modelValue,valFunc=scope.pfValidation({input:val});attrs.pfValidation||(valFunc=!0),valid=!val||valFunc||""===val,toggleErrorClass(scope.valEnabled&&!valid?!0:!1)}function toggleErrorClass(add){var messageElement=element.next(),parentElement=element.parent(),hasErrorM=parentElement.hasClass("has-error"),wasHidden=messageElement.hasClass("ng-hide");scope.inputCtrl.$setValidity("pf-validation",!add),add&&(hasErrorM||parentElement.addClass("has-error"),wasHidden&&messageElement.removeClass("ng-hide")),add||(hasErrorM&&parentElement.removeClass("has-error"),wasHidden||messageElement.addClass("ng-hide"))}scope.inputCtrl=ctrl,scope.valEnabled=!attrs.pfValidationDisabled,scope.$watch("pfValidationDisabled",function(newVal){scope.valEnabled=!newVal,newVal?(scope.inputCtrl.$setValidity("pfValidation",!0),toggleErrorClass(!1)):validate()}),attrs.pfValidation?$timeout(function(){validate()},0):!scope.inputCtrl.$valid&&scope.inputCtrl.$dirty&&toggleErrorClass(!0),scope.$watch("inputCtrl.$valid",function(isValid){toggleErrorClass(isValid?!1:!0)}),scope.$watch("inputCtrl.$modelValue",function(){validate()})}}}]),angular.module("patternfly.views").component("pfCardView",{bindings:{config:"=?",items:"=",eventId:"@id"},transclude:!0,templateUrl:"views/cardview/card-view.html",controller:["pfUtils",function(pfUtils){"use strict";var ctrl=this;ctrl.defaultConfig={selectItems:!1,multiSelect:!1,dblClick:!1,selectionMatchProp:"uuid",selectedItems:[],checkDisabled:!1,showSelectBox:!0,onSelect:null,onSelectionChange:null,onCheckBoxChange:null,onClick:null,onDblClick:null},ctrl.itemClick=function(e,item){var alreadySelected,selectionChanged=!1,continueEvent=!0;return ctrl.checkDisabled(item)?continueEvent:(ctrl.config&&ctrl.config.selectItems&&item&&(ctrl.config.multiSelect&&!ctrl.config.dblClick?(alreadySelected=_.find(ctrl.config.selectedItems,function(itemObj){return itemObj===item}),alreadySelected?ctrl.config.selectedItems=_.without(ctrl.config.selectedItems,item):(ctrl.config.selectedItems.push(item),selectionChanged=!0)):ctrl.config.selectedItems[0]===item?(ctrl.config.dblClick||(ctrl.config.selectedItems=[],selectionChanged=!0),continueEvent=!1):(ctrl.config.selectedItems=[item],selectionChanged=!0),selectionChanged&&ctrl.config.onSelect&&ctrl.config.onSelect(item,e),selectionChanged&&ctrl.config.onSelectionChange&&ctrl.config.onSelectionChange(ctrl.config.selectedItems,e)),ctrl.config.onClick&&ctrl.config.onClick(item,e),continueEvent)},ctrl.dblClick=function(e,item){ctrl.config.onDblClick&&ctrl.config.onDblClick(item,e)},ctrl.checkBoxChange=function(item){ctrl.config.onCheckBoxChange&&ctrl.config.onCheckBoxChange(item)},ctrl.isSelected=function(item){var matchProp=ctrl.config.selectionMatchProp,selected=!1;if(ctrl.config.showSelectBox)selected=item.selected;else if(ctrl.config.selectedItems.length)return _.find(ctrl.config.selectedItems,function(itemObj){return itemObj[matchProp]===item[matchProp]});return selected},ctrl.checkDisabled=function(item){return ctrl.config.checkDisabled&&ctrl.config.checkDisabled(item)},ctrl.$onInit=function(){if(ctrl.config=pfUtils.merge(ctrl.defaultConfig,ctrl.config),ctrl.config.selectItems&&ctrl.config.showSelectBox)throw new Error("pfCardView - Illegal use of pfCardView component! Cannot allow both select box and click selection in the same card view.")}}]}),angular.module("patternfly.views").component("pfListView",{bindings:{config:"=?",items:"=",actionButtons:"=?",enableButtonForItemFn:"=?",menuActions:"=?",hideMenuForItemFn:"=?",menuClassForItemFn:"=?",updateMenuActionForItemFn:"=?",actions:"=?",updateActionForItemFn:"=?",customScope:"=?"},transclude:{expandedContent:"?listExpandedContent"},templateUrl:"views/listview/list-view.html",controller:["$timeout","$window","$element","pfUtils",function($timeout,$window,$element,pfUtils){"use strict";var ctrl=this,setDropMenuLocation=function(parentDiv){var dropButton=parentDiv.querySelector(".dropdown-toggle"),dropMenu=parentDiv.querySelector(".dropdown-menu"),parentRect=$element[0].getBoundingClientRect(),buttonRect=dropButton.getBoundingClientRect(),menuRect=dropMenu.getBoundingClientRect(),menuTop=buttonRect.top-menuRect.height,menuBottom=buttonRect.top+buttonRect.height+menuRect.height;menuBottom<=parentRect.top+parentRect.height||menuTop0&&(ctrl.config.selectedItems=[ctrl.config.selectedItems[0]]),ctrl.config.selectItems&&ctrl.config.showSelectBox)throw new Error("pfListView - Illegal use of pListView component! Cannot allow both select box and click selection in the same list view.")}}]}),function(){"use strict";angular.module("patternfly.views").constant("pfViewUtils",{getDashboardView:function(title){return{id:"dashboardView",title:title||"Dashboard View",iconClass:"fa fa-dashboard"}},getCardView:function(title){return{id:"cardView",title:title||"Card View",iconClass:"fa fa-th"}},getListView:function(title){return{id:"listView",title:title||"List View",iconClass:"fa fa-th-list"}},getTableView:function(title){return{id:"tableView",title:title||"Table View",iconClass:"fa fa-table"}},getTopologyView:function(title){return{id:"topologyView",title:title||"Topology View",iconClass:"fa fa-sitemap"}}})}(),function(){"use strict";function pfWizardButtonDirective(action){angular.module("patternfly.wizard").directive(action,function(){return{restrict:"A",require:"^pfWizard",scope:{callback:"=?"},link:function($scope,$element,$attrs,wizard){$element.on("click",function(e){e.preventDefault(),$scope.$apply(function(){$scope.$eval($attrs[action]),wizard[action.replace("pfWiz","").toLowerCase()]($scope.callback)})})}}})}pfWizardButtonDirective("pfWizNext"),pfWizardButtonDirective("pfWizPrevious"),pfWizardButtonDirective("pfWizFinish"),pfWizardButtonDirective("pfWizCancel"),pfWizardButtonDirective("pfWizReset")}(),angular.module("patternfly.wizard").component("pfWizardReviewPage",{bindings:{shown:"<",wizardData:"<"},require:{wizard:"^pfWizard"},templateUrl:"wizard/wizard-review-page.html",controller:function(){"use strict";var ctrl=this;ctrl.$onInit=function(){ctrl.reviewSteps=[]},ctrl.$onChanges=function(changesObj){changesObj.shown&&changesObj.shown.currentValue&&ctrl.updateReviewSteps()},ctrl.toggleShowReviewDetails=function(step){step.showReviewDetails===!0?step.showReviewDetails=!1:step.showReviewDetails=!0},ctrl.getSubStepNumber=function(step,substep){return step.getStepDisplayNumber(substep)},ctrl.getReviewSubSteps=function(reviewStep){return reviewStep.getReviewSteps()},ctrl.updateReviewSteps=function(){ctrl.reviewSteps=ctrl.wizard.getReviewSteps()}}}),angular.module("patternfly.wizard").component("pfWizardStep",{require:{wizard:"^pfWizard"},transclude:!0,bindings:{stepTitle:"@",stepId:"@",stepPriority:"@",substeps:"=?",nextEnabled:"stepIndex&&(complete=complete&&step.nextEnabled)}),complete},ctrl.goTo=function(step){!ctrl.wizard.isWizardDone()&&step.okToNavAway&&step!==ctrl.selectedStep&&(firstRun||ctrl.getStepNumber(step)step.stepPriority});insertBefore?ctrl.steps.splice(ctrl.steps.indexOf(insertBefore),0,step):ctrl.steps.push(step)},ctrl.currentStepTitle=function(){return ctrl.selectedStep.stepTitle},ctrl.currentStepDescription=function(){return ctrl.selectedStep.description},ctrl.currentStep=function(){return ctrl.selectedStep},ctrl.totalStepCount=function(){return ctrl.getEnabledSteps().length},ctrl.next=function(callback){var enabledSteps=ctrl.getEnabledSteps(),index=stepIdx(ctrl.selectedStep);return angular.isFunction(callback)?callback(ctrl.selectedStep)?index===enabledSteps.length-1?!1:(ctrl.goTo(enabledSteps[index+1]),!0):!0:(ctrl.selectedStep.completed=!0,index===enabledSteps.length-1?!1:(ctrl.goTo(enabledSteps[index+1]),!0))},ctrl.previous=function(callback){var index=stepIdx(ctrl.selectedStep),goPrev=!1;return angular.isFunction(callback)&&callback(ctrl.selectedStep)&&0!==index&&(ctrl.goTo(ctrl.getEnabledSteps()[index-1]),goPrev=!0),goPrev}}]}),angular.module("patternfly.wizard").component("pfWizardSubstep",{transclude:!0,bindings:{stepTitle:"@",stepId:"@",stepPriority:"@",nextEnabled:"")},ctrl.$onChanges=function(changesObj){var step;if(changesObj.wizardReady&&changesObj.wizardReady.currentValue&&ctrl.goTo(ctrl.getEnabledSteps()[0]),changesObj.currentStep){if(step=changesObj.currentStep.currentValue,!step)return;ctrl.selectedStep&&ctrl.selectedStep.title!==step&&ctrl.goTo(stepByTitle(step))}},ctrl.getEnabledSteps=function(){return ctrl.steps.filter(function(step){return"true"!==step.disabled})},ctrl.getReviewSteps=function(){return ctrl.steps.filter(function(step){return!step.disabled&&(!angular.isUndefined(step.reviewTemplate)||step.getReviewSteps().length>0)})},ctrl.currentStepNumber=function(){return stepIdx(ctrl.selectedStep)+1},ctrl.getStepNumber=function(step){return stepIdx(step)+1},ctrl.goTo=function(step,resetStepNav){ctrl.wizardDone||ctrl.selectedStep&&!ctrl.selectedStep.okToNavAway||step===ctrl.selectedStep||((firstRun||ctrl.getStepNumber(step)step.stepPriority});insertBefore?ctrl.steps.splice(ctrl.steps.indexOf(insertBefore),0,step):ctrl.steps.push(step),ctrl.wizardReady&&ctrl.getEnabledSteps().length>0&&step===ctrl.getEnabledSteps()[0]&&ctrl.goTo(ctrl.getEnabledSteps()[0])},ctrl.isWizardDone=function(){return ctrl.wizardDone},ctrl.updateSubStepNumber=function(value){ctrl.firstStep=0===stepIdx(ctrl.selectedStep)&&0===value},ctrl.currentStepTitle=function(){return ctrl.selectedStep.title},ctrl.currentStepDescription=function(){return ctrl.selectedStep.description},ctrl.currentStep=function(){return ctrl.selectedStep},ctrl.totalStepCount=function(){return ctrl.getEnabledSteps().length},ctrl.goToStep=function(step,resetStepNav){var stepTo,enabledSteps=ctrl.getEnabledSteps();stepTo=angular.isNumber(step)?enabledSteps[step]:stepByTitle(step),ctrl.goTo(stepTo,resetStepNav)},ctrl.next=function(callback){var enabledSteps=ctrl.getEnabledSteps(),index=stepIdx(ctrl.selectedStep);if(!ctrl.selectedStep.substeps||!ctrl.selectedStep.next(callback)){if(angular.isFunction(callback)){if(!callback(ctrl.selectedStep))return;index===enabledSteps.length-1?ctrl.finish():enabledSteps[index+1].substeps&&enabledSteps[index+1].resetNav()}ctrl.selectedStep.completed=!0,index===enabledSteps.length-1?ctrl.finish():ctrl.goTo(enabledSteps[index+1])}},ctrl.previous=function(callback){var index=stepIdx(ctrl.selectedStep);if((!ctrl.selectedStep.substeps||!ctrl.selectedStep.previous(callback))&&angular.isFunction(callback)&&callback(ctrl.selectedStep)){if(0===index)throw new Error("Can't go back. It's already in step 0");ctrl.goTo(ctrl.getEnabledSteps()[index-1])}},ctrl.finish=function(){ctrl.onFinish&&ctrl.onFinish()!==!1&&ctrl.reset()},ctrl.cancel=function(){ctrl.onCancel&&ctrl.onCancel()!==!1&&ctrl.reset()},ctrl.reset=function(){angular.forEach(ctrl.getEnabledSteps(),function(step){step.completed=!1}),ctrl.goToStep(0)}}]}),angular.module("patternfly.card").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("card/aggregate-status/aggregate-status-card.html",'

    {{$ctrl.status.count}} {{$ctrl.status.title}} {{$ctrl.status.count}} {{$ctrl.status.title}}

    {{ notification.count }} {{ notification.count }}

    {{$ctrl.status.count}} {{$ctrl.status.title}} {{$ctrl.status.count}} {{$ctrl.status.title}}

    {{$ctrl.status.notification.count}} {{$ctrl.status.notification.count}}

    '),$templateCache.put("card/basic/card-filter.html",'
    '),$templateCache.put("card/basic/card.html","

    {{$ctrl.headTitle}}

    {{$ctrl.subTitle}}
    ")}]),angular.module("patternfly.charts").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("charts/donut/donut-pct-chart.html",''),$templateCache.put("charts/empty-chart.html",'
    No data available
    '),$templateCache.put("charts/heatmap/heatmap-legend.html",'
    • {{item.text}}
    '),$templateCache.put("charts/heatmap/heatmap.html",'

    {{$ctrl.chartTitle}}

    '),$templateCache.put("charts/line/line-chart.html",''),$templateCache.put("charts/sparkline/sparkline-chart.html",''),$templateCache.put("charts/trends/trends-chart.html",'
    {{$ctrl.config.title}} {{$ctrl.getLatestValue()}} {{$ctrl.config.units}} {{$ctrl.getPercentageValue() + \'%\'}} of {{$ctrl.chartData.total + \' \' + $ctrl.config.units}}{{$ctrl.config.timeFrame}}
    {{$ctrl.getLatestValue()}} {{$ctrl.config.units}} {{$ctrl.getPercentageValue() + \'%\'}} of {{$ctrl.chartData.total + \' \' + $ctrl.config.units}} {{$ctrl.config.title}}
    {{$ctrl.getPercentageValue() + \'%\'}}
    {{$ctrl.config.trendLabel}} {{$ctrl.getLatestValue()}} of {{$ctrl.chartData.total + \' \' + $ctrl.config.units}}
    '), -$templateCache.put("charts/utilization-bar/utilization-bar-chart.html",'
    {{$ctrl.chartTitle}}
    {{$ctrl.chartData.used}} of {{$ctrl.chartData.total}} {{$ctrl.units}} Used {{$ctrl.chartData.percentageUsed}}% Used
    {{$ctrl.chartTitle}}
    {{$ctrl.chartData.used}} {{$ctrl.units}} Used {{$ctrl.chartData.percentageUsed}}% Used
    '),$templateCache.put("charts/utilization-trend/utilization-trend-chart.html",'

    {{$ctrl.config.title}}

    {{$ctrl.currentValue}}

    {{$ctrl.currentText}}
    of {{$ctrl.chartData.total}} {{$ctrl.config.units}}
    {{$ctrl.legendLeftText}} {{$ctrl.legendRightText}}
    ')}]),angular.module("patternfly.filters").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("filters/filter-fields.html",'
    '),$templateCache.put("filters/filter-results.html",'
    {{$ctrl.config.resultsCount}} Results

    Active filters:

    • {{filter.title}}: {{filter.value}}

    Clear All Filters

    {{$ctrl.config.selectedCount}} of {{$ctrl.config.totalCount}} selected
    '),$templateCache.put("filters/filter.html","
    ")}]),angular.module("patternfly.form").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("form/form-buttons/form-buttons.html",'
    '),$templateCache.put("form/form-group/form-group.html",'
    • {{ message }}
    ')}]),angular.module("patternfly.modals").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("modals/about-modal.html",'')}]),angular.module("patternfly.navigation").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("navigation/vertical-navigation.html","
    ')}]),angular.module("patternfly.notification").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("notification/inline-notification.html",'
    {{$ctrl.pfNotificationHeader}} {{$ctrl.pfNotificationMessage}}
    '),$templateCache.put("notification/notification-drawer.html",'

    {{$ctrl.drawerTitle}}

    '),$templateCache.put("notification/notification-list.html",'
    '),$templateCache.put("notification/toast-notification-list.html",'
    '),$templateCache.put("notification/toast-notification.html",'
    {{$ctrl.header}} {{$ctrl.message}} {{$ctrl.message}}
    ')}]),angular.module("patternfly.select").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("select/select.html",'
    ')}]),angular.module("patternfly.sort").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("sort/sort.html",'
    ')}]),angular.module("patternfly.table").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("table/tableview/table-view.html",'
    {{col.header}}Actions
    {{ value }}
    ')}]),angular.module("patternfly.toolbars").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("toolbars/toolbar.html",'
    ')}]),angular.module("patternfly.views").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("views/cardview/card-view.html",'
    '),$templateCache.put("views/listview/list-view.html",'
    ')}]),angular.module("patternfly.wizard").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("wizard/wizard-review-page.html",''), -$templateCache.put("wizard/wizard-step.html",'
    '),$templateCache.put("wizard/wizard-substep.html",''),$templateCache.put("wizard/wizard.html",'
    ')}]); +function mergeDeep(dst){"use strict";return angular.forEach(arguments,function(obj){obj!==dst&&angular.forEach(obj,function(value,key){dst[key]&&dst[key].constructor&&dst[key].constructor===Object?mergeDeep(dst[key],value):dst[key]=value})}),dst}angular.module("patternfly.canvas",["dragging","ngDragDrop","ui.bootstrap"]),angular.module("patternfly.card",["ui.bootstrap"]),angular.module("patternfly.charts",["patternfly.utils","ui.bootstrap","ngSanitize"]),angular.module("patternfly.filters",["ui.bootstrap"]),angular.module("patternfly.form",[]),angular.module("patternfly.modals",["ui.bootstrap.modal","ui.bootstrap.tpls"]),angular.module("patternfly.navigation",["ui.bootstrap"]),angular.module("patternfly.notification",["patternfly.utils","ui.bootstrap"]),angular.module("patternfly",["patternfly.autofocus","patternfly.card","patternfly.filters","patternfly.form","patternfly.modals","patternfly.navigation","patternfly.notification","patternfly.select","patternfly.sort","patternfly.toolbars","patternfly.utils","patternfly.validation","patternfly.views","patternfly.wizard"]),angular.module("patternfly.select",["ui.bootstrap"]),angular.module("patternfly.sort",["ui.bootstrap"]),angular.module("patternfly.table",["datatables","patternfly.utils","patternfly.filters","patternfly.sort"]),angular.module("patternfly.toolbars",["patternfly.utils","patternfly.filters","patternfly.sort","patternfly.views"]),angular.module("patternfly.utils",["ui.bootstrap"]),angular.module("patternfly.views",["patternfly.utils","patternfly.filters","patternfly.sort","patternfly.charts","dndLists"]),angular.module("patternfly.wizard",["ui.bootstrap.modal","ui.bootstrap.tpls","patternfly.form"]),angular.module("patternfly.autofocus",[]).directive("pfFocused",["$timeout",function($timeout){"use strict";return{restrict:"A",link:function(scope,element,attrs){scope.$watch(attrs.pfFocused,function(newValue){$timeout(function(){newValue&&(element[0].focus(),element[0].select&&element[0].select())})})}}}]),function(){"use strict";angular.module("patternfly.canvas").component("pfCanvasEditor",{bindings:{chartDataModel:"=",chartViewModel:"=?",toolboxTabs:"=",readOnly:"ul").addClass("nav-tabs-pf"),angular.element("#filterFld").focus()})},ctrl.hideToolbox=function(){ctrl.toolboxVisible=!1},ctrl.toggleToolbox=function(){ctrl.readOnly||ctrl.chartViewModel.inConnectingMode||(ctrl.toolboxVisible===!0?ctrl.hideToolbox():ctrl.showToolbox())},ctrl.tabClicked=function(){angular.element("#filterFld").focus()},ctrl.startCallback=function(event,ui,item){ctrl.draggedItem=item},ctrl.dropCallback=function(event,ui){var newNode=angular.copy(ctrl.draggedItem);newNodeCount++,newNode.x=event.clientX-600,newNode.y=event.clientY-200,newNode.backgroundColor=newNode.backgroundColor?newNode.backgroundColor:"#fff",ctrl.chartViewModel.addNode(newNode)},ctrl.addNodeByClick=function(item){var newNode=angular.copy(item);newNodeCount++,newNode.x=250+(4*newNodeCount+160),newNode.y=200+(4*newNodeCount+160),newNode.backgroundColor=newNode.backgroundColor?newNode.backgroundColor:"#fff",ctrl.chartViewModel.addNode(newNode)},ctrl.tabClicked=function(){angular.element("#filterFld").focus()},ctrl.activeTab=function(){return ctrl.toolboxTabs.filter(function(tab){return tab.active})[0]},ctrl.activeSubTab=function(){var activeTab=ctrl.activeTab();return activeTab&&activeTab.subtabs?activeTab.subtabs.filter(function(subtab){return subtab.active})[0]:void 0},ctrl.activeSubSubTab=function(){var activeSubTab=ctrl.activeSubTab();return activeSubTab&&activeSubTab.subtabs?activeSubTab.subtabs.filter(function(subsubtab){return subsubtab.active})[0]:void 0},ctrl.maxZoom=function(){return ctrl.chartViewModel&&ctrl.chartViewModel.zoom?ctrl.chartViewModel.zoom.isMax():!1},ctrl.minZoom=function(){return ctrl.chartViewModel&&ctrl.chartViewModel.zoom?ctrl.chartViewModel.zoom.isMin():!1},ctrl.zoomIn=function(){ctrl.chartViewModel.zoom["in"]()},ctrl.zoomOut=function(){ctrl.chartViewModel.zoom.out()}}]})}(),function(){"use strict";function toolboxItemsDirective(){function toolboxItemsController(){var vm=this;vm.clickCallbackfmDir=function(item){item.disableInToolbox||vm.clickCallback(item)},vm.startDragCallbackfmDir=function(event,ui,item){vm.startDragCallback(event,ui,item)}}var directive={restrict:"E",scope:{items:"=",startDragCallback:"=",clickCallback:"=",searchText:"="},controller:toolboxItemsController,templateUrl:"canvas-view/canvas-editor/toolbox-items.html",controllerAs:"vm",bindToController:!0};return directive}angular.module("patternfly.canvas").directive("toolboxItems",toolboxItemsDirective)}(),function(){"use strict";angular.module("patternfly.canvas").filter("trustAsResourceUrl",["$sce",function($sce){return function(val){return $sce.trustAsResourceUrl(val)}}]).directive("pfCanvas",["$document",function($document){function link(scope){var deleteKeyCode=46,ctrlKeyCode=17,ctrlDown=!1,aKeyCode=65,escKeyCode=27;$document.find("body").keydown(function(evt){evt.keyCode===ctrlKeyCode&&(ctrlDown=!0,evt.stopPropagation(),evt.preventDefault()),evt.keyCode===aKeyCode&&ctrlDown&&(scope.selectAll(),scope.$digest(),evt.stopPropagation(),evt.preventDefault())}),$document.find("body").keyup(function(evt){evt.keyCode===deleteKeyCode&&(scope.deleteSelected(),scope.$digest()),evt.keyCode===escKeyCode&&(scope.deselectAll(),scope.$digest()),evt.keyCode===ctrlKeyCode&&(ctrlDown=!1,evt.stopPropagation(),evt.preventDefault())})}return{restrict:"E",templateUrl:"canvas-view/canvas/canvas.html",replace:!0,scope:{chartDataModel:"=",chartViewModel:"=?",readOnly:"=?",hideConnectors:"=?"},controller:"CanvasController",link:link}}]).controller("CanvasController",["$scope","dragging","$element","$document",function($scope,dragging,$element,$document){var controller=this;$scope.chart=new pfCanvas.ChartViewModel($scope.chartDataModel),$scope.chartViewModel=$scope.chart,this.document=document,this.jQuery=function(element){return angular.element(element)},$scope.draggingConnection=!1,$scope.connectorSize=6,$scope.dragSelecting=!1,$scope.mouseOverConnector=null,$scope.mouseOverConnection=null,$scope.mouseOverNode=null,this.connectionClass="connection",this.connectorClass="connector",this.nodeClass="node",this.translateCoordinates=function(x,y,evt){var svgElem=$element.get(0),matrix=svgElem.getScreenCTM(),point=svgElem.createSVGPoint();return point.x=(x-evt.view.pageXOffset)/$scope.zoomLevel(),point.y=(y-evt.view.pageYOffset)/$scope.zoomLevel(),point.matrixTransform(matrix.inverse())},$scope.hideConnectors=$scope.hideConnectors?$scope.hideConnectors:!1,$scope.isConnectorConnected=function(connector){return connector&&connector.connected()},$scope.isConnectorUnconnectedAndValid=function(connector){return connector&&!connector.connected()&&!connector.invalid()&&connector.parentNode()!==$scope.connectingModeSourceNode},$scope.isConnectedTo=function(connector,node){var i,connection,connections=$scope.chart.connections;for(i=0;istartPoint.x?startPoint.x:curPoint.x,y:curPoint.y>startPoint.y?startPoint.y:curPoint.y,width:curPoint.x>startPoint.x?curPoint.x-startPoint.x:startPoint.x-curPoint.x,height:curPoint.y>startPoint.y?curPoint.y-startPoint.y:startPoint.y-curPoint.y}},dragEnded:function(){$scope.dragSelecting=!1,$scope.chart.applySelectionRect($scope.dragSelectionRect),delete $scope.dragSelectionStartPoint,delete $scope.dragSelectionRect}}))},$scope.nodeMouseOver=function(evt,node){$scope.readOnly||($scope.mouseOverNode=node)},$scope.nodeMouseLeave=function(evt,node){$scope.mouseOverNode=null},$scope.nodeMouseDown=function(evt,node){var lastMouseCoords,chart=$scope.chart;$scope.readOnly||dragging.startDrag(evt,{dragStarted:function(x,y){lastMouseCoords=controller.translateCoordinates(x,y,evt),node.selected()||(chart.deselectAll(),node.select())},dragging:function(x,y){var curCoords=controller.translateCoordinates(x,y,evt),deltaX=curCoords.x-lastMouseCoords.x,deltaY=curCoords.y-lastMouseCoords.y;chart.updateSelectedNodesLocation(deltaX,deltaY),lastMouseCoords=curCoords},clicked:function(){chart.handleNodeClicked(node,evt.ctrlKey)}})},$scope.$on("nodeActionClicked",function(evt,args){var action=args.action,node=args.node;"nodeActionConnect"===action&&$scope.startConnectingMode(node)}),$scope.$on("nodeActionClosed",function(){$scope.mouseOverNode=null}),$scope.connectingModeOutputConnector=null,$scope.connectingModeSourceNode=null,$scope.startConnectingMode=function(node){$scope.chart.inConnectingMode=!0,$scope.hideConnectors=!1,$scope.connectingModeSourceNode=node,$scope.connectingModeSourceNode.select(),$scope.connectingModeOutputConnector=node.getOutputConnector(),$scope.chart.updateValidNodesAndConnectors($scope.connectingModeSourceNode)},$scope.cancelConnectingMode=function(){$scope.connectingModeOutputConnector.connected()||$scope.chart.removeOutputConnector($scope.connectingModeOutputConnector),$scope.stopConnectingMode()},$scope.stopConnectingMode=function(){$scope.chart.inConnectingMode=!1,$scope.chart.resetValidNodesAndConnectors()},$scope.connectionMouseOver=function(evt,connection){$scope.draggingConnection||$scope.readOnly||($scope.mouseOverConnection=connection)},$scope.connectionMouseLeave=function(evt,connection){$scope.mouseOverConnection=null},$scope.connectionMouseDown=function(evt,connection){var chart=$scope.chart;$scope.readOnly||chart.handleConnectionMouseDown(connection,evt.ctrlKey),evt.stopPropagation(),evt.preventDefault()},$scope.connectorMouseOver=function(evt,node,connector,connectorIndex,isInputConnector){$scope.readOnly||($scope.mouseOverConnector=connector)},$scope.connectorMouseLeave=function(evt,node,connector,connectorIndex,isInputConnector){$scope.mouseOverConnector=null},$scope.connectorMouseDown=function(evt,node,connector,connectorIndex,isInputConnector){$scope.chart.inConnectingMode&&node!==$scope.connectingModeSourceNode&&($scope.chart.createNewConnection($scope.connectingModeOutputConnector,$scope.mouseOverConnector),$scope.stopConnectingMode())},$scope.$on("zoomIn",function(evt,args){$scope.chart.zoom["in"]()}),$scope.$on("zoomOut",function(evt,args){$scope.chart.zoom.out()}),$scope.maxZoom=function(){return $scope.chart.chartViewModel&&$scope.chart.chartViewModel.zoom?$scope.chart.chartViewModel.zoom.isMax():!1},$scope.minZoom=function(){return $scope.chart.chartViewModel&&$scope.chart.chartViewModel.zoom?$scope.chart.chartViewModel.zoom.isMin():!1},$scope.zoomLevel=function(){return $scope.chart.zoom.getLevel()}}])}();var pfCanvas={};!function(){pfCanvas.defaultHeight=756,pfCanvas.defaultWidth=1396,pfCanvas.defaultBgImageSize=24,pfCanvas.defaultNodeWidth=150,pfCanvas.defaultNodeHeight=150,pfCanvas.nodeNameHeight=40,pfCanvas.connectorHeight=25,pfCanvas.computeConnectorY=function(connectorIndex){return pfCanvas.defaultNodeHeight/2+connectorIndex*pfCanvas.connectorHeight},pfCanvas.computeConnectorPos=function(node,connectorIndex,inputConnector){return{x:node.x()+(inputConnector?0:node.width?node.width():pfCanvas.defaultNodeWidth),y:node.y()+pfCanvas.computeConnectorY(connectorIndex)}},pfCanvas.ConnectorViewModel=function(connectorDataModel,x,y,parentNode){this.data=connectorDataModel,this._parentNode=parentNode,this._x=x,this._y=y,this.name=function(){return this.data.name},this.x=function(){return this._x},this.y=function(){return this._y},this.parentNode=function(){return this._parentNode},this.connected=function(){return this.data.connected},this.setConnected=function(value){this.data.connected=value},this.invalid=function(){return this.data.invalid},this.setInvalid=function(value){this.data.invalid=value},this.fontFamily=function(){return this.data.fontFamily||""},this.fontContent=function(){return this.data.fontContent||""}};var createConnectorsViewModel=function(connectorDataModels,x,parentNode){var viewModels=[];if(connectorDataModels)for(var i=0;i=selectionRect.x&&node.y()>=selectionRect.y&&node.x()+node.width()<=selectionRect.x+selectionRect.width&&node.y()+node.height()<=selectionRect.y+selectionRect.height&&node.select()}for(i=0;i0},this.getSelectedConnections=function(){for(var selectedConnections=[],i=0;ithreshold||Math.abs(evt.pageY-y)>threshold)&&(dragging=!0,config.dragStarted&&config.dragStarted(x,y,evt),config.dragging&&config.dragging(evt.pageX,evt.pageY,evt))},released=function(){dragging?config.dragEnded&&config.dragEnded():config.clicked&&config.clicked()},mouseUp=function(evt){mouseCapture.release(),evt.stopPropagation(),evt.preventDefault()};mouseCapture.acquire(evt,{mouseMove:mouseMove,mouseUp:mouseUp,released:released}),evt.stopPropagation(),evt.preventDefault()}}}angular.module("dragging",["mouseCapture"]).factory("dragging",["mouseCapture",Factory])}(),function(){"use strict";function Factory($rootScope){var $element=document,mouseCaptureConfig=null,mouseMove=function(evt){mouseCaptureConfig&&mouseCaptureConfig.mouseMove&&(mouseCaptureConfig.mouseMove(evt),$rootScope.$digest())},mouseUp=function(evt){mouseCaptureConfig&&mouseCaptureConfig.mouseUp&&(mouseCaptureConfig.mouseUp(evt),$rootScope.$digest())};return{registerElement:function(element){$element=element},acquire:function(evt,config){this.release(),mouseCaptureConfig=config,$element.mousemove(mouseMove),$element.mouseup(mouseUp)},release:function(){mouseCaptureConfig&&(mouseCaptureConfig.released&&mouseCaptureConfig.released(),mouseCaptureConfig=null),$element.unbind("mousemove",mouseMove),$element.unbind("mouseup",mouseUp)}}}function ComponentDirective(){return{restrict:"A",controller:["$scope","$element","$attrs","mouseCapture",function($scope,$element,$attrs,mouseCapture){mouseCapture.registerElement($element)}]}}angular.module("mouseCapture",[]).factory("mouseCapture",["$rootScope",Factory]).directive("mouseCapture",[ComponentDirective])}(),function(){"use strict";function nodeToolbarDirective($document){function NodeToolbarController($scope){var vm=this;vm.selectedAction="none",$scope.actionIconClicked=function(action){vm.selectedAction=action,$scope.$emit("nodeActionClicked",{action:action,node:vm.node})},$scope.close=function(){vm.selectedAction="none", +$scope.$emit("nodeActionClosed")}}var directive={restrict:"E",scope:{node:"=",nodeActions:"="},controller:NodeToolbarController,templateUrl:"canvas-view/canvas/node-toolbar.html",controllerAs:"vm",bindToController:!0};return directive}nodeToolbarDirective.$inject=["$document"],angular.module("patternfly.canvas").directive("nodeToolbar",nodeToolbarDirective)}(),angular.module("patternfly.card").component("pfAggregateStatusCard",{bindings:{status:"=",showTopBorder:"@?",altLayout:"@?",layout:"@?"},templateUrl:"card/aggregate-status/aggregate-status-card.html",controller:function(){"use strict";var ctrl=this;ctrl.$onInit=function(){ctrl.shouldShowTopBorder="true"===ctrl.showTopBorder,ctrl.isAltLayout="true"===ctrl.altLayout||"tall"===ctrl.layout,ctrl.isMiniLayout="mini"===ctrl.layout}}}),angular.module("patternfly.card").component("pfCard",{transclude:!0,templateUrl:"card/basic/card.html",bindings:{headTitle:"@",subTitle:"@?",showTopBorder:"@?",showTitlesSeparator:"@?",footer:"=?",filter:"=?"},controller:function(){"use strict";var ctrl=this;ctrl.filter&&!ctrl.currentFilter&&(ctrl.filter.defaultFilter?ctrl.currentFilter=ctrl.filter.filters[ctrl.filter.defaultFilter]:ctrl.currentFilter=ctrl.filter.filters[0]),ctrl.footerCallBackFn=function(){ctrl.footerCallBackResult=ctrl.footer.callBackFn()},ctrl.filterCallBackFn=function(f){ctrl.currentFilter=f,ctrl.filter.callBackFn&&(ctrl.filterCallBackResult=ctrl.filter.callBackFn(f))},ctrl.showHeader=function(){return ctrl.headTitle||ctrl.showFilterInHeader()},ctrl.showFilterInHeader=function(){return ctrl.filter&&ctrl.filter.filters&&ctrl.filter.position&&"header"===ctrl.filter.position},ctrl.showFilterInFooter=function(){return ctrl.filter&&ctrl.filter.filters&&(!ctrl.filter.position||"footer"===ctrl.filter.position)},ctrl.$onInit=function(){ctrl.shouldShowTitlesSeparator=!ctrl.showTitlesSeparator||"true"===ctrl.showTitlesSeparator}}}),function(){"use strict";var patternflyDefaults=patternfly.c3ChartDefaults();angular.module("patternfly.charts").constant("c3ChartDefaults",{getDefaultColors:patternflyDefaults.getDefaultColors,getDefaultDonut:patternflyDefaults.getDefaultDonut,getDefaultDonutSize:patternflyDefaults.getDefaultDonutSize,getDefaultDonutColor:patternflyDefaults.getDefaultDonutColors,getDefaultDonutLegend:patternflyDefaults.getDefaultDonutLegend,getDefaultDonutConfig:patternflyDefaults.getDefaultDonutConfig,getDefaultSparklineArea:patternflyDefaults.getDefaultSparklineArea,getDefaultSparklineSize:patternflyDefaults.getDefaultSparklineSize,getDefaultSparklineAxis:patternflyDefaults.getDefaultSparklineAxis,getDefaultSparklineColor:patternflyDefaults.getDefaultColors,getDefaultSparklineLegend:patternflyDefaults.getDefaultSparklineLegend,getDefaultSparklinePoint:patternflyDefaults.getDefaultSparklinePoint,getDefaultSparklineTooltip:patternflyDefaults.getDefaultSparklineTooltip,getDefaultSparklineConfig:patternflyDefaults.getDefaultSparklineConfig,getDefaultLineConfig:patternflyDefaults.getDefaultLineConfig})}(),function(){"use strict";angular.module("patternfly.charts").component("pfC3Chart",{bindings:{config:"<",getChartCallback:"<"},template:'
    ',controller:["$timeout","$attrs",function($timeout,$attrs){var prevConfig,ctrl=this;ctrl.generateChart=function(){var chart,chartData;prevConfig=angular.copy(ctrl.config),$timeout(function(){chartData=ctrl.config,chartData&&(chartData.bindto="#"+$attrs.id,chart=c3.generate(chartData),ctrl.getChartCallback(chart),prevConfig=angular.copy(ctrl.config))})},ctrl.$doCheck=function(){angular.equals(ctrl.config,prevConfig)||ctrl.generateChart()}}]})}(),angular.module("patternfly.charts").component("pfDonutPctChart",{bindings:{config:"<",data:"<",chartHeight:"=thresholds.error?(threshold="error",color=pfUtils.colorPalette.red):used>=thresholds.warning&&(threshold="warning",color=pfUtils.colorPalette.orange)),ctrl.threshold&&ctrl.threshold===threshold||(ctrl.threshold=threshold,ctrl.onThresholdChange({threshold:ctrl.threshold})),color},ctrl.statusDonutColor=function(){var color,percentUsed;return color={pattern:[]},percentUsed=ctrl.data.used/ctrl.data.total*100,color.pattern[0]=ctrl.getStatusColor(percentUsed,ctrl.config.thresholds),color.pattern[1]=pfUtils.colorPalette.black300,color},ctrl.donutTooltip=function(){return{contents:function(d){var tooltipHtml;return tooltipHtml=ctrl.config.tooltipFn?''+ctrl.config.tooltipFn(d)+"":''+Math.round(100*d[0].ratio)+"% "+ctrl.config.units+" "+d[0].name+""}}},ctrl.getDonutData=function(){return{columns:[["Used",ctrl.data.used],["Available",ctrl.data.available]],type:"donut",donut:{label:{show:!1}},groups:[["used","available"]],order:null}},ctrl.getCenterLabelText=function(){var centerLabelText;return centerLabelText={bigText:ctrl.data.used,smText:ctrl.config.units+" Used"},ctrl.config.centerLabelFn?(centerLabelText.bigText=ctrl.config.centerLabelFn(),centerLabelText.smText=""):"none"===ctrl.centerLabel?(centerLabelText.bigText="",centerLabelText.smText=""):"available"===ctrl.centerLabel?(centerLabelText.bigText=ctrl.data.available,centerLabelText.smText=ctrl.config.units+" Available"):"percent"===ctrl.centerLabel&&(centerLabelText.bigText=Math.round(ctrl.data.used/ctrl.data.total*100)+"%",centerLabelText.smText="of "+ctrl.data.total+" "+ctrl.config.units),centerLabelText},ctrl.updateAll=function(){prevData=angular.copy(ctrl.data),ctrl.config=pfUtils.merge(patternfly.c3ChartDefaults().getDefaultDonutConfig(),ctrl.config),ctrl.updateAvailable(),ctrl.config.data=pfUtils.merge(ctrl.config.data,ctrl.getDonutData()),ctrl.config.color=ctrl.statusDonutColor(ctrl),ctrl.config.tooltip=ctrl.donutTooltip(),ctrl.config.data.onclick=ctrl.config.onClickFn},ctrl.setupDonutChartTitle=function(){var donutChartTitle,centerLabelText;angular.isUndefined(ctrl.chart)||(donutChartTitle=d3.select(ctrl.chart.element).select("text.c3-chart-arcs-title"),donutChartTitle&&(centerLabelText=ctrl.getCenterLabelText(),donutChartTitle.selectAll("*").remove(),centerLabelText.bigText&&!centerLabelText.smText?donutChartTitle.text(centerLabelText.bigText):(donutChartTitle.insert("tspan").text(centerLabelText.bigText).classed("donut-title-big-pf",!0).attr("dy",0).attr("x",0),donutChartTitle.insert("tspan").text(centerLabelText.smText).classed("donut-title-small-pf",!0).attr("dy",20).attr("x",0))))},ctrl.setChart=function(chart){ctrl.chart=chart,ctrl.setupDonutChartTitle()},ctrl.$onChanges=function(changesObj){(changesObj.config||changesObj.data)&&ctrl.updateAll(),changesObj.chartHeight&&(ctrl.config.size.height=changesObj.chartHeight.currentValue),changesObj.centerLabel&&ctrl.setupDonutChartTitle()},ctrl.$doCheck=function(){angular.equals(ctrl.data,prevData)||ctrl.updateAll()}}]}),angular.module("patternfly.charts").component("pfEmptyChart",{bindings:{chartHeight:" 90%"];ctrl.$onInit=function(){ctrl.updateAll()},ctrl.updateAll=function(){var index,items=[];for(ctrl.legendColors||(ctrl.legendColors=heatmapColorPatternDefaults),ctrl.legend||(ctrl.legend=legendLabelDefaults),index=ctrl.legend.length-1;index>=0;index--)items.push({text:ctrl.legend[index],color:ctrl.legendColors[index]});ctrl.legendItems=items},ctrl.$onChanges=function(changesObj){changesObj.legend&&!changesObj.legend.isFirstChange()&&ctrl.updateAll(),changesObj.legendColors&&!changesObj.legendColors.isFirstChange()&&ctrl.updateAll()}}}),angular.module("patternfly.charts").component("pfHeatmap",{bindings:{data:"<",chartDataAvailable:" 90%"],rangeTooltipDefaults=["< 70%","70-80%","80-90%","> 90%"],heightDefault=200,setStyles=function(){ctrl.containerStyles={height:ctrl.height+"px",display:ctrl.chartDataAvailable===!1?"none":"block"}},setSizes=function(){var parentContainer=$element[0].querySelector(".heatmap-container");containerWidth=parentContainer.clientWidth,containerHeight=parentContainer.clientHeight,blockSize=determineBlockSize(),blockSize-ctrl.padding>ctrl.maxSize?(blockSize=ctrl.padding+ctrl.maxSize,numberOfRows=Math.ceil(Math.sqrt(ctrl.data.length)),(blockSize*numberOfRows>containerWidth||blockSize*numberOfRows>containerHeight)&&(numberOfRows=0===blockSize?0:Math.floor(containerHeight/blockSize))):blockSize-ctrl.paddingcontainerWidth||blockSize*numberOfRows>containerHeight)&&(numberOfRows=0===blockSize?0:Math.floor(containerHeight/blockSize))):numberOfRows=0===blockSize?0:Math.floor(containerHeight/blockSize)},determineBlockSize=function(){var sx,sy,x=containerWidth,y=containerHeight,n=ctrl.data?ctrl.data.length:0,px=Math.ceil(Math.sqrt(n*x/y)),py=Math.ceil(Math.sqrt(n*y/x));return sx=Math.floor(px*y/x)*px50&&(ctrl.maxSize=50)),void 0===ctrl.minBlockSize||isNaN(ctrl.minBlockSize)?ctrl.minSize=2:ctrl.minSize=parseInt(ctrl.minBlockSize),void 0===ctrl.blockPadding||isNaN(ctrl.blockPadding)?ctrl.padding=2:ctrl.padding=parseInt(ctrl.blockPadding),void 0===ctrl.rangeHoverSize||isNaN(ctrl.rangeHoverSize)?ctrl.rangeHoverSize=15:ctrl.rangeHoverSize=parseInt(ctrl.rangeHoverSize),ctrl.rangeOnHover=void 0===ctrl.rangeOnHover||ctrl.rangeOnHover?!0:!1,ctrl.rangeTooltips||(ctrl.rangeTooltips=rangeTooltipDefaults),ctrl.thresholds||(ctrl.thresholds=thresholdDefaults),ctrl.heatmapColorPattern||(ctrl.heatmapColorPattern=heatmapColorPatternDefaults),ctrl.legendLabels||(ctrl.legendLabels=legendLabelDefaults),ctrl.height=ctrl.height||heightDefault,ctrl.showLegend=ctrl.showLegend||void 0===ctrl.showLegend,ctrl.loadingDone=!1,angular.element($window).bind("resize",function(){setSizes(),redraw()}),ctrl.thisComponent=$element[0].querySelector(".heatmap-pf-svg"),$timeout(function(){setStyles(),setSizes(),redraw()})},ctrl.$onChanges=function(changesObj){changesObj.chartDataAvailable&&!changesObj.chartDataAvailable.isFirstChange()?setStyles():(ctrl.updateAll(),ctrl.loadingDone=!0)},ctrl.$doCheck=function(){angular.equals(ctrl.data,prevData)||(setStyles(),ctrl.chartDataAvailable!==!1&&(setSizes(),redraw()))},ctrl.$postLink=function(){setStyles(),setSizes(),redraw()}}]}),angular.module("patternfly.charts").component("pfLineChart",{bindings:{config:"<",chartData:"<",showXAxis:" '+tipRows+"
    "},ctrl.sparklineTooltip=function(){return{contents:function(d){var tipRows,percentUsed=0;if(ctrl.config.tooltipFn)tipRows=ctrl.config.tooltipFn(d);else switch(ctrl.config.tooltipType){case"usagePerDay":ctrl.chartData.dataAvailable!==!1&&ctrl.chartData.total>0&&(percentUsed=Math.round(d[0].value/ctrl.chartData.total*100)),tipRows=' '+d[0].x.toLocaleDateString()+' '+percentUsed+'%: '+d[0].value+" "+(ctrl.config.units?ctrl.config.units+" ":"")+d[0].name+"";break;case"valuePerDay":tipRows=' '+d[0].x.toLocaleDateString()+' '+d[0].value+" "+d[0].name+"";break;case"percentage":percentUsed=Math.round(d[0].value/ctrl.chartData.total*100),tipRows=' '+percentUsed+"%";break;default:tipRows=patternfly.c3ChartDefaults().getDefaultSparklineTooltip().contents(d)}return ctrl.getTooltipTableHTML(tipRows)},position:function(data,width,height,element){var center,top,chartBox,graphOffsetX,x;try{return center=parseInt(element.getAttribute("x")),top=parseInt(element.getAttribute("y")),chartBox=document.querySelector("#"+ctrl.sparklineChartId).getBoundingClientRect(),graphOffsetX=document.querySelector("#"+ctrl.sparklineChartId+" g.c3-axis-y").getBoundingClientRect().right,x=Math.max(0,center+graphOffsetX-chartBox.left-Math.floor(width/2)),{top:top-height,left:Math.min(x,chartBox.width-width)}}catch(e){}}}},ctrl.$onChanges=function(changesObj){ctrl.updateAll()},ctrl.$doCheck=function(){angular.equals(ctrl.chartData,prevChartData)||ctrl.updateAll()}}]}),angular.module("patternfly.charts").component("pfTopology",{bindings:{items:"<",relations:"<",kinds:"<",icons:"<",selection:"<",force:"<",radius:"<",nodes:"<",searchText:"i;i++)relation=relations[i],s=lookup[relation.source],t=lookup[relation.target],void 0!==s&&void 0!==t&&links.push({source:s,target:t,kinds:nodes[s].item.kind+nodes[t].item.kind});return width&&height?update():d3.select()}function resized(){window.clearTimeout(timeout),timeout=window.setTimeout(adjust,1)}var width,height,timeout,drag,svg,vertices,edges,outer=d3.select(selector),kinds=null,items={},relations=[],radius=20,nodes=[],links=[],lookup={},selection=null,force=options.force;return options.radius&&(radius=options.radius),force||(force=d3.layout.force().charge(-800).gravity(.2).linkDistance(80)),drag=force.drag(),svg=outer.append("svg").attr("viewBox","0 0 1600 1200").attr("preserveAspectRatio","xMidYMid meet").attr("class","pf-topology-svg"),vertices=d3.select(),edges=d3.select(),force.on("tick",function(){edges.attr("x1",function(d){return d.source.x}).attr("y1",function(d){return d.source.y}).attr("x2",function(d){return d.target.x}).attr("y2",function(d){return d.target.y}),vertices.attr("cx",function(d){return d.x=d.fixed?d.x:Math.max(radius,Math.min(width-radius,d.x)),d.x}).attr("cy",function(d){return d.y=d.fixed?d.y:Math.max(radius,Math.min(height-radius,d.y)),d.y}).attr("transform",function(d){return"translate("+d.x+","+d.y+")"})}),drag.on("dragstart",function(d){notify(d.item),d.fixed!==!0&&(d.floatpoint=[d.x,d.y]),d.fixed=!0,d3.select(this).classed("fixed",!0)}).on("dragend",function(d){var moved=!0;d.floatpoint&&(moved=d.xd.floatpoint[0]+5||d.yd.floatpoint[1]+5,delete d.floatpoint),d.fixed=moved&&d.x>3&&d.x=3&&d.ycanvasSize[0]&&(popup.style("left","auto"),popup.style("right",0)),popupSize[1]+mousePosition[1]>canvasSize[1]&&(popup.style("top","auto"),popup.style("bottom",0)),contextMenuShowing=!contextMenuShowing)}function buildContextMenuOptions(popup,data){return"Tag"===data.item.kind?!1:void addContextMenuOption(popup,"Go to summary page",data,dblclick)}function dblclick(d){window.location.assign(d.url)}function addContextMenuOption(popup,text,data,callback){popup.append("p").text(text).on("click",function(){callback(data)})}function getDimensions(d){var nodeEntry=ctrl.nodes[d.item.kind],defaultDimensions=defaultElementDimensions();return nodeEntry&&(nodeEntry.textX&&(defaultDimensions.x=nodeEntry.textX),nodeEntry.textY&&(defaultDimensions.y=nodeEntry.textY),nodeEntry.radius&&(defaultDimensions.r=nodeEntry.radius)),defaultDimensions}function defaultElementDimensions(){return{x:0,y:9,r:17}}function getItemStatusClass(d){switch(d.item.status.toLowerCase()){case"ok":case"active":case"available":case"on":case"ready":case"running":case"succeeded":case"valid":return"success";case"notready":case"failed":case"error":case"unreachable":return"error";case"warning":case"waiting":case"pending":return"warning";case"unknown":case"terminated":return"unknown"}}var options,graph,previousItems,previousRelations,previousKinds,contextMenuShowing,vs,ctrl=this,cache={};ctrl.$onInit=function(){$element.css("display","block"),options={force:ctrl.force,radius:ctrl.radius},ctrl.showLabels=!1,$element.on("$destroy",function(){graph.close()}),d3.select("body").on("click",function(){contextMenuShowing&&removeContextMenu()})},ctrl.$onChanges=function(changesObj){changesObj.searchText&&graph&&search(changesObj.searchText.currentValue),changesObj.showLabels&&vs&&toggleLabelVisibility(),changesObj.selection&&graph&&graph.select(changesObj.selection.currentValue||null)},ctrl.$doCheck=function(){graph&&(angular.equals(ctrl.kinds,previousKinds)||(previousKinds=angular.copy(ctrl.kinds),render(graph.kinds(ctrl.kinds))),angular.equals(ctrl.items,previousItems)&&angular.equals(ctrl.relations,previousRelations)||(previousItems=angular.copy(ctrl.items),previousRelations=angular.copy(ctrl.relations),render(graph.data(ctrl.items,ctrl.relations))))},ctrl.$postLink=function(){options={force:ctrl.force,radius:ctrl.radius},graph=topologyGraph($element[0],notify,options)}}]}),angular.module("patternfly.charts").component("pfTrendsChart",{bindings:{config:"<",chartData:"<",chartHeight:"0&&(pctValue=Math.round(ctrl.getLatestValue()/ctrl.chartData.total*100)),pctValue},ctrl.getLatestValue=function(){var latestValue=0;return ctrl.chartData.yData&&ctrl.chartData.yData.length>0&&(latestValue=ctrl.chartData.yData[ctrl.chartData.yData.length-1]),latestValue},ctrl.getChartHeight=function(){var retValue=LARGE;return ctrl.chartHeight?retValue=ctrl.chartHeight:"small"===ctrl.config.layout&&(retValue=SMALL),retValue},ctrl.$onChanges=function(changesObj){ctrl.updateAll()},ctrl.$doCheck=function(){angular.equals(ctrl.chartData,prevChartData)&&angular.equals(ctrl.config,prevConfig)||ctrl.updateAll()}}]}),angular.module("patternfly.charts").component("pfUtilizationBarChart",{bindings:{chartData:"=",chartTitle:"=",chartFooter:"=",units:"=",thresholdError:"=?",thresholdWarning:"=?",footerLabelFormat:"@?",layout:"=?"},templateUrl:"charts/utilization-bar/utilization-bar-chart.html",controller:["$timeout",function($timeout){"use strict";var prevChartData,prevLayout,ctrl=this;ctrl.updateAll=function(){prevChartData=angular.copy(ctrl.chartData),prevLayout=angular.copy(ctrl.layout),ctrl.chartData.percentageUsed=Math.round(100*(ctrl.chartData.used/ctrl.chartData.total)),(ctrl.thresholdError||ctrl.thresholdWarning)&&(ctrl.isError=ctrl.chartData.percentageUsed>=ctrl.thresholdError,ctrl.isWarn=ctrl.chartData.percentageUsed>=ctrl.thresholdWarning&&ctrl.chartData.percentageUsedcharsMaxLimit&&($scope.ngModel=$scope.ngModel.substring(0,charsMaxLimit),charsLength=$scope.ngModel.length,remainingChars=charsMaxLimit-charsLength),$scope.remainingChars=remainingChars,$scope.remainingCharsWarning=charsWarnRemaining>=remainingChars?!0:!1,countRemainingFld.text(remainingChars),countRemainingFld.toggleClass("chars-warn-remaining-pf",charsWarnRemaining>=remainingChars),0>remainingChars?$scope.$emit("overCharsMaxLimit",$attributes.id):$scope.$emit("underCharsMaxLimit",$attributes.id)};$scope.$watch("ngModel",function(){checkCharactersRemaining()}),$element.bind("keypress",function(event){blockInputAtMaxLimit&&$element.val().length>=charsMaxLimit&&8!==event.keyCode&&event.preventDefault()})}}}]),angular.module("patternfly.modals").directive("pfAboutModalTransclude",["$parse",function($parse){"use strict";return{link:function(scope,element,attrs){element.append($parse(attrs.pfAboutModalTransclude)(scope))}}}]).component("pfModalContent",{templateUrl:"about-modal-template.html",bindings:{resolve:"<",close:"&",dismiss:"&"},controller:function(){"use strict";var $ctrl=this;$ctrl.$onInit=function(){$ctrl.additionalInfo=$ctrl.resolve.additionalInfo,$ctrl.copyright=$ctrl.resolve.copyright,$ctrl.imgAlt=$ctrl.resolve.imgAlt,$ctrl.imgSrc=$ctrl.resolve.imgSrc,$ctrl.isOpen=$ctrl.resolve.isOpen,$ctrl.productInfo=$ctrl.resolve.productInfo,$ctrl.title=$ctrl.resolve.title,$ctrl.template=$ctrl.resolve.content}}}).component("pfAboutModal",{bindings:{additionalInfo:"=?",copyright:"=?",close:"&onClose",imgAlt:"=?",imgSrc:"=?",isOpen:"0&&item.children.forEach(function(secondaryItem){secondaryItem.isHover&&(hover=!0)})}),hover},updateSecondaryCollapsedState=function(setCollapsed,collapsedItem){var bodyContentElement=getBodyContentElement();collapsedItem&&(collapsedItem.secondaryCollapsed=setCollapsed),setCollapsed?(ctrl.collapsedSecondaryNav=!0,bodyContentElement.addClass("collapsed-secondary-nav-pf")):(ctrl.items&&ctrl.items.forEach(function(item){item.secondaryCollasped=!1}),ctrl.collapsedSecondaryNav=!1,bodyContentElement.removeClass("collapsed-secondary-nav-pf"))},updateTertiaryCollapsedState=function(setCollapsed,collapsedItem){var bodyContentElement=getBodyContentElement();collapsedItem&&(collapsedItem.tertiaryCollapsed=setCollapsed),setCollapsed?(ctrl.collapsedTertiaryNav=!0,bodyContentElement.addClass("collapsed-tertiary-nav-pf"),updateSecondaryCollapsedState(!1)):(ctrl.items&&ctrl.items.forEach(function(item){item.children&&item.children.length>0&&item.children.forEach(function(secondaryItem){secondaryItem.tertiaryCollasped=!1})}),ctrl.collapsedTertiaryNav=!1,bodyContentElement.removeClass("collapsed-tertiary-nav-pf"))};ctrl.showBadges="true"===ctrl.showBadges,ctrl.persistentSecondary="true"===ctrl.persistentSecondary,ctrl.pinnableMenus="true"===ctrl.pinnableMenus,ctrl.hiddenIcons="true"===ctrl.hiddenIcons,ctrl.updateActiveItemsOnClick="true"===ctrl.updateActiveItemsOnClick,ctrl.ignoreMobile="true"===ctrl.ignoreMobile,ctrl.activeSecondary=!1,ctrl.showMobileNav=!1,ctrl.showMobileSecondary=!1,ctrl.showMobileTertiary=!1,ctrl.hoverSecondaryNav=!1,ctrl.hoverTertiaryNav=!1,ctrl.collapsedSecondaryNav=!1,ctrl.collapsedTertiaryNav=!1,ctrl.navCollapsed=!1,ctrl.forceHidden=!1,ctrl.clearActiveItems=function(){ctrl.items.forEach(function(item){item.isActive=!1,item.children&&item.children.forEach(function(secondary){secondary.isActive=!1,secondary.children&&secondary.children.forEach(function(tertiary){tertiary.isActive=!1})})})},ctrl.setActiveItems=function(){var updatedRoute="#"+$location.path();ctrl.items.forEach(function(topLevel){updatedRoute.indexOf(topLevel.href)>-1&&(topLevel.isActive=!0),topLevel.children&&topLevel.children.forEach(function(secondLevel){updatedRoute.indexOf(secondLevel.href)>-1&&(secondLevel.isActive=!0,topLevel.isActive=!0),secondLevel.children&&secondLevel.children.forEach(function(thirdLevel){updatedRoute.indexOf(thirdLevel.href)>-1&&(thirdLevel.isActive=!0,secondLevel.isActive=!0,topLevel.isActive=!0)})})})},ctrl.handleNavBarToggleClick=function(){ctrl.inMobileState?ctrl.showMobileNav?ctrl.showMobileNav=!1:(updateMobileMenu(),ctrl.showMobileNav=!0):ctrl.navCollapsed?expandMenu():collapseMenu()},ctrl.handlePrimaryClick=function(item,event){ctrl.inMobileState?item.children&&item.children.length>0?updateMobileMenu(item):(updateMobileMenu(),navigateToItem(item)):navigateToItem(item)},ctrl.handleSecondaryClick=function(primary,secondary,event){ctrl.inMobileState?secondary.children&&secondary.children.length>0?updateMobileMenu(primary,secondary):(updateMobileMenu(),navigateToItem(secondary)):navigateToItem(secondary)},ctrl.handleTertiaryClick=function(primary,secondary,tertiary,event){ctrl.inMobileState&&updateMobileMenu(),navigateToItem(tertiary)},ctrl.handlePrimaryHover=function(item){item.children&&item.children.length>0&&(ctrl.inMobileState||(void 0!==item.navUnHoverTimeout?($timeout.cancel(item.navUnHoverTimeout),item.navUnHoverTimeout=void 0):void 0!==ctrl.navHoverTimeout||item.isHover||(item.navHoverTimeout=$timeout(function(){ctrl.hoverSecondaryNav=!0,item.isHover=!0,item.navHoverTimeout=void 0},hoverDelay))))},ctrl.handlePrimaryUnHover=function(item){item.children&&item.children.length>0&&(void 0!==item.navHoverTimeout?($timeout.cancel(item.navHoverTimeout),item.navHoverTimeout=void 0):void 0===item.navUnHoverTimeout&&item.isHover&&(item.navUnHoverTimeout=$timeout(function(){item.isHover=!1,primaryHover()||(ctrl.hoverSecondaryNav=!1),item.navUnHoverTimeout=void 0},hideDelay)))},ctrl.handleSecondaryHover=function(item){item.children&&item.children.length>0&&(ctrl.inMobileState||(void 0!==item.navUnHoverTimeout?($timeout.cancel(item.navUnHoverTimeout),item.navUnHoverTimeout=void 0):void 0===ctrl.navHoverTimeout&&(item.navHoverTimeout=$timeout(function(){ctrl.hoverTertiaryNav=!0,item.isHover=!0,item.navHoverTimeout=void 0},hoverDelay))))},ctrl.handleSecondaryUnHover=function(item){item.children&&item.children.length>0&&(void 0!==item.navHoverTimeout?($timeout.cancel(item.navHoverTimeout),item.navHoverTimeout=void 0):void 0===item.navUnHoverTimeout&&(item.navUnHoverTimeout=$timeout(function(){item.isHover=!1,secondaryHover()||(ctrl.hoverTertiaryNav=!1),item.navUnHoverTimeout=void 0},hideDelay)))},ctrl.collapseSecondaryNav=function(item,event){ctrl.inMobileState?updateMobileMenu():item.secondaryCollapsed?(updateSecondaryCollapsedState(!1,item),forceHideSecondaryMenu()):updateSecondaryCollapsedState(!0,item),ctrl.hoverSecondaryNav=!1,event.stopImmediatePropagation()},ctrl.collapseTertiaryNav=function(item,event){ctrl.inMobileState?ctrl.items.forEach(function(primaryItem){primaryItem.children&&primaryItem.children.forEach(function(secondaryItem){secondaryItem===item&&updateMobileMenu(primaryItem)})}):item.tertiaryCollapsed?(updateTertiaryCollapsedState(!1,item),forceHideSecondaryMenu()):updateTertiaryCollapsedState(!0,item),ctrl.hoverSecondaryNav=!1,ctrl.hoverTertiaryNav=!1,event.stopImmediatePropagation()},ctrl.$onInit=function(){$injector.has("$state")&&($state=$injector.get("$state")),ctrl.updateActiveItemsOnClick||$rootScope&&(routeChangeListener=$rootScope.$on("$routeChangeSuccess",function(event,next,current){ctrl.clearActiveItems(),ctrl.setActiveItems()})),initBodyElement(),checkNavState(),angular.element($window).bind("resize",function(){checkNavState()})},ctrl.$onDestroy=function(){_.isFunction(routeChangeListener)&&routeChangeListener()}}]}),angular.module("patternfly.notification").component("pfInlineNotification",{bindings:{pfNotificationType:"=",pfNotificationMessage:"=",pfNotificationHeader:"=",pfNotificationPersistent:"=",pfNotificationIndex:"=",pfNotificationRemove:"&?"},templateUrl:"notification/inline-notification.html"}),angular.module("patternfly.notification").component("pfNotificationDrawer",{bindings:{drawerHidden:"0&&(void 0===ctrl.config.currentField&&(ctrl.config.currentField=ctrl.config.fields[0],updated=!0),void 0===ctrl.config.isAscending&&(ctrl.config.isAscending=!0,updated=!0)),updated===!0&&ctrl.config.onSortChange&&ctrl.config.onSortChange(ctrl.config.currentField,ctrl.config.isAscending)}function selectField(field){ctrl.config.currentField=field,ctrl.config.onSortChange&&ctrl.config.onSortChange(ctrl.config.currentField,ctrl.config.isAscending)}function changeDirection(){ctrl.config.isAscending=!ctrl.config.isAscending,ctrl.config.onSortChange&&ctrl.config.onSortChange(ctrl.config.currentField,ctrl.config.isAscending)}function getSortIconClass(){var iconClass;return iconClass="numeric"===ctrl.config.currentField.sortType?ctrl.config.isAscending?"fa fa-sort-numeric-asc":"fa fa-sort-numeric-desc":ctrl.config.isAscending?"fa fa-sort-alpha-asc":"fa fa-sort-alpha-desc"}var prevConfig,ctrl=this;ctrl.$onInit=function(){angular.isDefined(ctrl.config)&&angular.isUndefined(ctrl.config.show)&&(ctrl.config.show=!0),angular.extend(ctrl,{selectField:selectField,changeDirection:changeDirection,getSortIconClass:getSortIconClass})},ctrl.$onChanges=function(){setupConfig()},ctrl.$doCheck=function(){angular.equals(ctrl.config,prevConfig)||setupConfig()}}}),angular.module("patternfly.table").component("pfTableView",{bindings:{config:"0)for(actnBtns=1;actnBtns<=ctrl.actionButtons.length;actnBtns++)ctrl.dtColumnDefs.push(DTColumnDefBuilder.newColumnDef(i++).notSortable());ctrl.menuActions&&ctrl.menuActions.length>0&&ctrl.dtColumnDefs.push(DTColumnDefBuilder.newColumnDef(i++).notSortable())}function listenForDraw(){var oTable,dtInstance=ctrl.dtInstance;dtInstance&&dtInstance.dataTable&&(oTable=dtInstance.dataTable,ctrl.tableId=oTable[0].id,oTable.on("draw.dt",function(){ctrl.debug&&$log.debug("--> redraw"),selectRowsByChecked()}))}function validSelectionMatchProp(){var prop,retVal=!1,item=ctrl.items[0];for(prop in item)item.hasOwnProperty(prop)&&ctrl.config.selectionMatchProp===prop&&(retVal=!0);return retVal}function getItemFromRow(matchPropValue){var item,retVals,filterObj={};return filterObj[ctrl.config.selectionMatchProp]=matchPropValue,retVals=$filter("filter")(ctrl.items,filterObj),retVals&&1===retVals.length&&(item=retVals[0]),item}function selectRowsByChecked(){$timeout(function(){var oTable,rows,checked;oTable=ctrl.dtInstance.DataTable,ctrl.debug&&$log.debug(" selectRowsByChecked"),angular.isUndefined(oTable)||(ctrl.debug&&$log.debug(" ...oTable defined"),rows=oTable.rows(),rows.deselect(),rows=oTable.rows(function(idx,data,node){return checked=node.children[0].children[0].checked}),ctrl.debug&&$log.debug(" ... #checkedRows = "+rows[0].length),rows[0].length>0&&rows.select(),setSelectAllCheckbox())})}function setSelectAllCheckbox(){var numVisibleRows,numCheckedRows;ctrl.debug&&$log.debug(" setSelectAllCheckbox"),numVisibleRows=getVisibleRows().length,numCheckedRows=document.querySelectorAll("#"+ctrl.tableId+" tbody tr.even.selected").length+document.querySelectorAll("#"+ctrl.tableId+" tbody tr.odd.selected").length,ctrl.selectAll=numVisibleRows===numCheckedRows}function getVisibleRows(){var i,rowData,visibleRows=new Array,oTable=ctrl.dtInstance.dataTable,anNodes=document.querySelectorAll("#"+ctrl.tableId+" tbody tr");for(i=0;i dtInstanceCallback"),ctrl.dtInstance=_dtInstance,listenForDraw(),selectRowsByChecked()},ctrl.$onChanges=function(changesObj){ctrl.debug&&$log.debug("$onChanges"),changesObj.config&&!changesObj.config.isFirstChange()&&(ctrl.debug&&$log.debug("...updateConfigOptions"),ctrl.updateConfigOptions())},ctrl.$doCheck=function(){ctrl.debug&&$log.debug("$doCheck"),angular.equals(ctrl.dtOptions,prevDtOptions)||(ctrl.debug&&$log.debug(" dtOptions !== prevDtOptions"),ctrl.updateConfigOptions()),angular.equals(ctrl.items,prevItems)||(ctrl.debug&&$log.debug(" items !== prevItems"), +prevItems=angular.copy(ctrl.items),selectRowsByChecked())},ctrl.$postLink=function(){ctrl.debug&&$log.debug(" $postLink")},ctrl.$onDestroy=function(){ctrl.debug&&$log.debug(" $onDestroy"),ctrl.dtInstance={}},ctrl.toggleAll=function(){var item,visibleRows=getVisibleRows();angular.forEach(visibleRows,function(row){item=getItemFromRow(row),item.selected!==ctrl.selectAll&&(item.selected=ctrl.selectAll,ctrl.config&&ctrl.config.onCheckBoxChange&&ctrl.config.onCheckBoxChange(item))})},ctrl.toggleOne=function(item){ctrl.config&&ctrl.config.onCheckBoxChange&&ctrl.config.onCheckBoxChange(item)},ctrl.handleButtonAction=function(action,item){action&&action.actionFn&&action.actionFn(action,item)},ctrl.isColItemFld=function(key){var retVal=!1,tableCol=$filter("filter")(ctrl.colummns,{itemField:key});return tableCol&&1===tableCol.length&&(retVal=!0),retVal},ctrl.areActions=function(){return ctrl.actionButtons&&ctrl.actionButtons.length>0||ctrl.menuActions&&ctrl.menuActions.length>0},ctrl.calcActionsColspan=function(){var colspan=0;return ctrl.actionButtons&&ctrl.actionButtons.length>0&&(colspan+=ctrl.actionButtons.length),ctrl.menuActions&&ctrl.menuActions.length>0&&(colspan+=1),colspan},ctrl.handleMenuAction=function(action,item){!ctrl.checkDisabled(item)&&action&&action.actionFn&&action.isDisabled!==!0&&action.actionFn(action,item)},ctrl.setupActions=function(item,event){$timeout(function(){var nextElement,parentDiv=void 0;for(nextElement=event.target;nextElement&&!parentDiv;)-1!==nextElement.className.indexOf("dropdown-kebab-pf")&&(parentDiv=nextElement,-1!==nextElement.className.indexOf("open")&&setDropMenuLocation(parentDiv)),nextElement=nextElement.parentElement})},ctrl.checkDisabled=function(item){return!1}}]}),angular.module("patternfly.toolbars").component("pfToolbar",{bindings:{config:"="},transclude:{actions:"?"},templateUrl:"toolbars/toolbar.html",controller:function(){"use strict";function setupConfig(){prevConfig=angular.copy(ctrl.config),ctrl.config&&ctrl.config.viewsConfig&&ctrl.config.viewsConfig.views&&(ctrl.config.viewsConfig.viewsList=angular.copy(ctrl.config.viewsConfig.views),ctrl.config.viewsConfig.currentView||(ctrl.config.viewsConfig.currentView=ctrl.config.viewsConfig.viewsList[0]))}function viewSelected(viewId){ctrl.config.viewsConfig.currentView=viewId,ctrl.config.viewsConfig.onViewSelect&&!ctrl.checkViewDisabled(viewId)&&ctrl.config.viewsConfig.onViewSelect(viewId)}function isViewSelected(viewId){return ctrl.config.viewsConfig&&ctrl.config.viewsConfig.currentView===viewId}function checkViewDisabled(view){return ctrl.config.viewsConfig.checkViewDisabled&&ctrl.config.viewsConfig.checkViewDisabled(view)}function filterExists(filter){var foundFilter=_.find(ctrl.config.filterConfig.appliedFilters,{title:filter.title,value:filter.value});return void 0!==foundFilter}function enforceSingleSelect(filter){_.remove(ctrl.config.appliedFilters,{title:filter.title})}function addFilter(field,value){var newFilter={id:field.id,title:field.title,value:value};filterExists(newFilter)||("select"===newFilter.type&&enforceSingleSelect(newFilter),ctrl.config.filterConfig.appliedFilters.push(newFilter),ctrl.config.filterConfig.onFilterChange&&ctrl.config.filterConfig.onFilterChange(ctrl.config.filterConfig.appliedFilters))}function handleAction(action){action&&action.actionFn&&action.isDisabled!==!0&&action.actionFn(action)}var prevConfig,ctrl=this;ctrl.$onInit=function(){angular.isDefined(ctrl.config.sortConfig)&&angular.isUndefined(ctrl.config.sortConfig.show)&&(ctrl.config.sortConfig.show=!0),angular.extend(ctrl,{viewSelected:viewSelected,isViewSelected:isViewSelected,checkViewDisabled:checkViewDisabled,addFilter:addFilter,handleAction:handleAction})},ctrl.$onChanges=function(){setupConfig()},ctrl.$doCheck=function(){angular.equals(ctrl.config,prevConfig)||setupConfig()}}}),angular.module("patternfly.utils").directive("pfFixedAccordion",["$window","$timeout",function($window,$timeout){"use strict";return{restrict:"A",scope:{scrollSelector:"@",groupHeight:"@",groupClass:"@"},link:function($scope,$element,$attrs){var setBodyScrollHeight=function(parentElement,bodyHeight){var collapsePanel,scrollElement,panelContents,nextContent,innerHeight,scroller,collapsePanels=parentElement[0].querySelectorAll(".panel-collapse");angular.forEach(collapsePanels,function(collapseElement){collapsePanel=angular.element(collapseElement),scrollElement=collapsePanel,innerHeight=0,angular.isDefined($scope.scrollSelector)&&(scroller=angular.element(collapsePanel[0].querySelector($scope.scrollSelector)),1===scroller.length&&(scrollElement=angular.element(scroller[0]),panelContents=collapsePanel.children(),angular.forEach(panelContents,function(contentElement){nextContent=angular.element(contentElement),nextContent[0]!==scrollElement[0]&&(innerHeight+=nextContent[0].offsetHeight,innerHeight+=parseInt(getComputedStyle(nextContent[0]).marginTop),innerHeight+=parseInt(getComputedStyle(nextContent[0]).marginBottom))}))),angular.element(scrollElement).css("max-height",bodyHeight-innerHeight+"px"),angular.element(scrollElement).css("overflow-y","auto")})},setCollapseHeights=function(){var height,openPanel,contentHeight,bodyHeight,headingElement,overflowY="hidden",parentElement=angular.element($element[0].querySelector(".panel-group")),headings=angular.element(parentElement).children();height=parentElement[0].clientHeight,openPanel=parentElement[0].querySelectorAll(".collapse.in"),openPanel&&openPanel.length>0&&angular.element(openPanel).removeClass("in"),contentHeight=0,angular.forEach(headings,function(heading){headingElement=angular.element(heading),contentHeight+=headingElement.prop("offsetHeight"),contentHeight+=parseInt(getComputedStyle(headingElement[0]).marginTop),contentHeight+=parseInt(getComputedStyle(headingElement[0]).marginBottom)}),bodyHeight=height-contentHeight,25>bodyHeight&&(bodyHeight=25,overflowY="auto"),openPanel&&openPanel.length>0&&angular.element(openPanel).addClass("in"),angular.element(parentElement).css("overflow-y",overflowY),$timeout(function(){setBodyScrollHeight(parentElement,bodyHeight)})};$scope.groupHeight&&angular.element($element[0].querySelector(".panel-group")).css("height",$scope.groupHeight),$scope.groupClass&&angular.element($element[0].querySelector(".panel-group")).addClass($scope.groupClass),$timeout(function(){setCollapseHeights()},100),$element.bind("resize",function(){setCollapseHeights()}),angular.element($window).bind("resize",function(){setCollapseHeights()})}}}]),angular.module("patternfly.utils").directive("pfTransclude",function(){"use strict";return{restrict:"A",link:function($scope,$element,$attrs,controller,$transclude){var iChildScope,iScopeType;if(!$transclude)throw new Error("pfTransclude - Illegal use of pfTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}");switch(iScopeType=$attrs.pfTransclude||"sibling"){case"sibling":$transclude(function(clone){$element.empty(),$element.append(clone)});break;case"parent":$transclude($scope,function(clone){$element.empty(),$element.append(clone)});break;case"child":iChildScope=$scope.$new(),$transclude(iChildScope,function(clone){$element.empty(),$element.append(clone),$element.on("$destroy",function(){iChildScope.$destroy()})})}}}}),function(){"use strict";angular.module("patternfly.utils").constant("pfUtils",{merge:function(source1,source2){var retValue;return retValue="function"==typeof angular.merge?this.angularMerge(source1,source2):"function"==typeof _.merge?this._merge(source1,source2):"function"==typeof $.extend?this.$extend(source1,source2):this.mergeDeep(source1,source2)},angularMerge:function(source1,source2){return angular.merge({},source1,source2)},_merge:function(source1,source2){return _.merge({},source1,source2)},$extend:function(source1,source2){return $.extend(!0,angular.copy(source1),source2)},mergeDeep:function(source1,source2){return mergeDeep({},angular.copy(source1),angular.copy(source2))},colorPalette:patternfly.pfPaletteColors})}(),angular.module("patternfly.validation",[]).directive("pfValidation",["$timeout",function($timeout){"use strict";return{restrict:"A",require:"ngModel",scope:{pfValidation:"&",pfValidationDisabled:"="},link:function(scope,element,attrs,ctrl){function validate(){var valid,val=scope.inputCtrl.$modelValue,valFunc=scope.pfValidation({input:val});attrs.pfValidation||(valFunc=!0),valid=!val||valFunc||""===val,toggleErrorClass(scope.valEnabled&&!valid?!0:!1)}function toggleErrorClass(add){var messageElement=element.next(),parentElement=element.parent(),hasErrorM=parentElement.hasClass("has-error"),wasHidden=messageElement.hasClass("ng-hide");scope.inputCtrl.$setValidity("pf-validation",!add),add&&(hasErrorM||parentElement.addClass("has-error"),wasHidden&&messageElement.removeClass("ng-hide")),add||(hasErrorM&&parentElement.removeClass("has-error"),wasHidden||messageElement.addClass("ng-hide"))}scope.inputCtrl=ctrl,scope.valEnabled=!attrs.pfValidationDisabled,scope.$watch("pfValidationDisabled",function(newVal){scope.valEnabled=!newVal,newVal?(scope.inputCtrl.$setValidity("pfValidation",!0),toggleErrorClass(!1)):validate()}),attrs.pfValidation?$timeout(function(){validate()},0):!scope.inputCtrl.$valid&&scope.inputCtrl.$dirty&&toggleErrorClass(!0),scope.$watch("inputCtrl.$valid",function(isValid){toggleErrorClass(isValid?!1:!0)}),scope.$watch("inputCtrl.$modelValue",function(){validate()})}}}]),angular.module("patternfly.views").component("pfCardView",{bindings:{config:"=?",emptyStateConfig:"=?",items:"=",eventId:"@id"},transclude:!0,templateUrl:"views/cardview/card-view.html",controller:function(){"use strict";var ctrl=this;ctrl.defaultConfig={selectItems:!1,multiSelect:!1,dblClick:!1,selectionMatchProp:"uuid",selectedItems:[],checkDisabled:!1,showSelectBox:!0,onSelect:null,onSelectionChange:null,onCheckBoxChange:null,onClick:null,onDblClick:null},ctrl.itemClick=function(e,item){var alreadySelected,selectionChanged=!1,continueEvent=!0;return ctrl.checkDisabled(item)?continueEvent:(ctrl.config&&ctrl.config.selectItems&&item&&(ctrl.config.multiSelect&&!ctrl.config.dblClick?(alreadySelected=_.find(ctrl.config.selectedItems,function(itemObj){return itemObj===item}),alreadySelected?ctrl.config.selectedItems=_.without(ctrl.config.selectedItems,item):(ctrl.config.selectedItems.push(item),selectionChanged=!0)):ctrl.config.selectedItems[0]===item?(ctrl.config.dblClick||(ctrl.config.selectedItems=[],selectionChanged=!0),continueEvent=!1):(ctrl.config.selectedItems=[item],selectionChanged=!0),selectionChanged&&ctrl.config.onSelect&&ctrl.config.onSelect(item,e),selectionChanged&&ctrl.config.onSelectionChange&&ctrl.config.onSelectionChange(ctrl.config.selectedItems,e)),ctrl.config.onClick&&ctrl.config.onClick(item,e),continueEvent)},ctrl.dblClick=function(e,item){ctrl.config.onDblClick&&ctrl.config.onDblClick(item,e)},ctrl.checkBoxChange=function(item){ctrl.config.onCheckBoxChange&&ctrl.config.onCheckBoxChange(item)},ctrl.isSelected=function(item){var matchProp=ctrl.config.selectionMatchProp,selected=!1;if(ctrl.config.showSelectBox)selected=item.selected;else if(ctrl.config.selectedItems.length)return _.find(ctrl.config.selectedItems,function(itemObj){return itemObj[matchProp]===item[matchProp]});return selected},ctrl.checkDisabled=function(item){return ctrl.config.checkDisabled&&ctrl.config.checkDisabled(item)},ctrl.$onInit=function(){if(_.defaults(ctrl.config,ctrl.defaultConfig),ctrl.config.selectItems&&ctrl.config.showSelectBox)throw new Error("pfCardView - Illegal use of pfCardView component! Cannot allow both select box and click selection in the same card view.")}}}),angular.module("patternfly.views").component("pfEmptyState",{bindings:{config:"0&&(ctrl.config.selectedItems=[ctrl.config.selectedItems[0]]),ctrl.config.selectItems&&ctrl.config.showSelectBox)throw new Error("pfListView - Illegal use of pListView component! Cannot allow both select box and click selection in the same list view.")},ctrl.dragEnd=function(){angular.isFunction(ctrl.config.dragEnd)&&ctrl.config.dragEnd()},ctrl.dragMoved=function(){angular.isFunction(ctrl.config.dragMoved)&&ctrl.config.dragMoved()},ctrl.isDragOriginal=function(item){return item===ctrl.dragItem},ctrl.dragStart=function(item){ctrl.dragItem=item,angular.isFunction(ctrl.config.dragStart)&&ctrl.config.dragStart(item)}}]}),function(){"use strict";angular.module("patternfly.views").constant("pfViewUtils",{getDashboardView:function(title){return{id:"dashboardView",title:title||"Dashboard View",iconClass:"fa fa-dashboard"}},getCardView:function(title){return{id:"cardView",title:title||"Card View",iconClass:"fa fa-th"}},getListView:function(title){return{id:"listView",title:title||"List View",iconClass:"fa fa-th-list"}},getTableView:function(title){return{id:"tableView",title:title||"Table View",iconClass:"fa fa-table"}},getTopologyView:function(title){return{id:"topologyView",title:title||"Topology View",iconClass:"fa fa-sitemap"}}})}(),function(){"use strict";function pfWizardButtonDirective(action){angular.module("patternfly.wizard").directive(action,function(){return{restrict:"A",require:"^pfWizard",scope:{callback:"=?"},link:function($scope,$element,$attrs,wizard){$element.on("click",function(e){e.preventDefault(),$scope.$apply(function(){$scope.$eval($attrs[action]),wizard[action.replace("pfWiz","").toLowerCase()]($scope.callback)})})}}})}pfWizardButtonDirective("pfWizNext"),pfWizardButtonDirective("pfWizPrevious"),pfWizardButtonDirective("pfWizFinish"),pfWizardButtonDirective("pfWizCancel"),pfWizardButtonDirective("pfWizReset")}(),angular.module("patternfly.wizard").component("pfWizardReviewPage",{bindings:{shown:"<",wizardData:"<"},require:{wizard:"^pfWizard"},templateUrl:"wizard/wizard-review-page.html",controller:function(){"use strict";var ctrl=this;ctrl.$onInit=function(){ctrl.reviewSteps=[]},ctrl.$onChanges=function(changesObj){changesObj.shown&&changesObj.shown.currentValue&&ctrl.updateReviewSteps()},ctrl.toggleShowReviewDetails=function(step){step.showReviewDetails===!0?step.showReviewDetails=!1:step.showReviewDetails=!0},ctrl.getSubStepNumber=function(step,substep){return step.getStepDisplayNumber(substep)},ctrl.getReviewSubSteps=function(reviewStep){return reviewStep.getReviewSteps()},ctrl.updateReviewSteps=function(){ctrl.reviewSteps=ctrl.wizard.getReviewSteps()}}}),angular.module("patternfly.wizard").component("pfWizardStep",{require:{wizard:"^pfWizard"},transclude:!0,bindings:{stepTitle:"@",stepId:"@",stepPriority:"@",substeps:"=?",nextEnabled:"stepIndex&&(complete=complete&&step.nextEnabled)}),complete},ctrl.goTo=function(step){!ctrl.wizard.isWizardDone()&&step.okToNavAway&&step!==ctrl.selectedStep&&(firstRun||ctrl.getStepNumber(step)step.stepPriority});insertBefore?ctrl.steps.splice(ctrl.steps.indexOf(insertBefore),0,step):ctrl.steps.push(step)},ctrl.currentStepTitle=function(){return ctrl.selectedStep.stepTitle},ctrl.currentStepDescription=function(){return ctrl.selectedStep.description},ctrl.currentStep=function(){return ctrl.selectedStep},ctrl.totalStepCount=function(){return ctrl.getEnabledSteps().length},ctrl.next=function(callback){var enabledSteps=ctrl.getEnabledSteps(),index=stepIdx(ctrl.selectedStep);return angular.isFunction(callback)?callback(ctrl.selectedStep)?index===enabledSteps.length-1?!1:(ctrl.goTo(enabledSteps[index+1]),!0):!0:(ctrl.selectedStep.completed=!0,index===enabledSteps.length-1?!1:(ctrl.goTo(enabledSteps[index+1]),!0))},ctrl.previous=function(callback){var index=stepIdx(ctrl.selectedStep),goPrev=!1;return angular.isFunction(callback)&&callback(ctrl.selectedStep)&&0!==index&&(ctrl.goTo(ctrl.getEnabledSteps()[index-1]),goPrev=!0),goPrev}}]}),angular.module("patternfly.wizard").component("pfWizardSubstep",{transclude:!0,bindings:{stepTitle:"@",stepId:"@",stepPriority:"@",nextEnabled:"")},ctrl.$onChanges=function(changesObj){var step;if(changesObj.wizardReady&&changesObj.wizardReady.currentValue&&ctrl.goTo(ctrl.getEnabledSteps()[0]),changesObj.currentStep){if(step=changesObj.currentStep.currentValue,!step)return;ctrl.selectedStep&&ctrl.selectedStep.title!==step&&ctrl.goTo(stepByTitle(step))}},ctrl.getEnabledSteps=function(){return ctrl.steps.filter(function(step){return"true"!==step.disabled})},ctrl.getReviewSteps=function(){return ctrl.steps.filter(function(step){return!step.disabled&&(!angular.isUndefined(step.reviewTemplate)||step.getReviewSteps().length>0)})},ctrl.currentStepNumber=function(){return stepIdx(ctrl.selectedStep)+1},ctrl.getStepNumber=function(step){return stepIdx(step)+1},ctrl.goTo=function(step,resetStepNav){ctrl.wizardDone||ctrl.selectedStep&&!ctrl.selectedStep.okToNavAway||step===ctrl.selectedStep||((firstRun||ctrl.getStepNumber(step)step.stepPriority});insertBefore?ctrl.steps.splice(ctrl.steps.indexOf(insertBefore),0,step):ctrl.steps.push(step),ctrl.wizardReady&&ctrl.getEnabledSteps().length>0&&step===ctrl.getEnabledSteps()[0]&&ctrl.goTo(ctrl.getEnabledSteps()[0])},ctrl.isWizardDone=function(){return ctrl.wizardDone},ctrl.updateSubStepNumber=function(value){ctrl.firstStep=0===stepIdx(ctrl.selectedStep)&&0===value},ctrl.currentStepTitle=function(){return ctrl.selectedStep.title},ctrl.currentStepDescription=function(){return ctrl.selectedStep.description},ctrl.currentStep=function(){return ctrl.selectedStep},ctrl.totalStepCount=function(){return ctrl.getEnabledSteps().length},ctrl.goToStep=function(step,resetStepNav){var stepTo,enabledSteps=ctrl.getEnabledSteps();stepTo=angular.isNumber(step)?enabledSteps[step]:stepByTitle(step),ctrl.goTo(stepTo,resetStepNav)},ctrl.next=function(callback){var enabledSteps=ctrl.getEnabledSteps(),index=stepIdx(ctrl.selectedStep);if(!ctrl.selectedStep.substeps||!ctrl.selectedStep.next(callback)){if(angular.isFunction(callback)){if(!callback(ctrl.selectedStep))return;index===enabledSteps.length-1?ctrl.finish():enabledSteps[index+1].substeps&&enabledSteps[index+1].resetNav()}ctrl.selectedStep.completed=!0,index===enabledSteps.length-1?ctrl.finish():ctrl.goTo(enabledSteps[index+1])}},ctrl.previous=function(callback){var index=stepIdx(ctrl.selectedStep);if((!ctrl.selectedStep.substeps||!ctrl.selectedStep.previous(callback))&&angular.isFunction(callback)&&callback(ctrl.selectedStep)){if(0===index)throw new Error("Can't go back. It's already in step 0");ctrl.goTo(ctrl.getEnabledSteps()[index-1])}},ctrl.finish=function(){ctrl.onFinish&&ctrl.onFinish()!==!1&&ctrl.reset()},ctrl.cancel=function(){ctrl.onCancel&&ctrl.onCancel()!==!1&&ctrl.reset()},ctrl.reset=function(){angular.forEach(ctrl.getEnabledSteps(),function(step){step.completed=!1}),ctrl.goToStep(0)}}]}),angular.module("patternfly.canvas").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("canvas-view/canvas-editor/canvas-editor.html",'
    Hide Connectors
    {{tab.preTitle}}
    {{tab.title}}
    '), +$templateCache.put("canvas-view/canvas-editor/toolbox-items.html",'
    • {{item.name}} {{ item.name }}
    '),$templateCache.put("canvas-view/canvas/canvas.html",'Select a second item to complete the connection or click on the canvas to cancelNo available connections! Click on the canvas to cancel{{node.name()}}

    {{node.name()}}

    {{node.fontContent()}}{{\'\\ue918\'}}{{connector.fontContent()}}{{connector.name()}}
    {{connection.name()}}
    '),$templateCache.put("canvas-view/canvas/node-toolbar.html",'
    ')}]),angular.module("patternfly.card").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("card/aggregate-status/aggregate-status-card.html",'

    {{$ctrl.status.count}} {{$ctrl.status.title}} {{$ctrl.status.count}} {{$ctrl.status.title}}

    {{ notification.count }} {{ notification.count }}

    {{$ctrl.status.count}} {{$ctrl.status.title}} {{$ctrl.status.count}} {{$ctrl.status.title}}

    {{$ctrl.status.notification.count}} {{$ctrl.status.notification.count}}

    '),$templateCache.put("card/basic/card-filter.html",'
    '),$templateCache.put("card/basic/card.html","

    {{$ctrl.headTitle}}

    {{$ctrl.subTitle}}
    ")}]),angular.module("patternfly.charts").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("charts/donut/donut-pct-chart.html",''),$templateCache.put("charts/empty-chart.html",'
    No data available
    '),$templateCache.put("charts/heatmap/heatmap-legend.html",'
    • {{item.text}}
    '),$templateCache.put("charts/heatmap/heatmap.html",'

    {{$ctrl.chartTitle}}

    '),$templateCache.put("charts/line/line-chart.html",''),$templateCache.put("charts/sparkline/sparkline-chart.html",''),$templateCache.put("charts/trends/trends-chart.html",'
    {{$ctrl.config.title}} {{$ctrl.getLatestValue()}} {{$ctrl.config.units}} {{$ctrl.getPercentageValue() + \'%\'}} of {{$ctrl.chartData.total + \' \' + $ctrl.config.units}}{{$ctrl.config.timeFrame}}
    {{$ctrl.getLatestValue()}} {{$ctrl.config.units}} {{$ctrl.getPercentageValue() + \'%\'}} of {{$ctrl.chartData.total + \' \' + $ctrl.config.units}} {{$ctrl.config.title}}
    {{$ctrl.getPercentageValue() + \'%\'}}
    {{$ctrl.config.trendLabel}} {{$ctrl.getLatestValue()}} of {{$ctrl.chartData.total + \' \' + $ctrl.config.units}}
    '),$templateCache.put("charts/utilization-bar/utilization-bar-chart.html",'
    {{$ctrl.chartTitle}}
    {{$ctrl.chartData.used}} of {{$ctrl.chartData.total}} {{$ctrl.units}} Used {{$ctrl.chartData.percentageUsed}}% Used
    {{$ctrl.chartTitle}}
    {{$ctrl.chartData.used}} {{$ctrl.units}} Used {{$ctrl.chartData.percentageUsed}}% Used
    '),$templateCache.put("charts/utilization-trend/utilization-trend-chart.html",'

    {{$ctrl.config.title}}

    {{$ctrl.currentValue}}

    {{$ctrl.currentText}}
    of {{$ctrl.chartData.total}} {{$ctrl.config.units}}
    {{$ctrl.legendLeftText}} {{$ctrl.legendRightText}}
    ')}]),angular.module("patternfly.filters").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("filters/filter-fields.html",'
    '),$templateCache.put("filters/filter-results.html",'
    {{$ctrl.config.resultsCount}} Results

    Active filters:

    • {{filter.title}}: {{filter.value}}

    Clear All Filters

    {{$ctrl.config.selectedCount}} of {{$ctrl.config.totalCount}} selected
    '),$templateCache.put("filters/filter.html","
    ")}]),angular.module("patternfly.form").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("form/form-buttons/form-buttons.html",'
    '),$templateCache.put("form/form-group/form-group.html",'
    • {{ message }}
    ')}]),angular.module("patternfly.modals").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("modals/about-modal.html",'')}]),angular.module("patternfly.navigation").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("navigation/vertical-navigation.html","
    '); +}]),angular.module("patternfly.notification").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("notification/inline-notification.html",'
    {{$ctrl.pfNotificationHeader}} {{$ctrl.pfNotificationMessage}}
    '),$templateCache.put("notification/notification-drawer.html",'

    {{$ctrl.drawerTitle}}

    '),$templateCache.put("notification/notification-list.html",'
    '),$templateCache.put("notification/toast-notification-list.html",'
    '),$templateCache.put("notification/toast-notification.html",'
    {{$ctrl.header}} {{$ctrl.message}} {{$ctrl.message}}
    ')}]),angular.module("patternfly.select").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("select/select.html",'
    ')}]),angular.module("patternfly.sort").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("sort/sort.html",'
    ')}]),angular.module("patternfly.table").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("table/tableview/table-view.html",'
    {{col.header}}Actions
    {{ value }}
    ')}]),angular.module("patternfly.toolbars").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("toolbars/toolbar.html",'
    ')}]),angular.module("patternfly.views").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("views/cardview/card-view.html",'
    '),$templateCache.put("views/empty-state.html",'

    {{$ctrl.config.title}}

    {{$ctrl.config.info}}

    '),$templateCache.put("views/listview/list-view.html",'
    ')}]),angular.module("patternfly.wizard").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("wizard/wizard-review-page.html",''),$templateCache.put("wizard/wizard-step.html",'
    '),$templateCache.put("wizard/wizard-substep.html",''),$templateCache.put("wizard/wizard.html",'
    ')}]); diff --git a/dist/docs/css/angular-patternfly.css b/dist/docs/css/angular-patternfly.css index f41570c51..33d0682c6 100644 --- a/dist/docs/css/angular-patternfly.css +++ b/dist/docs/css/angular-patternfly.css @@ -1,45 +1,82 @@ +.navbar-brand-txt { + line-height: 34px; +} +accordion > .panel-group .panel-default .panel-title > a:before { + content: "\f105"; +} +accordion > .panel-group .panel-open .panel-title > a:before { + content: "\f107"; +} .card-pf-aggregate-status-alt .card-pf-body { padding-bottom: 20px; } - .card-pf-aggregate-status-alt .card-pf-title { + font-weight: 300; line-height: 22px; margin: 20px 0 10px 0; - font-weight: 300; } - .card-pf-aggregate-status-alt .card-pf-aggregate-status-count { font-size: 24px; } - .card-pf-aggregate-status-alt .card-pf-aggregate-status-title { display: block; font-size: 12px; } - .card-pf-aggregate-status-alt .card-pf-aggregate-status-notifications .card-pf-aggregate-status-notification { border-left: none; } - -.card-pf-aggregate-status-alt .card-pf-aggregate-status-notifications .fa, .card-pf-aggregate-status-alt .card-pf-aggregate-status-notifications .pficon { +.card-pf-aggregate-status-alt .card-pf-aggregate-status-notifications .fa { + position: relative; + top: -1px; +} +.card-pf-aggregate-status-alt .card-pf-aggregate-status-notifications .pficon { position: relative; top: -1px; } - .card-pf-heading-no-bottom { margin: 0 -20px 0px; padding: 0 20px 0; } - .card-pf-icon-image { height: 18px; margin: 0 5px 5px; } - +.trend-card-large-pf .trend-header-pf { + display: block; + font-size: 16px; + font-weight: 400; + margin-left: 10px; +} +.trend-card-large-pf .trend-title-big-pf { + font-size: 26px; + font-weight: 300; + margin-left: 10px; +} +.trend-card-large-pf .trend-title-small-pf { + font-size: 12px; + font-weight: 400; +} +.trend-card-small-pf .trend-header-pf { + display: block; + font-size: 12px; + font-weight: 400; + margin-left: 10px; +} +.trend-card-small-pf .trend-title-big-pf { + font-size: 17px; + font-weight: 400; + margin-left: 10px; +} +.trend-card-small-pf .trend-title-small-pf { + font-size: 10px; + font-weight: 400; +} +pf-c3-chart { + display: block; +} .empty-chart-content { text-align: center; } - .empty-chart-content .pficon { font-size: 24px; } @@ -47,31 +84,25 @@ vertical-align: middle; width: 100%; } - - .utilization-trend-chart-pf .donut-chart-pf { - width: 100%; float: left; padding-top: 15px; + width: 100%; } - .utilization-trend-chart-pf h3 { font-weight: 400; } - .utilization-trend-chart-pf .current-values { border-bottom: 1px solid #d1d1d1; float: left; padding: 0 5px 10px 0; width: 100%; } - .utilization-trend-chart-pf .available-count { margin: 3px 0; padding-left: 0; padding-right: 5px; } - .utilization-trend-chart-pf .available-text { font-size: 12px; font-weight: 400; @@ -79,20 +110,17 @@ margin: 2px 0; padding: 0 5px; } - .utilization-trend-chart-pf .radial-chart { float: left; padding-top: 10px; width: 100%; } - .utilization-trend-chart-pf .sparkline-chart { float: left; margin-left: -5px; margin-right: -5px; width: 100%; } - .utilization-trend-chart-pf .legend-text { color: inherit; display: block; @@ -100,415 +128,877 @@ font-weight: 400; margin-left: 0; } - .utilization-trend-chart-pf.data-unavailable-pf .current-values { color: transparent; } - -.card-view-pf { - overflow: auto; - padding-top: 20px; - padding-left: 2px; -} - -.card-view-pf .card { - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .175); - background: #fff; - border-top: 2px solid transparent; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.175); - display: block; - float: left; - height: 290px; - margin-right: 20px; - margin-bottom: 20px; - padding: 10px; - position: relative; - text-align: center; - width: 260px; -} - -.card-view-pf .card .card-check-box { - left: 10px; - position: absolute; - top: 8px; - width: 20px; - z-index: 3; - visibility: hidden; -} - -.card-view-pf .card-content { - height: 100%; - margin: 2px 0 10px 0; - overflow: auto; - width: 100%; -} - -.card-view-pf .card-title { - color: #1186C1; - font-weight: 500; - font-size: 16px; - line-height: 1.1; - margin-top: 0px; -} - -.card-view-pf .card.active, -.card-view-pf .card.active:hover, -.card-view-pf .card.active:focus { - border: solid 3px #00a8e1; -} - -.card-view-pf .card:hover, -.card-view-pf .card:focus { - -webkit-box-shadow: 0px 3px 10px -2px rgba(0,0,0,0.24); - -moz-box-shadow: 0px 3px 10px -2px rgba(0,0,0,0.24); - box-shadow: 0px 3px 10px -2px rgba(0,0,0,0.24); - border: 1px solid #d1d1d1 -} - -.card-view-pf .card.active .pficon, -.card-view-pf .card.active:hover .pficon, -.card-view-pf .card.active:focus .pficon { - color: #ffffff; -} -.card-view-pf .card:hover .card-check-box, -.card-view-pf .card.active .card-check-box { - visibility: visible; -} - -.card-view-pf .card.disabled, .card.disabled:hover, .card.disabled:focus { - border: 1px solid #eee; - color: #999999; - cursor: not-allowed; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.trend-card-large-pf .trend-header-pf { - font-size: 16px; - font-weight: 400; - display: block; - margin-left: 10px; -} - -.trend-card-small-pf .trend-header-pf { - font-size: 12px; - font-weight: 400; - display: block; - margin-left: 10px; -} - -.trend-card-large-pf .trend-title-big-pf { - font-size: 26px; - font-weight: 300; - margin-left: 10px; -} - -.trend-card-small-pf .trend-title-big-pf { - font-size: 17px; - font-weight: 400; - margin-left: 10px; -} - -.trend-card-large-pf .trend-title-small-pf { - font-size: 12px; - font-weight: 400; -} - -.trend-card-small-pf .trend-title-small-pf { - font-size: 10px; - font-weight: 400; -} - .trend-flat-details { display: table; margin-top: 5px; } - @media (min-width: 768px) { -.trend-flat-details { + .trend-flat-details { margin-top: 25px; } } - .trend-flat-details-cell { display: table-cell; - vertical-align: bottom; min-width: 70px; + vertical-align: bottom; } - .trend-header-compact-pf { display: block; font-size: 12px; font-weight: 400; } - .trend-title-compact-big-pf { font-size: 36px; font-weight: 300; line-height: 1; } - .trend-title-compact-small-pf { font-size: 12px; font-weight: 400; } - .trend-title-flat-big-pf { font-size: 26px; font-weight: 300; line-height: 1; margin-right: 15px; } - .trend-label-flat-pf { font-size: 12px; font-weight: 400; line-height: 1; } - .trend-label-flat-strong-pf { display: block; font-size: 12px; font-weight: 700; line-height: 1; } - .trend-footer-pf { + color: #333333; font-size: 10px; font-weight: 400; - color: #333; margin-left: 10px; } - -.data-unavailable-pf [class*="trend-title-"], .data-unavailable-pf [class*="trend-label-"] { +.data-unavailable-pf[class*="trend-title-"] { color: transparent; } - -.data-unavailable-pf .trend-footer-pf { +.data-unavailable-pf[class*="trend-label-"] { color: transparent; } - -.filter-pf a { - cursor: pointer; -} - -.filter-pf.filter-fields .form-group { - padding-left: 0; - width: 275px; -} - -.filter-select .btn-default { - font-size: 12px; - font-style: italic; - font-weight: 400; - background-color: #ffffff; - background-image: none; - color: #999999; -} - -.sort-pf .btn-link { - color: #252525; - font-size: 16px; - line-height: 1; - padding: 4px 0; - margin-left: 10px; -} - -.sort-pf .btn-link:hover { - color: #0099d3; -} - -.input-group .input-group-btn .dropdown-menu > .selected > a { - background-color: #0099d3 !important; - border-color: #0076b7 !important; - color: #fff !important; -} - -@media (min-width: 768px) { - .toolbar-pf-actions .toolbar-apf-filter { - padding-left: 0; - } -} -.toolbar-pf-actions .toolbar-pf-view-selector a { - cursor: pointer; -} - -.toolbar-pf-actions .dropdown-menu a { - cursor: pointer; -} - -.toolbar-pf-actions .dropdown-kebab-pf { - float: right; -} - -.toolbar-pf-include-actions { - display: inline-block; - margin: 0 5px; -} - -.dropdown-kebab-pf.invisible { - opacity: 0; - pointer-events: none; +.data-unavailable-pf .trend-footer-pf { + color: transparent; } - -/* Utilization bar chart - Animate load */ .utilization-bar-chart-pf .progress-bar { - -webkit-transition: width .75s ease-in-out; - -moz-transition: width .75s ease-in-out; - -o-transition: width .75s ease-in-out; - transition: width .75s ease-in-out; + -moz-transition: width 0.75s ease-in-out; + -o-transition: width 0.75s ease-in-out; + -webkit-transition: width 0.75s ease-in-out; + transition: width 0.75s ease-in-out; } - .utilization-bar-chart-pf .progress-bar.animate { width: 0% !important; } - -/* Heap map */ .heatmap-pf-container { position: relative; } - +.heatmap-pf-container .heatmap-container { + margin-left: -1px; +} .heatmap-pf-container-pf .loading { position: absolute; - top: 100px; right: 50%; + top: 100px; z-index: 10; } - -.heatmap-pf-container .heatmap-container { - margin-left: -1px; -} - .heatmap-pf-svg { - width: 100%; height: 100%; + width: 100%; } - -.heatmap-pf-legend-container{ +.heatmap-pf-legend-container { list-style-type: none; margin-top: 5px; - padding: 0; overflow: auto; + padding: 0; } - .heatmap-pf-legend-items { float: left; } - .legend-pf-color-box { - width: 11px; + display: inline-block; height: 11px; margin-left: 5px; margin-right: 5px; - display: inline-block; + width: 11px; } .legend-pf-color-box:first-of-type { margin-left: 0px; } - .legend-pf-text { font-size: 11px; font-weight: 400; line-height: 11px; padding-right: 5px; } - -.toolbar-pf-actions.no-filter-results { - margin-bottom: 10px; +.camelcase { + text-transform: capitalize; } - -/* Angular bootstrap classes differ when opneed rather than when collapsed */ -accordion > .panel-group .panel-default .panel-title > a:before { - content: "\f105"; +pf-topology { + display: block; + user-select: none; } -accordion > .panel-group .panel-open .panel-title > a:before { - content: "\f107"; +.container-topology pf-topology { + height: 500px; + position: relative; } - -.navbar-brand-txt { - line-height: 34px; +.container-topology .canvas { + position: absolute; } - -.toast-pf-action > a { +.container-topology .popup { + position: absolute; + left: 0; + top: 0; + background-color: #fff; + width: 180px; + border: 1px #ccc solid; + border-radius: 6px; + box-shadow: #333 2px 2px 4px; + padding: 6px; + font-size: 14px; +} +.container-topology .popup h5 { + font-weight: bold; +} +.container-topology .popup p { + margin: 0 0 4px; +} +.container-topology .popup p:hover { + color: #0099cc; cursor: pointer; } -.toast-pf .dropdown-menu > li > a { +.container-topology label.checkbox-inline { + font-size: 14px; +} +.pf-topology-svg g { + font-family: PatternFlyIcons-webfont; + font-size: 18px; + text-anchor: middle; cursor: pointer; } - -.wizard-pf-footer .tooltip-wrapper { - border: none; - box-shadow: none; - display: inline-block; - margin-left: 5px; - padding: 0; - text-align: center; +.pf-topology-svg g text { + stroke: none; + stroke-width: 0px; } - -.wizard-pf-footer .tooltip-wrapper .btn[disabled] { - pointer-events: none; +.pf-topology-svg g.weak use { + opacity: .6; } - -.wizard-pf-singlestep { - margin-left: 0; +.pf-topology-svg g circle { + stroke: #aaa; + fill: #fff; } - -.wizard-pf-position-override { - position: relative; +.pf-topology-svg g.fixed use { + stroke-width: 2px; } - -.wizard-pf-footer-inline { - text-align: left; +.pf-topology-svg g.selected use, +.pf-topology-svg g.selected circle { + stroke-width: 4px; } - -.wizard-pf-cancel-inline { - margin-left: 25px; +.pf-topology-svg line { + stroke: #aaa; + stroke-width: 1; } - -.pf-expand-placeholder { - margin-right: 15px; +.pf-topology-svg g text.attached-label { + display: none; } - -pf-c3-chart { +.pf-topology-svg g text.attached-label.visible { + font-size: 12px; + fill: black; display: block; } - -.camelcase { - text-transform: capitalize; +.pf-topology-svg g.selected { + stroke-width: 4px; } - -.pf-table-view-selected-label { - float: right; - line-height: 40px; +.pf-topology-svg g circle { + stroke-width: 2px; } - -.table-view-container { - background-color: white; +.pf-topology-svg g circle.success { + stroke: #3F9C35; } - -table.dataTable.no-footer { - border-bottom: none; +.pf-topology-svg g circle.error { + stroke: #CC0000; } - -.dataTables_wrapper { - border: none; - margin: 0px; - padding: 0px; +.pf-topology-svg g circle.warning { + stroke: #EC7A08; } - -table.dataTable thead .sorting_asc { - background-image: none !important; +.pf-topology-svg g circle.unknown { + stroke: #bbb; } -table.dataTable thead .sorting_desc { - background-image: none !important; +.pf-topology-svg g text.glyph { + font-size: 20px; + fill: #1186C1; +} +.card-view-pf { + overflow: auto; + padding-left: 2px; + padding-top: 20px; +} +.card-view-pf .card { + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.175); + background: #fff; + border-top: 2px solid transparent; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.175); + display: block; + float: left; + height: 290px; + margin-bottom: 20px; + margin-right: 20px; + padding: 10px; + position: relative; + text-align: center; + width: 260px; +} +.card-view-pf .card .card-check-box { + left: 10px; + position: absolute; + top: 8px; + visibility: hidden; + width: 20px; + z-index: 3; +} +.card-view-pf .card:hover { + -moz-box-shadow: 0px 3px 10px -2px rgba(0, 0, 0, 0.24); + -webkit-box-shadow: 0px 3px 10px -2px rgba(0, 0, 0, 0.24); + border: 1px solid #d1d1d1; + box-shadow: 0px 3px 10px -2px rgba(0, 0, 0, 0.24); +} +.card-view-pf .card:hover .card-check-box { + visibility: visible; +} +.card-view-pf .card:focus { + -moz-box-shadow: 0px 3px 10px -2px rgba(0, 0, 0, 0.24); + -webkit-box-shadow: 0px 3px 10px -2px rgba(0, 0, 0, 0.24); + border: 1px solid #d1d1d1; + box-shadow: 0px 3px 10px -2px rgba(0, 0, 0, 0.24); +} +.card-view-pf .card-content { + height: 100%; + margin: 2px 0 10px 0; + overflow: auto; + width: 100%; +} +.card-view-pf .card-title { + color: #1186C1; + font-size: 16px; + font-weight: 500; + line-height: 1.1; + margin-top: 0px; +} +.card-view-pf .card.active { + border: solid 3px #39a5dc; +} +.card-view-pf .card.active:hover { + border: solid 3px #39a5dc; +} +.card-view-pf .card.active:hover .pficon { + color: #fff; +} +.card-view-pf .card.active:focus { + border: solid 3px #39a5dc; +} +.card-view-pf .card.active:focus .pficon { + color: #fff; +} +.card-view-pf .card.active .pficon { + color: #fff; +} +.card-view-pf .card.active .card-check-box { + visibility: visible; +} +.card-view-pf .card.disabled { + -moz-box-shadow: none; + -webkit-box-shadow: none; + border: 1px solid #ededed; + box-shadow: none; + color: #8b8d8f; + cursor: not-allowed; +} +.card.disabled:hover { + -moz-box-shadow: none; + -webkit-box-shadow: none; + border: 1px solid #ededed; + box-shadow: none; + color: #8b8d8f; + cursor: not-allowed; +} +.card.disabled:focus { + -moz-box-shadow: none; + -webkit-box-shadow: none; + border: 1px solid #ededed; + box-shadow: none; + color: #8b8d8f; + cursor: not-allowed; +} +/* overriding pf base so that blank slate fills entire parent container */ +.blank-slate-pf { + height: 100%; + margin-bottom: 0px; +} +.blank-slate-pf button { + margin-right: 4px; +} +/* overriding pf base so that buttons have spaces between them */ +.pf-expand-placeholder { + margin-right: 15px; +} +@media (min-width: 768px) { + .toolbar-pf-actions .toolbar-apf-filter { + padding-left: 0; + } +} +.toolbar-pf-actions .toolbar-pf-view-selector a { + cursor: pointer; +} +.toolbar-pf-actions .dropdown-menu a { + cursor: pointer; +} +.toolbar-pf-actions .dropdown-kebab-pf { + float: right; +} +.toolbar-pf-include-actions { + display: inline-block; + margin: 0 5px; +} +.dropdown-kebab-pf.invisible { + opacity: 0; + pointer-events: none; +} +.toolbar-pf-actions.no-filter-results { + margin-bottom: 10px; +} +.filter-pf a { + cursor: pointer; +} +.filter-pf.filter-fields .form-group { + padding-left: 0; + width: 275px; +} +.filter-select .btn-default { + background-color: #fff; + background-image: none; + color: #8b8d8f; + font-size: 12px; + font-style: italic; + font-weight: 400; +} +.input-group .input-group-btn .dropdown-menu > .selected > a { + background-color: #0088ce !important; + border-color: #0076b7 !important; + color: #fff !important; +} +.sort-pf .btn-link { + color: #252525; + font-size: 16px; + line-height: 1; + margin-left: 10px; + padding: 4px 0; +} +.sort-pf .btn-link:hover { + color: #0088ce; +} +.toast-pf-action > a { + cursor: pointer; +} +.toast-pf .dropdown-menu > li > a { + cursor: pointer; +} +.pf-table-view-selected-label { + float: right; + line-height: 40px; +} +.table-view-container { + background-color: white; +} +table.dataTable.no-footer { + border-bottom: none; +} +.dataTables_wrapper { + border: none; + margin: 0px; + padding: 0px; +} +table.dataTable thead .sorting_asc { + background-image: none !important; +} +table.dataTable thead .sorting_desc { + background-image: none !important; } table.dataTable thead .sorting { background-image: none !important; } -table.dataTable tbody th, table.dataTable tbody td { +table.dataTable tbody th { + padding: 2px 10px 3px; +} +table.dataTable tbody td { padding: 2px 10px 3px; } .table-view-pf-select { width: 13px; } +.wizard-pf-footer .tooltip-wrapper { + border: none; + box-shadow: none; + display: inline-block; + margin-left: 5px; + padding: 0; + text-align: center; +} +.wizard-pf-footer .tooltip-wrapper .btn[disabled] { + pointer-events: none; +} +.wizard-pf-singlestep { + margin-left: 0; +} +.wizard-pf-position-override { + position: relative; +} +.wizard-pf-footer-inline { + text-align: left; +} +.wizard-pf-cancel-inline { + margin-left: 25px; +} +.canvas { + height: 756px; + width: 1396px; +} +.read-only { + background-image: none !important; + background-repeat: unset !important; +} +.canvas-in-connection-mode { + background-image: none !important; + background-repeat: unset !important; + background-color: #bbb; +} +.node-header { + display: table; + font-weight: 600; +} +.node-header p { + display: table-cell; + text-align: center; + vertical-align: middle; +} +.invalid-node-header { + fill: #bbb; + color: #bbb; +} +.node-center-icon { + font-size: 72px; +} +.node-rect { + fill: #fff; + stroke-width: 2; + stroke: #bbb; +} +.invalid-node-rect { + fill: #d1d1d1; +} +.invalid-node-img { + opacity: 0.2; +} +.node-toolbar { + background-color: #f5f5f5; + border-bottom: solid 1px #bbb; + border-left: solid 1px #bbb; + border-radius: 5px; + border-right: solid 1px #bbb; + height: 28px; + padding-left: 8px; +} +.node-toolbar-icons { + color: #0088ce; + cursor: pointer; + font-size: 16px; + padding-right: 16px; + padding-top: 4px; +} +.svg-triangle polyline { + fill: #f5f5f5; + stroke-width: 2; + stroke: #bbb; +} +.connecting-mode-rec { + fill: #8b8d8f; +} +.connecting-mode-label { + fill: #fff; + font-size: 16px; +} +.connecting-mode-label-warning { + fill: #cc0000; + font-size: 16px; +} +.connector-icons { + cursor: pointer; + fill: #0088ce; + font-size: 16px; +} +.connector-icons:hover { + fill: #063451; +} +.mouseover-node-rect { + stroke-width: 3; + stroke: #bbb; +} +.selected-node-rect { + stroke-width: 3; + stroke: #0088ce; +} +.connector-tooltip { + fill: #f5f5f5; + stroke-width: 1; + stroke: #030303; +} +.connector-tooltip-text { + font-size: 10px; +} +.connector-circle { + fill: #fff; + stroke-width: 2; + stroke: #030303; +} +.mouseover-connector-circle { + fill: #fff; + stroke-width: 3; + stroke: #030303; +} +.unconnected-circle { + fill: #2d7623; + stroke-opacity: "0.8"; + stroke-width: 2; + stroke: #030303; +} +.mouseover-unconnected-circle { + fill: #2d7623; + stroke-opacity: "0.8"; + stroke-width: 3; + stroke: #030303; +} +.connection-line { + fill: transparent; + stroke-width: 4; + stroke: #8b8d8f; +} +.mouseover-connection-line { + fill: transparent; + stroke-width: 6; + stroke: #8b8d8f; +} +.selected-connection-line { + fill: transparent; + stroke-width: 4; + stroke: #cc0000; +} +.connection-endpoint { + fill: #8b8d8f; +} +.selected-connection-endpoint { + fill: #cc0000; +} +.mouseover-connection-endpoint { + fill: #8b8d8f; +} +.connection-name { + fill: #030303; +} +.selected-connection-name { + fill: #cc0000; +} +.mouseover-connection-name { + fill: #030303; +} +.dragging-connection { + pointer-events: none; +} +.dragging-connection-line { + fill: transparent; + stroke-width: 3; + stroke: #8b8d8f; +} +.dragging-connection-endpoint { + fill: #8b8d8f; +} +.draggable-container { + border: solid 1px #d1d1d1; +} +.drag-selection-rect { + fill: transparent; + stroke-width: 2; + stroke: #0088ce; +} +.node-dialog-close { + font-size: 12px; + padding-top: 7px; +} +.nodetoolbar-dialog { + left: -19px; + margin-top: 4px; + padding: 8px; + position: fixed; + top: 19px; + width: 300px; +} +.nodetoolbar-dialog .tag-list-action { + color: #fff; + cursor: pointer; +} +.tag-dialog { + left: 30px; + width: 353px; +} +.node-tag-title { + font-weight: 600; + padding-bottom: 12px; + padding-top: 12px; +} +.edit-dialog { + left: 5px; +} +.arrow-box { + background: #fff; + border-radius: 5px; + border: 1px solid #4d5258; + padding-bottom: 10px; + padding-left: 10px; + padding-right: 10px; + position: relative; +} +.arrow-box::after { + border-bottom-color: #fff; + border-color: #393f44; + border-width: 8px; + border: solid transparent; + bottom: 100%; + content: " "; + height: 0; + left: 50%; + margin-left: -41%; + pointer-events: none; + position: absolute; + width: 0; +} +.arrow-box::before { + border-bottom-color: #4d5258; + border-color: rgba(81, 77, 82, 0); + border-width: 10px; + border: solid transparent; + bottom: 100%; + content: " "; + height: 0; + left: 50%; + margin-left: -41.5%; + pointer-events: none; + position: absolute; + width: 0; +} +.canvas-editor-container { + background-color: #fff; + height: 100%; + width: 100%; +} +.canvas-editor-container .canvas-editor-toolbar { + padding: 15px; +} +.canvas-editor-container .canvas-editor-toolbar a { + color: #72767b; + cursor: pointer; +} +.canvas-editor-container .canvas-editor-toolbar a.disabled, +.canvas-editor-container .canvas-editor-toolbar a:hover.disabled { + color: #bbb; + cursor: not-allowed; +} +.canvas-editor-container .canvas-editor-toolbar a:hover { + color: #393f44; +} +.canvas-editor-container .canvas-editor-toolbar button { + margin-right: 6px; +} +.canvas-editor-container .canvas-editor-toolbar .more-actions { + border-left: solid 2px #d1d1d1; + margin-left: 6px; + vertical-align: middle; +} +.canvas-editor-container .canvas-editor-toolbar .pficon { + font-size: 20px; + margin-left: 15px; + margin-top: -4px; + vertical-align: middle; +} +.canvas-editor-container .canvas-editor-toolbar .right-aligned-controls { + display: block; + float: right; + font-size: 12px; + font-weight: 600; + padding-right: 5px; + padding-top: 2px; + vertical-align: middle; +} +.canvas-editor-container .canvas-editor-toolbar .show-hide-connectors-label { + vertical-align: 2px; +} +.canvas-editor-container .canvas-editor-toolbox-container { + -moz-placeholder-font-style: italic; + -moz-placeholder-padding-left: 10px; + -ms-input-placeholder-font-style: italic; + -ms-input-placeholder-padding-left: 10px; + height: 100%; + position: relative; + width: 100%; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox { + background-color: rgba(255, 255, 255, 0.94); + border: 1.5px solid #d1d1d1; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); + padding-bottom: 10px; + padding-left: 26px; + padding-right: 26px; + padding-top: 26px; + position: absolute; + top: -1px; + width: 100%; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .draggable-item-icon { + font-size: 28px; + padding-right: 14px; + padding-top: 6px; + vertical-align: middle; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .tab-pre-title { + font-size: 12px; + margin-bottom: -6px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .tab-title { + font-size: 14px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .tab-single-line { + padding-bottom: 8px; + padding-top: 8px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-items-list { + list-style: none; + max-height: 300px; + overflow-y: auto; + padding-bottom: 4px; + padding-left: 15px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-item { + background-color: rgba(255, 255, 255, 0.94); + border-radius: 1px; + border: 1px solid #bbb; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); + cursor: pointer; + float: left; + height: 36px; + margin-right: 16px; + margin-top: 16px; + min-height: 52px; + min-width: 325px; + padding: 6px 28px; + position: relative; + vertical-align: middle; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-item .fa { + font-size: 26px; + margin-right: 8px; + margin-top: 2px; + vertical-align: middle; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-item span { + position: relative; + top: 4px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-item img { + height: 100%; + margin-right: 8px; + object-fit: contain; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-item::before { + background-image: linear-gradient(to bottom, #0088ce 60%, #fff 0%); + background-position: left; + background-repeat: repeat-y; + background-size: 2px 5px; + border: 4px solid #0088ce; + bottom: 4px; + content: ""; + left: 4px; + position: absolute; + top: 3px; + width: 10px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .not-draggable { + background-color: #ededed; + cursor: auto; + opacity: 0.4; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-filter { + margin-top: 10px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-filter .search-text { + border: 1px solid #bbb; + float: right; + position: relative; + text-decoration: none; + width: 250px; + padding-left: 6px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-filter .clear-search-text { + bottom: -6px; + color: #bbb; + cursor: pointer; + float: right; + position: relative; + right: -242px; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .toolbox-filter .clear-search-text span { + font-size: 20px; + padding-right: 14px; + vertical-align: middle; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .close-toolbox { + font-size: 16px; + float: right; + position: relative; + top: -17px; + right: -12px; + color: #72767b; + cursor: pointer; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-editor-toolbox .close-toolbox :hover { + color: #393f44; +} +.canvas-editor-container .canvas-editor-toolbox-container .canvas-container { + height: 756px; + margin-left: 15px; + overflow: auto; + width: 98%; +} +.canvas-editor-container .canvas-editor-toolbox-container a { + color: #000000; +} +.canvas-editor-container .canvas-editor-toolbox-container::-webkit-input-placeholder { + font-style: italic; + padding-left: 10px; +} +.canvas-editor-container .canvas-editor-toolbox-container::-moz-placeholder { + font-style: italic; + padding-left: 10px; +} +.subtabs .nav-tabs-pf { + padding-left: 18px; +} +.subtabs .nav-tabs-pf li { + font-size: 14px; +} diff --git a/dist/docs/css/examples.css b/dist/docs/css/examples.css index b5683ad49..3fb9e4a0e 100644 --- a/dist/docs/css/examples.css +++ b/dist/docs/css/examples.css @@ -130,3 +130,10 @@ hr { .dropdown-kebab-pf.red .btn-link { color: red; } + +.canvas-demo-container { + height: 600px; + margin-left: 15px; + overflow: auto; + width: 99%; +} diff --git a/dist/docs/css/patternfly-additions.css b/dist/docs/css/patternfly-additions.css index 4d63d5df8..35f7d7779 100644 --- a/dist/docs/css/patternfly-additions.css +++ b/dist/docs/css/patternfly-additions.css @@ -2996,6 +2996,9 @@ fieldset[disabled] .combobox-container .input-group-addon.active { .pficon-cpu:before { content: "\e905"; } +.pficon-degraded:before { + content: "\e91b"; +} .pficon-delete:before { content: "\e611"; } @@ -3065,6 +3068,9 @@ fieldset[disabled] .combobox-container .input-group-addon.active { .pficon-project:before { content: "\e622"; } +.pficon-rebalance:before { + content: "\e91c"; +} .pficon-refresh:before, .pficon-restart:before { content: "\e613"; @@ -3408,6 +3414,50 @@ a.disabled { cursor: not-allowed; text-decoration: none; } +.list-pf { + border-bottom: 1px solid #ededed; +} +.list-pf-item { + border-color: #ededed; + border-left-color: #fff; + border-right-color: #fff; + border-style: solid; + border-width: 1px; + border-bottom: none; +} +.list-pf-item:hover { + background-color: #fafafa; +} +.list-pf-item.active { + background-color: #ededed; + border-color: #bbb; + border-bottom-width: 1px; + border-bottom-style: solid; +} +.list-pf-expansion { + background-color: #fff; +} +.list-pf-container { + -ms-flex-align: center; + align-items: center; + display: -ms-flexbox; + display: flex; + padding: 20px; +} +.list-pf-expansion .list-pf-container { + border-top: 1px solid #bbb; +} +.list-pf-chevron { + margin-right: 5px; +} +.list-pf-chevron + .list-pf-content { + border-left: 1px solid #bbb; + padding-left: 15px; +} +.list-pf-chevron .fa { + font-size: 22px; + width: 20px; +} .list-view-pf .list-group-item { -ms-flex-align: start; align-items: flex-start; @@ -3763,6 +3813,42 @@ a.disabled { position: relative; width: 100%; } +.list-view-pf-dnd .dndDragging.drag-original { + display: none; +} +.list-view-pf-dnd .dndDragging.drag-original .list-view-pf-dnd-original-items { + display: block; +} +.list-view-pf-dnd .dndDragging .list-view-pf-dnd-drag-items { + display: inline-block; +} +.list-view-pf-dnd .dndDragging .list-view-pf-dnd-original-items { + display: none; +} +.list-view-pf-dnd .dndPlaceholder { + background-color: #ededed; + padding: 20px 0; +} +.list-view-pf-dnd .list-group-item-header { + margin-left: -10px; +} +.list-view-pf-dnd .list-group-item-header:before { + background-image: linear-gradient(to bottom, #0088ce 60%, #fff 0%); + background-position: left; + background-repeat: repeat-y; + background-size: 2px 5px; + border: 4px solid #0088ce; + border-color: #00659c; + content: ""; + height: 55px; + left: 4px; + position: absolute; + top: 5px; + width: 10px; +} +.list-view-pf-dnd-drag-items { + display: none; +} .login-pf { height: 100%; } @@ -6764,6 +6850,9 @@ table.dataTable th:active { left: 0; right: 0; } +.wizard-pf-contents textarea { + resize: vertical; +} /* styles the content of a review page */ .wizard-pf-review-steps { list-style: none; diff --git a/dist/docs/css/patternfly.css b/dist/docs/css/patternfly.css index 1802e4a2f..bfef048f5 100644 --- a/dist/docs/css/patternfly.css +++ b/dist/docs/css/patternfly.css @@ -4,35 +4,90 @@ font-style: normal; font-weight: 300; src: url("../fonts/OpenSans-Light-webfont.eot"); - src: url("../fonts/OpenSans-Light-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/OpenSans-Light-webfont.woff") format("woff"), url("../fonts/OpenSans-Light-webfont.ttf") format("truetype"), url("../fonts/OpenSans-Light-webfont.svg#OpenSansLight") format("svg"); + /* IE9 Compat Modes */ + src: local("Open Sans Light"), local("OpenSans-Light"), url("../fonts/OpenSans-Light-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-Light-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-Light-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-Light-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-Light-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ } @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 400; src: url("../fonts/OpenSans-Regular-webfont.eot"); - src: url("../fonts/OpenSans-Regular-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/OpenSans-Regular-webfont.woff") format("woff"), url("../fonts/OpenSans-Regular-webfont.ttf") format("truetype"), url("../fonts/OpenSans-Regular-webfont.svg#OpenSansRegular") format("svg"); + /* IE9 Compat Modes */ + src: local("Open Sans"), local("OpenSans"), url("../fonts/OpenSans-Regular-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-Regular-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-Regular-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-Regular-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-Regular-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ +} +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 300; + src: url("../fonts/OpenSans-LightItalic-webfont.eot"); + /* IE9 Compat Modes */ + src: local("Open Sans Light Italic"), local("OpenSansLight-Italic"), url("../fonts/OpenSans-LightItalic-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-LightItalic-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-LightItalic-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-LightItalic-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-LightItalic-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ +} +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 400; + src: url("../fonts/OpenSans-Italic-webfont.eot"); + /* IE9 Compat Modes */ + src: local("Open Sans Italic"), local("OpenSans-Italic"), url("../fonts/OpenSans-Italic-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-Italic-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-Italic-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-Italic-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-Italic-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ } @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 600; src: url("../fonts/OpenSans-Semibold-webfont.eot"); - src: url("../fonts/OpenSans-Semibold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/OpenSans-Semibold-webfont.woff") format("woff"), url("../fonts/OpenSans-Semibold-webfont.ttf") format("truetype"), url("../fonts/OpenSans-Semibold-webfont.svg#OpenSansSemibold") format("svg"); + /* IE9 Compat Modes */ + src: local("Open Sans Semibold"), local("OpenSans-Semibold-webfont"), url("../fonts/OpenSans-Semibold-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-Semibold-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-Semibold-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-Semibold-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-Semibold-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ +} +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 600; + src: url("../fonts/OpenSans-SemiboldItalic-webfont.eot"); + /* IE9 Compat Modes */ + src: local("Open Sans Semibold Italic"), local("OpenSans-SemiboldItalic-webfont"), url("../fonts/OpenSans-SemiboldItalic-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-SemiboldItalic-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-SemiboldItalic-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-SemiboldItalic-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-SemiboldItalic-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ } @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 700; src: url("../fonts/OpenSans-Bold-webfont.eot"); - src: url("../fonts/OpenSans-Bold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/OpenSans-Bold-webfont.woff") format("woff"), url("../fonts/OpenSans-Bold-webfont.ttf") format("truetype"), url("../fonts/OpenSans-Bold-webfont.svg#OpenSansBold") format("svg"); + /* IE9 Compat Modes */ + src: local("Open Sans Bold"), local("OpenSans-Bold"), url("../fonts/OpenSans-Bold-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-Bold-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-Bold-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-Bold-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-Bold-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ +} +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 700; + src: url("../fonts/OpenSans-BoldItalic-webfont.eot"); + /* IE9 Compat Modes */ + src: local("Open Sans Bold Italic"), local("OpenSans-BoldItalic"), url("../fonts/OpenSans-BoldItalic-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-BoldItalic-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-BoldItalic-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-BoldItalic-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-BoldItalic-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ +} +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 800; + src: url("../fonts/OpenSans-ExtraBoldItalic-webfont.eot"); + /* IE9 Compat Modes */ + src: local("Open Sans Extrabold Italic"), local("OpenSans-ExtraboldItalic"), url("../fonts/OpenSans-ExtraBoldItalic-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-ExtraBoldItalic-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-ExtraBoldItalic-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-ExtraBoldItalic-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-ExtraBoldItalic-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ } @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 800; src: url("../fonts/OpenSans-ExtraBold-webfont.eot"); - src: url("../fonts/OpenSans-ExtraBold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/OpenSans-ExtraBold-webfont.woff") format("woff"), url("../fonts/OpenSans-ExtraBold-webfont.ttf") format("truetype"), url("../fonts/OpenSans-ExtraBold-webfont.svg#OpenSansExtrabold") format("svg"); + /* IE9 Compat Modes */ + src: local("Open Sans Extrabold"), local("OpenSans-Extrabold"), url("../fonts/OpenSans-ExtraBold-webfont.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ url("../fonts/OpenSans-ExtraBold-webfont.woff2") format("woff2"), /* Super Modern Browsers */ url("../fonts/OpenSans-ExtraBold-webfont.woff") format("woff"), /* Modern Browsers */ url("../fonts/OpenSans-ExtraBold-webfont.ttf") format("truetype"), /* Safari, Android, iOS */ url("../fonts/OpenSans-ExtraBold-webfont.svg#OpenSans") format("svg"); + /* Legacy iOS */ } /*! * Bootstrap v3.3.7 (http://getbootstrap.com) @@ -8882,6 +8937,7 @@ button.close { padding-left: 47px; padding-right: 14px; position: relative; + word-wrap: break-word; } .alert .alert-link { color: #0088ce; @@ -9749,7 +9805,6 @@ fieldset[disabled] .pagination > li > span.active { .content-view-pf-pagination { background-color: #f5f5f5; border: 1px solid #d1d1d1; - border-top: none; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; @@ -9757,6 +9812,9 @@ fieldset[disabled] .pagination > li > span.active { -ms-flex-pack: justify; justify-content: space-between; } +.content-view-pf-pagination.table-view-pf-pagination { + border-top: none; +} .content-view-pf-pagination .form-group { -ms-flex-align: baseline; align-items: baseline; diff --git a/dist/docs/fonts/OpenSans-Bold-webfont.eot b/dist/docs/fonts/OpenSans-Bold-webfont.eot index 5d20d9163..ee4ba1e3b 100644 Binary files a/dist/docs/fonts/OpenSans-Bold-webfont.eot and b/dist/docs/fonts/OpenSans-Bold-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-Bold-webfont.svg b/dist/docs/fonts/OpenSans-Bold-webfont.svg index 3ed7be4bc..4774d8c4f 100644 --- a/dist/docs/fonts/OpenSans-Bold-webfont.svg +++ b/dist/docs/fonts/OpenSans-Bold-webfont.svg @@ -1,1830 +1,19028 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-Bold-webfont.ttf b/dist/docs/fonts/OpenSans-Bold-webfont.ttf index 2109c958e..fd79d43be 100644 Binary files a/dist/docs/fonts/OpenSans-Bold-webfont.ttf and b/dist/docs/fonts/OpenSans-Bold-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-Bold-webfont.woff b/dist/docs/fonts/OpenSans-Bold-webfont.woff index 1205787b0..f501db09f 100644 Binary files a/dist/docs/fonts/OpenSans-Bold-webfont.woff and b/dist/docs/fonts/OpenSans-Bold-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-Bold-webfont.woff2 b/dist/docs/fonts/OpenSans-Bold-webfont.woff2 new file mode 100644 index 000000000..34aac6f3c Binary files /dev/null and b/dist/docs/fonts/OpenSans-Bold-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-BoldItalic-webfont.eot b/dist/docs/fonts/OpenSans-BoldItalic-webfont.eot index 1f639a15f..63f57868b 100644 Binary files a/dist/docs/fonts/OpenSans-BoldItalic-webfont.eot and b/dist/docs/fonts/OpenSans-BoldItalic-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-BoldItalic-webfont.svg b/dist/docs/fonts/OpenSans-BoldItalic-webfont.svg index 6a2607b9d..f49e45d18 100644 --- a/dist/docs/fonts/OpenSans-BoldItalic-webfont.svg +++ b/dist/docs/fonts/OpenSans-BoldItalic-webfont.svg @@ -1,1830 +1,19036 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-BoldItalic-webfont.ttf b/dist/docs/fonts/OpenSans-BoldItalic-webfont.ttf index 242d6b25c..9bc800958 100644 Binary files a/dist/docs/fonts/OpenSans-BoldItalic-webfont.ttf and b/dist/docs/fonts/OpenSans-BoldItalic-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-BoldItalic-webfont.woff b/dist/docs/fonts/OpenSans-BoldItalic-webfont.woff index ed760c062..80fd8a984 100644 Binary files a/dist/docs/fonts/OpenSans-BoldItalic-webfont.woff and b/dist/docs/fonts/OpenSans-BoldItalic-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-BoldItalic-webfont.woff2 b/dist/docs/fonts/OpenSans-BoldItalic-webfont.woff2 new file mode 100644 index 000000000..cc8d73192 Binary files /dev/null and b/dist/docs/fonts/OpenSans-BoldItalic-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-ExtraBold-webfont.eot b/dist/docs/fonts/OpenSans-ExtraBold-webfont.eot index 1e29ad595..b7ffbdbc9 100644 Binary files a/dist/docs/fonts/OpenSans-ExtraBold-webfont.eot and b/dist/docs/fonts/OpenSans-ExtraBold-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-ExtraBold-webfont.svg b/dist/docs/fonts/OpenSans-ExtraBold-webfont.svg index 27800505a..c3d41a730 100644 --- a/dist/docs/fonts/OpenSans-ExtraBold-webfont.svg +++ b/dist/docs/fonts/OpenSans-ExtraBold-webfont.svg @@ -1,1830 +1,19030 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-ExtraBold-webfont.ttf b/dist/docs/fonts/OpenSans-ExtraBold-webfont.ttf index 6b9118ee3..21f6f84a0 100644 Binary files a/dist/docs/fonts/OpenSans-ExtraBold-webfont.ttf and b/dist/docs/fonts/OpenSans-ExtraBold-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-ExtraBold-webfont.woff b/dist/docs/fonts/OpenSans-ExtraBold-webfont.woff index a7b99d255..af67f189d 100644 Binary files a/dist/docs/fonts/OpenSans-ExtraBold-webfont.woff and b/dist/docs/fonts/OpenSans-ExtraBold-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-ExtraBold-webfont.woff2 b/dist/docs/fonts/OpenSans-ExtraBold-webfont.woff2 new file mode 100644 index 000000000..473b2b451 Binary files /dev/null and b/dist/docs/fonts/OpenSans-ExtraBold-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.eot b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.eot index 77184af42..70335d8e4 100644 Binary files a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.eot and b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.svg b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.svg index 8f080c1e5..591a19cdc 100644 --- a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.svg +++ b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.svg @@ -1,1830 +1,19036 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.ttf b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.ttf index 26a07e939..31cb68834 100644 Binary files a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.ttf and b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.woff b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.woff index 45395d1bb..3b8b0717d 100644 Binary files a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.woff and b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.woff2 b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.woff2 new file mode 100644 index 000000000..ff51f4f28 Binary files /dev/null and b/dist/docs/fonts/OpenSans-ExtraBoldItalic-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-Italic-webfont.eot b/dist/docs/fonts/OpenSans-Italic-webfont.eot index 0c8a0ae06..6e56f5f8d 100644 Binary files a/dist/docs/fonts/OpenSans-Italic-webfont.eot and b/dist/docs/fonts/OpenSans-Italic-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-Italic-webfont.svg b/dist/docs/fonts/OpenSans-Italic-webfont.svg index e1075dcc2..c2f16d172 100644 --- a/dist/docs/fonts/OpenSans-Italic-webfont.svg +++ b/dist/docs/fonts/OpenSans-Italic-webfont.svg @@ -1,1830 +1,19043 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-Italic-webfont.ttf b/dist/docs/fonts/OpenSans-Italic-webfont.ttf index 12d25d9a7..c90da48ff 100644 Binary files a/dist/docs/fonts/OpenSans-Italic-webfont.ttf and b/dist/docs/fonts/OpenSans-Italic-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-Italic-webfont.woff b/dist/docs/fonts/OpenSans-Italic-webfont.woff index ff652e643..9e17567af 100644 Binary files a/dist/docs/fonts/OpenSans-Italic-webfont.woff and b/dist/docs/fonts/OpenSans-Italic-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-Italic-webfont.woff2 b/dist/docs/fonts/OpenSans-Italic-webfont.woff2 new file mode 100644 index 000000000..9a96c63fa Binary files /dev/null and b/dist/docs/fonts/OpenSans-Italic-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-Light-webfont.eot b/dist/docs/fonts/OpenSans-Light-webfont.eot index 14868406a..23bc6a999 100644 Binary files a/dist/docs/fonts/OpenSans-Light-webfont.eot and b/dist/docs/fonts/OpenSans-Light-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-Light-webfont.svg b/dist/docs/fonts/OpenSans-Light-webfont.svg index 11a472ca8..ceb267c43 100644 --- a/dist/docs/fonts/OpenSans-Light-webfont.svg +++ b/dist/docs/fonts/OpenSans-Light-webfont.svg @@ -1,1831 +1,19026 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-Light-webfont.ttf b/dist/docs/fonts/OpenSans-Light-webfont.ttf index 63af664cd..0d381897d 100644 Binary files a/dist/docs/fonts/OpenSans-Light-webfont.ttf and b/dist/docs/fonts/OpenSans-Light-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-Light-webfont.woff b/dist/docs/fonts/OpenSans-Light-webfont.woff index e78607481..fb34cf388 100644 Binary files a/dist/docs/fonts/OpenSans-Light-webfont.woff and b/dist/docs/fonts/OpenSans-Light-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-Light-webfont.woff2 b/dist/docs/fonts/OpenSans-Light-webfont.woff2 new file mode 100644 index 000000000..9a71d1c78 Binary files /dev/null and b/dist/docs/fonts/OpenSans-Light-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-LightItalic-webfont.eot b/dist/docs/fonts/OpenSans-LightItalic-webfont.eot index 8f445929f..cf3a6ffc0 100644 Binary files a/dist/docs/fonts/OpenSans-LightItalic-webfont.eot and b/dist/docs/fonts/OpenSans-LightItalic-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-LightItalic-webfont.svg b/dist/docs/fonts/OpenSans-LightItalic-webfont.svg index 431d7e354..0461c39a6 100644 --- a/dist/docs/fonts/OpenSans-LightItalic-webfont.svg +++ b/dist/docs/fonts/OpenSans-LightItalic-webfont.svg @@ -1,1835 +1,19039 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-LightItalic-webfont.ttf b/dist/docs/fonts/OpenSans-LightItalic-webfont.ttf index 01dda2858..68299c4bc 100644 Binary files a/dist/docs/fonts/OpenSans-LightItalic-webfont.ttf and b/dist/docs/fonts/OpenSans-LightItalic-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-LightItalic-webfont.woff b/dist/docs/fonts/OpenSans-LightItalic-webfont.woff index 43e8b9e6c..360f4a4dc 100644 Binary files a/dist/docs/fonts/OpenSans-LightItalic-webfont.woff and b/dist/docs/fonts/OpenSans-LightItalic-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-LightItalic-webfont.woff2 b/dist/docs/fonts/OpenSans-LightItalic-webfont.woff2 new file mode 100644 index 000000000..ec0bfee7d Binary files /dev/null and b/dist/docs/fonts/OpenSans-LightItalic-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-Regular-webfont.eot b/dist/docs/fonts/OpenSans-Regular-webfont.eot index 6bbc3cf58..8d4b7d9e7 100644 Binary files a/dist/docs/fonts/OpenSans-Regular-webfont.eot and b/dist/docs/fonts/OpenSans-Regular-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-Regular-webfont.svg b/dist/docs/fonts/OpenSans-Regular-webfont.svg index 25a395234..0ec5da573 100644 --- a/dist/docs/fonts/OpenSans-Regular-webfont.svg +++ b/dist/docs/fonts/OpenSans-Regular-webfont.svg @@ -1,1831 +1,19030 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-Regular-webfont.ttf b/dist/docs/fonts/OpenSans-Regular-webfont.ttf index c537f8382..db433349b 100644 Binary files a/dist/docs/fonts/OpenSans-Regular-webfont.ttf and b/dist/docs/fonts/OpenSans-Regular-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-Regular-webfont.woff b/dist/docs/fonts/OpenSans-Regular-webfont.woff index e231183dc..1251d51a6 100644 Binary files a/dist/docs/fonts/OpenSans-Regular-webfont.woff and b/dist/docs/fonts/OpenSans-Regular-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-Regular-webfont.woff2 b/dist/docs/fonts/OpenSans-Regular-webfont.woff2 new file mode 100644 index 000000000..0964c7c46 Binary files /dev/null and b/dist/docs/fonts/OpenSans-Regular-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-Semibold-webfont.eot b/dist/docs/fonts/OpenSans-Semibold-webfont.eot index d8375dd0a..5cf668dc9 100644 Binary files a/dist/docs/fonts/OpenSans-Semibold-webfont.eot and b/dist/docs/fonts/OpenSans-Semibold-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-Semibold-webfont.svg b/dist/docs/fonts/OpenSans-Semibold-webfont.svg index eec4db8bd..81fdf89af 100644 --- a/dist/docs/fonts/OpenSans-Semibold-webfont.svg +++ b/dist/docs/fonts/OpenSans-Semibold-webfont.svg @@ -1,1830 +1,19030 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-Semibold-webfont.ttf b/dist/docs/fonts/OpenSans-Semibold-webfont.ttf index b3290843a..1a7679e39 100644 Binary files a/dist/docs/fonts/OpenSans-Semibold-webfont.ttf and b/dist/docs/fonts/OpenSans-Semibold-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-Semibold-webfont.woff b/dist/docs/fonts/OpenSans-Semibold-webfont.woff index 28d6adee0..409c725d0 100644 Binary files a/dist/docs/fonts/OpenSans-Semibold-webfont.woff and b/dist/docs/fonts/OpenSans-Semibold-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-Semibold-webfont.woff2 b/dist/docs/fonts/OpenSans-Semibold-webfont.woff2 new file mode 100644 index 000000000..d088697a0 Binary files /dev/null and b/dist/docs/fonts/OpenSans-Semibold-webfont.woff2 differ diff --git a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.eot b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.eot index 0ab1db22e..5b7ffea48 100644 Binary files a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.eot and b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.eot differ diff --git a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.svg b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.svg index 7166ec1b9..6e9c82074 100644 --- a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.svg +++ b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.svg @@ -1,1830 +1,19043 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + + diff --git a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.ttf b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.ttf index d2d6318f6..59b6d16b0 100644 Binary files a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.ttf and b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.ttf differ diff --git a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.woff b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.woff index d4dfca402..543147746 100644 Binary files a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.woff and b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.woff differ diff --git a/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.woff2 b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.woff2 new file mode 100644 index 000000000..2d20d7705 Binary files /dev/null and b/dist/docs/fonts/OpenSans-SemiboldItalic-webfont.woff2 differ diff --git a/dist/docs/fonts/PatternFlyIcons-webfont.eot b/dist/docs/fonts/PatternFlyIcons-webfont.eot index a09ee71ae..5748d7c90 100644 Binary files a/dist/docs/fonts/PatternFlyIcons-webfont.eot and b/dist/docs/fonts/PatternFlyIcons-webfont.eot differ diff --git a/dist/docs/fonts/PatternFlyIcons-webfont.svg b/dist/docs/fonts/PatternFlyIcons-webfont.svg index b8fc87bb5..7db755481 100644 --- a/dist/docs/fonts/PatternFlyIcons-webfont.svg +++ b/dist/docs/fonts/PatternFlyIcons-webfont.svg @@ -90,4 +90,6 @@ + + \ No newline at end of file diff --git a/dist/docs/fonts/PatternFlyIcons-webfont.ttf b/dist/docs/fonts/PatternFlyIcons-webfont.ttf index cffbff2ae..e12fb3c5b 100644 Binary files a/dist/docs/fonts/PatternFlyIcons-webfont.ttf and b/dist/docs/fonts/PatternFlyIcons-webfont.ttf differ diff --git a/dist/docs/fonts/PatternFlyIcons-webfont.woff b/dist/docs/fonts/PatternFlyIcons-webfont.woff index bf8a28214..afd270084 100644 Binary files a/dist/docs/fonts/PatternFlyIcons-webfont.woff and b/dist/docs/fonts/PatternFlyIcons-webfont.woff differ diff --git a/dist/docs/grunt-scripts/angular-drag-and-drop-lists.js b/dist/docs/grunt-scripts/angular-drag-and-drop-lists.js new file mode 100644 index 000000000..c835748c0 --- /dev/null +++ b/dist/docs/grunt-scripts/angular-drag-and-drop-lists.js @@ -0,0 +1,570 @@ +/** + * angular-drag-and-drop-lists v2.0.0 + * + * Copyright (c) 2014 Marcel Juenemann marcel@juenemann.cc + * Copyright (c) 2014-2016 Google Inc. + * https://github.com/marceljuenemann/angular-drag-and-drop-lists + * + * License: MIT + */ +(function(dndLists) { + + // In standard-compliant browsers we use a custom mime type and also encode the dnd-type in it. + // However, IE and Edge only support a limited number of mime types. The workarounds are described + // in https://github.com/marceljuenemann/angular-drag-and-drop-lists/wiki/Data-Transfer-Design + var MIME_TYPE = 'application/x-dnd'; + var EDGE_MIME_TYPE = 'application/json'; + var MSIE_MIME_TYPE = 'Text'; + + /** + * Use the dnd-draggable attribute to make your element draggable + * + * Attributes: + * - dnd-draggable Required attribute. The value has to be an object that represents the data + * of the element. In case of a drag and drop operation the object will be + * serialized and unserialized on the receiving end. + * - dnd-selected Callback that is invoked when the element was clicked but not dragged. + * The original click event will be provided in the local event variable. + * - dnd-effect-allowed Use this attribute to limit the operations that can be performed. Options: + * - "move": The drag operation will move the element. This is the default. + * - "copy": The drag operation will copy the element. Shows a copy cursor. + * - "copyMove": The user can choose between copy and move by pressing the + * ctrl or shift key. *Not supported in IE:* In Internet Explorer this + * option will be the same as "copy". *Not fully supported in Chrome on + * Windows:* In the Windows version of Chrome the cursor will always be the + * move cursor. However, when the user drops an element and has the ctrl + * key pressed, we will perform a copy anyways. + * - HTML5 also specifies the "link" option, but this library does not + * actively support it yet, so use it at your own risk. + * - dnd-moved Callback that is invoked when the element was moved. Usually you will + * remove your element from the original list in this callback, since the + * directive is not doing that for you automatically. The original dragend + * event will be provided in the local event variable. + * - dnd-canceled Callback that is invoked if the element was dragged, but the operation was + * canceled and the element was not dropped. The original dragend event will + * be provided in the local event variable. + * - dnd-copied Same as dnd-moved, just that it is called when the element was copied + * instead of moved. The original dragend event will be provided in the local + * event variable. + * - dnd-dragstart Callback that is invoked when the element was dragged. The original + * dragstart event will be provided in the local event variable. + * - dnd-dragend Callback that is invoked when the drag operation ended. Available local + * variables are event and dropEffect. + * - dnd-type Use this attribute if you have different kinds of items in your + * application and you want to limit which items can be dropped into which + * lists. Combine with dnd-allowed-types on the dnd-list(s). This attribute + * must be a lower case string. Upper case characters can be used, but will + * be converted to lower case automatically. + * - dnd-disable-if You can use this attribute to dynamically disable the draggability of the + * element. This is useful if you have certain list items that you don't want + * to be draggable, or if you want to disable drag & drop completely without + * having two different code branches (e.g. only allow for admins). + * + * CSS classes: + * - dndDragging This class will be added to the element while the element is being + * dragged. It will affect both the element you see while dragging and the + * source element that stays at it's position. Do not try to hide the source + * element with this class, because that will abort the drag operation. + * - dndDraggingSource This class will be added to the element after the drag operation was + * started, meaning it only affects the original element that is still at + * it's source position, and not the "element" that the user is dragging with + * his mouse pointer. + */ + dndLists.directive('dndDraggable', ['$parse', '$timeout', function($parse, $timeout) { + return function(scope, element, attr) { + // Set the HTML5 draggable attribute on the element. + element.attr("draggable", "true"); + + // If the dnd-disable-if attribute is set, we have to watch that. + if (attr.dndDisableIf) { + scope.$watch(attr.dndDisableIf, function(disabled) { + element.attr("draggable", !disabled); + }); + } + + /** + * When the drag operation is started we have to prepare the dataTransfer object, + * which is the primary way we communicate with the target element + */ + element.on('dragstart', function(event) { + event = event.originalEvent || event; + + // Check whether the element is draggable, since dragstart might be triggered on a child. + if (element.attr('draggable') == 'false') return true; + + // Initialize global state. + dndState.dropEffect = "none"; + dndState.isDragging = true; + dndState.itemType = attr.dndType && scope.$eval(attr.dndType).toLowerCase(); + + // Internet Explorer and Microsoft Edge don't support custom mime types, see design doc: + // https://github.com/marceljuenemann/angular-drag-and-drop-lists/wiki/Data-Transfer-Design + var item = scope.$eval(attr.dndDraggable); + var mimeType = MIME_TYPE + (dndState.itemType ? ('-' + dndState.itemType) : ''); + try { + event.dataTransfer.setData(mimeType, angular.toJson(item)); + } catch (e) { + var data = angular.toJson({item: item, type: dndState.itemType}); + try { + event.dataTransfer.setData(EDGE_MIME_TYPE, data); + } catch (e) { + event.dataTransfer.setData(MSIE_MIME_TYPE, data); + } + } + + // Only allow actions specified in dnd-effect-allowed attribute. + event.dataTransfer.effectAllowed = attr.dndEffectAllowed || "move"; + + // Add CSS classes. See documentation above. + element.addClass("dndDragging"); + $timeout(function() { element.addClass("dndDraggingSource"); }, 0); + + // Try setting a proper drag image if triggered on a dnd-handle (won't work in IE). + if (event._dndHandle && event.dataTransfer.setDragImage) { + event.dataTransfer.setDragImage(element[0], 0, 0); + } + + $parse(attr.dndDragstart)(scope, {event: event}); + event.stopPropagation(); + }); + + /** + * The dragend event is triggered when the element was dropped or when the drag + * operation was aborted (e.g. hit escape button). Depending on the executed action + * we will invoke the callbacks specified with the dnd-moved or dnd-copied attribute. + */ + element.on('dragend', function(event) { + event = event.originalEvent || event; + + // Invoke callbacks. Usually we would use event.dataTransfer.dropEffect to determine + // the used effect, but Chrome has not implemented that field correctly. On Windows + // it always sets it to 'none', while Chrome on Linux sometimes sets it to something + // else when it's supposed to send 'none' (drag operation aborted). + var dropEffect = dndState.dropEffect; + scope.$apply(function() { + switch (dropEffect) { + case "move": + $parse(attr.dndMoved)(scope, {event: event}); + break; + case "copy": + $parse(attr.dndCopied)(scope, {event: event}); + break; + case "none": + $parse(attr.dndCanceled)(scope, {event: event}); + break; + } + $parse(attr.dndDragend)(scope, {event: event, dropEffect: dropEffect}); + }); + + // Clean up + element.removeClass("dndDragging"); + $timeout(function() { element.removeClass("dndDraggingSource"); }, 0); + dndState.isDragging = false; + event.stopPropagation(); + }); + + /** + * When the element is clicked we invoke the callback function + * specified with the dnd-selected attribute. + */ + element.on('click', function(event) { + if (!attr.dndSelected) return; + + event = event.originalEvent || event; + scope.$apply(function() { + $parse(attr.dndSelected)(scope, {event: event}); + }); + + // Prevent triggering dndSelected in parent elements. + event.stopPropagation(); + }); + + /** + * Workaround to make element draggable in IE9 + */ + element.on('selectstart', function() { + if (this.dragDrop) this.dragDrop(); + }); + }; + }]); + + /** + * Use the dnd-list attribute to make your list element a dropzone. Usually you will add a single + * li element as child with the ng-repeat directive. If you don't do that, we will not be able to + * position the dropped element correctly. If you want your list to be sortable, also add the + * dnd-draggable directive to your li element(s). + * + * Attributes: + * - dnd-list Required attribute. The value has to be the array in which the data of + * the dropped element should be inserted. The value can be blank if used + * with a custom dnd-drop handler that always returns true. + * - dnd-allowed-types Optional array of allowed item types. When used, only items that had a + * matching dnd-type attribute will be dropable. Upper case characters will + * automatically be converted to lower case. + * - dnd-disable-if Optional boolean expresssion. When it evaluates to true, no dropping + * into the list is possible. Note that this also disables rearranging + * items inside the list. + * - dnd-horizontal-list Optional boolean expresssion. When it evaluates to true, the positioning + * algorithm will use the left and right halfs of the list items instead of + * the upper and lower halfs. + * - dnd-dragover Optional expression that is invoked when an element is dragged over the + * list. If the expression is set, but does not return true, the element is + * not allowed to be dropped. The following variables will be available: + * - event: The original dragover event sent by the browser. + * - index: The position in the list at which the element would be dropped. + * - type: The dnd-type set on the dnd-draggable, or undefined if non was + * set. Will be null for drops from external sources in IE and Edge, + * since we don't know the type in those cases. + * - external: Whether the element was dragged from an external source. + * - dnd-drop Optional expression that is invoked when an element is dropped on the + * list. The same variables as for dnd-dragover will be available, with the + * exception that type is always known and therefore never null. There + * will also be an item variable, which is the transferred object. The + * return value determines the further handling of the drop: + * - falsy: The drop will be canceled and the element won't be inserted. + * - true: Signalises that the drop is allowed, but the dnd-drop + * callback already took care of inserting the element. + * - otherwise: All other return values will be treated as the object to + * insert into the array. In most cases you want to simply return the + * item parameter, but there are no restrictions on what you can return. + * - dnd-inserted Optional expression that is invoked after a drop if the element was + * actually inserted into the list. The same local variables as for + * dnd-drop will be available. Note that for reorderings inside the same + * list the old element will still be in the list due to the fact that + * dnd-moved was not called yet. + * - dnd-external-sources Optional boolean expression. When it evaluates to true, the list accepts + * drops from sources outside of the current browser tab. This allows to + * drag and drop accross different browser tabs. The only major browser + * that does not support this is currently Microsoft Edge. + * + * CSS classes: + * - dndPlaceholder When an element is dragged over the list, a new placeholder child + * element will be added. This element is of type li and has the class + * dndPlaceholder set. Alternatively, you can define your own placeholder + * by creating a child element with dndPlaceholder class. + * - dndDragover Will be added to the list while an element is dragged over the list. + */ + dndLists.directive('dndList', ['$parse', '$timeout', function($parse, $timeout) { + return function(scope, element, attr) { + // While an element is dragged over the list, this placeholder element is inserted + // at the location where the element would be inserted after dropping. + var placeholder = getPlaceholderElement(); + placeholder.remove(); + + var placeholderNode = placeholder[0]; + var listNode = element[0]; + var listSettings = {}; + + /** + * The dragenter event is fired when a dragged element or text selection enters a valid drop + * target. According to the spec, we either need to have a dropzone attribute or listen on + * dragenter events and call preventDefault(). It should be noted though that no browser seems + * to enforce this behaviour. + */ + element.on('dragenter', function (event) { + event = event.originalEvent || event; + + // Calculate list properties, so that we don't have to repeat this on every dragover event. + var types = attr.dndAllowedTypes && scope.$eval(attr.dndAllowedTypes); + listSettings = { + allowedTypes: angular.isArray(types) && types.join('|').toLowerCase().split('|'), + disabled: attr.dndDisableIf && scope.$eval(attr.dndDisableIf), + externalSources: attr.dndExternalSources && scope.$eval(attr.dndExternalSources), + horizontal: attr.dndHorizontalList && scope.$eval(attr.dndHorizontalList) + }; + + var mimeType = getMimeType(event.dataTransfer.types); + if (!mimeType || !isDropAllowed(getItemType(mimeType))) return true; + event.preventDefault(); + }); + + /** + * The dragover event is triggered "every few hundred milliseconds" while an element + * is being dragged over our list, or over an child element. + */ + element.on('dragover', function(event) { + event = event.originalEvent || event; + + // Check whether the drop is allowed and determine mime type. + var mimeType = getMimeType(event.dataTransfer.types); + var itemType = getItemType(mimeType); + if (!mimeType || !isDropAllowed(itemType)) return true; + + // Make sure the placeholder is shown, which is especially important if the list is empty. + if (placeholderNode.parentNode != listNode) { + element.append(placeholder); + } + + if (event.target != listNode) { + // Try to find the node direct directly below the list node. + var listItemNode = event.target; + while (listItemNode.parentNode != listNode && listItemNode.parentNode) { + listItemNode = listItemNode.parentNode; + } + + if (listItemNode.parentNode == listNode && listItemNode != placeholderNode) { + // If the mouse pointer is in the upper half of the list item element, + // we position the placeholder before the list item, otherwise after it. + var rect = listItemNode.getBoundingClientRect(); + if (listSettings.horizontal) { + var isFirstHalf = event.clientX < rect.left + rect.width / 2; + } else { + var isFirstHalf = event.clientY < rect.top + rect.height / 2; + } + listNode.insertBefore(placeholderNode, + isFirstHalf ? listItemNode : listItemNode.nextSibling); + } + } + + // At this point we invoke the callback, which still can disallow the drop. + // We can't do this earlier because we want to pass the index of the placeholder. + if (attr.dndDragover && !invokeCallback(attr.dndDragover, event, itemType)) { + return stopDragover(); + } + + element.addClass("dndDragover"); + event.preventDefault(); + event.stopPropagation(); + return false; + }); + + /** + * When the element is dropped, we use the position of the placeholder element as the + * position where we insert the transferred data. This assumes that the list has exactly + * one child element per array element. + */ + element.on('drop', function(event) { + event = event.originalEvent || event; + + // Check whether the drop is allowed and determine mime type. + var mimeType = getMimeType(event.dataTransfer.types); + var itemType = getItemType(mimeType); + if (!mimeType || !isDropAllowed(itemType)) return true; + + // The default behavior in Firefox is to interpret the dropped element as URL and + // forward to it. We want to prevent that even if our drop is aborted. + event.preventDefault(); + + // Unserialize the data that was serialized in dragstart. + try { + var data = JSON.parse(event.dataTransfer.getData(mimeType)); + } catch(e) { + return stopDragover(); + } + + // Drops with invalid types from external sources might not have been filtered out yet. + if (mimeType == MSIE_MIME_TYPE || mimeType == EDGE_MIME_TYPE) { + itemType = data.type || undefined; + data = data.item; + if (!isDropAllowed(itemType)) return stopDragover(); + } + + // Invoke the callback, which can transform the transferredObject and even abort the drop. + var index = getPlaceholderIndex(); + if (attr.dndDrop) { + data = invokeCallback(attr.dndDrop, event, itemType, index, data); + if (!data) return stopDragover(); + } + + // Insert the object into the array, unless dnd-drop took care of that (returned true). + if (data !== true) { + scope.$apply(function() { + scope.$eval(attr.dndList).splice(index, 0, data); + }); + } + invokeCallback(attr.dndInserted, event, itemType, index, data); + + // In Chrome on Windows the dropEffect will always be none... + // We have to determine the actual effect manually from the allowed effects + if (event.dataTransfer.dropEffect === "none") { + if (event.dataTransfer.effectAllowed === "copy" || + event.dataTransfer.effectAllowed === "move") { + dndState.dropEffect = event.dataTransfer.effectAllowed; + } else { + dndState.dropEffect = event.ctrlKey ? "copy" : "move"; + } + } else { + dndState.dropEffect = event.dataTransfer.dropEffect; + } + + // Clean up + stopDragover(); + event.stopPropagation(); + return false; + }); + + /** + * We have to remove the placeholder when the element is no longer dragged over our list. The + * problem is that the dragleave event is not only fired when the element leaves our list, + * but also when it leaves a child element -- so practically it's fired all the time. As a + * workaround we wait a few milliseconds and then check if the dndDragover class was added + * again. If it is there, dragover must have been called in the meantime, i.e. the element + * is still dragging over the list. If you know a better way of doing this, please tell me! + */ + element.on('dragleave', function(event) { + event = event.originalEvent || event; + + element.removeClass("dndDragover"); + $timeout(function() { + if (!element.hasClass("dndDragover")) { + placeholder.remove(); + } + }, 100); + }); + + /** + * Given the types array from the DataTransfer object, returns the first valid mime type. + * A type is valid if it starts with MIME_TYPE, or it equals MSIE_MIME_TYPE or EDGE_MIME_TYPE. + */ + function getMimeType(types) { + if (!types) return MSIE_MIME_TYPE; // IE 9 workaround. + for (var i = 0; i < types.length; i++) { + if (types[i] == MSIE_MIME_TYPE || types[i] == EDGE_MIME_TYPE || + types[i].substr(0, MIME_TYPE.length) == MIME_TYPE) { + return types[i]; + } + } + return null; + } + + /** + * Determines the type of the item from the dndState, or from the mime type for items from + * external sources. Returns undefined if no item type was set and null if the item type could + * not be determined. + */ + function getItemType(mimeType) { + if (dndState.isDragging) return dndState.itemType || undefined; + if (mimeType == MSIE_MIME_TYPE || mimeType == EDGE_MIME_TYPE) return null; + return (mimeType && mimeType.substr(MIME_TYPE.length + 1)) || undefined; + } + + /** + * Checks various conditions that must be fulfilled for a drop to be allowed, including the + * dnd-allowed-types attribute. If the item Type is unknown (null), the drop will be allowed. + */ + function isDropAllowed(itemType) { + if (listSettings.disabled) return false; + if (!listSettings.externalSources && !dndState.isDragging) return false; + if (!listSettings.allowedTypes || itemType === null) return true; + return itemType && listSettings.allowedTypes.indexOf(itemType) != -1; + } + + /** + * Small helper function that cleans up if we aborted a drop. + */ + function stopDragover() { + placeholder.remove(); + element.removeClass("dndDragover"); + return true; + } + + /** + * Invokes a callback with some interesting parameters and returns the callbacks return value. + */ + function invokeCallback(expression, event, itemType, index, item) { + return $parse(expression)(scope, { + event: event, + index: index !== undefined ? index : getPlaceholderIndex(), + item: item || undefined, + external: !dndState.isDragging, + type: itemType + }); + } + + /** + * We use the position of the placeholder node to determine at which position of the array the + * object needs to be inserted + */ + function getPlaceholderIndex() { + return Array.prototype.indexOf.call(listNode.children, placeholderNode); + } + + /** + * Tries to find a child element that has the dndPlaceholder class set. If none was found, a + * new li element is created. + */ + function getPlaceholderElement() { + var placeholder; + angular.forEach(element.children(), function(childNode) { + var child = angular.element(childNode); + if (child.hasClass('dndPlaceholder')) { + placeholder = child; + } + }); + return placeholder || angular.element("
  • "); + } + }; + }]); + + /** + * Use the dnd-nodrag attribute inside of dnd-draggable elements to prevent them from starting + * drag operations. This is especially useful if you want to use input elements inside of + * dnd-draggable elements or create specific handle elements. Note: This directive does not work + * in Internet Explorer 9. + */ + dndLists.directive('dndNodrag', function() { + return function(scope, element, attr) { + // Set as draggable so that we can cancel the events explicitly + element.attr("draggable", "true"); + + /** + * Since the element is draggable, the browser's default operation is to drag it on dragstart. + * We will prevent that and also stop the event from bubbling up. + */ + element.on('dragstart', function(event) { + event = event.originalEvent || event; + + if (!event._dndHandle) { + // If a child element already reacted to dragstart and set a dataTransfer object, we will + // allow that. For example, this is the case for user selections inside of input elements. + if (!(event.dataTransfer.types && event.dataTransfer.types.length)) { + event.preventDefault(); + } + event.stopPropagation(); + } + }); + + /** + * Stop propagation of dragend events, otherwise dnd-moved might be triggered and the element + * would be removed. + */ + element.on('dragend', function(event) { + event = event.originalEvent || event; + if (!event._dndHandle) { + event.stopPropagation(); + } + }); + }; + }); + + /** + * Use the dnd-handle directive within a dnd-nodrag element in order to allow dragging with that + * element after all. Therefore, by combining dnd-nodrag and dnd-handle you can allow + * dnd-draggable elements to only be dragged via specific "handle" elements. Note that Internet + * Explorer will show the handle element as drag image instead of the dnd-draggable element. You + * can work around this by styling the handle element differently when it is being dragged. Use + * the CSS selector .dndDragging:not(.dndDraggingSource) [dnd-handle] for that. + */ + dndLists.directive('dndHandle', function() { + return function(scope, element, attr) { + element.attr("draggable", "true"); + + element.on('dragstart dragend', function(event) { + event = event.originalEvent || event; + event._dndHandle = true; + }); + }; + }); + + /** + * For some features we need to maintain global state. This is done here, with these fields: + * - dropEffect: Set in dragstart to "none" and to the actual value in the drop handler. We don't + * rely on the dropEffect passed by the browser, since there are various bugs in Chrome and + * Safari, and Internet Explorer defaults to copy if effectAllowed is copyMove. + * - isDragging: True between dragstart and dragend. Falsy for drops from external sources. + * - itemType: The item type of the dragged element set via dnd-type. This is needed because IE + * and Edge don't support custom mime types that we can use to transfer this information. + */ + var dndState = {}; + +})(angular.module('dndLists', [])); diff --git a/dist/docs/grunt-scripts/angular-dragdrop.js b/dist/docs/grunt-scripts/angular-dragdrop.js new file mode 100644 index 000000000..55229364d --- /dev/null +++ b/dist/docs/grunt-scripts/angular-dragdrop.js @@ -0,0 +1,419 @@ +/** + * 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. + */ + +/** + * Implementing Drag and Drop functionality in AngularJS is easier than ever. + * Demo: http://codef0rmer.github.com/angular-dragdrop/ + * + * @version 1.0.13 + * + * (c) 2013 Amit Gharat a.k.a codef0rmer - amitgharat.wordpress.com + */ + +(function (window, angular, $, undefined) { +'use strict'; + +var jqyoui = angular.module('ngDragDrop', []).service('ngDragDropService', ['$timeout', '$parse', '$q', function($timeout, $parse, $q) { + this.draggableScope = null; + this.droppableScope = null; + + $('head').prepend(''); + + this.callEventCallback = function (scope, callbackName, event, ui) { + if (!callbackName) return; + + var objExtract = extract(callbackName), + callback = objExtract.callback, + constructor = objExtract.constructor, + args = [event, ui].concat(objExtract.args); + + // call either $scoped method i.e. $scope.dropCallback or constructor's method i.e. this.dropCallback. + // Removing scope.$apply call that was performance intensive (especially onDrag) and does not require it + // always. So call it within the callback if needed. + return (scope[callback] || scope[constructor][callback]).apply(scope[callback] ? scope : scope[constructor], args); + + function extract(callbackName) { + var atStartBracket = callbackName.indexOf('(') !== -1 ? callbackName.indexOf('(') : callbackName.length, + atEndBracket = callbackName.lastIndexOf(')') !== -1 ? callbackName.lastIndexOf(')') : callbackName.length, + args = callbackName.substring(atStartBracket + 1, atEndBracket), // matching function arguments inside brackets + constructor = callbackName.indexOf('.') !== -1 ? callbackName.substr(0, callbackName.indexOf('.')) : null; // matching a string upto a dot to check ctrl as syntax + constructor = scope[constructor] && typeof scope[constructor].constructor === 'function' ? constructor : null; + + return { + callback: callbackName.substring(constructor && constructor.length + 1 || 0, atStartBracket), + args: $.map(args && args.split(',') || [], function(item) { return [$parse(item)(scope)]; }), + constructor: constructor + } + } + }; + + this.invokeDrop = function ($draggable, $droppable, event, ui) { + var dragModel = '', + dropModel = '', + dragSettings = {}, + dropSettings = {}, + jqyoui_pos = null, + dragItem = {}, + dropItem = {}, + dragModelValue, + dropModelValue, + $droppableDraggable = null, + droppableScope = this.droppableScope, + draggableScope = this.draggableScope, + $helper = null, + promises = [], + temp; + + dragModel = $draggable.ngattr('ng-model'); + dropModel = $droppable.ngattr('ng-model'); + dragModelValue = draggableScope.$eval(dragModel); + dropModelValue = droppableScope.$eval(dropModel); + + $droppableDraggable = $droppable.find('[jqyoui-draggable]:last,[data-jqyoui-draggable]:last'); + dropSettings = droppableScope.$eval($droppable.attr('jqyoui-droppable') || $droppable.attr('data-jqyoui-droppable')) || []; + dragSettings = draggableScope.$eval($draggable.attr('jqyoui-draggable') || $draggable.attr('data-jqyoui-draggable')) || []; + + // Helps pick up the right item + dragSettings.index = this.fixIndex(draggableScope, dragSettings, dragModelValue); + dropSettings.index = this.fixIndex(droppableScope, dropSettings, dropModelValue); + + jqyoui_pos = angular.isArray(dragModelValue) ? dragSettings.index : null; + dragItem = angular.isArray(dragModelValue) ? dragModelValue[jqyoui_pos] : dragModelValue; + + if (dragSettings.deepCopy) { + dragItem = angular.copy(dragItem); + } + + if (angular.isArray(dropModelValue) && dropSettings && dropSettings.index !== undefined) { + dropItem = dropModelValue[dropSettings.index]; + } else if (!angular.isArray(dropModelValue)) { + dropItem = dropModelValue; + } else { + dropItem = {}; + } + + if (dropSettings.deepCopy) { + dropItem = angular.copy(dropItem); + } + + if (dragSettings.beforeDrop) { + promises.push(this.callEventCallback(draggableScope, dragSettings.beforeDrop, event, ui)); + } + + $q.all(promises).then(angular.bind(this, function() { + if (dragSettings.insertInline && dragModel === dropModel) { + if (dragSettings.index > dropSettings.index) { + temp = dragModelValue[dragSettings.index]; + for (var i = dragSettings.index; i > dropSettings.index; i--) { + dropModelValue[i] = angular.copy(dropModelValue[i - 1]); + dropModelValue[i - 1] = {}; + dropModelValue[i][dragSettings.direction] = 'left'; + } + dropModelValue[dropSettings.index] = temp; + } else { + temp = dragModelValue[dragSettings.index]; + for (var i = dragSettings.index; i < dropSettings.index; i++) { + dropModelValue[i] = angular.copy(dropModelValue[i + 1]); + dropModelValue[i + 1] = {}; + dropModelValue[i][dragSettings.direction] = 'right'; + } + dropModelValue[dropSettings.index] = temp; + } + this.callEventCallback(droppableScope, dropSettings.onDrop, event, ui); + } else if (dragSettings.animate === true) { + // be nice with absolutely positioned brethren :-) + $helper = $draggable.clone(); + $helper.css({'position': 'absolute'}).css($draggable.offset()); + $('body').append($helper); + $draggable.addClass('angular-dragdrop-hide'); + + this.move($helper, $droppableDraggable.length > 0 ? $droppableDraggable : $droppable, null, 'fast', dropSettings, function() { $helper.remove(); }); + this.move($droppableDraggable.length > 0 && !dropSettings.multiple ? $droppableDraggable : [], $draggable.parent('[jqyoui-droppable],[data-jqyoui-droppable]'), jqyoui.startXY, 'fast', dropSettings, angular.bind(this, function() { + $timeout(angular.bind(this, function() { + // Do not move this into move() to avoid flickering issue + $draggable.css({'position': 'relative', 'left': '', 'top': ''}).removeClass('angular-dragdrop-hide'); + // Angular v1.2 uses ng-hide to hide an element not display property + // so we've to manually remove display:none set in this.move() + $droppableDraggable.css({'position': 'relative', 'left': '', 'top': '', 'display': $droppableDraggable.css('display') === 'none' ? '' : $droppableDraggable.css('display')}); + + this.mutateDraggable(draggableScope, dropSettings, dragSettings, dragModel, dropModel, dropItem, $draggable); + this.mutateDroppable(droppableScope, dropSettings, dragSettings, dropModel, dragItem, jqyoui_pos); + this.callEventCallback(droppableScope, dropSettings.onDrop, event, ui); + })); + })); + } else { + $timeout(angular.bind(this, function() { + this.mutateDraggable(draggableScope, dropSettings, dragSettings, dragModel, dropModel, dropItem, $draggable); + this.mutateDroppable(droppableScope, dropSettings, dragSettings, dropModel, dragItem, jqyoui_pos); + this.callEventCallback(droppableScope, dropSettings.onDrop, event, ui); + })); + } + })).finally(angular.bind(this, function() { + this.restore($draggable); + })); + }; + + this.move = function($fromEl, $toEl, toPos, duration, dropSettings, callback) { + if ($fromEl.length === 0) { + if (callback) { + window.setTimeout(function() { + callback(); + }, 300); + } + return false; + } + + var zIndex = $fromEl.css('z-index'), + fromPos = $fromEl[dropSettings.containment || 'offset'](), + displayProperty = $toEl.css('display'), // sometimes `display` is other than `block` + hadNgHideCls = $toEl.hasClass('ng-hide'), + hadDNDHideCls = $toEl.hasClass('angular-dragdrop-hide'); + + if (toPos === null && $toEl.length > 0) { + if (($toEl.attr('jqyoui-draggable') || $toEl.attr('data-jqyoui-draggable')) !== undefined && $toEl.ngattr('ng-model') !== undefined && $toEl.is(':visible') && dropSettings && dropSettings.multiple) { + toPos = $toEl[dropSettings.containment || 'offset'](); + if (dropSettings.stack === false) { + toPos.left+= $toEl.outerWidth(true); + } else { + toPos.top+= $toEl.outerHeight(true); + } + } else { + // Angular v1.2 uses ng-hide to hide an element + // so we've to remove it in order to grab its position + if (hadNgHideCls) $toEl.removeClass('ng-hide'); + if (hadDNDHideCls) $toEl.removeClass('angular-dragdrop-hide'); + toPos = $toEl.css({'visibility': 'hidden', 'display': 'block'})[dropSettings.containment || 'offset'](); + $toEl.css({'visibility': '','display': displayProperty}); + } + } + + $fromEl.css({'position': 'absolute', 'z-index': 9999}) + .css(fromPos) + .animate(toPos, duration, function() { + // Angular v1.2 uses ng-hide to hide an element + // and as we remove it above, we've to put it back to + // hide the element (while swapping) if it was hidden already + // because we remove the display:none in this.invokeDrop() + if (hadNgHideCls) $toEl.addClass('ng-hide'); + if (hadDNDHideCls) $toEl.addClass('angular-dragdrop-hide'); + $fromEl.css('z-index', zIndex); + if (callback) callback(); + }); + }; + + this.mutateDroppable = function(scope, dropSettings, dragSettings, dropModel, dragItem, jqyoui_pos) { + var dropModelValue = scope.$eval(dropModel); + + scope.dndDragItem = dragItem; + + if (angular.isArray(dropModelValue)) { + if (dropSettings && dropSettings.index >= 0) { + dropModelValue[dropSettings.index] = dragItem; + } else { + dropModelValue.push(dragItem); + } + if (dragSettings && dragSettings.placeholder === true) { + dropModelValue[dropModelValue.length - 1]['jqyoui_pos'] = jqyoui_pos; + } + } else { + $parse(dropModel + ' = dndDragItem')(scope); + if (dragSettings && dragSettings.placeholder === true) { + dropModelValue['jqyoui_pos'] = jqyoui_pos; + } + } + }; + + this.mutateDraggable = function(scope, dropSettings, dragSettings, dragModel, dropModel, dropItem, $draggable) { + var isEmpty = angular.equals(dropItem, {}) || !dropItem, + dragModelValue = scope.$eval(dragModel); + + scope.dndDropItem = dropItem; + + if (dragSettings && dragSettings.placeholder) { + if (dragSettings.placeholder != 'keep'){ + if (angular.isArray(dragModelValue) && dragSettings.index !== undefined) { + dragModelValue[dragSettings.index] = dropItem; + } else { + $parse(dragModel + ' = dndDropItem')(scope); + } + } + } else { + if (angular.isArray(dragModelValue)) { + if (isEmpty) { + if (dragSettings && ( dragSettings.placeholder !== true && dragSettings.placeholder !== 'keep' )) { + dragModelValue.splice(dragSettings.index, 1); + } + } else { + dragModelValue[dragSettings.index] = dropItem; + } + } else { + // Fix: LIST(object) to LIST(array) - model does not get updated using just scope[dragModel] = {...} + // P.S.: Could not figure out why it happened + $parse(dragModel + ' = dndDropItem')(scope); + if (scope.$parent) { + $parse(dragModel + ' = dndDropItem')(scope.$parent); + } + } + } + + this.restore($draggable); + }; + + this.restore = function($draggable) { + $draggable.css({'z-index': '', 'left': '', 'top': ''}); + }; + + this.fixIndex = function(scope, settings, modelValue) { + if (settings.applyFilter && angular.isArray(modelValue) && modelValue.length > 0) { + var dragModelValueFiltered = scope[settings.applyFilter](), + lookup = dragModelValueFiltered[settings.index], + actualIndex = undefined; + + modelValue.forEach(function(item, i) { + if (angular.equals(item, lookup)) { + actualIndex = i; + } + }); + + return actualIndex; + } + + return settings.index; + }; + }]).directive('jqyouiDraggable', ['ngDragDropService', function(ngDragDropService) { + return { + require: '?jqyouiDroppable', + restrict: 'A', + link: function(scope, elem, attrs) { + var element = $(elem); + var dragSettings, jqyouiOptions, zIndex, killWatcher; + var updateDraggable = function(newValue, oldValue) { + if (newValue) { + dragSettings = scope.$eval(element.attr('jqyoui-draggable') || element.attr('data-jqyoui-draggable')) || {}; + jqyouiOptions = scope.$eval(attrs.jqyouiOptions) || {}; + element + .draggable({disabled: false}) + .draggable(jqyouiOptions) + .draggable({ + start: function(event, ui) { + ngDragDropService.draggableScope = scope; + zIndex = $(jqyouiOptions.helper ? ui.helper : this).css('z-index'); + $(jqyouiOptions.helper ? ui.helper : this).css('z-index', 9999); + jqyoui.startXY = $(this)[dragSettings.containment || 'offset'](); + ngDragDropService.callEventCallback(scope, dragSettings.onStart, event, ui); + }, + stop: function(event, ui) { + $(jqyouiOptions.helper ? ui.helper : this).css('z-index', zIndex); + ngDragDropService.callEventCallback(scope, dragSettings.onStop, event, ui); + }, + drag: function(event, ui) { + ngDragDropService.callEventCallback(scope, dragSettings.onDrag, event, ui); + } + }); + } else { + element.draggable({disabled: true}); + } + + if (killWatcher && angular.isDefined(newValue) && (angular.equals(attrs.drag, 'true') || angular.equals(attrs.drag, 'false'))) { + killWatcher(); + killWatcher = null; + } + }; + + killWatcher = scope.$watch(function() { return scope.$eval(attrs.drag); }, updateDraggable); + updateDraggable(); + + element.on('$destroy', function() { + element.draggable({disabled: true}).draggable('destroy'); + }); + } + }; + }]).directive('jqyouiDroppable', ['ngDragDropService', '$q', function(ngDragDropService, $q) { + return { + restrict: 'A', + priority: 1, + link: function(scope, elem, attrs) { + var element = $(elem); + var dropSettings, jqyouiOptions, killWatcher; + var updateDroppable = function(newValue, oldValue) { + if (newValue) { + dropSettings = scope.$eval($(element).attr('jqyoui-droppable') || $(element).attr('data-jqyoui-droppable')) || {}; + jqyouiOptions = scope.$eval(attrs.jqyouiOptions) || {}; + element + .droppable({disabled: false}) + .droppable(jqyouiOptions) + .droppable({ + over: function(event, ui) { + ngDragDropService.callEventCallback(scope, dropSettings.onOver, event, ui); + }, + out: function(event, ui) { + ngDragDropService.callEventCallback(scope, dropSettings.onOut, event, ui); + }, + drop: function(event, ui) { + var beforeDropPromise = null; + + if (dropSettings.beforeDrop) { + beforeDropPromise = ngDragDropService.callEventCallback(scope, dropSettings.beforeDrop, event, ui); + } else { + beforeDropPromise = (function() { + var deferred = $q.defer(); + deferred.resolve(); + return deferred.promise; + })(); + } + + beforeDropPromise.then(angular.bind(this, function() { + if ($(ui.draggable).ngattr('ng-model') && attrs.ngModel) { + ngDragDropService.droppableScope = scope; + ngDragDropService.invokeDrop($(ui.draggable), $(this), event, ui); + } else { + ngDragDropService.callEventCallback(scope, dropSettings.onDrop, event, ui); + } + }), function() { + ui.draggable.animate({left: '', top: ''}, jqyouiOptions.revertDuration || 0); + }); + } + }); + } else { + element.droppable({disabled: true}); + } + + if (killWatcher && angular.isDefined(newValue) && (angular.equals(attrs.drop, 'true') || angular.equals(attrs.drop, 'false'))) { + killWatcher(); + killWatcher = null; + } + }; + + killWatcher = scope.$watch(function() { return scope.$eval(attrs.drop); }, updateDroppable); + updateDroppable(); + + element.on('$destroy', function() { + element.droppable({disabled: true}).droppable('destroy'); + }); + } + }; + }]); + + $.fn.ngattr = function(name, value) { + var element = this[0]; + + return element.getAttribute(name) || element.getAttribute('data-' + name); + }; +})(window, window.angular, window.jQuery); diff --git a/dist/docs/grunt-scripts/angular-patternfly.js b/dist/docs/grunt-scripts/angular-patternfly.js index 0c084f2bd..99ce919eb 100644 --- a/dist/docs/grunt-scripts/angular-patternfly.js +++ b/dist/docs/grunt-scripts/angular-patternfly.js @@ -1,4 +1,12 @@ /** + * @name patternfly canvas + * + * @description + * Canvas module for patternfly. + * + */ +angular.module('patternfly.canvas', ['dragging', 'ngDragDrop', 'ui.bootstrap']); +;/** * @name patternfly card * * @description @@ -122,7 +130,7 @@ angular.module( 'patternfly.utils', ['ui.bootstrap'] ); * Views module for patternfly. * */ -angular.module('patternfly.views', ['patternfly.utils', 'patternfly.filters', 'patternfly.sort', 'patternfly.charts']); +angular.module('patternfly.views', ['patternfly.utils', 'patternfly.filters', 'patternfly.sort', 'patternfly.charts', 'dndLists']); ;/** * @name PatternFly Wizard * @@ -193,242 +201,2957 @@ angular.module('patternfly.autofocus', []).directive('pfFocused', ["$timeout", f } }; }]); -;/** - * @ngdoc directive - * @name patternfly.card.component:pfAggregateStatusCard - * @restrict E - * - * @param {object} status Status configuration information
    - * - * When layout='mini', only one notification can be specified:
    - * - * @param {boolean=} show-top-border Show/hide the top border, true shows top border, false (default) hides top border - * @param {string=} layout Various alternative layouts the aggregate status card may have:
    - * - * @deprecated {boolean=} alt-layout Display the aggregate status card in a 'alternate tall' layout. false (default) displays normal layout, true displays tall layout - * - * @description - * Component for easily displaying status information - * - * @example - +;(function () { + 'use strict'; - -
    -
    - - -
    - - -
    - - - -
    - - -
    - - (depreciated, use layout = 'tall' instead) -

    - -
    -
    -
    + angular.module('patternfly.canvas').component('pfCanvasEditor', { - - angular.module( 'patternfly.card' ).controller( 'CardDemoCtrl', function( $scope ) { - $scope.status = { - "title":"Nodes", - "count":793, - "href":"#", - "iconClass": "fa fa-shield", - "notifications":[ - { - "iconClass":"pficon pficon-error-circle-o", - "count":4, - "href":"#" - }, - { - "iconClass":"pficon pficon-warning-triangle-o", - "count":1 - } - ] - }; + bindings: { + chartDataModel: "=", + chartViewModel: "=?", + toolboxTabs: "=", + readOnly: 'ul").addClass('nav-tabs-pf'); + angular.element("#filterFld").focus(); + }); + }; + + ctrl.hideToolbox = function () { + ctrl.toolboxVisible = false; + }; + + ctrl.toggleToolbox = function () { + if (!ctrl.readOnly && !ctrl.chartViewModel.inConnectingMode) { + if (ctrl.toolboxVisible === true) { + ctrl.hideToolbox(); + } else { + ctrl.showToolbox(); + } } - }; - }); - + }; -
    - */ + ctrl.tabClicked = function () { + angular.element("#filterFld").focus(); + }; -angular.module( 'patternfly.card' ).component('pfAggregateStatusCard', { - bindings: { - status: '=', - showTopBorder: '@?', - altLayout: '@?', - layout: '@?' - }, - templateUrl: 'card/aggregate-status/aggregate-status-card.html', - controller: function () { - 'use strict'; - var ctrl = this; - ctrl.$onInit = function () { - ctrl.shouldShowTopBorder = (ctrl.showTopBorder === 'true'); - ctrl.isAltLayout = (ctrl.altLayout === 'true' || ctrl.layout === 'tall'); - ctrl.isMiniLayout = (ctrl.layout === 'mini'); - }; - } -}); -;/** - * @ngdoc directive - * @name patternfly.card.component:pfCard - Utilization - * @restrict E - * - * @param {string} headTitle Title for the card - * @param {string=} subTitle Sub-Title for the card - * @param {boolean=} showTopBorder Show/Hide the blue top border. True shows top border, false (default) hides top border - * @param {boolean=} showTitlesSeparator Show/Hide the grey line between the title and sub-title. - * True (default) shows the line, false hides the line - * @param {object=} footer footer configuration properties:
    - * - * *Note: If a href link and a callBackFn are specified, the href link will be called - * @param {object=} filter filter configuration properties:
    - * - * @description - * Component for easily displaying a card with html content - * - * @example - + /*** Toolbox ***/ - -
    - - - - - - - -
    -
    - - angular.module( 'demo', ['patternfly.charts', 'patternfly.card'] ).controller( 'ChartCtrl', function( $scope ) { + ctrl.startCallback = function (event, ui, item) { + ctrl.draggedItem = item; + }; - $scope.title2 = 'Memory'; - $scope.units2 = 'GB'; + ctrl.dropCallback = function (event, ui) { + var newNode = angular.copy(ctrl.draggedItem); + newNodeCount++; + newNode.x = event.clientX - 600; + newNode.y = event.clientY - 200; + newNode.backgroundColor = newNode.backgroundColor ? newNode.backgroundColor : '#fff'; - $scope.data2 = { - 'used': '25', - 'total': '100' - }; + ctrl.chartViewModel.addNode(newNode); + }; - $scope.title3 = 'CPU Usage'; - $scope.units3 = 'MHz'; + ctrl.addNodeByClick = function (item) { + var newNode = angular.copy(item); + newNodeCount++; + newNode.x = 250 + (newNodeCount * 4 + 160); + newNode.y = 200 + (newNodeCount * 4 + 160); + newNode.backgroundColor = newNode.backgroundColor ? newNode.backgroundColor : '#fff'; - $scope.data3 = { - 'used': '420', - 'total': '500', - }; + ctrl.chartViewModel.addNode(newNode); + }; - $scope.title4 = 'Disk Usage'; - $scope.units4 = 'TB'; - $scope.data4 = { - 'used': '350', - 'total': '500', - }; + ctrl.tabClicked = function () { + angular.element("#filterFld").focus(); + }; - $scope.title5 = 'Disk I/O'; - $scope.units5 = 'I/Ops'; - $scope.data5 = { - 'used': '450', - 'total': '500', - }; + ctrl.activeTab = function () { + return ctrl.toolboxTabs.filter(function (tab) { + return tab.active; + })[0]; + }; - $scope.layoutInline = { - 'type': 'inline' - }; - }); - -
    - */ -angular.module('patternfly.card').component('pfCard', { + ctrl.activeSubTab = function () { + var activeTab = ctrl.activeTab(); + if (activeTab && activeTab.subtabs) { + return activeTab.subtabs.filter(function (subtab) { + return subtab.active; + })[0]; + } + }; + + ctrl.activeSubSubTab = function () { + var activeSubTab = ctrl.activeSubTab(); + if (activeSubTab && activeSubTab.subtabs) { + return activeSubTab.subtabs.filter(function (subsubtab) { + return subsubtab.active; + })[0]; + } + }; + + /*** Zoom ***/ + + ctrl.maxZoom = function () { + if (ctrl.chartViewModel && ctrl.chartViewModel.zoom) { + return ctrl.chartViewModel.zoom.isMax(); + } + + return false; + }; + + ctrl.minZoom = function () { + if (ctrl.chartViewModel && ctrl.chartViewModel.zoom) { + return ctrl.chartViewModel.zoom.isMin(); + } + + return false; + }; + + ctrl.zoomIn = function () { + ctrl.chartViewModel.zoom.in(); + }; + + ctrl.zoomOut = function () { + ctrl.chartViewModel.zoom.out(); + }; + }] // controller + }); // module +})(); +;/* eslint-disable */ +(function() { + 'use strict'; + + angular.module('patternfly.canvas') + .directive('toolboxItems', toolboxItemsDirective); + + function toolboxItemsDirective() { + var directive = { + restrict: 'E', + scope: { + items: '=', + startDragCallback: '=', + clickCallback: '=', + searchText: '=' + }, + controller: toolboxItemsController, + templateUrl: 'canvas-view/canvas-editor/toolbox-items.html', + controllerAs: 'vm', + bindToController: true + }; + + return directive; + + function toolboxItemsController() { + var vm = this; + + vm.clickCallbackfmDir = function(item) { + if (!item.disableInToolbox) { + vm.clickCallback(item); + } + }; + + vm.startDragCallbackfmDir = function(event, ui, item) { + vm.startDragCallback(event, ui, item); + }; + } + } +})(); +;(function () { + 'use strict'; + + angular.module('patternfly.canvas') + .filter('trustAsResourceUrl', ['$sce', function ($sce) { + return function (val) { + return $sce.trustAsResourceUrl(val); + }; + }]) + + // + // Directive that generates the rendered chart from the data model. + // + .directive('pfCanvas', ["$document", function ($document) { + return { + restrict: 'E', + templateUrl: "canvas-view/canvas/canvas.html", + replace: true, + scope: { + chartDataModel: "=", + chartViewModel: "=?", + readOnly: "=?", + hideConnectors: "=?" + }, + controller: 'CanvasController', + link: link + }; + function link (scope) { + var deleteKeyCode = 46; + var ctrlKeyCode = 17; + var ctrlDown = false; + var aKeyCode = 65; + var dKeyCode = 68; + var escKeyCode = 27; + + $document.find('body').keydown(function (evt) { + if (evt.keyCode === ctrlKeyCode) { + ctrlDown = true; + evt.stopPropagation(); + evt.preventDefault(); + } + + if (evt.keyCode === aKeyCode && ctrlDown) { + // + // Ctrl + A + // + scope.selectAll(); + scope.$digest(); + evt.stopPropagation(); + evt.preventDefault(); + } + }); + + $document.find('body').keyup(function (evt) { + if (evt.keyCode === deleteKeyCode) { + scope.deleteSelected(); + scope.$digest(); + } + + if (evt.keyCode === escKeyCode) { + scope.deselectAll(); + scope.$digest(); + } + + if (evt.keyCode === ctrlKeyCode) { + ctrlDown = false; + evt.stopPropagation(); + evt.preventDefault(); + } + }); + } + }]) + // + // Controller for the canvas directive. + // Having a separate controller is better for unit testing, otherwise + // it is painful to unit test a directive without instantiating the DOM + // (which is possible, just not ideal). + // + .controller('CanvasController', ['$scope', 'dragging', '$element', '$document', function CanvasController ($scope, dragging, $element, $document) { + var controller = this; + + $scope.chart = new pfCanvas.ChartViewModel($scope.chartDataModel); + $scope.chartViewModel = $scope.chart; + // + // Reference to the document and jQuery, can be overridden for testting. + // + this.document = document; + + // + // Wrap jQuery so it can easily be mocked for testing. + // + this.jQuery = function (element) { + return angular.element(element); + }; + + // + // Init data-model variables. + // + $scope.draggingConnection = false; + $scope.connectorSize = 6; + $scope.dragSelecting = false; + + // + // Reference to the connection, connector or node that the mouse is currently over. + // + $scope.mouseOverConnector = null; + $scope.mouseOverConnection = null; + $scope.mouseOverNode = null; + + // + // The class for connections and connectors. + // + this.connectionClass = 'connection'; + this.connectorClass = 'connector'; + this.nodeClass = 'node'; + + // + // Translate the coordinates so they are relative to the svg element. + // + this.translateCoordinates = function (x, y, evt) { + var svgElem = $element.get(0); + var matrix = svgElem.getScreenCTM(); + var point = svgElem.createSVGPoint(); + point.x = (x - evt.view.pageXOffset) / $scope.zoomLevel(); + point.y = (y - evt.view.pageYOffset) / $scope.zoomLevel(); + + return point.matrixTransform(matrix.inverse()); + }; + + $scope.hideConnectors = $scope.hideConnectors ? $scope.hideConnectors : false; + + $scope.isConnectorConnected = function (connector) { + return (connector && connector.connected()); + }; + + $scope.isConnectorUnconnectedAndValid = function (connector) { + return (connector && !connector.connected() && !connector.invalid() && + connector.parentNode() !== $scope.connectingModeSourceNode); + }; + + // determins if a dest. connector is connected to the source node + $scope.isConnectedTo = function (connector, node) { + var i,connection; + var connections = $scope.chart.connections; + for (i = 0; i < connections.length; i++) { + connection = connections[i]; + if (connection.dest === connector && connection.source.parentNode() === node) { + return true; + } + } + + return false; + }; + + $scope.availableConnections = function () { + return $scope.chart.validConnections; + }; + + $scope.foreignObjectSupported = function () { + return $document[0].implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Extensibility', '1.1'); + }; + + $scope.addNodeToCanvas = function (newNode) { + $scope.chart.addNode(newNode); + }; + + $scope.$on('selectAll', function (evt, args) { + $scope.selectAll(); + }); + + $scope.selectAll = function () { + $scope.chart.selectAll(); + }; + + $scope.$on('deselectAll', function (evt, args) { + $scope.deselectAll(); + }); + + $scope.deselectAll = function () { + $scope.chart.deselectAll(); + }; + + $scope.$on('deleteSelected', function (evt, args) { + $scope.deleteSelected(); + }); + + $scope.deleteSelected = function () { + $scope.chart.deleteSelected(); + }; + + // + // Called on mouse down in the chart. + // + $scope.mouseDown = function (evt) { + if ($scope.readOnly) { + return; + } + + if ($scope.chart.inConnectingMode ) { + // camceling out of connection mode, remove unused output connector + $scope.cancelConnectingMode(); + } + + $scope.chart.deselectAll(); + + $scope.chart.clickedOnChart = true; + + dragging.startDrag(evt, { + + // + // Commence dragging... setup variables to display the drag selection rect. + // + dragStarted: function (x, y) { + var startPoint; + $scope.dragSelecting = true; + startPoint = controller.translateCoordinates(x, y, evt); + $scope.dragSelectionStartPoint = startPoint; + $scope.dragSelectionRect = { + x: startPoint.x, + y: startPoint.y, + width: 0, + height: 0, + }; + }, + + // + // Update the drag selection rect while dragging continues. + // + dragging: function (x, y) { + var startPoint = $scope.dragSelectionStartPoint; + var curPoint = controller.translateCoordinates(x, y, evt); + + $scope.dragSelectionRect = { + x: curPoint.x > startPoint.x ? startPoint.x : curPoint.x, + y: curPoint.y > startPoint.y ? startPoint.y : curPoint.y, + width: curPoint.x > startPoint.x ? curPoint.x - startPoint.x : startPoint.x - curPoint.x, + height: curPoint.y > startPoint.y ? curPoint.y - startPoint.y : startPoint.y - curPoint.y, + }; + }, + + // + // Dragging has ended... select all that are within the drag selection rect. + // + dragEnded: function () { + $scope.dragSelecting = false; + $scope.chart.applySelectionRect($scope.dragSelectionRect); + delete $scope.dragSelectionStartPoint; + delete $scope.dragSelectionRect; + }, + }); + }; + + // + // Handle nodeMouseOver on an node. + // + $scope.nodeMouseOver = function (evt, node) { + if (!$scope.readOnly) { + $scope.mouseOverNode = node; + } + }; + + // + // Handle nodeMouseLeave on an node. + // + $scope.nodeMouseLeave = function (evt, node) { + $scope.mouseOverNode = null; + }; + + // + // Handle mousedown on a node. + // + $scope.nodeMouseDown = function (evt, node) { + var chart = $scope.chart; + var lastMouseCoords; + + if ($scope.readOnly) { + return; + } + + dragging.startDrag(evt, { + + // + // Node dragging has commenced. + // + dragStarted: function (x, y) { + lastMouseCoords = controller.translateCoordinates(x, y, evt); + + // + // If nothing is selected when dragging starts, + // at least select the node we are dragging. + // + if (!node.selected()) { + chart.deselectAll(); + node.select(); + } + }, + + // + // Dragging selected nodes... update their x,y coordinates. + // + dragging: function (x, y) { + var curCoords = controller.translateCoordinates(x, y, evt); + var deltaX = curCoords.x - lastMouseCoords.x; + var deltaY = curCoords.y - lastMouseCoords.y; + + chart.updateSelectedNodesLocation(deltaX, deltaY); + + lastMouseCoords = curCoords; + }, + + // + // The node wasn't dragged... it was clicked. + // + clicked: function () { + chart.handleNodeClicked(node, evt.ctrlKey); + }, + + }); + }; + + // + // Listen for node action + // + $scope.$on('nodeActionClicked', function (evt, args) { + var action = args.action; + var node = args.node; + + if (action === 'nodeActionConnect') { + $scope.startConnectingMode(node); + } + }); + + $scope.$on('nodeActionClosed', function () { + $scope.mouseOverNode = null; + }); + + $scope.connectingModeOutputConnector = null; + $scope.connectingModeSourceNode = null; + + $scope.startConnectingMode = function (node) { + $scope.chart.inConnectingMode = true; + $scope.hideConnectors = false; + $scope.connectingModeSourceNode = node; + $scope.connectingModeSourceNode.select(); + $scope.connectingModeOutputConnector = node.getOutputConnector(); + $scope.chart.updateValidNodesAndConnectors($scope.connectingModeSourceNode); + }; + + $scope.cancelConnectingMode = function () { + // if output connector not connected to something, remove it + if (!$scope.connectingModeOutputConnector.connected()) { + $scope.chart.removeOutputConnector($scope.connectingModeOutputConnector); + } + $scope.stopConnectingMode(); + }; + + $scope.stopConnectingMode = function () { + $scope.chart.inConnectingMode = false; + $scope.chart.resetValidNodesAndConnectors(); + }; + + // + // Handle connectionMouseOver on an connection. + // + $scope.connectionMouseOver = function (evt, connection) { + if (!$scope.draggingConnection && !$scope.readOnly) { // Only allow 'connection mouse over' when not dragging out a connection. + $scope.mouseOverConnection = connection; + } + }; + + // + // Handle connectionMouseLeave on an connection. + // + $scope.connectionMouseLeave = function (evt, connection) { + $scope.mouseOverConnection = null; + }; + + // + // Handle mousedown on a connection. + // + $scope.connectionMouseDown = function (evt, connection) { + var chart = $scope.chart; + if (!$scope.readOnly) { + chart.handleConnectionMouseDown(connection, evt.ctrlKey); + } + // Don't let the chart handle the mouse down. + evt.stopPropagation(); + evt.preventDefault(); + }; + + // + // Handle connectorMouseOver on an connector. + // + $scope.connectorMouseOver = function (evt, node, connector, connectorIndex, isInputConnector) { + if (!$scope.readOnly) { + $scope.mouseOverConnector = connector; + } + }; + + // + // Handle connectorMouseLeave on an connector. + // + $scope.connectorMouseLeave = function (evt, node, connector, connectorIndex, isInputConnector) { + $scope.mouseOverConnector = null; + }; + + // + // Handle mousedown on an input connector. + // + $scope.connectorMouseDown = function (evt, node, connector, connectorIndex, isInputConnector) { + if ($scope.chart.inConnectingMode && node !== $scope.connectingModeSourceNode) { + $scope.chart.createNewConnection($scope.connectingModeOutputConnector, $scope.mouseOverConnector); + $scope.stopConnectingMode(); + } + }; + + // + // zoom. + // + $scope.$on('zoomIn', function (evt, args) { + $scope.chart.zoom.in(); + }); + + $scope.$on('zoomOut', function (evt, args) { + $scope.chart.zoom.out(); + }); + + $scope.maxZoom = function () { + return ($scope.chart.chartViewModel && $scope.chart.chartViewModel.zoom) ? $scope.chart.chartViewModel.zoom.isMax() : false; + }; + $scope.minZoom = function () { + return ($scope.chart.chartViewModel && $scope.chart.chartViewModel.zoom) ? $scope.chart.chartViewModel.zoom.isMin() : false; + }; + + $scope.zoomLevel = function () { + return $scope.chart.zoom.getLevel(); + }; + } + ]); +})(); +;/* eslint-disable */ +// +// Global accessor. +// +var pfCanvas = {}; + +// Module. +(function() { + // + // Height of flow chart. + // + pfCanvas.defaultHeight = 756; + + // + // Width of flow chart. + // + pfCanvas.defaultWidth = 1396; + + pfCanvas.defaultBgImageSize = 24; + + // + // Width of a node. + // + pfCanvas.defaultNodeWidth = 150; + + // + // Height of a node. + // + pfCanvas.defaultNodeHeight = 150; + + // + // Amount of space reserved for displaying the node's name. + // + pfCanvas.nodeNameHeight = 40; + + // + // Height of a connector in a node. + // + pfCanvas.connectorHeight = 25; + + // + // Compute the Y coordinate of a connector, given its index. + // + pfCanvas.computeConnectorY = function(connectorIndex) { + return pfCanvas.defaultNodeHeight / 2 + connectorIndex * pfCanvas.connectorHeight; + }; + + // + // Compute the position of a connector in the graph. + // + pfCanvas.computeConnectorPos = function(node, connectorIndex, inputConnector) { + return { + x: node.x() + (inputConnector ? 0 : node.width ? node.width() : pfCanvas.defaultNodeWidth), + y: node.y() + pfCanvas.computeConnectorY(connectorIndex), + }; + }; + + // + // View model for a connector. + // + pfCanvas.ConnectorViewModel = function(connectorDataModel, x, y, parentNode) { + this.data = connectorDataModel; + + this._parentNode = parentNode; + this._x = x; + this._y = y; + + // + // The name of the connector. + // + this.name = function() { + return this.data.name; + }; + + // + // X coordinate of the connector. + // + this.x = function() { + return this._x; + }; + + // + // Y coordinate of the connector. + // + this.y = function() { + return this._y; + }; + + // + // The parent node that the connector is attached to. + // + this.parentNode = function() { + return this._parentNode; + }; + + // + // Is this connector connected? + // + this.connected = function() { + return this.data.connected; + }; + + // + // set connector connected + // + this.setConnected = function(value) { + this.data.connected = value; + }; + + // + // Is this connector invalid for a connecton? + // + this.invalid = function() { + return this.data.invalid; + }; + + // + // set connector invalid + // + this.setInvalid = function(value) { + this.data.invalid = value; + }; + + // + // Font Family for the the node. + // + this.fontFamily = function() { + return this.data.fontFamily || ""; + }; + + // + // Font Content for the the node. + // + this.fontContent = function() { + return this.data.fontContent || ""; + }; + }; + + // + // Create view model for a list of data models. + // + var createConnectorsViewModel = function(connectorDataModels, x, parentNode) { + var viewModels = []; + + if (connectorDataModels) { + for (var i = 0; i < connectorDataModels.length; ++i) { + var connectorViewModel = new pfCanvas.ConnectorViewModel(connectorDataModels[i], x, pfCanvas.computeConnectorY(i), parentNode); + viewModels.push(connectorViewModel); + } + } + + return viewModels; + }; + + // + // View model for a node. + // + pfCanvas.NodeViewModel = function(nodeDataModel) { + this.data = nodeDataModel; + + // set the default width value of the node + if (!this.data.width || this.data.width < 0) { + this.data.width = pfCanvas.defaultNodeWidth; + } + this.inputConnectors = createConnectorsViewModel(this.data.inputConnectors, 0, this); + this.outputConnectors = createConnectorsViewModel(this.data.outputConnectors, this.data.width, this); + + // Set to true when the node is selected. + this._selected = false; + + // + // Name of the node. + // + this.name = function() { + return this.data.name || ""; + }; + + // + // id of the node. + // + this.id = function() { + return this.data.id || -1; + }; + + // + // Image for the the node. + // + this.image = function() { + return this.data.image || ""; + }; + + // + // Icon for the the node. + // + this.icon = function() { + return this.data.icon || ""; + }; + + // + // Is node a bundle + // + this.bundle = function() { + return this.data.bundle || ""; + }; + + // + // background color for the node. + // + this.backgroundColor = function() { + return this.data.backgroundColor; + }; + + // + // X coordinate of the node. + // + this.x = function() { + return this.data.x; + }; + + // + // Y coordinate of the node. + // + this.y = function() { + return this.data.y; + }; + + // + // Width of the node. + // + this.width = function() { + return this.data.width; + }; + + // + // Font Family for the the node. + // + this.fontFamily = function() { + return this.data.fontFamily || ""; + }; + + // + // Font size for the the icon + // + this.fontSize = function() { + return this.data.fontSize || ""; + }; + + // + // Font Content for the the node. + // + this.fontContent = function() { + return this.data.fontContent || ""; + }; + + // + // Returns valid connection types for the node. + // + this.validConnectionTypes = function() { + return this.data.validConnectionTypes || []; + }; + + // + // Is this node valid for current connection? + // + this.invalid = function() { + return this.data.invalid; + }; + + // + // set node valid + // + this.setInvalid = function(value) { + this.data.invalid = value; + }; + + // + // Height of the node. + // + this.height = function() { + /* + var numConnectors = + Math.max( + this.inputConnectors.length, + this.outputConnectors.length); + + return pfCanvas.computeConnectorY(numConnectors); + */ + + return pfCanvas.defaultNodeHeight; + }; + + // + // Select the node. + // + this.select = function() { + this._selected = true; + }; + + // + // Deselect the node. + // + this.deselect = function() { + this._selected = false; + }; + + // + // Toggle the selection state of the node. + // + this.toggleSelected = function() { + this._selected = !this._selected; + }; + + // + // Returns true if the node is selected. + // + this.selected = function() { + return this._selected; + }; + + // + // Internal function to add a connector. + this._addConnector = function(connectorDataModel, x, connectorsDataModel, connectorsViewModel) { + var connectorViewModel = new pfCanvas.ConnectorViewModel(connectorDataModel, x, + pfCanvas.computeConnectorY(connectorsViewModel.length), this); + + connectorsDataModel.push(connectorDataModel); + + // Add to node's view model. + connectorsViewModel.push(connectorViewModel); + + return connectorViewModel; + }; + + // + // Internal function to remove a connector. + this._removeConnector = function(connectorDataModel, connectorsDataModel, connectorsViewModel) { + var connectorIndex = connectorsDataModel.indexOf(connectorDataModel); + connectorsDataModel.splice(connectorIndex, 1); + connectorsViewModel.splice(connectorIndex, 1); + }; + + // + // Add an input connector to the node. + // + this.addInputConnector = function(connectorDataModel) { + if (!this.data.inputConnectors) { + this.data.inputConnectors = []; + } + this._addConnector(connectorDataModel, 0, this.data.inputConnectors, this.inputConnectors); + }; + + // + // Get the single ouput connector for the node. + // + this.getOutputConnector = function() { + if (!this.data.outputConnectors) { + this.data.outputConnectors = []; + } + + if (this.data.outputConnectors.length === 0) { + var connectorDataModel = {name: 'out'}; + + return this._addConnector(connectorDataModel, this.data.width, this.data.outputConnectors, this.outputConnectors); + } else { + return this.outputConnectors[0]; + } + }; + + // + // Remove an ouput connector from the node. + // + this.removeOutputConnector = function(connectorDataModel) { + if (this.data.outputConnectors) { + this._removeConnector(connectorDataModel, this.data.outputConnectors, this.outputConnectors); + } + }; + + this.tags = function() { + return this.data.tags; + }; + }; + + // + // Wrap the nodes data-model in a view-model. + // + var createNodesViewModel = function(nodesDataModel) { + var nodesViewModel = []; + + if (nodesDataModel) { + for (var i = 0; i < nodesDataModel.length; ++i) { + nodesViewModel.push(new pfCanvas.NodeViewModel(nodesDataModel[i])); + } + } + + return nodesViewModel; + }; + + // + // View model for a node action. + // + pfCanvas.NodeActionViewModel = function(nodeActionDataModel) { + this.data = nodeActionDataModel; + + // + // id of the node action. + // + this.id = function() { + return this.data.id || ""; + }; + + // + // Name of the node action. + // + this.name = function() { + return this.data.name || ""; + }; + + // + // Font Family for the the node. + // + this.iconClass = function() { + return this.data.iconClass || ""; + }; + + // + // Font Content for the the node. + // + this.action = function() { + return this.data.action || ""; + }; + }; + + // + // Wrap the node actions data-model in a view-model. + // + var createNodeActionsViewModel = function(nodeActionsDataModel) { + var nodeActionsViewModel = []; + + if (nodeActionsDataModel) { + for (var i = 0; i < nodeActionsDataModel.length; ++i) { + nodeActionsViewModel.push(new pfCanvas.NodeActionViewModel(nodeActionsDataModel[i])); + } + } + + return nodeActionsViewModel; + }; + + // + // View model for a connection. + // + pfCanvas.ConnectionViewModel = function(connectionDataModel, sourceConnector, destConnector) { + this.data = connectionDataModel; + this.source = sourceConnector; + this.dest = destConnector; + + // Set to true when the connection is selected. + this._selected = false; + + this.name = function() { + return destConnector.name() || ""; + }; + + this.sourceCoordX = function() { + return this.source.parentNode().x() + this.source.x(); + }; + + this.sourceCoordY = function() { + return this.source.parentNode().y() + this.source.y(); + }; + + this.sourceCoord = function() { + return { + x: this.sourceCoordX(), + y: this.sourceCoordY(), + }; + }; + + this.sourceTangentX = function() { + return pfCanvas.computeConnectionSourceTangentX(this.sourceCoord(), this.destCoord()); + }; + + this.sourceTangentY = function() { + return pfCanvas.computeConnectionSourceTangentY(this.sourceCoord(), this.destCoord()); + }; + + this.destCoordX = function() { + return this.dest.parentNode().x() + this.dest.x(); + }; + + this.destCoordY = function() { + return this.dest.parentNode().y() + this.dest.y(); + }; + + this.destCoord = function() { + return { + x: this.destCoordX(), + y: this.destCoordY(), + }; + }; + + this.destTangentX = function() { + return pfCanvas.computeConnectionDestTangentX(this.sourceCoord(), this.destCoord()); + }; + + this.destTangentY = function() { + return pfCanvas.computeConnectionDestTangentY(this.sourceCoord(), this.destCoord()); + }; + + this.middleX = function(scale) { + if (angular.isUndefined(scale)) { + scale = 0.5; + } + + return this.sourceCoordX() * (1 - scale) + this.destCoordX() * scale; + }; + + this.middleY = function(scale) { + if (angular.isUndefined(scale)) { + scale = 0.5; + } + + return this.sourceCoordY() * (1 - scale) + this.destCoordY() * scale; + }; + + // + // Select the connection. + // + this.select = function() { + this._selected = true; + }; + + // + // Deselect the connection. + // + this.deselect = function() { + this._selected = false; + }; + + // + // Toggle the selection state of the connection. + // + this.toggleSelected = function() { + this._selected = !this._selected; + }; + + // + // Returns true if the connection is selected. + // + this.selected = function() { + return this._selected; + }; + }; + + // + // Helper function. + // + var computeConnectionTangentOffset = function(pt1, pt2) { + return (pt2.x - pt1.x) / 2; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionSourceTangentX = function(pt1, pt2) { + return pt1.x + computeConnectionTangentOffset(pt1, pt2); + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionSourceTangentY = function(pt1, pt2) { + return pt1.y; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionSourceTangent = function(pt1, pt2) { + return { + x: pfCanvas.computeConnectionSourceTangentX(pt1, pt2), + y: pfCanvas.computeConnectionSourceTangentY(pt1, pt2), + }; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionDestTangentX = function(pt1, pt2) { + return pt2.x - computeConnectionTangentOffset(pt1, pt2); + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionDestTangentY = function(pt1, pt2) { + return pt2.y; + }; + + // + // Compute the tangent for the bezier curve. + // + pfCanvas.computeConnectionDestTangent = function(pt1, pt2) { + return { + x: pfCanvas.computeConnectionDestTangentX(pt1, pt2), + y: pfCanvas.computeConnectionDestTangentY(pt1, pt2), + }; + }; + + // + // View model for the chart. + // + pfCanvas.ChartViewModel = function(chartDataModel) { + // + // Find a specific node within the chart. + // + this.findNode = function(nodeID) { + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + if (node.data.id === nodeID) { + return node; + } + } + + throw new Error("Failed to find node " + nodeID); + }; + + // + // Find a specific input connector within the chart. + // + this.findInputConnector = function(nodeID, connectorIndex) { + var node = this.findNode(nodeID); + + if (!node.inputConnectors || node.inputConnectors.length <= connectorIndex) { + throw new Error("Node " + nodeID + " has invalid input connectors."); + } + + return node.inputConnectors[connectorIndex]; + }; + + // + // Find a specific output connector within the chart. + // + this.findOutputConnector = function(nodeID, connectorIndex) { + var node = this.findNode(nodeID); + + /*if (!node.outputConnectors || node.outputConnectors.length < connectorIndex) { + throw new Error("Node " + nodeID + " has invalid output connectors."); + } + + return node.outputConnectors[connectorIndex];*/ + return node.getOutputConnector(); + }; + + // + // Create a view model for connection from the data model. + // + this._createConnectionViewModel = function(connectionDataModel) { + var sourceConnector = this.findOutputConnector(connectionDataModel.source.nodeID, connectionDataModel.source.connectorIndex); + var destConnector = this.findInputConnector(connectionDataModel.dest.nodeID, connectionDataModel.dest.connectorIndex); + + sourceConnector.setConnected(true); + destConnector.setConnected(true); + return new pfCanvas.ConnectionViewModel(connectionDataModel, sourceConnector, destConnector); + }; + + // + // Wrap the connections data-model in a view-model. + // + this._createConnectionsViewModel = function(connectionsDataModel) { + var connectionsViewModel = []; + + if (connectionsDataModel) { + for (var i = 0; i < connectionsDataModel.length; ++i) { + connectionsViewModel.push(this._createConnectionViewModel(connectionsDataModel[i])); + } + } + + return connectionsViewModel; + }; + + // Reference to the underlying data. + this.data = chartDataModel; + + // Create a view-model for nodes. + this.nodes = createNodesViewModel(this.data.nodes); + + // Create a view-model for nodes. + this.nodeActions = createNodeActionsViewModel(this.data.nodeActions); + + // Create a view-model for connections. + this.connections = this._createConnectionsViewModel(this.data.connections); + + // Are there any valid connections (used in connection mode) ? + this.validConnections = true; + + // Create a view-model for zoom. + this.zoom = new pfCanvas.ZoomViewModel(); + + // Flag to indicate in connecting mode + this.inConnectingMode = false; + + // Flag to indicate whether the chart was just clicked on. + this.clickedOnChart = false; + + // + // Create a view model for a new connection. + // + this.createNewConnection = function(startConnector, endConnector) { + var connectionsDataModel = this.data.connections; + if (!connectionsDataModel) { + connectionsDataModel = this.data.connections = []; + } + + var connectionsViewModel = this.connections; + if (!connectionsViewModel) { + connectionsViewModel = this.connections = []; + } + + var startNode = startConnector.parentNode(); + var startConnectorIndex = startNode.outputConnectors.indexOf(startConnector); + startConnector = startNode.outputConnectors[startConnectorIndex]; + var startConnectorType = 'output'; + if (startConnectorIndex === -1) { + startConnectorIndex = startNode.inputConnectors.indexOf(startConnector); + startConnectorType = 'input'; + if (startConnectorIndex === -1) { + throw new Error("Failed to find source connector within either inputConnectors or outputConnectors of source node."); + } + } + + var endNode = endConnector.parentNode(); + var endConnectorIndex = endNode.inputConnectors.indexOf(endConnector); + endConnector = endNode.inputConnectors[endConnectorIndex]; + var endConnectorType = 'input'; + if (endConnectorIndex === -1) { + endConnectorIndex = endNode.outputConnectors.indexOf(endConnector); + endConnectorType = 'output'; + if (endConnectorIndex === -1) { + throw new Error("Failed to find dest connector within inputConnectors or outputConnectors of dest node."); + } + } + + if (startConnectorType === endConnectorType) { + throw new Error("Failed to create connection. Only output to input connections are allowed."); + } + + if (startNode === endNode) { + throw new Error("Failed to create connection. Cannot link a node with itself."); + } + + startNode = { + nodeID: startNode.data.id, + connectorIndex: startConnectorIndex, + }; + + endNode = { + nodeID: endNode.data.id, + connectorIndex: endConnectorIndex, + }; + + var connectionDataModel = { + source: startConnectorType === 'output' ? startNode : endNode, + dest: startConnectorType === 'output' ? endNode : startNode, + }; + connectionsDataModel.push(connectionDataModel); + + var outputConnector = startConnectorType === 'output' ? startConnector : endConnector; + var inputConnector = startConnectorType === 'output' ? endConnector : startConnector; + + var connectionViewModel = new pfCanvas.ConnectionViewModel(connectionDataModel, outputConnector, inputConnector); + connectionsViewModel.push(connectionViewModel); + + startConnector.setConnected(true); + endConnector.setConnected(true); + }; + + // + // Add a node to the view model. + // + this.addNode = function(nodeDataModel) { + if (!this.data.nodes) { + this.data.nodes = []; + } + + // + // Update the data model. + // + this.data.nodes.push(nodeDataModel); + + // + // Update the view model. + // + this.nodes.push(new pfCanvas.NodeViewModel(nodeDataModel)); + }; + + // + // Select all nodes and connections in the chart. + // + this.selectAll = function() { + var nodes = this.nodes; + for (var i = 0; i < nodes.length; ++i) { + var node = nodes[i]; + node.select(); + } + + var connections = this.connections; + for (i = 0; i < connections.length; ++i) { + var connection = connections[i]; + connection.select(); + } + }; + + // + // Deselect all nodes and connections in the chart. + // + this.deselectAll = function() { + var nodes = this.nodes; + for (var i = 0; i < nodes.length; ++i) { + var node = nodes[i]; + node.deselect(); + // close any/all open toolbar dialogs + node.toolbarDlgOpen = false; + } + + var connections = this.connections; + for (i = 0; i < connections.length; ++i) { + var connection = connections[i]; + connection.deselect(); + } + }; + + // + // Mark nodes & connectors as valid/invalid based on source node's + // valid connection types + // + this.updateValidNodesAndConnectors = function(sourceNode) { + this.validConnections = false; + var validConnectionTypes = sourceNode.validConnectionTypes(); + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + node.setInvalid(true); + for (var c = 0; c < node.inputConnectors.length; c++) { + var inputConnector = node.inputConnectors[c]; + inputConnector.setInvalid(validConnectionTypes.indexOf(inputConnector.data.type) === -1); + if (!inputConnector.invalid() && node !== sourceNode && !inputConnector.connected()) { + node.setInvalid(false); + this.validConnections = true; + } + } + } + }; + + // + // Mark nodes & connectors as valid + // + this.resetValidNodesAndConnectors = function() { + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + node.setInvalid(false); + for (var c = 0; c < node.inputConnectors.length; c++) { + var inputConnector = node.inputConnectors[c]; + inputConnector.setInvalid(false); + } + } + }; + + this.removeOutputConnector = function(connectorViewModel) { + var parentNode = connectorViewModel.parentNode(); + parentNode.removeOutputConnector(connectorViewModel.data); + }; + + // + // Update the location of the node and its connectors. + // + this.updateSelectedNodesLocation = function(deltaX, deltaY) { + var selectedNodes = this.getSelectedNodes(); + + for (var i = 0; i < selectedNodes.length; ++i) { + var node = selectedNodes[i]; + node.data.x += deltaX; + node.data.y += deltaY; + } + }; + + // + // Handle mouse click on a particular node. + // + this.handleNodeClicked = function(node, ctrlKey) { + if (ctrlKey) { + node.toggleSelected(); + } else { + this.deselectAll(); + node.select(); + } + + // Move node to the end of the list so it is rendered after all the other. + // This is the way Z-order is done in SVG. + + var nodeIndex = this.nodes.indexOf(node); + if (nodeIndex === -1) { + throw new Error("Failed to find node in view model!"); + } + this.nodes.splice(nodeIndex, 1); + this.nodes.push(node); + }; + + // + // Handle mouse down on a connection. + // + this.handleConnectionMouseDown = function(connection, ctrlKey) { + if (ctrlKey) { + connection.toggleSelected(); + } else { + this.deselectAll(); + connection.select(); + } + }; + + // + // Delete all nodes and connections that are selected. + // + this.duplicateSelectedNode = function() { + var duplicatedNode = angular.copy(this.getSelectedNodes()[0]); + delete duplicatedNode.data.outputConnectors; + return duplicatedNode.data; + }; + + // + // Delete all nodes and connections that are selected. + // + this.deleteSelected = function() { + var newNodeViewModels = []; + var newNodeDataModels = []; + + var deletedNodeIds = []; + + // + /* Sort nodes into: + * nodes to keep and + * nodes to delete. + */ + + for (var nodeIndex = 0; nodeIndex < this.nodes.length; ++nodeIndex) { + var node = this.nodes[nodeIndex]; + if (!node.selected()) { + // Only retain non-selected nodes. + newNodeViewModels.push(node); + newNodeDataModels.push(node.data); + } else { + // Keep track of nodes that were deleted, so their connections can also + // be deleted. + deletedNodeIds.push(node.data.id); + } + } + + var newConnectionViewModels = []; + var newConnectionDataModels = []; + + // + // Remove connections that are selected. + // Also remove connections for nodes that have been deleted. + // + for (var connectionIndex = 0; connectionIndex < this.connections.length; ++connectionIndex) { + var connection = this.connections[connectionIndex]; + if (!connection.selected()) { + if (deletedNodeIds.indexOf(connection.data.source.nodeID) === -1 + && deletedNodeIds.indexOf(connection.data.dest.nodeID) === -1) { + // + // The nodes this connection is attached to, where not deleted, + // so keep the connection. + // + newConnectionViewModels.push(connection); + newConnectionDataModels.push(connection.data); + } + } else { + // connection selected, so it will be deleted (ie. not included in the 'newConnection models) + // also delete the connection's source node's output connector (if source node hasn't been deleteed + if (deletedNodeIds.indexOf(connection.data.source.nodeID) === -1) { + var sourceConnectorViewModel = connection.source; + if (sourceConnectorViewModel) { + sourceConnectorViewModel._parentNode.removeOutputConnector(sourceConnectorViewModel.data); + // also set connected to false on the dest node + var destConnectorViewModel = connection.dest; + if (destConnectorViewModel) { + destConnectorViewModel.setConnected(false); + } else { + throw new Error("Failed to find dest node of deleted connection!"); + } + } else { + throw new Error("Failed to find source node of deleted connection!"); + } + } + } + } + + // + // Update nodes and connections. + // + this.nodes = newNodeViewModels; + this.data.nodes = newNodeDataModels; + this.connections = newConnectionViewModels; + this.data.connections = newConnectionDataModels; + }; + + // + // Select nodes and connections that fall within the selection rect. + // + this.applySelectionRect = function(selectionRect) { + this.deselectAll(); + + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + if (node.x() >= selectionRect.x + && node.y() >= selectionRect.y + && node.x() + node.width() <= selectionRect.x + selectionRect.width + && node.y() + node.height() <= selectionRect.y + selectionRect.height) { + // Select nodes that are within the selection rect. + node.select(); + } + } + + for (i = 0; i < this.connections.length; ++i) { + var connection = this.connections[i]; + if (connection.source.parentNode().selected() + && connection.dest.parentNode().selected()) { + // Select the connection if both its parent nodes are selected. + connection.select(); + } + } + }; + + // + // Get the array of nodes that are currently selected. + // + this.getSelectedNodes = function() { + var selectedNodes = []; + + for (var i = 0; i < this.nodes.length; ++i) { + var node = this.nodes[i]; + if (node.selected()) { + selectedNodes.push(node); + } + } + + return selectedNodes; + }; + + // + // Is only one node selected + // + this.isOnlyOneNodeSelected = function() { + return this.getSelectedNodes().length === 1; + }; + + // + // Are any nodes selected + // + this.areAnyNodesSelected = function() { + return this.getSelectedNodes().length > 0; + }; + + // + // Get the array of connections that are currently selected. + // + this.getSelectedConnections = function() { + var selectedConnections = []; + + for (var i = 0; i < this.connections.length; ++i) { + var connection = this.connections[i]; + if (connection.selected()) { + selectedConnections.push(connection); + } + } + + return selectedConnections; + }; + }; + + // + // Zoom view model + // + pfCanvas.ZoomViewModel = function() { + this.max = 1; // Max zoom level + this.min = parseFloat(".5"); // Min zoom level + this.inc = parseFloat(".25"); // Zoom level increment + this.level = this.max; // Zoom level + + // + // Is max zoom + // + this.isMax = function() { + return (this.level === this.max); + }; + + // + // Is min zoom + // + this.isMin = function() { + return (this.level === this.min); + }; + + // + // Get background image size + // + this.getBackgroundSize = function() { + var size = pfCanvas.defaultBgImageSize * this.getLevel(); + + return size; + }; + + // + // Get height to accomodate flow chart + // + this.getChartHeight = function() { + var height = (pfCanvas.defaultHeight / this.min) * this.getLevel(); + + return height; + }; + + // + // Get width to accomodate flow chart + // + this.getChartWidth = function() { + var width = (pfCanvas.defaultWidth / this.min) * this.getLevel(); + + return width; + }; + + // + // Zoom level + // + this.getLevel = function() { + return this.level; + }; + + // + // Zoom in + // + this.in = function() { + if (!this.isMax()) { + this.level = (this.level * 10 + this.inc * 10) / 10; + } + }; + + // + // Zoom out + // + this.out = function() { + if (!this.isMin()) { + this.level = (this.level * 10 - this.inc * 10) / 10; + } + }; + }; +})(); +;(function () { + 'use strict'; + + // Service used to help with dragging and clicking on elements. + angular.module('dragging', ['mouseCapture']) + .factory('dragging', ['mouseCapture', Factory]); + + function Factory (mouseCapture) { + // + // Threshold for dragging. + // When the mouse moves by at least this amount dragging starts. + // + var threshold = 5; + + return { + + // + // Called by users of the service to register a mousedown event and start dragging. + // Acquires the 'mouse capture' until the mouseup event. + // + startDrag: function (evt, config) { + var dragging = false; + var x = evt.pageX; + var y = evt.pageY; + + // + // Handler for mousemove events while the mouse is 'captured'. + // + var mouseMove = function (evt) { + if (!dragging) { + if (Math.abs(evt.pageX - x) > threshold + || Math.abs(evt.pageY - y) > threshold) { + dragging = true; + + if (config.dragStarted) { + config.dragStarted(x, y, evt); + } + + if (config.dragging) { + // First 'dragging' call to take into account that we have + // already moved the mouse by a 'threshold' amount. + config.dragging(evt.pageX, evt.pageY, evt); + } + } + } else { + if (config.dragging) { + config.dragging(evt.pageX, evt.pageY, evt); + } + + x = evt.pageX; + y = evt.pageY; + } + }; + + // + // Handler for when mouse capture is released. + // + var released = function () { + if (dragging) { + if (config.dragEnded) { + config.dragEnded(); + } + } else { + if (config.clicked) { + config.clicked(); + } + } + }; + + // + // Handler for mouseup event while the mouse is 'captured'. + // Mouseup releases the mouse capture. + // + var mouseUp = function (evt) { + mouseCapture.release(); + + evt.stopPropagation(); + evt.preventDefault(); + }; + + // + // Acquire the mouse capture and start handling mouse events. + // + mouseCapture.acquire(evt, { + mouseMove: mouseMove, + mouseUp: mouseUp, + released: released, + }); + + evt.stopPropagation(); + evt.preventDefault(); + }, + + }; + } +})(); + +;(function () { + "use strict"; + + // Service used to acquire 'mouse capture' then receive dragging events while the mouse is captured. + angular.module('mouseCapture', []) + .factory('mouseCapture', ['$rootScope', Factory]) + .directive('mouseCapture', [ComponentDirective]); + + function Factory ($rootScope) { + // + // Element that the mouse capture applies to, defaults to 'document' + // unless the 'mouse-capture' directive is used. + // + var $element = document; + + // + // Set when mouse capture is acquired to an object that contains + // handlers for 'mousemove' and 'mouseup' events. + // + var mouseCaptureConfig = null; + + // + // Handler for mousemove events while the mouse is 'captured'. + // + var mouseMove = function (evt) { + if (mouseCaptureConfig && mouseCaptureConfig.mouseMove) { + mouseCaptureConfig.mouseMove(evt); + + $rootScope.$digest(); + } + }; + + // + // Handler for mouseup event while the mouse is 'captured'. + // + var mouseUp = function (evt) { + if (mouseCaptureConfig && mouseCaptureConfig.mouseUp) { + mouseCaptureConfig.mouseUp(evt); + + $rootScope.$digest(); + } + }; + + return { + + // + // Register an element to use as the mouse capture element instead of + // the default which is the document. + // + registerElement: function (element) { + $element = element; + }, + + // + // Acquire the 'mouse capture'. + // After acquiring the mouse capture mousemove and mouseup events will be + // forwarded to callbacks in 'config'. + // + acquire: function (evt, config) { + // + // Release any prior mouse capture. + // + this.release(); + + mouseCaptureConfig = config; + + // + // In response to the mousedown event register handlers for mousemove and mouseup + // during 'mouse capture'. + // + $element.mousemove(mouseMove); + $element.mouseup(mouseUp); + }, + + // + // Release the 'mouse capture'. + // + release: function () { + if (mouseCaptureConfig) { + if (mouseCaptureConfig.released) { + // + // Let the client know that their 'mouse capture' has been released. + // + mouseCaptureConfig.released(); + } + + mouseCaptureConfig = null; + } + + $element.unbind("mousemove", mouseMove); + $element.unbind("mouseup", mouseUp); + }, + }; + } + + function ComponentDirective () { + return { + restrict: 'A', + controller: ['$scope', '$element', '$attrs', 'mouseCapture', + function ($scope, $element, $attrs, mouseCapture) { + // + // Register the directives element as the mouse capture element. + // + mouseCapture.registerElement($element); + }], + + }; + } +})(); + +;(function () { + 'use strict'; + + nodeToolbarDirective.$inject = ["$document"]; + angular.module('patternfly.canvas') + .directive('nodeToolbar', nodeToolbarDirective); + + function nodeToolbarDirective ($document) { + var directive = { + restrict: 'E', + scope: { + node: '=', + nodeActions: '=', + }, + controller: NodeToolbarController, + templateUrl: 'canvas-view/canvas/node-toolbar.html', + controllerAs: 'vm', + bindToController: true, + }; + + return directive; + + function NodeToolbarController ($scope) { + var vm = this; + vm.selectedAction = "none"; + + $scope.actionIconClicked = function (action) { + vm.selectedAction = action; + $scope.$emit('nodeActionClicked', {'action': action, 'node': vm.node}); + }; + + $scope.close = function () { + vm.selectedAction = 'none'; + $scope.$emit('nodeActionClosed'); + }; + } + } +})(); +;/** + * @ngdoc directive + * @name patternfly.canvas.directive:pfCanvas + * @restrict E + * + * @description + * Directive for core operations and rendering of a canvas. Does not work in IE 11 or lower because they do not support + * latest svg specification's 'foreignObject' api. Tested in FireFox, Chrome, and MS-Edge. + * @param {object} chartDataModel Chart data object which defines the nodes and connections on the canvas + * + * @param {object} chartViewModel (Optional) The chartViewModel is initialized from the chartDataModel and contains additional helper methods such as chartViewModel.isOnlyOneNodeSelected() and + * chartViewModel.getSelectedNodes(). You only need to specify a chartViewModel object if you plan on using advanced canvas operations. + * @param {boolean} readOnly A flag indicating whether the canvas is in 'read-only' mode. When in 'read-only' mode nodes cannot be moved, selected, or deleted, and the node action toolbar is hidden. + * @param {boolean} hideConnectors A flag indicating whether connections should be hidden or shown on the canvas + * @example + + + +
    +
    + + +
    +
    +
    + + + + + + + + + + + + +
    +
    + +
    +
    + +
    +
    +
    + + + angular.module('patternfly.canvas.demo', ['patternfly.canvas']); + + + + angular.module( 'patternfly.canvas.demo' ).controller( 'CanvasDemoCtrl', function( $scope ) { + $scope.chartDataModel = { + "nodes": [ + { + "name": "Nuage", + "x": 345, + "y": 67, + "id": 1, + "image": "/img/OpenShift-logo.svg", + "width": 150, + "bundle": true, + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container"] + }, + { + "name": "Vmware", + "x": 100, + "y": 290, + "id": 2, + "image": "/img/kubernetes.svg", + "width": 150, + "backgroundColor": "#fff", + "validConnectionTypes": ["storage"], + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + }, + { + "name": "NetApp", + "x": 350, + "y": 291, + "id": 3, + "width": 150, + "icon": "pf pficon-service", + "fontSize": "76px", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network"] + }, + { + "name": "OpenShift", + "x": 105, + "y": 67, + "id": 4, + "width": 150, + "fontFamily": "fontawesome", + "fontContent": "\uf0c2", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container", "storage"] + } + ], + "nodeActions" : [ + { + "id": 1, + "name": "connect", + "iconClass": "fa fa-share-alt", + "action": "nodeActionConnect", + }, + { + "id": 2, + "name": "edit", + "iconClass": "pf pficon-edit", + "action": "nodeActionEdit", + }, + { + "id": 3, + "name": "tag", + "iconClass": "fa fa-tag", + "action": "nodeActionTag", + }, + ], + "connections": [ + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 1, + "connectorIndex": 1 + } + }, + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 3, + "connectorIndex": 0 + } + } + ] + }; + + $scope.newNode = { + "name": "NetApp", + "id": 1000, + "width": 150, + "icon": "pf pficon-service", + "fontSize": "76px", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network"] + }; + + $scope.chartViewModel; + $scope.readOnly = false; + $scope.hideConnectors = false; + $scope.eventText = ""; + + var numNewNodes = 1; + + $scope.addNode = function() { + var newNode = angular.copy($scope.newNode); + newNode.id ++; + newNode.name = newNode.name + " " + numNewNodes++; + newNode.x = 250 + (numNewNodes * 4 + 160); + newNode.y = 200 + (numNewNodes * 4 + 160); + + $scope.chartViewModel.addNode(newNode); + } + + $scope.$on('nodeActionClicked', function(evt, args) { + var action = args.action; + var node = args.node; + $scope.eventText = node.name() + ' ' + action + '\r\n' + $scope.eventText; + }); + + $scope.zoomIn = function() { + $scope.$broadcast('zoomIn'); + } + $scope.zoomOut = function() { + $scope.$broadcast('zoomOut'); + } + + $scope.selectAll = function() { + $scope.$broadcast('selectAll'); + } + $scope.deselectAll = function() { + $scope.$broadcast('deselectAll'); + } + $scope.deleteSelected = function() { + $scope.$broadcast('deleteSelected'); + } + }); + +
    + */ +;/** + * @ngdoc directive + * @name patternfly.canvas.directive:pfCanvasEditor + * @restrict E + * + * @description + * Component for canvas editor which adds a toolbox where items can be dragged and dropped onto canvas, as well as other canvas + * operations such as: Zoom In, Zoom Out, Hide Connections, Remove Node, and Duplicate Node. Does not work in IE 11 or lower because they do not support + * latest svg specification's 'foreignObject' api. Tested in FireFox, Chrome, and MS-Edge. + * + * @param {object} chartDataModel Chart data object which defines the nodes and connections on the canvas. See {@link patternfly.canvas.directive:pfCanvas} for detailed information. + * @param {object} chartViewModel (Optional) The chartViewModel is initialized from the chartDataModel and contains additional helper methods such as chartViewModel.isOnlyOneNodeSelected() and + * chartViewModel.getSelectedNodes(). + * @param {boolean} toolboxTabs An array of Tab objects used in the Toolbox. Each Tab object many contain 'subtabs' and/or 'items'. Items may be dragged onto the canvas. + * + * @param {boolean} readOnly (Optional) A flag indicating whether the canvas is in 'read-only' mode. When in 'read-only' mode nodes cannot be moved, selected, or deleted, and the node action toolbar is hidden. + * @example + + + +
    + + + + + + + + + + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + angular.module('patternfly.canvaseditor.demo', ['patternfly.canvas']); + + + + angular.module( 'patternfly.canvaseditor.demo' ).controller( 'CanvasEditorDemoCtrl', function( $scope, $filter ) { + $scope.chartDataModel = { + "nodes": [ + { + "name": "Nuage", + "x": 345, + "y": 67, + "id": 1, + "image": "/img/OpenShift-logo.svg", + "width": 150, + "bundle": true, + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container"] + }, + { + "name": "Vmware", + "x": 100, + "y": 290, + "id": 2, + "image": "/img/kubernetes.svg", + "width": 150, + "backgroundColor": "#fff", + "validConnectionTypes": ["storage"], + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + }, + { + "name": "NetApp", + "x": 350, + "y": 291, + "id": 3, + "width": 150, + "icon": "pf pficon-service", + "fontSize": "76px", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Network", + "type": "network", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue909" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network"] + }, + { + "name": "OpenShift", + "x": 105, + "y": 67, + "id": 4, + "width": 150, + "fontFamily": "fontawesome", + "fontContent": "\uf0c2", + "backgroundColor": "#fff", + "inputConnectors": [ + { + "name": "Storage", + "type": "storage", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue90e" + }, + { + "name": "Container", + "type": "container", + "fontFamily": "PatternFlyIcons-webfont", + "fontContent": "\ue621" + } + ], + "validConnectionTypes": ["network", "container", "storage"] + } + ], + "nodeActions" : [ + { + "id": 1, + "name": "connect", + "iconClass": "fa fa-share-alt", + "action": "nodeActionConnect", + }, + { + "id": 2, + "name": "edit", + "iconClass": "pf pficon-edit", + "action": "nodeActionEdit", + }, + { + "id": 3, + "name": "tag", + "iconClass": "fa fa-tag", + "action": "nodeActionTag", + }, + ], + "connections": [ + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 1, + "connectorIndex": 1 + } + }, + { + "source": { + "nodeID": 4, + "connectorIndex": 0 + }, + "dest": { + "nodeID": 3, + "connectorIndex": 0 + } + } + ] + }; + + $scope.toolboxTabs = [ + { + "preTitle": "Toolbox", + "title": "Items A", + "active": true, + "items": [ + { + "name": "Nuage", + "id": 10000000000004, + "image": "/img/OpenShift-logo.svg" + }, + { + "name": "Vmware", + "id": 10000000000010, + "image": "/img/kubernetes.svg" + } + ] + }, + { + "preTitle": "Toolbox", + "title": "Items B", + "active": true, + "items": [ + { + "name": "NetApp", + "id": 10000000000014, + "icon": "pf pficon-service" + }, + { + "name": "OpenShift", + "id": 10000000000021, + "icon": "fa fa-cloud" + }, + { + "name": "OpenStack", + "id": 10000000000022, + "icon": "pf pficon-network" + }, + { + "name": "Storage", + "id": 10000000000026, + "icon": "pf pficon-storage-domain" + }, + { + "name": "VM", + "id": 10000000000023, + "icon": "pf pficon-virtual-machine" + }, + { + "name": "Replicatore", + "id": 10000000000027, + "icon": "pf pficon-replicator" + } + ] + } + ]; + + $scope.chartViewModel; + $scope.readOnly = false; + $scope.eventText = ""; + + $scope.$on('nodeActionClicked', function(evt, args) { + var action = args.action; + var node = args.node; + $scope.eventText = node.name() + ' ' + action + '\r\n' + $scope.eventText; + }); + + $scope.deleteNodes = function() { + if ($scope.chartViewModel.inConnectingMode) { + return; + } + + $scope.chartViewModel.deleteSelected(); + + angular.element("#deleteNodes").blur(); + }; + + $scope.duplicateNode = function() { + if ($scope.chartViewModel.inConnectingMode) { + return; + } + + var duplicatedNode = $scope.chartViewModel.duplicateSelectedNode(); + + // Note: node id will be used in connections to/from this duplicated node + // If id changes, connections array/obj will need to be updated as well + duplicatedNode.id = Math.floor((Math.random() * 600) + 1); // random number between 1 and 600 + duplicatedNode.name = getCopyName(duplicatedNode.name); + duplicatedNode.backgroundColor = '#fff'; + + duplicatedNode.x = duplicatedNode.x + 15 * $scope.chartDataModel.nodes.length; + duplicatedNode.y = duplicatedNode.y + 15 * $scope.chartDataModel.nodes.length; + + $scope.chartViewModel.addNode(duplicatedNode); + + angular.element("#duplicateItem").blur(); + } + + function getCopyName(baseName) { + // Test to see if we are duplicating an existing 'Copy' + var baseNameLength = baseName.indexOf(' Copy'); + if (baseNameLength === -1) { + baseNameLength = baseName.length; + } + baseName = baseName.substr(0, baseNameLength); + var filteredArray = $filter('filter')($scope.chartDataModel.nodes, {name: baseName}, false); + var copyName = baseName + " Copy" + ((filteredArray.length === 1) ? "" : " " + filteredArray.length); + + return copyName; + } + }); + +
    + */ +;/** + * @ngdoc directive + * @name patternfly.card.component:pfAggregateStatusCard + * @restrict E + * + * @param {object} status Status configuration information
    + * + * When layout='mini', only one notification can be specified:
    + * + * @param {boolean=} show-top-border Show/hide the top border, true shows top border, false (default) hides top border + * @param {string=} layout Various alternative layouts the aggregate status card may have:
    + * + * @deprecated {boolean=} alt-layout Display the aggregate status card in a 'alternate tall' layout. false (default) displays normal layout, true displays tall layout + * + * @description + * Component for easily displaying status information + * + * @example + + + +
    +
    + + +
    + + +
    + + + +
    + + +
    + + (depreciated, use layout = 'tall' instead) +

    + +
    +
    +
    + + + angular.module( 'patternfly.card' ).controller( 'CardDemoCtrl', function( $scope ) { + $scope.status = { + "title":"Nodes", + "count":793, + "href":"#", + "iconClass": "fa fa-shield", + "notifications":[ + { + "iconClass":"pficon pficon-error-circle-o", + "count":4, + "href":"#" + }, + { + "iconClass":"pficon pficon-warning-triangle-o", + "count":1 + } + ] + }; + + $scope.aggStatusAlt = { + "title":"Providers", + "count":3, + "notifications":[ + { + "iconImage":"img/kubernetes.svg", + "count":1, + "href":"#" + }, + { + "iconImage":"img/OpenShift-logo.svg", + "count":2, + "href":"#" + } + ] + }; + + $scope.miniAggStatus = { + "iconClass":"pficon pficon-container-node", + "title":"Nodes", + "count":52, + "href":"#", + "notification": { + "iconClass":"pficon pficon-error-circle-o", + "count":3 + } + }; + + $scope.miniAggStatus2 = { + "iconClass":"pficon pficon-cluster", + "title":"Adipiscing", + "count":9, + "href":"#", + "notification":{ + "iconClass":"pficon pficon-ok" + } + }; + }); + + +
    + */ + +angular.module( 'patternfly.card' ).component('pfAggregateStatusCard', { + bindings: { + status: '=', + showTopBorder: '@?', + altLayout: '@?', + layout: '@?' + }, + templateUrl: 'card/aggregate-status/aggregate-status-card.html', + controller: function () { + 'use strict'; + var ctrl = this; + ctrl.$onInit = function () { + ctrl.shouldShowTopBorder = (ctrl.showTopBorder === 'true'); + ctrl.isAltLayout = (ctrl.altLayout === 'true' || ctrl.layout === 'tall'); + ctrl.isMiniLayout = (ctrl.layout === 'mini'); + }; + } +}); +;/** + * @ngdoc directive + * @name patternfly.card.component:pfCard - Utilization + * @restrict E + * + * @param {string} headTitle Title for the card + * @param {string=} subTitle Sub-Title for the card + * @param {boolean=} showTopBorder Show/Hide the blue top border. True shows top border, false (default) hides top border + * @param {boolean=} showTitlesSeparator Show/Hide the grey line between the title and sub-title. + * True (default) shows the line, false hides the line + * @param {object=} footer footer configuration properties:
    + * + * *Note: If a href link and a callBackFn are specified, the href link will be called + * @param {object=} filter filter configuration properties:
    + * + * @description + * Component for easily displaying a card with html content + * + * @example + + + +
    + + + + + + + +
    +
    + + angular.module( 'demo', ['patternfly.charts', 'patternfly.card'] ).controller( 'ChartCtrl', function( $scope ) { + + $scope.title2 = 'Memory'; + $scope.units2 = 'GB'; + + $scope.data2 = { + 'used': '25', + 'total': '100' + }; + + $scope.title3 = 'CPU Usage'; + $scope.units3 = 'MHz'; + + $scope.data3 = { + 'used': '420', + 'total': '500', + }; + + $scope.title4 = 'Disk Usage'; + $scope.units4 = 'TB'; + $scope.data4 = { + 'used': '350', + 'total': '500', + }; + + $scope.title5 = 'Disk I/O'; + $scope.units5 = 'I/Ops'; + $scope.data5 = { + 'used': '450', + 'total': '500', + }; + + $scope.layoutInline = { + 'type': 'inline' + }; + }); + +
    + */ +angular.module('patternfly.card').component('pfCard', { transclude: true, templateUrl: 'card/basic/card.html', bindings: { @@ -1746,76 +4469,322 @@ angular.module('patternfly.charts').component('pfHeatmap', { ctrl.rangeTooltips = rangeTooltipDefaults; } - if (!ctrl.thresholds) { - ctrl.thresholds = thresholdDefaults; - } + if (!ctrl.thresholds) { + ctrl.thresholds = thresholdDefaults; + } + + if (!ctrl.heatmapColorPattern) { + ctrl.heatmapColorPattern = heatmapColorPatternDefaults; + } + + if (!ctrl.legendLabels) { + ctrl.legendLabels = legendLabelDefaults; + } + ctrl.height = ctrl.height || heightDefault; + ctrl.showLegend = ctrl.showLegend || (ctrl.showLegend === undefined); + ctrl.loadingDone = false; + + angular.element($window).bind('resize', function () { + setSizes(); + redraw(); + }); + + ctrl.thisComponent = $element[0].querySelector('.heatmap-pf-svg'); + + $timeout(function () { + setStyles(); + setSizes(); + redraw(); + }); + }; + + ctrl.$onChanges = function (changesObj) { + if (changesObj.chartDataAvailable && !changesObj.chartDataAvailable.isFirstChange()) { + setStyles(); + } else { + ctrl.updateAll(); + ctrl.loadingDone = true; + } + }; + + ctrl.$doCheck = function () { + // do a deep compare on chartData and config + if (!angular.equals(ctrl.data, prevData)) { + setStyles(); + if (ctrl.chartDataAvailable !== false) { + setSizes(); + redraw(); + } + } + }; + + ctrl.$postLink = function () { + setStyles(); + setSizes(); + redraw(); + }; + }] +}); +;/** + * @ngdoc directive + * @name patternfly.charts.component:pfLineChart + * @restrict E + * + * @description + * Component for rendering a line chart. + *

    + * See http://c3js.org/reference.html for a full list of C3 chart options. + * + * @param {object} config configuration settings for the line chart:
    + * + * + * @param {object} chartData the data to be shown as an area chart
    + * First and second Array elements, xData and yData, must exist, next data arrays are optional.
    + * + * + * @param {boolean=} showXAxis override config settings for showing the X Axis + * @param {boolean=} showYAxis override config settings for showing the Y Axis + * @param {boolean=} setAreaChart override config settings for showing area type chart + + * @example + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + + angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope, pfUtils ) { + + $scope.config = { + chartId: 'exampleLine', + grid: {y: {show: false}}, + point: {r: 1}, + color: {pattern: [pfUtils.colorPalette.blue, pfUtils.colorPalette.green]} + }; + + var today = new Date(); + var dates = ['dates']; + for (var d = 20 - 1; d >= 0; d--) { + dates.push(new Date(today.getTime() - (d * 24 * 60 * 60 * 1000))); + } + + $scope.data = { + dataAvailable: true, + xData: dates, + yData0: ['Created', 12, 10, 10, 62, 17, 10, 15, 13, 17, 10, 12, 10, 10, 12, 17, 16, 15, 13, 17, 10], + yData1: ['Deleted', 10, 17, 76, 14, 10, 10, 10, 10, 10, 10, 10, 17, 17, 14, 10, 10, 10, 10, 10, 10] + }; + + $scope.custShowXAxis = false; + $scope.custShowYAxis = false; + $scope.custAreaChart = false; + + $scope.addDataPoint = function () { + $scope.data.xData.push(new Date($scope.data.xData[$scope.data.xData.length - 1].getTime() + (24 * 60 * 60 * 1000))); + $scope.data.yData0.push(Math.round(Math.random() * 100)); + $scope.data.yData1.push(Math.round(Math.random() * 100)); + }; + + $scope.resetData = function () { + $scope.data = { + xData: dates, + yData0: ['Created', 12, 10, 10, 62], + yData1: ['Deleted', 10, 17, 76, 14] + }; + }; + }); + +
    + */ +angular.module('patternfly.charts').component('pfLineChart', { + bindings: { + config: '<', + chartData: '<', + showXAxis: '
    * See http://c3js.org/reference.html for a full list of C3 chart options. * - * @param {object} config configuration settings for the line chart:
    + * @param {object} config configuration settings for the sparkline chart:
    * * * @param {object} chartData the data to be shown as an area chart
    - * First and second Array elements, xData and yData, must exist, next data arrays are optional.
    * * + * @param {int=} chartHeight height of the sparkline chart * @param {boolean=} showXAxis override config settings for showing the X Axis * @param {boolean=} showYAxis override config settings for showing the Y Axis - * @param {boolean=} setAreaChart override config settings for showing area type chart * @example
    - +

    +
    +
    + +
    + + + + +
    +
    + +
    -
    - -
    -
    -
    -
    -
    -
    -
    +
    - + +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    - angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope, pfUtils ) { + angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope ) { $scope.config = { - chartId: 'exampleLine', - grid: {y: {show: false}}, - point: {r: 1}, - color: {pattern: [pfUtils.colorPalette.blue, pfUtils.colorPalette.green]} + chartId: 'exampleSparkline', + tooltipType: 'default' }; var today = new Date(); @@ -1903,33 +4893,32 @@ angular.module('patternfly.charts').component('pfHeatmap', { $scope.data = { dataAvailable: true, + total: 100, xData: dates, - yData0: ['Created', 12, 10,10, 62, 17, 10, 15, 13, 17, 10, 12, 10, 10, 12, 17, 16, 15, 13, 17, 10], - yData1: ['Deleted', 10, 17, 76,14, 10, 10, 10, 10, 10, 10, 10, 17, 17, 14, 10, 10, 10, 10, 10, 10] + yData: ['used', 10, 20, 30, 20, 30, 10, 14, 20, 25, 68, 54, 56, 78, 56, 67, 88, 76, 65, 87, 76] }; $scope.custShowXAxis = false; $scope.custShowYAxis = false; - $scope.custAreaChart = false; + $scope.custChartHeight = 60; $scope.addDataPoint = function () { $scope.data.xData.push(new Date($scope.data.xData[$scope.data.xData.length - 1].getTime() + (24 * 60 * 60 * 1000))); - $scope.data.yData0.push(Math.round(Math.random() * 100)); - $scope.data.yData1.push(Math.round(Math.random() * 100)); + $scope.data.yData.push(Math.round(Math.random() * 100)); }; });
    */ -angular.module('patternfly.charts').component('pfLineChart', { +angular.module('patternfly.charts').component('pfSparklineChart', { bindings: { config: '<', chartData: '<', + chartHeight: '' + + ' ' + + ' ' + + tipRows + + ' ' + + '
    ' + + ''; + }; + + ctrl.sparklineTooltip = function () { + return { + contents: function (d) { + var tipRows; + var percentUsed = 0; + + if (ctrl.config.tooltipFn) { + tipRows = ctrl.config.tooltipFn(d); + } else { + switch (ctrl.config.tooltipType) { + case 'usagePerDay': + if (ctrl.chartData.dataAvailable !== false && ctrl.chartData.total > 0) { + percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); + } + tipRows = + '' + + ' ' + d[0].x.toLocaleDateString() + '' + + '' + + '' + + ' ' + percentUsed + '%:' + '' + + ' ' + d[0].value + ' ' + (ctrl.config.units ? ctrl.config.units + ' ' : '') + d[0].name + '' + + ''; + break; + case 'valuePerDay': + tipRows = + '' + + ' ' + d[0].x.toLocaleDateString() + '' + + ' ' + d[0].value + ' ' + d[0].name + '' + + ''; + break; + case 'percentage': + percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); + tipRows = + '' + + ' ' + percentUsed + '%' + '' + + ''; + break; + default: + tipRows = patternfly.c3ChartDefaults().getDefaultSparklineTooltip().contents(d); + } + } + return ctrl.getTooltipTableHTML(tipRows); + }, + position: function (data, width, height, element) { + var center; + var top; + var chartBox; + var graphOffsetX; + var x; - // Will trigger c3 chart generation - ctrl.chartConfig = pfUtils.merge(ctrl.defaultConfig, ctrl.config); - }; + try { + center = parseInt(element.getAttribute('x')); + top = parseInt(element.getAttribute('y')); + chartBox = document.querySelector('#' + ctrl.sparklineChartId).getBoundingClientRect(); + graphOffsetX = document.querySelector('#' + ctrl.sparklineChartId + ' g.c3-axis-y').getBoundingClientRect().right; + x = Math.max(0, center + graphOffsetX - chartBox.left - Math.floor(width / 2)); - /* - * Convert the config data to C3 Data - */ - ctrl.getLineData = function (chartData) { - var lineData = { - type: ctrl.setAreaChart ? "area" : "line" + return { + top: top - height, + left: Math.min(x, chartBox.width - width) + }; + } catch (e) { + } + } }; - - if (chartData && chartData.dataAvailable !== false && chartData.xData) { - lineData.x = chartData.xData[0]; - // Convert the chartData dictionary into a C3 columns data arrays - lineData.columns = Object.keys(chartData).map(function (key) { - return chartData[key]; - }); - } - - return lineData; }; ctrl.$onChanges = function (changesObj) { @@ -2034,333 +5097,941 @@ angular.module('patternfly.charts').component('pfLineChart', { }); ;/** * @ngdoc directive - * @name patternfly.charts.component:pfSparklineChart + * @name patternfly.charts.component:pfTopology * @restrict E * * @description - * Component for rendering a sparkline chart. - *

    - * See http://c3js.org/reference.html for a full list of C3 chart options. + * Component for rendering a topology chart. Individual nodes and relationships can be represented with this view. CSS is especially important for rendering the nodes and lines. The example inline contains specific examples that can be used to change the icon size and the line type of the relationships. * - * @param {object} config configuration settings for the sparkline chart:
    - * * - * @param {object} chartData the data to be shown as an area chart
    + * @param {object} relations the object containing all of the node relationships:
    * * - * @param {int=} chartHeight height of the sparkline chart - * @param {boolean=} showXAxis override config settings for showing the X Axis - * @param {boolean=} showYAxis override config settings for showing the Y Axis - + * @param {object} icons The different icons to be used in the node representations + * @param {object} selection The item to be selected + * @param {object} force Optional. A D3 force layout to use instead of creating one by default. The force layout size will be updated, and layout will be started as appropriate. + * @param {object} nodes The node configuration for the various types of nodes
    + * @param {string} searchText Search text which is watched for changes and highlights the nodes matching the search text + * @param {object} kinds The different kinds of nodes represented in the topology chart + * @param {function (vertices, added) } chartRendered The argument will be D3 selection of elements that correspond to items. Each item has its data set to one of the items. The default implementation of this event sets the title from Kubernetes metadata and tweaks the look of for certain statuses. Use event.preventDefault() to prevent this default behavior. + * @param {boolean} itemSelected A function that is dispatched when an item is selected (along with the node data associated with the function + * @param {boolean} showLabels A watched boolean that determines whether or not lables should be displayed beneath the nodes + * @param {function (node) } tooltipFunction A passed in tooltip function which can be used to overwrite the default tooltip behavior + * * @example - -
    -
    - -
    -
    -
    -
    -
    - -
    - - - - -
    -
    -
    -
    -
    -
    - -
    - - -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    + +
    + + - - angular.module( 'patternfly.charts' ).controller( 'ChartCtrl', function( $scope ) { +
    + - $scope.config = { - chartId: 'exampleSparkline', - tooltipType: 'default' - }; + - var today = new Date(); - var dates = ['dates']; - for (var d = 20 - 1; d >= 0; d--) { - dates.push(new Date(today.getTime() - (d * 24 * 60 * 60 * 1000))); - } + + +
    +
    +
    - $scope.data = { - dataAvailable: true, - total: 100, - xData: dates, - yData: ['used', 10, 20, 30, 20, 30, 10, 14, 20, 25, 68, 54, 56, 78, 56, 67, 88, 76, 65, 87, 76] - }; + + angular.module( 'patternfly.charts' ).controller( 'TopologyCtrl', function( $scope, $rootScope ) { + var index = 0; + var datasets = []; + + function sink(dataset) { + datasets.push(dataset); + } + + sink({ + "items": { + "ContainerManager10r20": { + "name": "ocp-master.example.com", + "kind": "ContainerManager", + "miq_id": 10000000000020, + "status": "Valid", + "display_kind": "OpenshiftEnterprise" + }, + "ContainerNode10r14": { + "name": "ocp-master.example.com", + "kind": "ContainerNode", + "miq_id": 10000000000014, + "status": "Ready", + "display_kind": "Node" + }, + "ContainerGroup10r240": { + "name": "docker-registry-2-vrguw", + "kind": "ContainerGroup", + "miq_id": 10000000000240, + "status": "Running", + "display_kind": "Pod" + }, + "Container10r235": { + "name": "registry", + "kind": "Container", + "miq_id": 10000000000235, + "status": "Error", + "display_kind": "Container" + }, + "ContainerReplicator10r56": { + "name": "docker-registry-2", + "kind": "ContainerReplicator", + "miq_id": 10000000000056, + "status": "OK", + "display_kind": "Replicator" + }, + "ContainerService10r61": { + "name": "docker-registry", + "kind": "ContainerService", + "miq_id": 10000000000061, + "status": "Unknown", + "display_kind": "Service" + }, + }, + "relations": [ + { + "source": "ContainerManager10r20", + "target": "ContainerNode10r14" + }, { + "source": "ContainerNode10r14", + "target": "ContainerGroup10r240" + }, { + "source": "ContainerGroup10r240", + "target": "Container10r235" + }, { + "source": "ContainerGroup10r240", + "target": "ContainerReplicator10r56" + }, { + "source": "ContainerGroup10r240", + "target": "ContainerService10r61" + }, { + "source": "ContainerNode10r14", + "target": "ContainerGroup10r241" + }, { + "source": "ContainerGroup10r241", + "target": "Container10r236" + }, { + "source": "ContainerGroup10r241", + "target": "ContainerReplicator10r57" + } + ], + "icons": { + "AvailabilityZone": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerReplicator": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerGroup": { + "type": "glyph", + "icon": "", + "fontfamily": "FontAwesome" + }, + "ContainerNode": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerService": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerRoute": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "Container": { + "type": "glyph", + "icon": "", + "fontfamily": "FontAwesome" + }, + "Host": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "Vm": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + }, + "ContainerManager": { + "type": "glyph", + "icon": "", + "fontfamily": "PatternFlyIcons-webfont" + } + }, + }); + + $rootScope.data = datasets[index]; + + var nodeKinds = { + "ContainerReplicator": true, + "ContainerGroup": true, + "Container": true, + "ContainerNode": true, + "ContainerService": true, + "Host": true, + "Vm": true, + "ContainerRoute": true, + "ContainerManager": true + }; + + $rootScope.kinds = nodeKinds; + + var icons = $rootScope.data.icons; + $scope.nodes = {}; + for(var kind in nodeKinds) { + var icon = icons[kind]; + $scope.nodes[kind] = { + "name": kind, + "enabled": nodeKinds[kind], + "radius": 16, + "textX": 0, + "textY": 5, + "height": 18, + "width": 18, + "icon": icon.icon, + "fontFamily": icon.fontfamily + }; + } + + // Individual values can also be set for specific icons + $scope.nodes.ContainerService.textY = 9; + $scope.nodes.ContainerService.textX = -1; + + $scope.nodes.ContainerGroup.height = 30; + $scope.nodes.ContainerGroup.width = 30; + $scope.nodes.ContainerGroup.radius = 28; + $scope.nodes.ContainerGroup.textY = 8; + + $scope.itemSelected = function (item) { + var text = ""; + if (item) { + text = "Selected: " + item.name; + } + angular.element(document.getElementById("selected")).text(text); + }; + + $scope.removeKind = function () { + if($rootScope.kinds.ContainerNode) { + delete $rootScope.kinds.ContainerNode; + } + }; + + $scope.tooltip = function (node) { + var status = [ + 'Name: ' + node.item.name, + 'Type: ' + node.item.kind, + 'Status: ' + node.item.status + ]; + return status; + } + }); + + + + .pf-topology-svg g.Pod text { + font-family: FontAwesome; + font-size: 16px; + fill: #1186C1; + } + + .pf-topology-svg g.Node text { + fill: #636363; + } + + .pf-topology-svg g.Service text { + fill: #ff7f0e; + } + + .pf-topology-svg g.ReplicationController text { + fill: #9467bd; + font-size: 20px; + } + + .pf-topology-svg line.ReplicationControllerPod { + stroke-linecap: round; + stroke-dasharray: 5, 2; + } + + + .pf-topology-svg line.ContainerServiceContainerGroup, .pf-topology-svg line.ContainerReplicatorContainerGroup, .pf-topology-svg line.ContainerServiceContainerRoute, + .pf-topology-svg line.ContainerGroupContainerService, .pf-topology-svg line.ContainerGroupContainerReplicator { + stroke-linecap: round; + stroke-dasharray: 5.5; + } + + + .pf-topology-svg g.Container text.glyph { + font-size: 18px; + } + + .pf-topology-svg g.ContainerGroup text.glyph { + font-size: 28px; + } + + .pf-topology-svg g.Vm text.glyph, .pf-topology-svg g.Host text.glyph { + fill: #636363; + } - $scope.custShowXAxis = false; - $scope.custShowYAxis = false; - $scope.custChartHeight = 60; + .pf-topology-svg g.ContainerNode text.glyph { + font-size: 18px; + } + + .pf-topology-svg g.ContainerManager text.glyph { + font-size: 18px; + } + - $scope.addDataPoint = function () { - $scope.data.xData.push(new Date($scope.data.xData[$scope.data.xData.length - 1].getTime() + (24 * 60 * 60 * 1000))); - $scope.data.yData.push(Math.round(Math.random() * 100)); - }; - }); -
    */ -angular.module('patternfly.charts').component('pfSparklineChart', { +;angular.module('patternfly.charts').component('pfTopology', { bindings: { - config: '<', - chartData: '<', - chartHeight: ' d.floatpoint[0] + 5) || + (d.y < d.floatpoint[1] - 5 || d.y > d.floatpoint[1] + 5); + delete d.floatpoint; + } + d.fixed = moved && d.x > 3 && d.x < (width - 3) && d.y >= 3 && d.y < (height - 3); + d3.select(this).classed("fixed", d.fixed); + }); + + svg + .on("dblclick", function () { + svg.selectAll("g") + .classed("fixed", false) + .each(function (d) { + d.fixed = false; + }); + force.start(); + }) + .on("click", function (ev) { + if (!d3.select(d3.event.target).datum()) { + notify(null); + } + }); + + function select (item) { + if (item !== undefined) { + selection = item; + } + svg.selectAll("g") + .classed("selected", function (d) { + return d.item === selection; + }); + } + + function adjust () { + timeout = null; + width = outer.node().clientWidth; + height = outer.node().clientHeight; + force.size([width, height]); + svg.attr("viewBox", "0 0 " + width + " " + height); + update(); + } + + function update () { + var added; + + edges = svg.selectAll("line") + .data(links); + + edges.exit().remove(); + edges.enter().insert("line", ":first-child"); + + edges.attr("class", function (d) { + return d.kinds; + }); + + vertices = svg.selectAll("g") + .data(nodes, function (d) { + return d.id; + }); + + vertices.exit().remove(); + + added = vertices.enter().append("g") + .call(drag); + + select(selection); + + force + .nodes(nodes) + .links(links) + .start(); + + return added; + } + + function digest () { + var pnodes = nodes; + var plookup = lookup; + var item, id, kind, node; + var i, len, relation, s, t; + /* The actual data for the graph */ + nodes = []; + links = []; + lookup = {}; + + for (id in items) { + if (id) { + item = items[id]; + kind = item.kind; + + if (kinds && !kinds[kind]) { + continue; } + + /* Prevents flicker */ + node = pnodes[plookup[id]]; + if (!node) { + node = cache[id]; + delete cache[id]; + if (!node) { + node = {}; + } + } + + node.id = id; + node.item = item; + + lookup[id] = nodes.length; + nodes.push(node); + } + } + for (i = 0, len = relations.length; i < len; i++) { + relation = relations[i]; + + s = lookup[relation.source]; + t = lookup[relation.target]; + if (s === undefined || t === undefined) { + continue; } + + links.push({source: s, target: t, kinds: nodes[s].item.kind + nodes[t].item.kind}); + } + + if (width && height) { + return update(); + } + return d3.select(); + } + + function resized () { + window.clearTimeout(timeout); + timeout = window.setTimeout(adjust, 1); + } + + window.addEventListener('resize', resized); + + adjust(); + resized(); + + return { + select: select, + kinds: function (value) { + var added; + kinds = value; + added = digest(); + return [vertices, added]; }, - y: { - show: ctrl.showYAxis === true, - tick: { - format: function () { - return ''; + data: function (newItems, newRelations) { + var added; + items = newItems || {}; + relations = newRelations || []; + added = digest(); + return [vertices, added]; + }, + close: function () { + var id, node; + window.removeEventListener('resize', resized); + window.clearTimeout(timeout); + /* + * Keep the positions of these items cached, + * in case we are asked to make the same graph again. + */ + cache = {}; + for (id in lookup) { + if (id) { + node = nodes[lookup[id]]; + delete node.item; + cache[id] = node; } } + + nodes = []; + lookup = {}; } }; + } - // Setup the default configuration - ctrl.defaultConfig.tooltip = ctrl.sparklineTooltip(); - if (ctrl.chartHeight) { - ctrl.defaultConfig.size.height = ctrl.chartHeight; + function search (query) { + var svg = getSVG(); + var nodes = svg.selectAll("g"); + var selected, links; + if (query !== "") { + selected = nodes.filter(function (d) { + return d.item.name.indexOf(query) === -1; + }); + selected.style("opacity", "0.2"); + links = svg.selectAll("line"); + links.style("opacity", "0.2"); } - ctrl.defaultConfig.units = ''; + } - // Convert the given data to C3 chart format - ctrl.config.data = pfUtils.merge(ctrl.config.data, ctrl.getSparklineData(ctrl.chartData)); + function resetSearch (d3) { + // Display all topology nodes and links + d3.selectAll("g, line").transition() + .duration(2000) + .style("opacity", 1); + } - // Override defaults with callers specifications - ctrl.chartConfig = pfUtils.merge(ctrl.defaultConfig, ctrl.config); - }; + function toggleLabelVisibility () { + if (ctrl.showLabels) { + vs.selectAll("text.attached-label") + .classed("visible", true); + } else { + vs.selectAll("text.attached-label") + .classed("visible", false); + } + } - /* - * Convert the config data to C3 Data - */ - ctrl.getSparklineData = function (chartData) { - var sparklineData = { - type: 'area' - }; + function getSVG () { + var graph = d3.select("pf-topology"); + var svg = graph.select('svg'); + return svg; + } - if (chartData && chartData.dataAvailable !== false && chartData.xData && chartData.yData) { - sparklineData.x = chartData.xData[0]; - sparklineData.columns = [ - chartData.xData, - chartData.yData - ]; + function notify (item) { + ctrl.itemSelected({item: item}); + if ($attrs.selection === undefined) { + graph.select(item); } + } - return sparklineData; - }; + function icon (d) { + return '#' + d.item.kind; + } - ctrl.getTooltipTableHTML = function (tipRows) { - return '
    ' + - ' ' + - ' ' + - tipRows + - ' ' + - '
    ' + - '
    '; - }; + function title (d) { + return d.item.name; + } - ctrl.sparklineTooltip = function () { - return { - contents: function (d) { - var tipRows; - var percentUsed = 0; + function render (args) { + var vertices = args[0]; + var added = args[1]; + var event; - if (ctrl.config.tooltipFn) { - tipRows = ctrl.config.tooltipFn(d); - } else { - switch (ctrl.config.tooltipType) { - case 'usagePerDay': - if (ctrl.chartData.dataAvailable !== false && ctrl.chartData.total > 0) { - percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); - } - tipRows = - '' + - ' ' + d[0].x.toLocaleDateString() + '' + - '' + - '' + - ' ' + percentUsed + '%:' + '' + - ' ' + d[0].value + ' ' + (ctrl.config.units ? ctrl.config.units + ' ' : '') + d[0].name + '' + - ''; - break; - case 'valuePerDay': - tipRows = - '' + - ' ' + d[0].x.toLocaleDateString() + '' + - ' ' + d[0].value + ' ' + d[0].name + '' + - ''; - break; - case 'percentage': - percentUsed = Math.round(d[0].value / ctrl.chartData.total * 100.0); - tipRows = - '' + - ' ' + percentUsed + '%' + '' + - ''; - break; - default: - tipRows = patternfly.c3ChartDefaults().getDefaultSparklineTooltip().contents(d); + // allow custom rendering of chart + if (angular.isFunction(ctrl.chartRendered)) { + event = ctrl.chartRendered({vertices: vertices, added: added}); + } + + if (!event || !event.defaultPrevented) { + added.attr("class", function (d) { + return d.item.kind; + }); + + added.append("circle") + .attr("r", function (d) { + return getDimensions(d).r; + }) + .attr('class', function (d) { + return getItemStatusClass(d); + }) + .on("contextmenu", function (d) { + contextMenu(ctrl, d); + }); + + added.append("title"); + + added.on("dblclick", function (d) { + return dblclick(d); + }); + + added.append("image") + .attr("xlink:href", function (d) { + // overwrite this . . . + var iconInfo = ctrl.icons[d.item.kind]; + switch (iconInfo.type) { + case 'image': + return iconInfo.icon; + case "glyph": + return null; } - } - return ctrl.getTooltipTableHTML(tipRows); - }, - position: function (data, width, height, element) { - var center; - var top; - var chartBox; - var graphOffsetX; - var x; + }) + .attr("height", function (d) { + var iconInfo = ctrl.icons[d.item.kind]; + if (iconInfo.type !== 'image') { + return 0; + } + return 40; + }) + .attr("width", function (d) { + var iconInfo = ctrl.icons[d.item.kind]; + if (iconInfo.type !== 'image') { + return 0; + } + return 40; + }) + .attr("y", function (d) { + return getDimensions(d).y; + }) + .attr("x", function (d) { + return getDimensions(d).x; + }) + .on("contextmenu", function (d) { + contextMenu(ctrl, d); + }); + + added.append("text") + .each(function (d) { + var iconInfo = ctrl.icons[d.item.kind]; + if (iconInfo.type !== 'glyph') { + return; + } + d3.select(this).text(iconInfo.icon) + .attr("class", "glyph") + .attr('font-family', iconInfo.fontfamily); + }) + + .attr("y", function (d) { + return getDimensions(d).y; + }) + .attr("x", function (d) { + return getDimensions(d).x; + }) + .on("contextmenu", function (d) { + contextMenu(this, d); + }); + + + added.append("text") + .attr("x", 26) + .attr("y", 24) + .text(function (d) { + return d.item.name; + }) + .attr('class', function () { + var className = "attached-label"; + if (ctrl.showLabels) { + return className + ' visible'; + } + return className; + }); + + added.selectAll("title").text(function (d) { + return tooltip(d).join("\n"); + }); + + vs = vertices; + } + graph.select(); + } + + function tooltip (d) { + if (ctrl.tooltipFunction) { + return ctrl.tooltipFunction({node: d}); + } + return 'Name: ' + d.item.name; + } + + function removeContextMenu () { + d3.event.preventDefault(); + d3.select('.popup').remove(); + contextMenuShowing = false; + } + + function contextMenu (that, data) { + var canvasSize, popupSize, canvas, mousePosition, popup; + + if (contextMenuShowing) { + removeContextMenu(); + } else { + d3.event.preventDefault(); + + canvas = d3.select('pf-topology'); + mousePosition = d3.mouse(canvas.node()); + + popup = canvas.append('div') + .attr('class', 'popup') + .style('left', mousePosition[0] + 'px') + .style('top', mousePosition[1] + 'px'); + popup.append('h5').text('Actions on ' + data.item.kind); - try { - center = parseInt(element.getAttribute('x')); - top = parseInt(element.getAttribute('y')); - chartBox = document.querySelector('#' + ctrl.sparklineChartId).getBoundingClientRect(); - graphOffsetX = document.querySelector('#' + ctrl.sparklineChartId + ' g.c3-axis-y').getBoundingClientRect().right; - x = Math.max(0, center + graphOffsetX - chartBox.left - Math.floor(width / 2)); + buildContextMenuOptions(popup, data); - return { - top: top - height, - left: Math.min(x, chartBox.width - width) - }; - } catch (e) { - } + canvasSize = [ + canvas.node().offsetWidth, + canvas.node().offsetHeight + ]; + + popupSize = [ + popup.node().offsetWidth, + popup.node().offsetHeight + ]; + + if (popupSize[0] + mousePosition[0] > canvasSize[0]) { + popup.style('left', 'auto'); + popup.style('right', 0); } - }; - }; - ctrl.$onChanges = function (changesObj) { - ctrl.updateAll(); - }; + if (popupSize[1] + mousePosition[1] > canvasSize[1]) { + popup.style('top', 'auto'); + popup.style('bottom', 0); + } + contextMenuShowing = !contextMenuShowing; + } + } - ctrl.$doCheck = function () { - // do a deep compare on chartData - if (!angular.equals(ctrl.chartData, prevChartData)) { - ctrl.updateAll(); + function buildContextMenuOptions (popup, data) { + if (data.item.kind === 'Tag') { + return false; } - }; + addContextMenuOption(popup, 'Go to summary page', data, dblclick); + } + + function dblclick (d) { + window.location.assign(d.url); + } + + function addContextMenuOption (popup, text, data, callback) { + popup.append('p').text(text).on('click', function () { + callback(data); + }); + } + + function getDimensions (d) { + var nodeEntry = ctrl.nodes[d.item.kind]; + var defaultDimensions = defaultElementDimensions(); + if (nodeEntry) { + if (nodeEntry.textX) { + defaultDimensions.x = nodeEntry.textX; + } + if (nodeEntry.textY) { + defaultDimensions.y = nodeEntry.textY; + } + + if (nodeEntry.radius) { + defaultDimensions.r = nodeEntry.radius; + } + } + return defaultDimensions; + } + + function defaultElementDimensions () { + return { x: 0, y: 9, r: 17 }; + } + + function getItemStatusClass (d) { + switch (d.item.status.toLowerCase()) { + case "ok": + case "active": + case "available": + case "on": + case "ready": + case "running": + case "succeeded": + case "valid": + return "success"; + case "notready": + case "failed": + case "error": + case "unreachable": + return "error"; + case 'warning': + case 'waiting': + case 'pending': + return "warning"; + case 'unknown': + case 'terminated': + return "unknown"; + } + } }] }); ;/** @@ -3159,11 +6830,12 @@ angular.module('patternfly.charts').component('pfUtilizationTrendChart', { var matchesFilter = function (item, filter) { var match = true; + var re = new RegExp(filter.value, 'i'); if (filter.id === 'name') { - match = item.name.match(filter.value) !== null; + match = item.name.match(re) !== null; } else if (filter.id === 'address') { - match = item.address.match(filter.value) !== null; + match = item.address.match(re) !== null; } else if (filter.id === 'birthMonth') { match = item.birthMonth === filter.value; } @@ -7151,8 +10823,9 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { * * @param {object} config Optional configuration object * * @param {object} dtOptions Optional angular-datatables DTOptionsBuilder configuration object. See {@link http://l-lin.github.io/angular-datatables/archives/#/api angular-datatables: DTOptionsBuilder} * @param {array} items Array of items to display in the table view. @@ -7173,31 +10846,46 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { *
  • .title - (String) Optional title, used for the tooltip *
  • .actionFn - (function(action)) Function to invoke when the action selected * + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @example - +
    -
    - -
    -
    - +
    +
    +
    +
    -
    +
    +
    +
    + +
    +
    + +
    +
    + + + + angular.module('patternfly.tableview.demo', ['patternfly.views','patternfly.table']); - angular.module('patternfly.table').controller('TableCtrl', ['$scope', + angular.module('patternfly.tableview.demo').controller('TableCtrl', ['$scope', function ($scope) { $scope.dtOptions = { order: [[2, "asc"]], @@ -7265,7 +10953,19 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.config = { onCheckBoxChange: handleCheckBoxChange, - selectionMatchProp: "name" + selectionMatchProp: "name", + itemsAvailable: true + }; + + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } }; function handleCheckBoxChange (item) { @@ -7335,8 +11035,9 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { * * @param {object} config Optional configuration object *
      - *
    • .selectionMatchProp - (string) Property of the items to use for determining matching, default is 'uuid' - *
    • .onCheckBoxChange - ( function(item) ) Called to notify when a checkbox selection changes, default is none + *
    • .selectionMatchProp - (string) Property of the items to use for determining matching, default is 'uuid' + *
    • .onCheckBoxChange - ( function(item) ) Called to notify when a checkbox selection changes, default is none + *
    • .itemsAvailable - (boolean) If 'false', displays the {@link patternfly.views.component:pfEmptyState Empty State} component. *
    * @param {object} dtOptions Optional angular-datatables DTOptionsBuilder configuration object. See {@link http://l-lin.github.io/angular-datatables/archives/#/api angular-datatables: DTOptionsBuilder} * @param {array} items Array of items to display in the table view. @@ -7357,6 +11058,7 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { *
  • .title - (String) Optional title, used for the tooltip *
  • .actionFn - (function(action)) Function to invoke when the action selected * + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @example @@ -7366,22 +11068,27 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', {
    - + --!> +

    @@ -7706,7 +11413,19 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.tableConfig = { onCheckBoxChange: handleCheckBoxChange, - selectionMatchProp: "name" + selectionMatchProp: "name", + itemsAvailable: true + }; + + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } }; $scope.tableActionButtons = [ @@ -7753,6 +11472,18 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { actionFn: performTableAction } ]; + + $scope.updateItemsAvailable = function () { + if(!$scope.tableConfig.itemsAvailable) { + $scope.toolbarConfig.filterConfig.resultsCount = 0; + $scope.toolbarConfig.filterConfig.totalCount = 0; + $scope.toolbarConfig.filterConfig.selectedCount = 0; + } else { + $scope.toolbarConfig.filterConfig.resultsCount = $scope.items.length; + $scope.toolbarConfig.filterConfig.totalCount = $scope.allItems.length; + handleCheckBoxChange(); + } + }; } ]); @@ -7765,7 +11496,8 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { colummns: '<', items: '<', actionButtons: '
    - +
    {{item.name}} @@ -8275,7 +12009,9 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', {
    - +
    {{item.name}}
    @@ -8290,9 +12026,17 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', {
    + items="items" + empty-state-config="emptyStateConfig">
    +
    +
    + +
    +

    @@ -8397,13 +12141,14 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { var matchesFilter = function (item, filter) { var match = true; + var re = new RegExp(filter.value, 'i'); if (filter.id === 'name') { - match = item.name.match(filter.value) !== null; + match = item.name.match(re) !== null; } else if (filter.id === 'age') { match = item.age === parseInt(filter.value); } else if (filter.id === 'address') { - match = item.address.match(filter.value) !== null; + match = item.address.match(re) !== null; } else if (filter.id === 'birthMonth') { match = item.birthMonth === filter.value; } @@ -8621,12 +12366,25 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.listConfig = { selectionMatchProp: 'name', checkDisabled: false, + itemsAvailable: true, onCheckBoxChange: handleCheckBoxChange }; + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; + $scope.tableConfig = { onCheckBoxChange: handleCheckBoxChange, - selectionMatchProp: "name" + selectionMatchProp: "name", + itemsAvailable: true, }; $scope.doAdd = function () { @@ -8637,6 +12395,19 @@ angular.module( 'patternfly.notification' ).component('pfToastNotification', { $scope.actionsText = "Option " + option + " selected\n" + $scope.actionsText; }; + $scope.updateItemsAvailable = function () { + $scope.tableConfig.itemsAvailable = $scope.listConfig.itemsAvailable; + if(!$scope.listConfig.itemsAvailable) { + $scope.toolbarConfig.filterConfig.resultsCount = 0; + $scope.toolbarConfig.filterConfig.totalCount = 0; + $scope.toolbarConfig.filterConfig.selectedCount = 0; + } else { + $scope.toolbarConfig.filterConfig.resultsCount = $scope.items.length; + $scope.toolbarConfig.filterConfig.totalCount = $scope.allItems.length; + handleCheckBoxChange(); + } + }; + function handleCheckBoxChange (item) { var selectedItems = $filter('filter')($scope.allItems, {selected: true}); if (selectedItems) { @@ -9303,8 +13074,9 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout *
  • .onSelectionChange - ( function(items) ) Called to notify when item selections change, default is none *
  • .onClick - ( function(item, event) ) Called to notify when an item is clicked, default is none *
  • .onDblClick - ( function(item, event) ) Called to notify when an item is double clicked, default is none + *
  • .itemsAvailable - (boolean) If 'false', displays the {@link patternfly.views.component:pfEmptyState Empty State} component. * - * + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @param {Array} items the data to be shown in the cards
    * * @example @@ -9322,7 +13094,7 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout
    - +
    {{item.name}}
    @@ -9370,6 +13142,9 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout +
    @@ -9424,6 +13199,7 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout $scope.config = { selectItems: false, + itemsAvailable: true, multiSelect: false, dblClick: false, selectionMatchProp: 'name', @@ -9469,6 +13245,17 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout state: "New York" }, ] + + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; } ]); @@ -9477,12 +13264,13 @@ angular.module('patternfly.validation', []).directive('pfValidation', ["$timeout angular.module('patternfly.views').component('pfCardView', { bindings: { config: '=?', + emptyStateConfig: '=?', items: '=', eventId: '@id' }, transclude: true, templateUrl: 'views/cardview/card-view.html', - controller: ["pfUtils", function (pfUtils) { + controller: function () { 'use strict'; var ctrl = this; ctrl.defaultConfig = { @@ -9585,13 +13373,171 @@ angular.module('patternfly.views').component('pfCardView', { }; ctrl.$onInit = function () { - ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Setting bound variables to new variables loses it's binding + // ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Instead, use _.defaults to update the existing variable + _.defaults(ctrl.config, ctrl.defaultConfig); if (ctrl.config.selectItems && ctrl.config.showSelectBox) { throw new Error('pfCardView - ' + 'Illegal use of pfCardView component! ' + 'Cannot allow both select box and click selection in the same card view.'); } }; + } +}); +;/** + * @ngdoc directive + * @name patternfly.views.component:pfEmptyState + * @restrict E + * + * @description + * Component for rendering an empty state. + * + * @param {object} config Optional configuration object + * + * @param {array} actionButtons Buttons to display under the icon, title, and informational paragraph. + * + * @example + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + + + angular.module('patternfly.views').controller('ViewCtrl', ['$scope', + function ($scope) { + $scope.eventText = ''; + + $scope.config = { + icon: 'pficon-add-circle-o', + title: 'Empty State Title', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; + + var performAction = function (action) { + $scope.eventText = action.name + " executed. \r\n" + $scope.eventText; + }; + + $scope.actionButtons = [ + { + name: 'Main Action', + title: 'Perform an action', + actionFn: performAction, + type: 'main' + }, + { + name: 'Secondary Action 1', + title: 'Perform an action', + actionFn: performAction + }, + { + name: 'Secondary Action 2', + title: 'Perform an action', + actionFn: performAction + }, + { + name: 'Secondary Action 3', + title: 'Perform an action', + actionFn: performAction + } + ]; + } + ]); + +
    +*/ +angular.module('patternfly.views').component('pfEmptyState', { + bindings: { + config: '.showSelectBox - (boolean) Show item selection boxes for each item, default is true *
  • .selectItems - (boolean) Allow row selection, default is false *
  • .dlbClick - (boolean) Handle double clicking (item remains selected on a double click). Default is false. + *
  • .dragEnabled - (boolean) Enable drag and drop. Default is false. + *
  • .dragEnd - ( function() ) Function to call when the drag operation ended, default is none + *
  • .dragMoved - ( function() ) Function to call when the drag operation moved an element, default is none + *
  • .dragStart - ( function(item) ) Function to call when the drag operation started, default is none *
  • .multiSelect - (boolean) Allow multiple row selections, selectItems must also be set, not applicable when dblClick is true. Default is false *
  • .useExpandingRows - (boolean) Allow row expansion for each list item. *
  • .selectionMatchProp - (string) Property of the items to use for determining matching, default is 'uuid' *
  • .selectedItems - (array) Current set of selected items + *
  • .itemsAvailable - (boolean) If 'false', displays the {@link patternfly.views.component:pfEmptyState Empty State} component. *
  • .checkDisabled - ( function(item) ) Function to call to determine if an item is disabled, default is none *
  • .onCheckBoxChange - ( function(item) ) Called to notify when a checkbox selection changes, default is none *
  • .onSelect - ( function(item, event) ) Called to notify of item selection, default is none @@ -9646,13 +13597,16 @@ angular.module('patternfly.views').component('pfCardView', { * @param {function (item))} menuClassForItemFn function(item) Used to specify a class for an item's dropdown kebab * @param {function (action, item))} updateMenuActionForItemFn function(action, item) Used to update a menu action based on the current item * @param {object} customScope Object containing any variables/functions used by the transcluded html, access via customScope. + * @param {object} emptyStateConfig Optional configuration settings for the empty state component. See the {@link patternfly.views.component:pfEmptyState Empty State} component * @example
    Show Expanding Rows + +
    + +
    +
    +
    +
    +
    @@ -9781,6 +13747,28 @@ angular.module('patternfly.views').component('pfCardView', { return $scope.showDisabled && (item.name === "John Smith"); }; + var dragEnd = function() { + $scope.eventText = 'drag end\r\n' + $scope.eventText; + }; + var dragMoved = function() { + var index = -1; + + for (var i = 0; i < $scope.items.length; i++) { + if ($scope.items[i] === $scope.dragItem) { + index = i; + break; + } + } + if (index >= 0) { + $scope.items.splice(index, 1); + } + $scope.eventText = 'drag moved\r\n' + $scope.eventText; + }; + var dragStart = function(item) { + $scope.dragItem = item; + $scope.eventText = item.name + ': drag start\r\n' + $scope.eventText; + }; + $scope.enableButtonForItemFn = function(action, item) { return !((action.name ==='Action 2') && (item.name === "Frank Livingston")) && !(action.name === 'Start' && item.started); @@ -9821,8 +13809,13 @@ angular.module('patternfly.views').component('pfCardView', { selectItems: false, multiSelect: false, dblClick: false, + dragEnabled: false, + dragEnd: dragEnd, + dragMoved: dragMoved, + dragStart: dragStart, selectionMatchProp: 'name', selectedItems: [], + itemsAvailable: true, checkDisabled: checkDisabledItem, showSelectBox: true, useExpandingRows: false, @@ -9833,6 +13826,17 @@ angular.module('patternfly.views').component('pfCardView', { onDblClick: handleDblClick }; + $scope.emptyStateConfig = { + icon: 'pficon-warning-triangle-o', + title: 'No Items Available', + info: "This is the Empty State component. The goal of a empty state pattern is to provide a good first impression that helps users to achieve their goals. It should be used when a view is empty because no objects exists and you want to guide the user to perform specific actions.", + helpLink: { + label: 'For more information please see', + urlLabel: 'pfExample', + url : '#/api/patternfly.views.component:pfEmptyState' + } + }; + $scope.items = [ { name: "Fred Flintstone", @@ -9990,13 +13994,14 @@ angular.module('patternfly.views').component('pfListView', { updateMenuActionForItemFn: '=?', actions: '=?', updateActionForItemFn: '=?', - customScope: '=?' + customScope: '=?', + emptyStateConfig: '=?' }, transclude: { expandedContent: '?listExpandedContent' }, templateUrl: 'views/listview/list-view.html', - controller: ["$timeout", "$window", "$element", "pfUtils", function ($timeout, $window, $element, pfUtils) { + controller: ["$window", "$element", function ($window, $element) { 'use strict'; var ctrl = this; @@ -10020,6 +14025,10 @@ angular.module('patternfly.views').component('pfListView', { selectItems: false, multiSelect: false, dblClick: false, + dragEnabled: false, + dragEnd: null, + dragMoved: null, + dragStart: null, selectionMatchProp: 'uuid', selectedItems: [], checkDisabled: false, @@ -10094,7 +14103,7 @@ angular.module('patternfly.views').component('pfListView', { // update the actions based on the current item ctrl.updateActions(item); - $timeout(function () { + $window.requestAnimationFrame(function () { var parentDiv = undefined; var nextElement; @@ -10199,7 +14208,10 @@ angular.module('patternfly.views').component('pfListView', { }; ctrl.$onInit = function () { - ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Setting bound variables to new variables loses it's binding + // ctrl.config = pfUtils.merge(ctrl.defaultConfig, ctrl.config); + // Instead, use _.defaults to update the existing variable + _.defaults(ctrl.config, ctrl.defaultConfig); if (!ctrl.config.selectItems) { ctrl.config.selectedItems = []; } @@ -10212,6 +14224,30 @@ angular.module('patternfly.views').component('pfListView', { 'Cannot allow both select box and click selection in the same list view.'); } }; + + ctrl.dragEnd = function () { + if (angular.isFunction(ctrl.config.dragEnd)) { + ctrl.config.dragEnd(); + } + }; + + ctrl.dragMoved = function () { + if (angular.isFunction(ctrl.config.dragMoved)) { + ctrl.config.dragMoved(); + } + }; + + ctrl.isDragOriginal = function (item) { + return (item === ctrl.dragItem); + }; + + ctrl.dragStart = function (item) { + ctrl.dragItem = item; + + if (angular.isFunction(ctrl.config.dragStart)) { + ctrl.config.dragStart(item); + } + }; }] }); ;(function () { @@ -11380,6 +15416,43 @@ angular.module('patternfly.wizard').component('pfWizard', { }; }] }); +;angular.module('patternfly.canvas').run(['$templateCache', function($templateCache) { + 'use strict'; + + $templateCache.put('canvas-view/canvas-editor/canvas-editor.html', + "
    Hide Connectors
    {{tab.preTitle}}
    {{tab.title}}
    " + ); + + + $templateCache.put('canvas-view/canvas-editor/toolbox-items.html', + "
    • \"{{item.name}}\" {{ item.name }}
    " + ); + + + $templateCache.put('canvas-view/canvas/canvas.html', + "Select a second item to complete the connection or click on the canvas to cancelNo available connections! Click on the canvas to cancel{{node.name()}}

    {{node.name()}}

    {{node.fontContent()}}{{'\\ue918'}}{{connector.fontContent()}}{{connector.name()}}
    {{connection.name()}}
    " + ); + + + $templateCache.put('canvas-view/canvas/node-toolbar.html', + "
    " + ); + +}]); ;angular.module('patternfly.card').run(['$templateCache', function($templateCache) { 'use strict'; @@ -11583,7 +15656,7 @@ angular.module('patternfly.wizard').component('pfWizard', { 'use strict'; $templateCache.put('table/tableview/table-view.html', - "
    {{col.header}}Actions
    {{ value }} 0\" class=table-view-pf-actions ng-repeat=\"actionButton in $ctrl.actionButtons\">
    0\" class=\"table-view-pf-actions list-group-item-header\">
    " + "
    {{col.header}}Actions
    {{ value }} 0\" class=table-view-pf-actions ng-repeat=\"actionButton in $ctrl.actionButtons\">
    0\" class=\"table-view-pf-actions list-group-item-header\">
    " ); }]); @@ -11602,12 +15675,17 @@ angular.module('patternfly.wizard').component('pfWizard', { 'use strict'; $templateCache.put('views/cardview/card-view.html', - "
    " + "
    " + ); + + + $templateCache.put('views/empty-state.html', + "

    {{$ctrl.config.title}}

    {{$ctrl.config.info}}

    " ); $templateCache.put('views/listview/list-view.html', - "
    0) || ($ctrl.menuActions && $ctrl.menuActions.length > 0)\">
    " + "
    0) || ($ctrl.menuActions && $ctrl.menuActions.length > 0)\">
    " ); }]); diff --git a/dist/docs/grunt-scripts/jquery-ui.min.js b/dist/docs/grunt-scripts/jquery-ui.min.js new file mode 100644 index 000000000..25398a167 --- /dev/null +++ b/dist/docs/grunt-scripts/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("
    "))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("

    ")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(p),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(p.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(d)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(c+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(c+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

    ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n) +}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
    ").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var f=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("
    ").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n; +this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("