Commit 5e6ba8afab0d8bb963b50013a4b8da24bf2a143f

Authored by isisadmin
1 parent bf9c3f73

datalet doc update

Showing 570 changed files with 950 additions and 163911 deletions

Too many changes.

To preserve performance only 100 of 570 files are displayed.

datalets/barchart-datalet/barchart-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26 <link rel="import" href="../highcharts-datalet/highcharts-datalet.html">
26 27  
27 28 <!--
28 29  
29   -`barchart-datalet` is a barchart datalet based on highcharts project <http://www.highcharts.com/>
  30 +`barchart-datalet` is a barchart datalet based on highcharts project http://www.highcharts.com/
30 31  
31 32 Example:
32 33  
33   -<barchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
34   - fields='["result,records,Lat","result,records,Lng"]'></barchart-datalet>
35   -
  34 + <barchart-datalet
  35 + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#"
  36 + fields='["field1","field2"]'>
  37 + </barchart-datalet>
36 38  
  39 +@element barchart-datalet
  40 +@status v0.1
  41 +@demo demo/index.html
  42 +@group datalets
37 43 -->
38 44  
39 45 <dom-module name="barchart-datalet">
... ...
datalets/barchart-datalet/demo/index.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title></title>
  6 +
  7 + <script>
  8 + </script>
  9 +
  10 +</head>
  11 +<body>
  12 +
  13 +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>
  14 +<link rel="import" href="../barchart-datalet.html" />
  15 +
  16 +<barchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
  17 + fields='["result,records,Lat","result,records,Lng"]'></barchart-datalet>
  18 +
  19 +</body>
  20 +</html>
0 21 \ No newline at end of file
... ...
datalets/base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26 <link rel="import" href="../base-datalet/base-datalet.html">
26 27  
27 28 <!--
28   -@group ROUTETOPA Base Web Component
29   -
30   -The `base-datalet` is a base-datalet web component that has built up by using Polymer.
31   -Pass to this component a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll build an object
32   -you can use to set up the structures for presentation.
  29 +The `base-ajax-json-jsonpath-datalet` extend the base component and define the mechanism to access and select data.
  30 +This datalet handles AJAX request with JSON response and uses JSONPATH for data selection and filtering.
33 31  
34   -### Code
  32 +Example :
35 33  
36   -Example
37   -
38   - <base-datalet
39   - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&amp;limit=50"
40   - query="$.result.records..Supplier $.result.records..Amount">
41   - </base-datalet>
42   -
43   -### HTML
44   -
45   - <base-datalet
46   - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&amp;limit=50"
47   - query="$.result.records..Supplier $.result.records..Amount">
48   - </base-datalet>
  34 + <dom-module id="every-datalet-that-handle-ajax-json">
  35 + <template>
  36 + ...
  37 + <base-ajax-json-jsonpath-datalet data-url="{{dataUrl}}" fields="{{fields}}"></base-ajax-json-jsonpath-datalet>
  38 + ...
  39 + </template>
  40 + </dom-module>
49 41  
50   -@class base-datalet
  42 +@element base-ajax-json-jsonpath-datalet
  43 +@status v0.1
  44 +@homepage
  45 +@group datalets
51 46 -->
52 47  
53 48 <dom-module id="base-ajax-json-jsonpath-datalet">
... ...
datalets/base-ajax-json-jsonpath-datalet/docs.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <link rel="import" href="../../bower_components/iron-component-page/iron-component-page.html">
  5 + <meta charset="UTF-8">
  6 +</head>
  7 +<body>
  8 +
  9 +<iron-component-page src="base-ajax-json-jsonpath-datalet.html"></iron-component-page>
  10 +
  11 +</body>
  12 +</html>
0 13 \ No newline at end of file
... ...
datalets/base-ajax-json-jsonpath-datalet/static/js/AjaxJsonJsonPathBehavior.js
1 1 /*
2   - The MIT License (MIT)
  2 +@license
  3 + The MIT License (MIT)
3 4  
4   - Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno, Italy
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
5 6  
6   - Permission is hereby granted, free of charge, to any person obtaining a copy
7   - of this software and associated documentation files (the "Software"), to deal
8   - in the Software without restriction, including without limitation the rights
9   - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   - copies of the Software, and to permit persons to whom the Software is
11   - furnished to do so, subject to the following conditions:
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
12 13  
13   - The above copyright notice and this permission notice shall be included in
14   - all copies or substantial portions of the Software.
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
  24 +*/
15 25  
16   - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   - THE SOFTWARE.
23   - */
24 26  
25 27 var AjaxJsonJsonPathBehavior = {
26 28  
... ... @@ -39,6 +41,11 @@ var AjaxJsonJsonPathBehavior = {
39 41 }
40 42 },
41 43  
  44 + /**
  45 + * Make an AJAX call to the dataset URL
  46 + *
  47 + * @method requestData
  48 + */
42 49 requestData: function(){
43 50  
44 51 var comp = this;
... ... @@ -53,10 +60,7 @@ var AjaxJsonJsonPathBehavior = {
53 60 },
54 61  
55 62 /**
56   - * Called when core-ajax component receive the json data from called url. It is responsible to
57   - * extract data from response, coded in json, and refine it by using JsonPath queries in the query attribute.
58   - * After this phase it parses the resulting object to populate the structure(keys,values) to fill the final table by using
59   - * angularJs syntax.
  63 + * Called when core-ajax component receive the json data from called url.
60 64 *
61 65 * @method handleResponse
62 66 */
... ... @@ -65,6 +69,12 @@ var AjaxJsonJsonPathBehavior = {
65 69 this.runWorkcycle();
66 70 },
67 71  
  72 + /**
  73 + * selectData built a JSONPATH query based on the user selected fields then extract data from the JSON response.
  74 + * This method built an objects <name, data> for every user selected field and push it into the data array.
  75 + *
  76 + * @method selectData
  77 + */
68 78 selectData : function(){
69 79  
70 80 this.data = [];
... ...
datalets/base-csv-datalet/base-csv-datalet.html
  1 +<!--
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
  24 +-->
  25 +
1 26 <link rel="import" href="../../bower_components/polymer/polymer.html">
2 27  
3 28 <dom-module id="base-csv-datalet">
... ...
datalets/base-datalet/base-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26 <link rel="import" href="../../bower_components/polymer/polymer.html">
26 27  
27 28 <!--
28   -@group ROUTETOPA Base Web Component
29   -
30   -The `base-datalet` is a base-datalet web component that has built up by using Polymer.
31   -Pass to this component a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll build an object
32   -you can use to set up the structures for presentation.
33   -
34   -### Code
35   -
36   -Example
37   -
38   - <base-datalet
39   - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&amp;limit=50"
40   - query="$.result.records..Supplier $.result.records..Amount">
41   - </base-datalet>
42   -
43   -### HTML
44   -
45   - <base-datalet
46   - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&amp;limit=50"
47   - query="$.result.records..Supplier $.result.records..Amount">
48   - </base-datalet>
49   -
50   -@class base-datalet
  29 +The `base-datalet` is the base component that includes datalet footer (with information about dataset domain and ROUTE-TO-PA project).
  30 +Base datalet includes polymer.html and the BaseDataletBehaviors javascript file that define the datalet workcycle and the datalet base properties : dataUrl, fields and data.
  31 +Every datalet must include this one in its `<template>` section.
  32 +
  33 +Example :
  34 +
  35 + <dom-module id="every-datalet">
  36 + <template>
  37 + ...
  38 + <base-datalet data-url="{{dataUrl}}" fields="{{fields}}"></base-datalet>
  39 + ...
  40 + </template>
  41 + </dom-module>
  42 +
  43 +@element base-datalet
  44 +@status v0.1
  45 +@homepage
  46 +@group datalets
51 47 -->
52 48  
53 49 <dom-module id="base-datalet">
... ... @@ -75,6 +71,17 @@ Example
75 71 <script>
76 72 BaseDatalet = Polymer({
77 73 is: 'base-datalet',
  74 +
  75 + /**
  76 + * It is called after the elementโ€™s template has been stamped and all elements inside the elementโ€™s local
  77 + * DOM have been configured (with values bound from parents, deserialized attributes, or else default values)
  78 + * and had their ready method called.
  79 + *
  80 + * Extract the dataset domain from the entire URL and set the text content of the datalet footer.
  81 + *
  82 + * @method ready
  83 + *
  84 + */
78 85 ready: function(){
79 86 this.$.domain.textContent = this.dataUrl.split("/")[0] + "//" + this.dataUrl.split("/")[2];
80 87 }
... ...
datalets/base-datalet/docs.html
1 1 <!DOCTYPE html>
2 2 <html lang="en">
3 3 <head>
4   - <link rel="import" href="../../bower_components/iron-component-page/iron-component-page.html">
5 4 <meta charset="UTF-8">
  5 + <link rel="import" href="../../bower_components/iron-component-page/iron-component-page.html">
6 6 </head>
7 7 <body>
8 8  
... ...
datalets/base-datalet/static/js/BaseDataletBehaviors.js
1 1 /*
  2 +@license
2 3 The MIT License (MIT)
3 4  
4   - Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
5 6  
6 7 Permission is hereby granted, free of charge, to any person obtaining a copy
7 8 of this software and associated documentation files (the "Software"), to deal
... ... @@ -74,6 +75,7 @@ var BaseDataletBehavior ={
74 75 var WorkcycleBehavior = {
75 76  
76 77 _component: null,
  78 +
77 79 /**
78 80 * Request data from source(e.g. CKAN by api) using some kind of technology(e.g. Ajax)
79 81 *
... ... @@ -118,12 +120,9 @@ var WorkcycleBehavior = {
118 120 },
119 121  
120 122 /**
121   - * Called when iron-ajax component receive the json data from called url. It is responsible to
122   - * extract data from response, coded in json, and refine it by using JsonPath queries in the query attribute.
123   - * After this phase it parses the resulting object to populate the structure(keys,values) to fill the final table by using
124   - * angularJs syntax.
  123 + * This method represents the entire datalet workcycle.
125 124 *
126   - * @method handleResponse
  125 + * @method runWorkcycle
127 126 */
128 127 runWorkcycle: function() {
129 128 this.selectData();
... ... @@ -132,6 +131,11 @@ var WorkcycleBehavior = {
132 131 this.presentData();
133 132 },
134 133  
  134 + /**
  135 + * This method save the reference to the polymer object related to the datalet.
  136 + *
  137 + * @method init
  138 + */
135 139 init: function(component){
136 140 this._component = component;
137 141 this.requestData();
... ...
datalets/column3Dchart-datalet/column3Dchart-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26  
... ... @@ -33,10 +34,15 @@ THE SOFTWARE.
33 34  
34 35 Example:
35 36  
36   -<column3dchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
37   - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']">
38   -
  37 + <column3dchart-datalet
  38 + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#"
  39 + fields='["field1","field2"]'>
  40 + </column3dchart-datalet>
39 41  
  42 +@element column3Dchart-datalet
  43 +@status v0.1
  44 +@demo demo/index.html
  45 +@group datalets
40 46 -->
41 47  
42 48  
... ...
datalets/column3Dchart-datalet/demo/index.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title></title>
  6 +
  7 + <script>
  8 + </script>
  9 +
  10 +</head>
  11 +<body>
  12 +
  13 +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>
  14 +<link rel="import" href="../column3Dchart-datalet.html" />
  15 +
  16 +<column3Dchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
  17 + fields='["result,records,Lat","result,records,Lng"]'></column3Dchart-datalet>
  18 +
  19 +</body>
  20 +</html>
0 21 \ No newline at end of file
... ...
datalets/columnchart-datalet/columnchart-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26 <link rel="import" href="../highcharts-datalet/highcharts-datalet.html">
... ... @@ -30,10 +31,15 @@ THE SOFTWARE.
30 31  
31 32 Example:
32 33  
33   -<columnchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
34   - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']">
35   -
  34 + <columnchart-datalet
  35 + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#"
  36 + fields='["field1","field2"]'>
  37 + </columnchart-datalet>
36 38  
  39 +@element columnchart-datalet
  40 +@status v0.1
  41 +@demo demo/index.html
  42 +@group datalets
37 43 -->
38 44  
39 45 <dom-module id="columnchart-datalet">
... ...
datalets/columnchart-datalet/demo/index.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title></title>
  6 +
  7 + <script>
  8 + </script>
  9 +
  10 +</head>
  11 +<body>
  12 +
  13 +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>
  14 +<link rel="import" href="../columnchart-datalet.html" />
  15 +
  16 +<columnchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
  17 + fields='["result,records,Lat","result,records,Lng"]'></columnchart-datalet>
  18 +
  19 +</body>
  20 +</html>
0 21 \ No newline at end of file
... ...
datalets/datatable-datalet/datatable-datalet.html
1 1 <!--
2   -@group ROUTETOPA Polymer Core Elements
  2 +@license
  3 + The MIT License (MIT)
3 4  
4   -The `datatables-datalet` is a porting of Datatables JQuery library in a web component that has built up by using Polymer.
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
  24 +-->
  25 +
  26 +<link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html">
  27 +
  28 +<!--
  29 +The `datatable-datalet` is a porting of Datatables JQuery library in a web component that has built up by using Polymer.
5 30 Pass to this component a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll show a
6 31 table with data and query attributes with all Datatables library features.
7 32  
8   -### Code
  33 +Example:
9 34  
10   -Example
11   -
12   - <datatables-datalet
13   - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&amp;limit=50"
14   - query="$.result.records..Supplier $.result.records..Amount">
  35 + <datatable-datalet
  36 + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#"
  37 + fields='["field1","field2"]'>
15 38 </datatables-datalet>
16 39  
17   -@class datatables-datalet
  40 +@element datatable-datalet
  41 +@status v0.1
  42 +@demo demo/index.html
  43 +@group datalets
18 44 -->
19   -<link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html">
20 45  
21 46 <dom-module id="datatable-datalet">
22 47 <template>
... ...
datalets/datatable-datalet/demo/index.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title></title>
  6 +
  7 + <script>
  8 + </script>
  9 +
  10 +</head>
  11 +<body>
  12 +
  13 +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>
  14 +<link rel="import" href="../datatable-datalet.html" />
  15 +
  16 +<datatable-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
  17 + fields='["result,records,Lat","result,records,Lng"]'></datatable-datalet>
  18 +
  19 +</body>
  20 +</html>
0 21 \ No newline at end of file
... ...
datalets/highcharts-datalet/highcharts-datalet.html
  1 +<!--
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
  24 +-->
  25 +
1 26 <link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html">
2 27  
  28 +<!--
  29 +The `highcharts-datalet` uses the base-ajax-json-jsonpath-datalet as data retriving and selection mechanism. It defines the common properties
  30 +for all the highchart datalets : categories, series and series_type. Overmore override the transformData method
  31 +to create and populate categories and series array. Every specific highchart chart implementation (eg linechart, barchart, columnchart ...)
  32 +will use highcharts-datalet properties to create the appropriate chart.
  33 +
  34 +Example :
  35 +
  36 + <dom-module id="highcarts-chart-datalet">
  37 + <template>
  38 + ...
  39 + <highcharts-datalet id="charts" data-url="{{dataUrl}}" fields="{{fields}}"></highcharts-datalet>
  40 + ...
  41 + </template>
  42 + </dom-module>
  43 +
  44 +@element highcharts-datalet
  45 +@status v0.1
  46 +@homepage
  47 +@group datalets
  48 +-->
  49 +
3 50 <dom-module id="highcharts-datalet">
4 51  
5 52 <template>
... ... @@ -7,8 +54,8 @@
7 54 <base-ajax-json-jsonpath-datalet data-url="{{dataUrl}}" fields="{{fields}}"></base-ajax-json-jsonpath-datalet>
8 55 </template>
9 56  
10   - <script src="http://code.highcharts.com/highcharts.js"></script>
11   - <script src="http://code.highcharts.com/modules/exporting.js"></script>
  57 + <script src="static/js/highcharts.js"></script>
  58 + <script src="static/js/exporting.js"></script>
12 59  
13 60 <script>
14 61 var HighchartsBehavior = {
... ... @@ -31,6 +78,13 @@
31 78 }
32 79 },
33 80  
  81 + /**
  82 + * Populate the categories and the series array.
  83 + *
  84 + * @method transformData
  85 + *
  86 + * @param {Event} e
  87 + */
34 88 transformData: function () {
35 89  
36 90 this.properties.categories.value = this.data[0].data;
... ... @@ -40,6 +94,7 @@
40 94  
41 95 this.data[i].data.every(function (element, index, array) {
42 96 try {
  97 + // TODO fix this parsing mechanism
43 98 (isNaN(parseFloat(element))) ? array[index] = parseFloat(element.match(/[0-9]+/g).join(".")) :
44 99 array[index] = parseFloat(element);
45 100 }catch(e){
... ...
datalets/highcharts-datalet/static/js/exporting.js 0 โ†’ 100644
  1 +/*
  2 + Highcharts JS v4.1.9 (2015-10-07)
  3 + Exporting module
  4 +
  5 + (c) 2010-2014 Torstein Honsi
  6 +
  7 + License: www.highcharts.com/license
  8 + */
  9 +(function(g){var z=g.Chart,s=g.addEvent,A=g.removeEvent,B=HighchartsAdapter.fireEvent,j=g.createElement,p=g.discardElement,u=g.css,l=g.merge,m=g.each,q=g.extend,E=g.splat,F=Math.max,k=document,C=window,G=g.isTouchDevice,H=g.Renderer.prototype.symbols,r=g.getOptions(),x;q(r.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});r.navigation=
  10 +{menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:G?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};r.exporting={type:"image/png",url:"http://export.highcharts.com/",
  11 + buttons:{contextButton:{menuClassName:"highcharts-contextmenu",symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};
  12 + g.post=function(b,a,e){var c,b=j("form",l({method:"post",action:b,enctype:"multipart/form-data"},e),{display:"none"},k.body);for(c in a)j("input",{type:"hidden",name:c,value:a[c]},null,b);b.submit();p(b)};q(z.prototype,{sanitizeSVG:function(b){return b.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ (NS[0-9]+\:)?href=/g,
  13 + " xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1="rgb($2)" $1-opacity="$3"').replace(/&nbsp;/g,"\u00a0").replace(/&shy;/g,"\u00ad").replace(/<IMG /g,"<image ").replace(/<(\/?)TITLE>/g,"<$1title>").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/ id=([^" >]+)/g,' id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g,
  14 + " ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(b){var a=this,e,c,f,y,h,d=l(a.options,b),I=d.exporting.allowHTML;if(!k.createElementNS)k.createElementNS=function(a,b){return k.createElement(b)};c=j("div",null,{position:"absolute",top:"-9999em",width:a.chartWidth+"px",height:a.chartHeight+"px"},k.body);f=a.renderTo.style.width;h=a.renderTo.style.height;f=d.exporting.sourceWidth||
  15 + d.chart.width||/px$/.test(f)&&parseInt(f,10)||600;h=d.exporting.sourceHeight||d.chart.height||/px$/.test(h)&&parseInt(h,10)||400;q(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:f,height:h});d.exporting.enabled=!1;delete d.data;d.series=[];m(a.series,function(a){y=l(a.options,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});y.isInternal||d.series.push(y)});b&&m(["xAxis","yAxis"],function(a){m(E(b[a]),function(b,c){d[a][c]=l(d[a][c],b)})});e=new g.Chart(d,
  16 + a.callback);m(["xAxis","yAxis"],function(b){m(a[b],function(a,c){var d=e[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;d&&(h!==void 0||f!==void 0)&&d.setExtremes(h,f,!0,!1)})});f=e.getChartHTML();d=null;e.destroy();p(c);if(I&&(c=f.match(/<\/svg>(.*?$)/)))c='<foreignObject x="0" y="0" width="200" height="200"><body xmlns="http://www.w3.org/1999/xhtml">'+c[1]+"</body></foreignObject>",f=f.replace("</svg>",c+"</svg>");f=this.sanitizeSVG(f);return f=f.replace(/(url\(#highcharts-[0-9]+)&quot;/g,"$1").replace(/&quot;/g,
  17 + "'")},getSVGForExport:function(b,a){var e=this.options.exporting;return this.getSVG(l({chart:{borderRadius:0}},e.chartOptions,a,{exporting:{sourceWidth:b&&b.sourceWidth||e.sourceWidth,sourceHeight:b&&b.sourceHeight||e.sourceHeight}}))},exportChart:function(b,a){var e=this.getSVGForExport(b,a),b=l(this.options.exporting,b);g.post(b.url,{filename:b.filename||"chart",type:b.type,width:b.width||0,scale:b.scale||2,svg:e},b.formAttributes)},print:function(){var b=this,a=b.container,e=[],c=a.parentNode,
  18 + f=k.body,g=f.childNodes;if(!b.isPrinting)b.isPrinting=!0,B(b,"beforePrint"),m(g,function(a,b){if(a.nodeType===1)e[b]=a.style.display,a.style.display="none"}),f.appendChild(a),C.focus(),C.print(),setTimeout(function(){c.appendChild(a);m(g,function(a,b){if(a.nodeType===1)a.style.display=e[b]});b.isPrinting=!1;B(b,"afterPrint")},1E3)},contextMenu:function(b,a,e,c,f,g,h){var d=this,l=d.options.navigation,D=l.menuItemStyle,n=d.chartWidth,o=d.chartHeight,k="cache-"+b,i=d[k],t=F(f,g),v,w,p,r=function(a){d.pointer.inClass(a.target,
  19 + b)||w()};if(!i)d[k]=i=j("div",{className:b},{position:"absolute",zIndex:1E3,padding:t+"px"},d.container),v=j("div",null,q({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},l.menuStyle),i),w=function(){u(i,{display:"none"});h&&h.setState(0);d.openMenu=!1},s(i,"mouseleave",function(){p=setTimeout(w,500)}),s(i,"mouseenter",function(){clearTimeout(p)}),s(document,"mouseup",r),s(d,"destroy",function(){A(document,"mouseup",r)}),m(a,function(a){if(a){var b=
  20 + a.separator?j("hr",null,null,v):j("div",{onmouseover:function(){u(this,l.menuItemHoverStyle)},onmouseout:function(){u(this,D)},onclick:function(b){b.stopPropagation();w();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},q({cursor:"pointer"},D),v);d.exportDivElements.push(b)}}),d.exportDivElements.push(v,i),d.exportMenuWidth=i.offsetWidth,d.exportMenuHeight=i.offsetHeight;a={display:"block"};e+d.exportMenuWidth>n?a.right=n-e-f-t+"px":a.left=e-t+"px";c+g+d.exportMenuHeight>
  21 + o&&h.alignOptions.verticalAlign!=="top"?a.bottom=o-c-t+"px":a.top=c+g-t+"px";u(i,a);d.openMenu=!0},addButton:function(b){var a=this,e=a.renderer,c=l(a.options.navigation.buttonOptions,b),f=c.onclick,k=c.menuItems,h,d,m={stroke:c.symbolStroke,fill:c.symbolFill},j=c.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=[],a.exportSVGElements=[];if(c.enabled!==!1){var n=c.theme,o=n.states,p=o&&o.hover,o=o&&o.select,i;delete n.states;f?i=function(b){b.stopPropagation();
  22 + f.call(a,b)}:k&&(i=function(){a.contextMenu(d.menuClassName,k,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?n.paddingLeft=g.pick(n.paddingLeft,25):c.text||q(n,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,i,n,p,o).attr({title:a.options.lang[c._titleKey],"stroke-linecap":"round"});d.menuClassName=b.menuClassName||"highcharts-menu-"+a.btnCount++;c.symbol&&(h=e.symbol(c.symbol,c.symbolX-j/2,c.symbolY-j/2,j,j).attr(q(m,{"stroke-width":c.symbolStrokeWidth||
  23 + 1,zIndex:1})).add(d));d.add().align(q(c,{width:d.width,x:g.pick(c.x,x)}),!0,"spacingBox");x+=(d.width+c.buttonSpacing)*(c.align==="right"?-1:1);a.exportSVGElements.push(d,h)}},destroyExport:function(b){var b=b.target,a,e;for(a=0;a<b.exportSVGElements.length;a++)if(e=b.exportSVGElements[a])e.onclick=e.ontouchstart=null,b.exportSVGElements[a]=e.destroy();for(a=0;a<b.exportDivElements.length;a++)e=b.exportDivElements[a],A(e,"mouseleave"),b.exportDivElements[a]=e.onmouseout=e.onmouseover=e.ontouchstart=
  24 + e.onclick=null,p(e)}});H.menu=function(b,a,e,c){return["M",b,a+2.5,"L",b+e,a+2.5,"M",b,a+c/2+0.5,"L",b+e,a+c/2+0.5,"M",b,a+c-1.5,"L",b+e,a+c-1.5]};z.prototype.callbacks.push(function(b){var a,e=b.options.exporting,c=e.buttons;x=0;if(e.enabled!==!1){for(a in c)b.addButton(c[a]);s(b,"destroy",b.destroyExport)}})})(Highcharts);
0 25 \ No newline at end of file
... ...
datalets/highcharts-datalet/static/js/highcharts.js 0 โ†’ 100644
  1 +/*
  2 + Highcharts JS v4.1.9 (2015-10-07)
  3 +
  4 + (c) 2009-2014 Torstein Honsi
  5 +
  6 + License: www.highcharts.com/license
  7 + */
  8 +(function(){function D(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&d!=="renderTo"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a<c;a++)d=e(d,b[a]);return d}function G(a,b){return parseInt(a,b||10)}function Ba(a){return typeof a==="string"}function da(a){return a&&
  9 + typeof a==="object"}function Ga(a){return Object.prototype.toString.call(a)==="[object Array]"}function qa(a){return typeof a==="number"}function Ca(a){return V.log(a)/V.LN10}function ia(a){return V.pow(10,a)}function ja(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function q(a){return a!==x&&a!==null}function K(a,b,c){var d,e;if(Ba(b))q(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(q(b)&&da(b))for(d in b)a.setAttribute(d,b[d]);return e}function ra(a){return Ga(a)?
  10 + a:[a]}function M(a,b){if(sa&&!ca&&b&&b.opacity!==x)b.filter="alpha(opacity="+b.opacity*100+")";t(a.style,b)}function $(a,b,c,d,e){a=C.createElement(a);b&&t(a,b);e&&M(a,{padding:0,border:P,margin:0});c&&M(a,c);d&&d.appendChild(a);return a}function ka(a,b){var c=function(){return x};c.prototype=new a;t(c.prototype,b);return c}function Ha(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Wa(a){return(db&&db(a)||nb||0)*6E4}function Ia(a,b){for(var c="{",d=!1,e,f,g,h,i,j=[];(c=a.indexOf(c))!==
  11 +-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=S.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e!==null&&(e=B.numberFormat(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:""))):e=Na(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function ob(a){return V.pow(10,T(V.log(a)/V.LN10))}function pb(a,b,c,d,e){var f,g=a,c=p(c,1);f=a/c;b||(b=[1,2,2.5,5,10],d===!1&&(c===
  12 +1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(g=b[d],e&&g*c>=a||!e&&f<=(b[d]+(b[d+1]||b[d]))/2)break;g*=c;return g}function qb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:d});for(e=0;e<c;e++)delete a[e].ss_i}function Oa(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function Da(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Pa(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),
  13 + delete a[c]}function Qa(a){eb||(eb=$(Ja));a&&eb.appendChild(a);eb.innerHTML=""}function la(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;L.console&&console.log(c)}function ea(a,b){return parseFloat(a.toPrecision(b||14))}function Ra(a,b){b.renderer.globalAnimation=p(a,b.animation)}function Cb(){var a=S.global,b=a.useUTC,c=b?"getUTC":"get",d=b?"setUTC":"set";ya=a.Date||window.Date;nb=b&&a.timezoneOffset;db=b&&a.getTimezoneOffset;fb=function(a,c,d,h,i,j){var k;b?(k=
  14 + ya.UTC.apply(0,arguments),k+=Wa(k)):k=(new ya(a,c,p(d,1),p(h,0),p(i,0),p(j,0))).getTime();return k};rb=c+"Minutes";sb=c+"Hours";tb=c+"Day";Xa=c+"Date";Ya=c+"Month";Za=c+"FullYear";Db=d+"Milliseconds";Eb=d+"Seconds";Fb=d+"Minutes";Gb=d+"Hours";ub=d+"Date";vb=d+"Month";wb=d+"FullYear"}function Q(){}function Sa(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function Hb(a,b,c,d,e){var f=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=
  15 + null;this.points={};this.stack=e;this.alignOptions={align:b.align||(f?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(f?"middle":c?"bottom":"top"),y:p(b.y,f?4:c?14:-6),x:p(b.x,f?c?-6:6:0)};this.textAlign=b.textAlign||(f?c?"right":"left":"center")}var x,C=document,L=window,V=Math,w=V.round,T=V.floor,ta=V.ceil,s=V.max,z=V.min,O=V.abs,W=V.cos,aa=V.sin,ma=V.PI,ga=ma*2/360,za=navigator.userAgent,Ib=L.opera,sa=/(msie|trident|edge)/i.test(za)&&!Ib,gb=C.documentMode===8,hb=!sa&&/AppleWebKit/.test(za),
  16 + Ka=/Firefox/.test(za),Jb=/(Mobile|Android|Windows Phone)/.test(za),Ea="http://www.w3.org/2000/svg",ca=!!C.createElementNS&&!!C.createElementNS(Ea,"svg").createSVGRect,Nb=Ka&&parseInt(za.split("Firefox/")[1],10)<4,fa=!ca&&!sa&&!!C.createElement("canvas").getContext,$a,ab,Kb={},xb=0,eb,S,Na,yb,F,ua=function(){return x},X=[],bb=0,Ja="div",P="none",Ob=/^[0-9]+$/,ib=["plotTop","marginRight","marginBottom","plotLeft"],Pb="stroke-width",ya,fb,nb,db,rb,sb,tb,Xa,Ya,Za,Db,Eb,Fb,Gb,ub,vb,wb,N={},B;B=L.Highcharts=
  17 + L.Highcharts?la(16,!0):{};B.seriesTypes=N;var t=B.extend=function(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a},p=B.pick=function(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],c!==x&&c!==null)return c},Ta=B.wrap=function(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}};Na=function(a,b,c){if(!q(b)||isNaN(b))return S.lang.invalidDate||"";var a=p(a,"%Y-%m-%d %H:%M:%S"),d=new ya(b-Wa(b)),e,f=d[sb](),g=d[tb](),h=d[Xa](),
  18 + i=d[Ya](),j=d[Za](),k=S.lang,m=k.weekdays,d=t({a:m[g].substr(0,3),A:m[g],d:Ha(h),e:h,w:g,b:k.shortMonths[i],B:k.months[i],m:Ha(i+1),y:j.toString().substr(2,2),Y:j,H:Ha(f),k:f,I:Ha(f%12||12),l:f%12||12,M:Ha(d[rb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ha(d.getSeconds()),L:Ha(w(b%1E3),3)},B.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};F={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,
  19 + week:6048E5,month:24192E5,year:314496E5};B.numberFormat=function(a,b,c,d){var e=S.lang,a=+a||0,f=b===-1?z((a.toString().split(".")[1]||"").length,20):isNaN(b=O(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(G(a=O(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+O(a-c).toFixed(f).slice(2):"")};yb={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),
  20 + c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=
  21 + d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};(function(a){L.HighchartsAdapter=L.HighchartsAdapter||a&&{init:function(b){var c=a.fx;a.extend(a.easing,{easeOutQuad:function(a,b,c,g,h){return-g*(b/=h)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(b,e){var f=c.step,g;e==="cur"?f=c.prototype:e==="_default"&&a.Tween&&(f=a.Tween.propHooks[e],e="set");(g=f[e])&&(f[e]=function(a){var c,a=b?a:this;if(a.prop!==
  22 + "align")return c=a.elem,c.attr?c.attr(a.prop,e==="cur"?x:a.now):g.apply(this,arguments)})});Ta(a.cssHooks.opacity,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});this.addAnimSetter("d",function(a){var c=a.elem,f;if(!a.started)f=b.init(c,c.d,c.toD),a.start=f[0],a.end=f[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))});this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){var c,g=a.length;for(c=0;c<g;c++)if(b.call(a[c],
  23 + a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,g;if(this[0]){Ba(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,1));c=b[0];if(c!==x)c.chart=c.chart||{},c.chart.renderTo=this[0],new B[a](c,b[1]),g=this;c===x&&(g=X[K(this[0],"data-highcharts-chart")])}return g}},addAnimSetter:function(b,c){a.Tween?a.Tween.propHooks[b]={set:c}:a.fx.step[b]=c},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=
  24 + 0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=C.removeEventListener?"removeEventListener":"detachEvent";C[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!sa&&d&&(delete d.layerX,delete d.layerY,delete d.returnValue);t(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,
  25 + b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===x)c.pageX=a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==x&&b.attr&&(c.opacity+="px");b.hasAnim=1;e.animate(c,d)},stop:function(b){b.hasAnim&&a(b).stop()}}})(L.jQuery);var U=L.HighchartsAdapter,
  26 + E=U||{};U&&U.init.call(U,yb);var jb=E.adapterRun,Qb=E.getScript,La=E.inArray,o=B.each=E.each,kb=E.grep,Rb=E.offset,Ua=E.map,I=E.addEvent,Y=E.removeEvent,J=E.fireEvent,Sb=E.washMouseEvent,lb=E.animate,cb=E.stop;S={colors:"#7cb5ec,#434348,#90ed7d,#f7a35c,#8085e9,#f15c80,#e4d354,#2b908f,#f45b5b,#91e8e1".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),
  27 + shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/4.1.9/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/4.1.9/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:0,
  28 + defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#333333",fontSize:"18px"}},subtitle:{text:"",align:"center",style:{color:"#555555"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0,
  29 + lineWidthPlus:1,radiusPlus:2},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return this.y===null?"":B.numberFormat(this.y,-1)},style:{color:"contrast",fontSize:"11px",fontWeight:"bold",textShadow:"0 0 6px contrast, 0 0 3px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1,marker:{},halo:{size:10,opacity:0.25}},select:{marker:{}}},stickyTracking:!0,
  30 + turboThreshold:1E3}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#909090",borderRadius:0,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolPadding:5,verticalAlign:"bottom",
  31 + x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:ca,backgroundColor:"rgba(249, 249, 249, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",
  32 + year:"%Y"},footerFormat:"",headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>',shadow:!0,snap:Jb?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",
  33 + fontSize:"9px"}}};var ba=S.plotOptions,U=ba.line;Cb();var Tb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,Ub=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,Vb=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,na=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Ua(a.stops,function(a){return na(a[1])}):(c=Tb.exec(a))?b=[G(c[1]),G(c[2]),G(c[3]),parseFloat(c[4],10)]:(c=Ub.exec(a))?b=[G(c[1],16),G(c[2],16),G(c[3],16),1]:(c=Vb.exec(a))&&
  34 +(b=[G(c[1]),G(c[2]),G(c[3]),1])})(a);return{get:function(c){var f;d?(f=D(a),f.stops=[].concat(f.stops),o(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)o(d,function(b){b.brighten(a)});else if(qa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=G(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this},raw:a}};Q.prototype=
  35 +{opacity:1,textProps:"fontSize,fontWeight,fontFamily,fontStyle,color,lineHeight,width,textDecoration,textOverflow,textShadow".split(","),init:function(a,b){this.element=b==="span"?$(b):C.createElementNS(Ea,b);this.renderer=a},animate:function(a,b,c){b=p(b,this.renderer.globalAnimation,!0);cb(this);if(b){b=D(b,{});if(c)b.complete=c;lb(this,a,b)}else this.attr(a,null,c);return this},colorGradient:function(a,b,c){var d=this.renderer,e,f,g,h,i,j,k,m,n,l,u,r=[];a.linearGradient?f="linearGradient":a.radialGradient&&
  36 +(f="radialGradient");if(f){g=a[f];i=d.gradients;k=a.stops;l=c.radialReference;Ga(g)&&(a[f]=g={x1:g[0],y1:g[1],x2:g[2],y2:g[3],gradientUnits:"userSpaceOnUse"});f==="radialGradient"&&l&&!q(g.gradientUnits)&&(h=g,g=D(g,d.getRadialAttr(l,h),{gradientUnits:"userSpaceOnUse"}));for(u in g)u!=="id"&&r.push(u,g[u]);for(u in k)r.push(k[u]);r=r.join(",");i[r]?a=i[r].attr("id"):(g.id=a="highcharts-"+xb++,i[r]=j=d.createElement(f).attr(g).add(d.defs),j.radAttr=h,j.stops=[],o(k,function(a){a[1].indexOf("rgba")===
  37 +0?(e=na(a[1]),m=e.get("rgb"),n=e.get("a")):(m=a[1],n=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":m,"stop-opacity":n}).add(j);j.stops.push(a)}));c.setAttribute(b,"url("+d.url+"#"+a+")");c.gradient=r}},applyTextShadow:function(a){var b=this.element,c,d=a.indexOf("contrast")!==-1,e={},f=this.renderer.forExport,g=f||b.style.textShadow!==x&&!sa;if(d)e.textShadow=a=a.replace(/contrast/g,this.renderer.getContrast(b.style.fill));if(hb||f)e.textRendering="geometricPrecision";g?this.css(e):
  38 + (this.fakeTS=!0,this.ySetter=this.xSetter,c=[].slice.call(b.getElementsByTagName("tspan")),o(a.split(/\s?,\s?/g),function(a){var d=b.firstChild,e,f,a=a.split(" ");e=a[a.length-1];(f=a[a.length-2])&&o(c,function(a,c){var g;c===0&&(a.setAttribute("x",b.getAttribute("x")),c=b.getAttribute("y"),a.setAttribute("y",c||0),c===null&&b.setAttribute("y",0));g=a.cloneNode(1);K(g,{"class":"highcharts-text-shadow",fill:e,stroke:e,"stroke-opacity":1/s(G(f),3),"stroke-width":f,"stroke-linejoin":"round"});b.insertBefore(g,
  39 + d)})}))},attr:function(a,b,c){var d,e=this.element,f,g=this,h;typeof a==="string"&&b!==x&&(d=a,a={},a[d]=b);if(typeof a==="string")g=(this[a+"Getter"]||this._defaultGetter).call(this,a,e);else{for(d in a){b=a[d];h=!1;this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(d)&&(f||(this.symbolAttr(a),f=!0),h=!0);if(this.rotation&&(d==="x"||d==="y"))this.doTransform=!0;h||(this[d+"Setter"]||this._defaultSetter).call(this,b,d,e);this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(d)&&
  40 +this.updateShadows(d,b)}if(this.doTransform)this.updateTransform(),this.doTransform=!1}c&&c();return g},updateShadows:function(a,b){for(var c=this.shadows,d=c.length;d--;)c[d].setAttribute(a,a==="height"?s(b-(c[d].cutHeight||0),0):a==="d"?this.d:b)},addClass:function(a){var b=this.element,c=K(b,"class")||"";c.indexOf(a)===-1&&K(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;o("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=p(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,
  41 + b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":P)},crisp:function(a){var b,c={},d,e=a.strokeWidth||this.strokeWidth||0;d=w(e)%2/2;a.x=T(a.x||this.x||0)+d;a.y=T(a.y||this.y||0)+d;a.width=T((a.width||this.width||0)-2*d);a.height=T((a.height||this.height||0)-2*d);a.strokeWidth=e;for(b in a)this[b]!==a[b]&&(this[b]=c[b]=a[b]);return c},css:function(a){var b=this.styles,c={},d=this.element,e,f,g="";e=!b;if(a&&a.color)a.fill=a.color;if(b)for(f in a)a[f]!==
  42 +b[f]&&(c[f]=a[f],e=!0);if(e){e=this.textWidth=a&&a.width&&d.nodeName.toLowerCase()==="text"&&G(a.width)||this.textWidth;b&&(a=t(b,c));this.styles=a;e&&(fa||!ca&&this.renderer.forExport)&&delete a.width;if(sa&&!ca)M(this.element,a);else{b=function(a,b){return"-"+b.toLowerCase()};for(f in a)g+=f.replace(/([A-Z])/g,b)+":"+a[f]+";";K(d,"style",g)}e&&this.added&&this.renderer.buildText(this)}return this},on:function(a,b){var c=this,d=c.element;ab&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=
  43 + ya.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(za.indexOf("Android")===-1||ya.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){var b=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;b&&b.radAttr&&b.animate(this.renderer.getRadialAttr(a,b.radAttr));return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},
  44 + updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation,g=this.element;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(g.getAttribute("x")||0)+" "+(g.getAttribute("y")||0)+")");(q(c)||q(d))&&a.push("scale("+p(c,1)+" "+p(d,1)+")");a.length&&g.setAttribute("transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);
  45 + return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=a,this.alignByTranslate=b,!c||Ba(c))this.alignTo=d=c||"renderer",ja(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=p(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=w(f);if(e==="bottom"||e==="middle")g+=(c.height-
  46 + (a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=w(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(a){var b,c=this.renderer,d,e=this.rotation,f=this.element,g=this.styles,h=e*ga;d=this.textStr;var i,j=f.style,k,m;d!==x&&(m=["",e||0,g&&g.fontSize,f.style.width].join(","),m=d===""||Ob.test(d)?"num:"+d.toString().length+m:d+m);m&&!a&&(b=c.cache[m]);if(!b){if(f.namespaceURI===Ea||c.forExport){try{k=this.fakeTS&&function(a){o(f.querySelectorAll(".highcharts-text-shadow"),
  47 + function(b){b.style.display=a})},Ka&&j.textShadow?(i=j.textShadow,j.textShadow=""):k&&k(P),b=f.getBBox?t({},f.getBBox()):{width:f.offsetWidth,height:f.offsetHeight},i?j.textShadow=i:k&&k("")}catch(n){}if(!b||b.width<0)b={width:0,height:0}}else b=this.htmlGetBBox();if(c.isSVG){a=b.width;d=b.height;if(sa&&g&&g.fontSize==="11px"&&d.toPrecision(3)==="16.9")b.height=d=14;if(e)b.width=O(d*aa(h))+O(a*W(h)),b.height=O(d*W(h))+O(a*aa(h))}m&&(c.cache[m]=b)}return b},show:function(a){return this.attr({visibility:a?
  48 + "inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.attr({y:-9999})}})},add:function(a){var b=this.renderer,c=this.element,d;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)d=this.zIndexSetter();d||(a?a.element:b.box).appendChild(c);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var b=
  49 + a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;cb(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();a.stops=null}a.safeRemoveChild(b);for(c&&o(c,function(b){a.safeRemoveChild(b)});d&&d.div&&d.div.childNodes.length===0;)b=d.parentGroup,a.safeRemoveChild(d.div),delete d.div,
  50 + d=b;a.alignTo&&ja(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=p(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+p(a.offsetX,1)+", "+p(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;K(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*e,"stroke-width":h,transform:"translate"+k,fill:P});if(c)K(f,"height",s(K(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):
  51 + g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this},xGetter:function(a){this.element.nodeName==="circle"&&(a={x:"cx",y:"cy"}[a]||a);return this._defaultGetter(a)},_defaultGetter:function(a){a=p(this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,b,c){a&&a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");c.setAttribute(b,a);this[b]=a},dashstyleSetter:function(a){var b;if(a=a&&a.toLowerCase()){a=
  52 + a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(b=a.length;b--;)a[b]=G(a[b])*this["stroke-width"];a=a.join(",").replace("NaN","none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.element.setAttribute("text-anchor",{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a,
  53 + b,c){this[b]=a;c.setAttribute(b,a)},titleSetter:function(a){var b=this.element.getElementsByTagName("title")[0];b||(b=C.createElementNS(Ea,"title"),this.element.appendChild(b));b.appendChild(C.createTextNode(String(p(a),"").replace(/<[^>]*>/g,"")))},textSetter:function(a){if(a!==this.textStr)delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this)},fillSetter:function(a,b,c){typeof a==="string"?c.setAttribute(b,a):a&&this.colorGradient(a,b,c)},visibilitySetter:function(a,b,c){a===
  54 +"inherit"?c.removeAttribute(b):c.setAttribute(b,a)},zIndexSetter:function(a,b){var c=this.renderer,d=this.parentGroup,c=(d||c).element||c.box,e,f,g=this.element,h;e=this.added;var i;q(a)&&(g.setAttribute(b,a),a=+a,this[b]===a&&(e=!1),this[b]=a);if(e){if((a=this.zIndex)&&d)d.handleZ=!0;d=c.childNodes;for(i=0;i<d.length&&!h;i++)if(e=d[i],f=K(e,"zIndex"),e!==g&&(G(f)>a||!q(a)&&q(f)))c.insertBefore(g,e),h=!0;h||c.appendChild(g)}return h},_defaultSetter:function(a,b,c){c.setAttribute(b,a)}};Q.prototype.yGetter=
  55 + Q.prototype.xGetter;Q.prototype.translateXSetter=Q.prototype.translateYSetter=Q.prototype.rotationSetter=Q.prototype.verticalAlignSetter=Q.prototype.scaleXSetter=Q.prototype.scaleYSetter=function(a,b){this[b]=a;this.doTransform=!0};Q.prototype["stroke-widthSetter"]=Q.prototype.strokeSetter=function(a,b,c){this[b]=a;if(this.stroke&&this["stroke-width"])this.strokeWidth=this["stroke-width"],Q.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",this["stroke-width"]),
  56 + this.hasStroke=!0;else if(b==="stroke-width"&&a===0&&this.hasStroke)c.removeAttribute("stroke"),this.hasStroke=!1};var Aa=function(){this.init.apply(this,arguments)};Aa.prototype={Element:Q,init:function(a,b,c,d,e,f){var g=location,h,d=this.createElement("svg").attr({version:"1.1"}).css(this.getStyle(d));h=d.element;a.appendChild(h);a.innerHTML.indexOf("xmlns")===-1&&K(h,"xmlns",Ea);this.isSVG=!0;this.box=h;this.boxWrapper=d;this.alignedObjects=[];this.url=(Ka||hb)&&C.getElementsByTagName("base").length?
  57 + g.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(C.createTextNode("Created with Highcharts 4.1.9"));this.defs=this.createElement("defs").add();this.allowHTML=f;this.forExport=e;this.gradients={};this.cache={};this.setSize(b,c,!1);var i;if(Ka&&a.getBoundingClientRect)this.subPixelFix=b=function(){M(a,{left:0,top:0});i=a.getBoundingClientRect();M(a,{left:ta(i.left)-i.left+"px",top:ta(i.top)-i.top+"px"})},b(),I(L,"resize",
  58 + b)},getStyle:function(a){return this.style=t({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Pa(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&Y(L,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;
  59 + b.init(this,a);return b},draw:function(){},getRadialAttr:function(a,b){return{cx:a[0]-a[2]/2+b.cx*a[2],cy:a[1]-a[2]/2+b.cy*a[2],r:b.r*a[2]}},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=p(a.textStr,"").toString(),f=e.indexOf("<")!==-1,g=b.childNodes,h,i,j=K(b,"x"),k=a.styles,m=a.textWidth,n=k&&k.lineHeight,l=k&&k.textShadow,u=k&&k.textOverflow==="ellipsis",r=g.length,Z=m&&!a.added&&this.box,A=function(a){return n?G(n):c.fontMetrics(/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:
  60 +k&&k.fontSize||c.style.fontSize||12,a).h},v=function(a){return a.replace(/&lt;/g,"<").replace(/&gt;/g,">")};r--;)b.removeChild(g[r]);!f&&!l&&!u&&e.indexOf(" ")===-1?b.appendChild(C.createTextNode(v(e))):(h=/<.*style="([^"]+)".*>/,i=/<.*href="(http[^"]+)".*>/,Z&&Z.appendChild(b),e=f?e.replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g):[e],e[e.length-1]===
  61 +""&&e.pop(),o(e,function(e,f){var g,n=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,"</span>|||");g=e.split("|||");o(g,function(e){if(e!==""||g.length===1){var l={},r=C.createElementNS(Ea,"tspan"),p;h.test(e)&&(p=e.match(h)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),K(r,"style",p));i.test(e)&&!d&&(K(r,"onclick",'location.href="'+e.match(i)[1]+'"'),M(r,{cursor:"pointer"}));e=v(e.replace(/<(.|\n)*?>/g,"")||" ");if(e!==" "){r.appendChild(C.createTextNode(e));if(n)l.dx=0;else if(f&&j!==null)l.x=
  62 + j;K(r,l);b.appendChild(r);!n&&f&&(!ca&&d&&M(r,{display:"block"}),K(r,"dy",A(r)));if(m){for(var l=e.replace(/([^\^])-/g,"$1- ").split(" "),Z=g.length>1||f||l.length>1&&k.whiteSpace!=="nowrap",o,y,q,s=[],x=A(r),t=1,w=a.rotation,z=e,D=z.length;(Z||u)&&(l.length||s.length);)a.rotation=0,o=a.getBBox(!0),q=o.width,!ca&&c.forExport&&(q=c.measureSpanWidth(r.firstChild.data,a.styles)),o=q>m,y===void 0&&(y=o),u&&y?(D/=2,z===""||!o&&D<0.5?l=[]:(o&&(y=!0),z=e.substring(0,z.length+(o?-1:1)*ta(D)),l=[z+(m>3?"\u2026":
  63 + "")],r.removeChild(r.firstChild))):!o||l.length===1?(l=s,s=[],l.length&&(t++,r=C.createElementNS(Ea,"tspan"),K(r,{dy:x,x:j}),p&&K(r,"style",p),b.appendChild(r)),q>m&&(m=q)):(r.removeChild(r.firstChild),s.unshift(l.pop())),l.length&&r.appendChild(C.createTextNode(l.join(" ").replace(/- /g,"-")));y&&a.attr("title",a.textStr);a.rotation=w}n++}}})}),Z&&Z.removeChild(b),l&&a.applyTextShadow&&a.applyTextShadow(l))},getContrast:function(a){a=na(a).rgba;return a[0]+a[1]+a[2]>384?"#000000":"#FFFFFF"},button:function(a,
  64 + b,c,d,e,f,g,h,i){var j=this.label(a,b,c,i,null,null,null,null,"button"),k=0,m,n,l,u,r,p,a={x1:0,y1:0,x2:0,y2:1},e=D({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);l=e.style;delete e.style;f=D(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);u=f.style;delete f.style;g=D(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);r=g.style;delete g.style;h=D(e,{style:{color:"#CCC"}},
  65 + h);p=h.style;delete h.style;I(j.element,sa?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(u)});I(j.element,sa?"mouseout":"mouseleave",function(){k!==3&&(m=[e,f,g][k],n=[l,u,r][k],j.attr(m).css(n))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(r):a===3&&j.attr(h).css(p):j.attr(e).css(l)};return j.on("click",function(a){k!==3&&d.call(j,a)}).attr(e).css(t({cursor:"default"},l))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=w(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=w(a[2])+b%2/
  66 + 2);return a},path:function(a){var b={fill:P};Ga(a)?b.d=a:da(a)&&t(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=da(a)?a:{x:a,y:b,r:c};b=this.createElement("circle");b.xSetter=function(a){this.element.setAttribute("cx",a)};b.ySetter=function(a){this.element.setAttribute("cy",a)};return b.attr(a)},arc:function(a,b,c,d,e,f){if(da(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,
  67 + b,c,d,e,f){var e=da(a)?a.r:e,g=this.createElement("rect"),a=da(a)?a:a===x?{}:{x:a,y:b,width:s(c,0),height:s(d,0)};if(f!==x)a.strokeWidth=f,a=g.crisp(a);if(e)a.r=e;g.rSetter=function(a){K(this.element,{rx:a,ry:a})};return g.attr(a)},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[p(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return q(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,
  68 + b,c,d,e){var f={preserveAspectRatio:P};arguments.length>1&&t(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(w(b),w(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),t(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&t(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],
  69 + height:b[1]}),a.alignByTranslate||a.translate(w((d-b[0])/2),w((e-b[1])/2)))},j=a.match(i)[1],a=Kb[j]||f&&f.width&&f.height&&[f.width,f.height],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),$("img",{onload:function(){this.width===0&&(M(this,{position:"absolute",top:"-999em"}),document.body.appendChild(this));k(g,Kb[j]=[this.width,this.height]);this.parentNode&&this.parentNode.removeChild(this)},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",
  70 + a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=W(f),j=aa(f),k=W(g),g=aa(g),e=e.end-f<ma?0:1;
  71 + return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]},callout:function(a,b,c,d,e){var f=z(e&&e.r||0,c,d),g=f+6,h=e&&e.anchorX,e=e&&e.anchorY,i;i=["M",a+f,b,"L",a+c-f,b,"C",a+c,b,a+c,b,a+c,b+f,"L",a+c,b+d-f,"C",a+c,b+d,a+c,b+d,a+c-f,b+d,"L",a+f,b+d,"C",a,b+d,a,b+d,a,b+d-f,"L",a,b+f,"C",a,b,a,b,a+f,b];h&&h>c&&e>b+g&&e<b+d-g?i.splice(13,3,"L",a+c,e-6,a+c+6,e,a+c,e+6,a+c,b+d-f):h&&h<0&&e>b+g&&e<b+d-g?i.splice(33,3,"L",a,e+6,a-6,e,a,e-6,a,b+f):e&&e>
  72 +d&&h>a+g&&h<a+c-g?i.splice(23,3,"L",h+6,b+d,h,b+d+6,h-6,b+d,a+f,b+d):e&&e<0&&h>a+g&&h<a+c-g&&i.splice(3,3,"L",h-6,b,h,b-6,h+6,b,c-f,b);return i}},clipRect:function(a,b,c,d){var e="highcharts-"+xb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;a.count=0;return a},text:function(a,b,c,d){var e=fa||!ca&&this.forExport,f={};if(d&&(this.allowHTML||!this.forExport))return this.html(a,b,c);f.x=Math.round(b||0);if(c)f.y=Math.round(c);if(a||
  73 + a===0)f.text=a;a=this.createElement("text").attr(f);e&&a.css({position:"absolute"});if(!d)a.xSetter=function(a,b,c){var d=c.getElementsByTagName("tspan"),e,f=c.getAttribute(b),n;for(n=0;n<d.length;n++)e=d[n],e.getAttribute(b)===f&&e.setAttribute(b,a);c.setAttribute(b,a)};return a},fontMetrics:function(a,b){var c,d,a=a||this.style.fontSize;!a&&b&&L.getComputedStyle&&(b=b.element||b,a=(c=L.getComputedStyle(b,""))&&c.fontSize);a=/px/.test(a)?G(a):/em/.test(a)?parseFloat(a)*12:12;c=a<24?a+3:w(a*1.2);
  74 + d=w(c*0.8);return{h:c,b:d,f:a}},rotCorr:function(a,b,c){var d=a;b&&c&&(d=s(d*W(b*ga),4));return{x:-a/3*aa(b*ga),y:d}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=u.element.style;p=(s===void 0||va===void 0||l.styles.textAlign)&&q(u.textStr)&&u.getBBox();l.width=(s||p.width||0)+2*v+y;l.height=(va||p.height||0)+2*v;B=v+n.fontMetrics(a&&a.fontSize,u).b;if(E){if(!r)a=w(-A*v)+C,b=(h?-B:0)+C,l.box=r=d?n.symbol(d,a,b,l.width,l.height,H):n.rect(a,b,l.width,l.height,0,H[Pb]),r.isImg||r.attr("fill",
  75 + P),r.add(l);r.isImg||r.attr(t({width:w(l.width),height:w(l.height)},H));H=null}}function k(){var a=l.styles,a=a&&a.textAlign,b=y+v*(1-A),c;c=h?0:B;if(q(s)&&p&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(s-p.width);if(b!==u.x||c!==u.y)u.attr("x",b),c!==x&&u.attr("y",c);u.x=b;u.y=c}function m(a,b){r?r.attr(a,b):H[a]=b}var n=this,l=n.g(i),u=n.text("",0,0,g).attr({zIndex:1}),r,p,A=0,v=3,y=0,s,va,zb,z,C=0,H={},B,E;l.onAdd=function(){u.add(l);l.attr({text:a||a===0?a:"",x:b,y:c});r&&q(e)&&l.attr({anchorX:e,
  76 + anchorY:f})};l.widthSetter=function(a){s=a};l.heightSetter=function(a){va=a};l.paddingSetter=function(a){if(q(a)&&a!==v)v=l.padding=a,k()};l.paddingLeftSetter=function(a){q(a)&&a!==y&&(y=a,k())};l.alignSetter=function(a){A={left:0,center:0.5,right:1}[a]};l.textSetter=function(a){a!==x&&u.textSetter(a);j();k()};l["stroke-widthSetter"]=function(a,b){a&&(E=!0);C=a%2/2;m(b,a)};l.strokeSetter=l.fillSetter=l.rSetter=function(a,b){b==="fill"&&a&&(E=!0);m(b,a)};l.anchorXSetter=function(a,b){e=a;m(b,w(a)-
  77 + C-zb)};l.anchorYSetter=function(a,b){f=a;m(b,a-z)};l.xSetter=function(a){l.x=a;A&&(a-=A*((s||p.width)+v));zb=w(a);l.attr("translateX",zb)};l.ySetter=function(a){z=l.y=w(a);l.attr("translateY",z)};var G=l.css;return t(l,{css:function(a){if(a){var b={},a=D(a);o(l.textProps,function(c){a[c]!==x&&(b[c]=a[c],delete a[c])});u.css(b)}return G.call(l,a)},getBBox:function(){return{width:p.width+2*v,height:p.height+2*v,x:p.x-v,y:p.y-v}},shadow:function(a){r&&r.shadow(a);return l},destroy:function(){Y(l.element,
  78 + "mouseenter");Y(l.element,"mouseleave");u&&(u=u.destroy());r&&(r=r.destroy());Q.prototype.destroy.call(l);l=n=j=k=m=null}})}};$a=Aa;t(Q.prototype,{htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();if(a&&a.textOverflow==="ellipsis")a.whiteSpace="nowrap",a.overflow="hidden";this.styles=t(this.styles,a);M(this.element,a);return this},htmlGetBBox:function(){var a=this.element;if(a.nodeName==="text")a.style.position="absolute";
  79 + return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=this.shadows,j=this.styles;M(b,{marginLeft:c,marginTop:d});i&&o(i,function(a){M(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&o(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k=this.rotation,
  80 + m,n=G(this.textWidth),l=[k,g,b.innerHTML,this.textWidth,this.textAlign].join(",");if(l!==this.cTT){m=a.fontMetrics(b.style.fontSize).b;q(k)&&this.setSpanRotation(k,h,m);i=p(this.elemWidth,b.offsetWidth);if(i>n&&/[ \-]/.test(b.textContent||b.innerText))M(b,{width:n+"px",display:"block",whiteSpace:j&&j.whiteSpace||"normal"}),i=n;this.getSpanCorrection(i,m,h,k,g)}M(b,{left:e+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(hb)m=b.offsetHeight;this.cTT=l}}else this.alignOnAdd=!0},setSpanRotation:function(a,
  81 + b,c){var d={},e=sa?"-ms-transform":hb?"-webkit-transform":Ka?"MozTransform":Ib?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)";d[e+(Ka?"Origin":"-origin")]=d.transformOrigin=b*100+"% "+c+"px";M(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});t(Aa.prototype,{html:function(a,b,c){var d=this.createElement("span"),e=d.element,f=d.renderer;d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a;d.htmlUpdateTransform()};d.xSetter=d.ySetter=
  82 + d.alignSetter=d.rotationSetter=function(a,b){b==="align"&&(b="textAlign");d[b]=a;d.htmlUpdateTransform()};d.attr({text:a,x:w(b),y:w(c)}).css({position:"absolute",fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});e.style.whiteSpace="nowrap";d.css=d.htmlCss;if(f.isSVG)d.add=function(a){var b,c=f.box.parentNode,j=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)j.push(a),a=a.parentGroup;o(j.reverse(),function(a){var d,e=K(a.element,"class");e&&(e={className:e});b=a.div=a.div||$(Ja,e,{position:"absolute",
  83 + left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;t(a,{translateXSetter:function(b,c){d.left=b+"px";a[c]=b;a.doTransform=!0},translateYSetter:function(b,c){d.top=b+"px";a[c]=b;a.doTransform=!0}});o(["opacity","visibility"],function(b){Ta(a,b+"Setter",function(a,b,c,e){a.call(this,b,c,e);d[c]=b})})})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d};return d}});if(!ca&&!fa){E={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ",
  84 + "absolute",";"],e=b===Ja;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=$(c);this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();return this},
  85 + updateTransform:Q.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=W(a*ga),c=aa(a*ga);M(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""):P})},getSpanCorrection:function(a,b,c,d,e){var f=d?W(d*ga):1,g=d?aa(d*ga):0,h=p(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!==
  86 + "left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),M(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(qa(a[b]))c[b]=w(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},clip:function(a){var b=this,c;a?(c=a.members,ja(c,b),c.push(b),b.destroyClip=function(){ja(c,b)},a=a.getCSS(b)):(b.destroyClip&&
  87 + b.destroyClip(),a={clip:gb?"inherit":"rect(auto)"});return b.css(a)},css:Q.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Qa(a)},destroy:function(){this.destroyClip&&this.destroyClip();return Q.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=L.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=G(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,
  88 + f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,m,n,l,u;k&&typeof k.value!=="string"&&(k="x");n=k;if(a){l=p(a.width,3);u=(a.opacity||0.15)/l;for(e=1;e<=3;e++){m=l*2+1-2*e;c&&(n=this.cutOffPath(k.value,m+0.5));j=['<shape isShadow="true" strokeweight="',m,'" filled="false" path="',n,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=$(g.prepVML(j),null,{left:G(i.left)+p(a.offsetX,1),top:G(i.top)+p(a.offsetY,1)});if(c)h.cutOff=m+1;j=['<stroke color="',a.color||"black",'" opacity="',u*e,'"/>'];
  89 + $(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this},updateShadows:ua,setAttr:function(a,b){gb?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){this.element.className=a},dashstyleSetter:function(a,b,c){(c.getElementsByTagName("stroke")[0]||$(this.renderer.prepVML(["<stroke/>"]),null,null,c))[b]=a||"solid";this[b]=a},dSetter:function(a,b,c){var d=this.shadows,a=a||[];this.d=a.join&&a.join(" ");c.path=a=
  90 + this.pathToVML(a);if(d)for(c=d.length;c--;)d[c].path=d[c].cutOff?this.cutOffPath(a,d[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var d=c.nodeName;if(d==="SPAN")c.style.color=a;else if(d!=="IMG")c.filled=a!==P,this.setAttr("fillcolor",this.renderer.color(a,c,b,this))},opacitySetter:ua,rotationSetter:function(a,b,c){c=c.style;this[b]=c[b]=a;c.left=-w(aa(a*ga)+1)+"px";c.top=w(W(a*ga))+"px"},strokeSetter:function(a,b,c){this.setAttr("strokecolor",this.renderer.color(a,c,b))},"stroke-widthSetter":function(a,
  91 + b,c){c.stroked=!!a;this[b]=a;qa(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){a==="inherit"&&(a="visible");this.shadows&&o(this.shadows,function(c){c.style[b]=a});c.nodeName==="DIV"&&(a=a==="hidden"?"-999em":0,gb||(c.style[b]=a?"visible":"hidden"),b="top");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;b==="x"?b="left":b==="y"&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a,
  92 + b,c){c.style[b]=a}};B.VMLElement=E=ka(Q,E);E.prototype.ySetter=E.prototype.widthSetter=E.prototype.heightSetter=E.prototype.xSetter;var Ma={Element:E,isIE8:za.indexOf("MSIE 8.0")>-1,init:function(a,b,c,d){var e;this.alignedObjects=[];d=this.createElement(Ja).css(t(this.getStyle(d),{position:"relative"}));e=d.element;a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.cache={};this.setSize(b,c,!1);if(!C.namespaces.hcv){C.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{C.createStyleSheet().cssText=
  93 + "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){C.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=da(a);return t(e,{members:[],count:0,left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,
  94 + c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+w(a?e:d)+"px,"+w(a?f:b)+"px,"+w(a?b:f)+"px,"+w(a?d:e)+"px)"};!a&&gb&&c==="DIV"&&t(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){o(e.members,function(a){a.element&&a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=P;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,m,n=a.linearGradient||a.radialGradient,
  95 + l,u,r,p,A,v="",a=a.stops,y,q=[],va=function(){h=['<fill colors="'+q.join(",")+'" opacity="',r,'" o:opacity2="',u,'" type="',i,'" ',v,'focus="100%" method="any" />'];$(e.prepVML(h),null,null,b)};l=a[0];y=a[a.length-1];l[0]>0&&a.unshift([0,l[1]]);y[0]<1&&a.push([1,y[1]]);o(a,function(a,b){g.test(a[1])?(f=na(a[1]),k=f.get("rgb"),m=f.get("a")):(k=a[1],m=1);q.push(a[0]*100+"% "+k);b?(r=m,p=k):(u=m,A=k)});if(c==="fill")if(i==="gradient")c=n.x1||n[0]||0,a=n.y1||n[1]||0,l=n.x2||n[2]||0,n=n.y2||n[3]||0,v=
  96 + 'angle="'+(90-V.atan((n-a)/(l-c))*180/ma)+'"',va();else{var j=n.r,s=j*2,x=j*2,t=n.cx,w=n.cy,z=b.radialReference,D,j=function(){z&&(D=d.getBBox(),t+=(z[0]-D.x)/D.width-0.5,w+=(z[1]-D.y)/D.height-0.5,s*=z[2]/D.width,x*=z[2]/D.height);v='src="'+S.global.VMLRadialGradientURL+'" size="'+s+","+x+'" origin="0.5,0.5" position="'+t+","+w+'" color2="'+A+'" ';va()};d.added?j():d.onAdd=j;j=p}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=na(a),h=["<",c,' opacity="',f.get("a"),'"/>'],$(this.prepVML(h),null,null,
  97 + b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:Aa.prototype.html,path:function(a){var b={coordsize:"10 10"};
  98 + Ga(a)?b.d=a:da(a)&&t(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(da(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ja).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},createElement:function(a){return a==="rect"?this.symbol(a):
  99 + Aa.prototype.createElement.call(this,a)},invertChild:function(a,b){var c=this,d=b.style,e=a.tagName==="IMG"&&a.style;M(a,{flip:"x",left:G(d.width)-(e?G(e.top):1),top:G(d.height)-(e?G(e.left):1),rotation:-90});o(a.childNodes,function(b){c.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=W(f),i=aa(f),j=W(g),k=aa(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*
  100 + j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){return Aa.prototype.symbols[!q(e)||!e.r?"square":"callout"].call(0,a,b,c,d,e)}}};B.VMLRenderer=E=function(){this.init.apply(this,arguments)};E.prototype=D(Aa.prototype,Ma);$a=E}Aa.prototype.measureSpanWidth=function(a,b){var c=C.createElement("span"),d;d=C.createTextNode(a);c.appendChild(d);M(c,b);this.box.appendChild(c);
  101 + d=c.offsetWidth;Qa(c);return d};var Lb;if(fa)B.CanVGRenderer=E=function(){Ea="http://www.w3.org/1999/xhtml"},E.prototype.symbols={},Lb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Qb(d,a);b.push(c)}}}(),$a=E;Sa.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.categories,e=a.names,f=this.pos,g=b.labels,h=a.tickPositions,i=f===h[0],j=f===h[h.length-1],e=d?p(d[f],e[f],f):f,d=this.label,h=h.info,k;a.isDatetimeAxis&&
  102 +h&&(k=b.dateTimeLabelFormats[h.higherRanks[f]||h.unitName]);this.isFirst=i;this.isLast=j;b=a.labelFormatter.call({axis:a,chart:c,isFirst:i,isLast:j,dateTimeLabelFormat:k,value:a.isLog?ea(ia(e)):e});q(d)?d&&d.attr({text:b}):(this.labelLength=(this.label=d=q(b)&&g.enabled?c.renderer.text(b,0,0,g.useHTML).css(D(g.style)).add(a.labelGroup):null)&&d.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var b=
  103 + this.axis,c=a.x,d=b.chart.chartWidth,e=b.chart.spacing,f=p(b.labelLeft,z(b.pos,e[3])),e=p(b.labelRight,s(b.pos+b.len,d-e[1])),g=this.label,h=this.rotation,i={left:0,center:0.5,right:1}[b.labelAlign],j=g.getBBox().width,k=b.slotWidth,m=1,n,l={};if(h)h<0&&c-i*j<f?n=w(c/W(h*ga)-f):h>0&&c+i*j>e&&(n=w((d-c)/W(h*ga)));else if(d=c+(1-i)*j,c-i*j<f?k=a.x+k*(1-i)-f:d>e&&(k=e-a.x+k*i,m=-1),k=z(b.slotWidth,k),k<b.slotWidth&&b.labelAlign==="center"&&(a.x+=m*(b.slotWidth-k-i*(b.slotWidth-z(j,k)))),j>k||b.autoRotation&&
  104 + g.styles.width)n=k;if(n){l.width=n;if(!b.options.labels.style.textOverflow)l.textOverflow="ellipsis";g.css(l)}},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,
  105 + m=i.staggerLines,n=i.tickRotCorr||{x:0,y:0},c=p(e.y,n.y+(i.side===2?8:-(c.getBBox().height/2))),a=a+e.x+n.x-(f&&d?f*j*(k?-1:1):0),b=b+c-(f&&!d?f*j*(k?1:-1):0);m&&(b+=g/(h||1)%m*(i.labelOffset/m));return{x:a,y:w(b)}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,m=this.gridLine,n=h?h+"Grid":"grid",l=h?h+"Tick":"tick",u=e[n+"LineWidth"],
  106 + r=e[n+"LineColor"],o=e[n+"LineDashStyle"],A=e[l+"Length"],n=p(e[l+"Width"],!h&&d.isXAxis?1:0),v=e[l+"Color"],y=e[l+"Position"],l=this.mark,q=k.step,va=!0,s=d.tickmarkOffset,t=this.getPosition(g,j,s,b),w=t.x,t=t.y,z=g&&w===d.pos+d.len||!g&&t===d.pos?-1:1,c=p(c,1);this.isActive=!0;if(u){j=d.getPlotLinePath(j+s,u*z,b,!0);if(m===x){m={stroke:r,"stroke-width":u};if(o)m.dashstyle=o;if(!h)m.zIndex=1;if(b)m.opacity=0;this.gridLine=m=u?f.path(j).attr(m).add(d.gridGroup):null}if(!b&&m&&j)m[this.isNew?"attr":
  107 + "animate"]({d:j,opacity:c})}if(n&&A)y==="inside"&&(A=-A),d.opposite&&(A=-A),h=this.getMarkPath(w,t,A,n*z,g,f),l?l.animate({d:h,opacity:c}):this.mark=f.path(h).attr({stroke:v,"stroke-width":n,opacity:c}).add(d.axisGroup);if(i&&!isNaN(w))i.xy=t=this.getLabelPosition(w,t,i,g,k,s,a,q),this.isFirst&&!this.isLast&&!p(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(e.showLastLabel,1)?va=!1:g&&!d.isRadial&&!k.step&&!k.rotation&&!b&&c!==0&&this.handleOverflow(t),q&&a%q&&(va=!1),va&&!isNaN(t.y)?(t.opacity=
  108 + c,i[this.isNew?"attr":"animate"](t),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Pa(this,this.axis)}};B.PlotLineOrBand=function(a,b){this.axis=a;if(b)this.options=b,this.id=b.id};B.PlotLineOrBand.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=a.options,e=d.label,f=a.label,g=d.width,h=d.to,i=d.from,j=q(i)&&q(h),k=d.value,m=d.dashStyle,n=a.svgElem,l=[],u,r=d.color,p=d.zIndex,o=d.events,v={},y=b.chart.renderer;b.isLog&&(i=Ca(i),h=Ca(h),k=Ca(k));if(g){if(l=b.getPlotLinePath(k,g),
  109 + v={stroke:r,"stroke-width":g},m)v.dashstyle=m}else if(j){l=b.getPlotBandPath(i,h,d);if(r)v.fill=r;if(d.borderWidth)v.stroke=d.borderColor,v["stroke-width"]=d.borderWidth}else return;if(q(p))v.zIndex=p;if(n)if(l)n.animate({d:l},null,n.onGetPath);else{if(n.hide(),n.onGetPath=function(){n.show()},f)a.label=f=f.destroy()}else if(l&&l.length&&(a.svgElem=n=y.path(l).attr(v).add(),o))for(u in d=function(b){n.on(b,function(c){o[b].apply(a,[c])})},o)d(u);if(e&&q(e.text)&&l&&l.length&&b.width>0&&b.height>0){e=
  110 + D({align:c&&j&&"center",x:c?!j&&4:10,verticalAlign:!c&&j&&"middle",y:c?j?16:10:j?6:-4,rotation:c&&!j&&90},e);if(!f){v={align:e.textAlign||e.align,rotation:e.rotation};if(q(p))v.zIndex=p;a.label=f=y.text(e.text,0,0,e.useHTML).attr(v).css(e.style).add()}b=[l[1],l[4],j?l[6]:l[1]];j=[l[2],l[5],j?l[7]:l[2]];l=Oa(b);c=Oa(j);f.align(e,!1,{x:l,y:c,width:Da(b)-l,height:Da(j)-c});f.show()}else f&&f.hide();return a},destroy:function(){ja(this.axis.plotLinesAndBands,this);delete this.axis;Pa(this)}};var ha=B.Axis=
  111 + function(){this.init.apply(this,arguments)};ha.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#D8D8D8",labels:{enabled:!0,style:{color:"#606060",cursor:"default",fontSize:"11px"},x:0,y:15},lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,
  112 + minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#707070"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return B.numberFormat(this.total,
  113 + -1)},style:D(ba.line.dataLabels.style,{color:"#000000"})}},defaultLeftAxisOptions:{labels:{x:-15,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0,y:null},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0,y:-15},title:{rotation:0}},init:function(a,b){var c=b.isX;this.chart=a;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side=
  114 + b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=d.visible!==!1;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=this.names||[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=q(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks=
  115 +{};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=p(d.crosshair,ra(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;La(this,a.axes)===-1&&(c&&!this.isColorAxis?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&&
  116 + c&&this.reversed===x)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)I(this,f,d[f]);if(this.isLog)this.val2lin=Ca,this.lin2val=ia},setOptions:function(a){this.options=D(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],D(S[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d=
  117 + this.dateTimeLabelFormat,e=S.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ia(h,this);else if(c)g=b;else if(d)g=Na(d,b);else if(f&&a>=1E3)for(;f--&&g===x;)c=Math.pow(1E3,f+1),a>=c&&b*10%c===0&&e[f]!==null&&(g=B.numberFormat(b/c,-1)+e[f]);g===x&&(g=O(b)>=1E4?B.numberFormat(b,-1):B.numberFormat(b,-1,x,""));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;
  118 + a.buildStacks&&a.buildStacks();o(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d=c.options,e=d.threshold,f;a.hasVisibleSeries=!0;a.isLog&&e<=0&&(e=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=z(p(a.dataMin,d[0]),Oa(d)),a.dataMax=s(p(a.dataMax,d[0]),Da(d))}else{c.getExtremes();f=c.dataMax;c=c.dataMin;if(q(c)&&q(f))a.dataMin=z(p(a.dataMin,c),c),a.dataMax=s(p(a.dataMax,f),f);if(q(e))a.threshold=e;if(!d.softThreshold||a.isLog)a.softThreshold=!1}}})},translate:function(a,
  119 + b,c,d,e,f){var g=this.linkedParent||this,h=1,i=0,j=d?g.oldTransA:g.transA,d=d?g.oldMin:g.min,k=g.minPixelPadding,e=(g.doPostTranslate||g.isLog&&e)&&g.lin2val;if(!j)j=g.transA;if(c)h*=-1,i=g.len;g.reversed&&(h*=-1,i-=h*(g.sector||g.len));b?(a=a*h+i,a-=k,a=a/j+d,e&&(a=g.lin2val(a))):(e&&(a=g.val2lin(a)),f==="between"&&(f=0.5),a=h*(a-d)*j+i+h*k+(qa(f)?j*f*g.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-
  120 + (b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,c,d,e){var f=this.chart,g=this.left,h=this.top,i,j,k=c&&f.oldChartHeight||f.chartHeight,m=c&&f.oldChartWidth||f.chartWidth,n;i=this.transB;var l=function(a,b,c){if(a<b||a>c)d?a=z(s(b,a),c):n=!0;return a},e=p(e,this.translate(a,null,null,c)),a=c=w(e+i);i=j=w(k-e-i);isNaN(e)?n=!0:this.horiz?(i=h,j=k-this.bottom,a=c=l(a,g,g+this.width)):(a=g,c=m-this.right,i=j=l(i,h,h+this.height));return n&&!d?null:f.renderer.crispLine(["M",a,i,"L",
  121 + c,j],b||1)},getLinearTickPositions:function(a,b,c){var d,e=ea(T(b/a)*a),f=ea(ta(c/a)*a),g=[];if(b===c&&qa(b))return[b];for(b=e;b<=f;){g.push(b);b=ea(b+a);if(b===d)break;d=b}return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e,f=this.pointRangePadding||0;e=this.min-f;var f=this.max+f,g=f-e;if(g&&g/c<this.len/3)if(this.isLog){f=b.length;for(e=1;e<f;e++)d=d.concat(this.getLogTickPositions(c,b[e-1],b[e],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval===
  122 + "auto")d=d.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c),e,f,a.startOfWeek));else for(b=e+(b[0]-e)%c;b<=f;b+=c)d.push(b);d.length!==0&&this.trimTicks(d,a.startOnTick,a.endOnTick);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j,k;if(this.isXAxis&&this.minRange===x&&!this.isLog)q(a.min)||q(a.max)?this.minRange=null:(o(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-
  123 + i[g-1],f===x||h<f)f=h}),this.minRange=z(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){k=this.minRange;d=(k-c+b)/2;d=[b-d,p(a.min,b-d)];if(e)d[2]=this.dataMin;b=Da(d);c=[b+k,p(a.max,b+k)];if(e)c[2]=this.dataMax;c=Oa(c);c-b<k&&(d[0]=c-k,d[1]=p(a.min,c-k),b=Da(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this,c=b.max-b.min,d=b.axisPointRange||0,e,f=0,g=0,h=b.linkedParent,i=!!b.categories,j=b.transA,k=b.isXAxis;if(k||i||d)if(h?(f=h.minPointOffset,g=h.pointRangePadding):o(b.series,
  124 + function(a){var c=i?1:k?a.pointRange:b.axisPointRange||0,h=a.options.pointPlacement,j=a.closestPointRange;d=s(d,c);b.single||(f=s(f,Ba(h)?0:c/2),g=s(g,h==="on"?0:c));!a.noSharedTooltip&&q(j)&&(e=q(e)?z(e,j):j)}),h=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=f*=h,b.pointRangePadding=g*=h,b.pointRange=z(d,c),k)b.closestPointRange=e;if(a)b.oldTransA=j;b.translationSlope=b.transA=j=b.len/(c+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=j*f},minFromRange:function(){return this.max-
  125 + this.range},setTickInterval:function(a){var b=this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=d.maxPadding,j=d.minPadding,k=d.tickInterval,m=d.tickPixelInterval,n=b.categories,l=b.threshold,u=b.softThreshold,r,Z,A,v;!f&&!n&&!h&&this.getTickAmount();A=p(b.userMin,d.min);v=p(b.userMax,d.max);h?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=p(c.min,c.dataMin),b.max=p(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&la(11,1)):(!u&&q(l)&&
  126 +(b.dataMin>=l?(r=l,j=0):b.dataMax<=l&&(Z=l,i=0)),b.min=p(A,r,b.dataMin),b.max=p(v,Z,b.dataMax));if(e)!a&&z(b.min,p(b.dataMin,b.min))<=0&&la(10,1),b.min=ea(Ca(b.min),15),b.max=ea(Ca(b.max),15);if(b.range&&q(b.max))b.userMin=b.min=A=s(b.min,b.minFromRange()),b.userMax=v=b.max,b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!n&&!b.axisPointRange&&!b.usePercentage&&!h&&q(b.min)&&q(b.max)&&(c=b.max-b.min))!q(A)&&j&&(b.min-=c*j),!q(v)&&i&&(b.max+=c*i);if(qa(d.floor))b.min=s(b.min,
  127 + d.floor);if(qa(d.ceiling))b.max=z(b.max,d.ceiling);if(u&&q(b.dataMin))if(l=l||0,!q(A)&&b.min<l&&b.dataMin>=l)b.min=l;else if(!q(v)&&b.max>l&&b.dataMax<=l)b.max=l;b.tickInterval=b.min===b.max||b.min===void 0||b.max===void 0?1:h&&!k&&m===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:p(k,this.tickAmount?(b.max-b.min)/s(this.tickAmount-1,1):void 0,n?1:(b.max-b.min)*m/s(b.len,m));g&&!a&&o(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);
  128 + b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=s(b.pointRange,b.tickInterval);a=p(d.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);if(!k&&b.tickInterval<a)b.tickInterval=a;if(!f&&!e&&!k)b.tickInterval=pb(b.tickInterval,null,ob(b.tickInterval),p(d.allowDecimals,!(b.tickInterval>0.5&&b.tickInterval<5&&b.max>1E3&&b.max<9999)),!!this.tickAmount);if(!this.tickAmount&&this.len)b.tickInterval=
  129 + b.unsquish();this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,e=a.startOnTick,f=a.endOnTick,g;this.tickmarkOffset=this.categories&&a.tickmarkPlacement==="between"&&this.tickInterval===1?0.5:0;this.minorTickInterval=a.minorTickInterval==="auto"&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();if(!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),
  130 + this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max]))))this.tickPositions=b=d;if(!this.isLinked)this.trimTicks(b,e,f),this.min===this.max&&q(this.min)&&!this.tickAmount&&(g=!0,this.min-=0.5,this.max+=0.5),this.single=g,!c&&!d&&this.adjustTickAmount()},
  131 + trimTicks:function(a,b,c){var d=a[0],e=a[a.length-1],f=this.minPointOffset||0;b?this.min=d:this.min-f>d&&a.shift();c?this.max=e:this.max+f<e&&a.pop();a.length===0&&q(d)&&a.push((e+d)/2)},getTickAmount:function(){var a={},b,c=this.options,d=c.tickAmount,e=c.tickPixelInterval;!q(c.tickInterval)&&this.len<e&&!this.isRadial&&!this.isLog&&c.startOnTick&&c.endOnTick&&(d=2);!d&&this.chart.options.chart.alignTicks!==!1&&c.alignTicks!==!1&&(o(this.chart[this.coll],function(c){var d=c.options,e=c.horiz,d=[e?
  132 + d.left:d.top,e?d.width:d.height,d.pane].join(",");c.series.length&&(a[d]?b=!0:a[d]=1)}),b&&(d=ta(this.len/e)+1));if(d<4)this.finalTickAmt=d,d=5;this.tickAmount=d},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,e=b&&b.length;if(e<c){for(;b.length<c;)b.push(ea(b[b.length-1]+a));this.transA*=(e-1)/(c-1);this.max=b[b.length-1]}else e>c&&(this.tickInterval*=2,this.setTickPositions());if(q(d)){for(a=c=b.length;a--;)(d===3&&a%2===1||d<=2&&a>
  133 + 0&&a<c-1)&&b.splice(a,1);this.finalTickAmt=x}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;o(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});if(b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=
  134 + this.userMin,this.oldUserMax=this.userMax,!this.isDirty)this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax}else this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=p(c,!0);o(f.series,function(a){delete a.kdTree});e=t(e,{min:a,max:b});J(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;c&&g.redraw(d)})},zoom:function(a,b){var c=this.dataMin,d=this.dataMax,e=this.options,f=z(c,p(e.min,c)),e=s(d,p(e.max,d));this.allowZoomOutside||
  135 + (q(c)&&a<=f&&(a=f),q(d)&&b>=e&&(b=e));this.displayBtn=a!==x||b!==x;this.setExtremes(a,b,!1,x,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,e=p(b.width,a.plotWidth-c+(b.offsetRight||0)),f=p(b.height,a.plotHeight),g=p(b.top,a.plotTop),b=p(b.left,a.plotLeft+c),c=/%$/;c.test(f)&&(f=parseFloat(f)/100*a.plotHeight);c.test(g)&&(g=parseFloat(g)/100*a.plotHeight+a.plotTop);this.left=b;this.top=g;this.width=e;this.height=f;this.bottom=a.chartHeight-
  136 + f-g;this.right=a.chartWidth-e-b;this.len=s(d?e:f,0);this.pos=d?b:g},getExtremes:function(){var a=this.isLog;return{min:a?ea(ia(this.min)):this.min,max:a?ea(ia(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?ia(this.min):this.min,b=b?ia(this.max):this.max;a===null?a=b<0?b:c:c>a?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(p(a,0)-this.side*90+720)%360;return a>15&&
  137 + a<165?"right":a>195&&a<345?"left":"center"},unsquish:function(){var a=this.ticks,b=this.options.labels,c=this.horiz,d=this.tickInterval,e=d,f=this.len/(((this.categories?1:0)+this.max-this.min)/d),g,h=b.rotation,i=this.chart.renderer.fontMetrics(b.style.fontSize,a[0]&&a[0].label),j,k=Number.MAX_VALUE,m,n=function(a){a/=f||1;a=a>1?ta(a):1;return a*d};c?(m=!b.staggerLines&&!b.step&&(q(h)?[h]:f<p(b.autoRotationLimit,80)&&b.autoRotation))&&o(m,function(a){var b;if(a===h||a&&a>=-90&&a<=90)j=n(O(i.h/aa(ga*
  138 + a))),b=j+O(a/360),b<k&&(k=b,g=a,e=j)}):b.step||(e=n(i.h));this.autoRotation=m;this.labelRotation=p(g,h);return e},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,e=this.options.labels,f=this.horiz,g=a.margin,h=this.categories?c.length:c.length-1,i=this.slotWidth=f&&!e.step&&!e.rotation&&(this.staggerLines||1)*a.plotWidth/h||!f&&(g[3]&&g[3]-a.spacing[3]||a.chartWidth*0.33),j=s(1,w(i-2*(e.padding||5))),k={},g=b.fontMetrics(e.style.fontSize,d[0]&&d[0].label),
  139 + h=e.style.textOverflow,m,n=0;if(!Ba(e.rotation))k.rotation=e.rotation||0;if(this.autoRotation)o(c,function(a){if((a=d[a])&&a.labelLength>n)n=a.labelLength}),n>j&&n>g.h?k.rotation=this.labelRotation:this.labelRotation=0;else if(i&&(m={width:j+"px"},!h)){m.textOverflow="clip";for(i=c.length;!f&&i--;)if(j=c[i],j=d[j].label)if(j.styles.textOverflow==="ellipsis"&&j.css({textOverflow:"clip"}),j.getBBox().height>this.len/c.length-(g.h-g.f))j.specCss={textOverflow:"ellipsis"}}if(k.rotation&&(m={width:(n>
  140 + a.chartHeight*0.5?a.chartHeight*0.33:a.chartHeight)+"px"},!h))m.textOverflow="ellipsis";this.labelAlign=k.align=e.align||this.autoLabelAlign(this.labelRotation);o(c,function(a){var b=(a=d[a])&&a.label;if(b)b.attr(k),m&&b.css(D(m,b.specCss)),delete b.specCss,a.rotation=k.rotation});this.tickRotCorr=b.rotCorr(g.b,this.labelRotation||0,this.side===2)},hasData:function(){return this.hasVisibleSeries||q(this.min)&&q(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,
  141 + d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k,m=0,n,l=0,u=d.title,r=d.labels,Z=0,A=b.axisOffset,b=b.clipOffset,v=[-1,1,1,-1][h],y,t=a.axisParent;j=a.hasData();a.showAxis=k=j||p(d.showEmpty,!0);a.staggerLines=a.horiz&&r.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(t),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(t),a.labelGroup=c.g("axis-labels").attr({zIndex:r.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+
  142 + "-labels").add(t);if(j||a.isLinked){if(o(e,function(b){f[b]?f[b].addLabel():f[b]=new Sa(a,b)}),a.renderUnsquish(),o(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)Z=s(f[b].getLabelSize(),Z)}),a.staggerLines)Z*=a.staggerLines,a.labelOffset=Z}else for(y in f)f[y].destroy(),delete f[y];if(u&&u.text&&u.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(u.text,0,0,u.useHTML).attr({zIndex:7,rotation:u.rotation||0,align:u.textAlign||{low:"left",middle:"center",high:"right"}[u.align]}).addClass("highcharts-"+
  143 + this.coll.toLowerCase()+"-title").css(u.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(k)m=a.axisTitle.getBBox()[g?"height":"width"],n=u.offset,l=q(n)?0:p(u.margin,g?5:10);a.axisTitle[k?"show":"hide"]()}a.offset=v*p(d.offset,A[h]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=h===2?a.tickRotCorr.y:0;g=Z+l+(Z&&v*(g?p(r.y,a.tickRotCorr.y+8):r.x)-c);a.axisTitleMargin=p(n,g);A[h]=s(A[h],a.axisTitleMargin+m+v*a.offset,g);d=d.offset?0:T(d.lineWidth/2)*2;b[i]=s(b[i],d)},getLinePath:function(a){var b=this.chart,
  144 + c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=e.x||0,j=e.y||0,k=G(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?
  145 + c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?k:0);return{x:a?d+i:b+(g?this.width:0)+h+i,y:a?b+j-(g?this.height:0)+h:d+j}},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.ticks,j=a.minorTicks,k=a.alternateBands,m=d.stackLabels,n=d.alternateGridColor,l=a.tickmarkOffset,u=d.lineWidth,r,p=b.hasRendered&&q(a.oldMin)&&!isNaN(a.oldMin),A=a.showAxis,v=c.globalAnimation,y,s;a.labelEdge.length=0;a.overlap=!1;
  146 + o([i,j,k],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||f){a.minorTickInterval&&!a.categories&&o(a.getMinorTickPositions(),function(b){j[b]||(j[b]=new Sa(a,b,"minor"));p&&j[b].isNew&&j[b].render(null,!0);j[b].render(null,!1,1)});if(g.length&&(o(g,function(b,c){if(!f||b>=a.min&&b<=a.max)i[b]||(i[b]=new Sa(a,b)),p&&i[b].isNew&&i[b].render(c,!0,0.1),i[b].render(c)}),l&&(a.min===0||a.single)))i[-1]||(i[-1]=new Sa(a,-1,null,!0)),i[-1].render(-1);n&&o(g,function(b,c){s=g[c+1]!==x?g[c+1]+
  147 + l:a.max-l;if(c%2===0&&b<a.max&&s<=a.max-l)k[b]||(k[b]=new B.PlotLineOrBand(a)),y=b+l,k[b].options={from:e?ia(y):y,to:e?ia(s):s,color:n},k[b].render(),k[b].isActive=!0});if(!a._addedPlotLB)o((d.plotLines||[]).concat(d.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0}o([i,j,k],function(a){var c,d,e=[],f=v?v.duration||500:0,g=function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])};for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive=
  148 + !1,e.push(c);a===k||!b.hasRendered||!f?g():f&&setTimeout(g,f)});if(u)r=a.getLinePath(u),a.axisLine?a.axisLine.animate({d:r}):a.axisLine=c.path(r).attr({stroke:d.lineColor,"stroke-width":u,zIndex:7}).add(a.axisGroup),a.axisLine[A?"show":"hide"]();if(h&&A)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;m&&m.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.visible&&(this.render(),o(this.plotLinesAndBands,function(a){a.render()}));o(this.series,function(a){a.isDirty=!0})},
  149 + destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||Y(b);for(d in c)Pa(c[d]),c[d]=null;o([b.ticks,b.minorTicks,b.alternateBands],function(a){Pa(a)});for(a=e.length;a--;)e[a].destroy();o("stackTotalGroup,axisLine,axisTitle,axisGroup,cross,gridGroup,labelGroup".split(","),function(a){b[a]&&(b[a]=b[a].destroy())});this.cross&&this.cross.destroy()},drawCrosshair:function(a,b){var c,d=this.crosshair,e=d.animation;if(!this.crosshair||(q(b)||!p(this.crosshair.snap,!0))===!1||b&&b.series&&
  150 + b.series[this.coll]!==this)this.hideCrosshair();else if(p(d.snap,!0)?q(b)&&(c=this.isXAxis?b.plotX:this.len-b.plotY):c=this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos,c=this.isRadial?this.getPlotLinePath(this.isXAxis?b.x:p(b.stackY,b.y))||null:this.getPlotLinePath(null,null,null,null,c)||null,c===null)this.hideCrosshair();else if(this.cross)this.cross.attr({visibility:"visible"})[e?"animate":"attr"]({d:c},e);else{e=this.categories&&!this.isRadial;e={"stroke-width":d.width||(e?this.transA:
  151 + 1),stroke:d.color||(e?"rgba(155,200,255,0.2)":"#C0C0C0"),zIndex:d.zIndex||2};if(d.dashStyle)e.dashstyle=d.dashStyle;this.cross=this.chart.renderer.path(c).attr(e).add()}},hideCrosshair:function(){this.cross&&this.cross.hide()}};t(ha.prototype,{getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b,null,null,!0),d=this.getPlotLinePath(a,null,null,!0);d&&c&&d.toString()!==c.toString()?d.push(c[4],c[5],c[1],c[2]):d=null;return d},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},
  152 + addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new B.PlotLineOrBand(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();o([c.plotLines||[],d.plotLines||[],c.plotBands||[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&
  153 + ja(b,b[e])})}});ha.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=S.global.useUTC,h,i=new ya(b-Wa(b)),j=a.unitRange,k=a.count;if(q(b)){i[Db](j>=F.second?0:k*T(i.getMilliseconds()/k));if(j>=F.second)i[Eb](j>=F.minute?0:k*T(i.getSeconds()/k));if(j>=F.minute)i[Fb](j>=F.hour?0:k*T(i[rb]()/k));if(j>=F.hour)i[Gb](j>=F.day?0:k*T(i[sb]()/k));if(j>=F.day)i[ub](j>=F.month?1:k*T(i[Xa]()/k));j>=F.month&&(i[vb](j>=F.year?0:k*T(i[Ya]()/k)),h=i[Za]());j>=F.year&&(h-=h%k,i[wb](h));if(j===F.week)i[ub](i[Xa]()-
  154 + i[tb]()+p(d,1));b=1;if(nb||db)i=i.getTime(),i=new ya(i+Wa(i));h=i[Za]();for(var d=i.getTime(),m=i[Ya](),n=i[Xa](),l=(F.day+(g?Wa(i):i.getTimezoneOffset()*6E4))%F.day;d<c;)e.push(d),j===F.year?d=fb(h+b*k,0):j===F.month?d=fb(h,m+b*k):!g&&(j===F.day||j===F.week)?d=fb(h,m,n+b*k*(j===F.day?1:7)):d+=j*k,b++;e.push(d);o(kb(e,function(a){return j<=F.hour&&a%F.day===l}),function(a){f[a]="day"})}e.info=t(a,{higherRanks:f,totalRange:j*k});return e};ha.prototype.normalizeTimeTickInterval=function(a,b){var c=
  155 + b||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],d=c[c.length-1],e=F[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=F[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+F[c[g+1][0]])/2)break;e===F.year&&a<5*e&&(f=[1,2,5]);c=pb(a/e,f,d[0]==="year"?s(ob(a/e),1):1);return{unitRange:e,count:c,unitName:d[0]}};ha.prototype.getLogTickPositions=function(a,b,c,d){var e=
  156 + this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=w(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=T(b),h,i,j,k,m,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!m;f++){i=e.length;for(h=0;h<i&&!m;h++)j=Ca(ia(f)*e[h]),j>b&&(!d||k<=c)&&k!==x&&g.push(k),k>c&&(m=!0),k=j}else if(b=ia(b),c=ia(c),a=e[d?"minorTickInterval":"tickInterval"],a=p(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:
  157 + f)||1)),a=pb(a,null,ob(a)),g=Ua(this.getLinearTickPositions(a,b,c),Ca),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};var Mb=B.Tooltip=function(){this.init.apply(this,arguments)};Mb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=G(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=a.renderer.label("",0,0,b.shape||"callout",null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,
  158 + r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-9999});fa||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden&&(O(a-f.x)>1||O(b-f.y)>1),h=e.followPointer||e.len>1;t(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:h?x:g?(2*f.anchorX+c)/3:c,anchorY:h?x:g?(f.anchorY+d)/2:d});e.label.attr(f);
  159 + if(g)clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(a){var b=this;clearTimeout(this.hideTimer);if(!this.isHidden)this.hideTimer=setTimeout(function(){b.label.fadeOut();b.isHidden=!0},p(a,this.options.hideDelay,500))},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=d.plotLeft,h=0,i=0,j,k,a=ra(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===x&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-
  160 +f]);c||(o(a,function(a){j=a.series.yAxis;k=a.series.xAxis;h+=a.plotX+(!e&&k?k.left-g:0);i+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&j?j.top-f:0)}),h/=a.length,i/=a.length,c=[e?d.plotWidth-i:h,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-h:i]);return Ua(c,w)},getPosition:function(a,b,c){var d=this.chart,e=this.distance,f={},g=c.h||0,h,i=["y",d.chartHeight,b,c.plotY+d.plotTop,d.plotTop,d.plotTop+d.plotHeight],j=["x",d.chartWidth,a,c.plotX+d.plotLeft,d.plotLeft,d.plotLeft+d.plotWidth],
  161 + k=p(c.ttBelow,d.inverted&&!c.negative||!d.inverted&&c.negative),m=function(a,b,c,d,h,i){var j=c<d-e,n=d+e+c<b,m=d-e-c;d+=e;if(k&&n)f[a]=d;else if(!k&&j)f[a]=m;else if(j)f[a]=z(i-c,m-g<0?m:m-g);else if(n)f[a]=s(h,d+g+c>b?d:d+g);else return!1},n=function(a,b,c,d){if(d<e||d>b-e)return!1;else f[a]=d<c/2?1:d>b-c/2?b-c-2:d-c/2},l=function(a){var b=i;i=j;j=b;h=a},u=function(){m.apply(0,i)!==!1?n.apply(0,j)===!1&&!h&&(l(!0),u()):h?f.x=f.y=0:(l(!0),u())};(d.inverted||this.len>1)&&l();u();return f},defaultFormatter:function(a){var b=
  162 + this.points||ra(this),c;c=[a.tooltipFooterHeaderFormatter(b[0])];c=c.concat(a.bodyFormatter(b));c.push(a.tooltipFooterHeaderFormatter(b[0],!0));return c.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h,i={},j,k=[];j=e.formatter||this.defaultFormatter;var i=c.hoverPoints,m,n=this.shared;clearTimeout(this.hideTimer);this.followPointer=ra(a)[0].series.tooltipOptions.followPointer;h=this.getAnchor(a,b);f=h[0];g=h[1];n&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=
  163 + a,i&&o(i,function(a){a.setState()}),o(a,function(a){a.setState("hover");k.push(a.getLabelConfig())}),i={x:a[0].category,y:a[0].y},i.points=k,this.len=k.length,a=a[0]):i=a.getLabelConfig();j=j.call(i,this);i=a.series;this.distance=p(i.tooltipOptions.distance,16);j===!1?this.hide():(this.isHidden&&(cb(d),d.attr("opacity",1).show()),d.attr({text:j}),m=e.borderColor||a.color||i.color||"#606060",d.attr({stroke:m}),this.updatePosition({plotX:f,plotY:g,negative:a.negative,ttBelow:a.ttBelow,h:h[2]||0}),this.isHidden=
  164 + !1);J(c,"tooltipRefresh",{text:j,x:f+c.plotLeft,y:g+c.plotTop,borderColor:m})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(w(c.x),w(c.y||0),a.plotX+b.plotLeft,a.plotY+b.plotTop)},getXDateFormat:function(a,b,c){var d,b=b.dateTimeLabelFormats,e=c&&c.closestPointRange,f,g={millisecond:15,second:12,minute:9,hour:6,day:3},h,i="millisecond";if(e){h=Na("%m-%d %H:%M:%S.%L",a.x);for(f in F){if(e===F.week&&+Na("%w",
  165 + a.x)===c.options.startOfWeek&&h.substr(6)==="00:00:00.000"){f="week";break}else if(F[f]>e){f=i;break}else if(g[f]&&h.substr(g[f])!=="01-01 00:00:00.000".substr(g[f]))break;f!=="week"&&(i=f)}f&&(d=b[f])}else d=b.day;return d||b.year},tooltipFooterHeaderFormatter:function(a,b){var c=b?"footer":"header",d=a.series,e=d.tooltipOptions,f=e.xDateFormat,g=d.xAxis,h=g&&g.options.type==="datetime"&&qa(a.key),c=e[c+"Format"];h&&!f&&(f=this.getXDateFormat(a,e,g));h&&f&&(c=c.replace("{point.key}","{point.key:"+
  166 + f+"}"));return Ia(c,{point:a,series:d})},bodyFormatter:function(a){return Ua(a,function(a){var c=a.series.tooltipOptions;return(c.pointFormatter||a.point.tooltipFormatter).call(a.point,c.pointFormat)})}};var oa;ab=C.documentElement.ontouchstart!==x;var Va=B.Pointer=function(a,b){this.init(a,b)};Va.prototype={init:function(a,b){var c=b.chart,d=c.events,e=fa?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=
  167 + e&&!c||f&&c;this.hasZoom=f||e;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(B.Tooltip&&b.tooltip.enabled)a.tooltip=new Mb(a,b.tooltip),this.followTouchMove=p(b.tooltip.followTouchMove,!0);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||window.event,a=Sb(a);if(!a.target)a.target=a.srcElement;d=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;if(!b)this.chartPosition=b=Rb(this.chart.container);d.pageX===x?(c=s(a.x,a.clientX-b.left),d=a.y):(c=
  168 + d.pageX-b.left,d=d.pageY-b.top);return t(a,{chartX:w(c),chartY:w(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};o(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e=d?d.shared:!1,f=b.hoverPoint,g=b.hoverSeries,h,i=Number.MAX_VALUE,j,k,m=[],n,l;if(!e&&!g)for(h=0;h<c.length;h++)if(c[h].directTouch||!c[h].options.stickyTracking)c=[];g&&(e?g.noSharedTooltip:
  169 + g.directTouch)&&f?n=f:(o(c,function(b){j=b.noSharedTooltip&&e;k=!e&&b.directTouch;b.visible&&!j&&!k&&p(b.options.enableMouseTracking,!0)&&(l=b.searchPoint(a,!j&&b.kdDimensions===1))&&m.push(l)}),o(m,function(a){if(a&&typeof a.dist==="number"&&a.dist<i)i=a.dist,n=a}));if(n&&(n!==this.prevKDPoint||d&&d.isHidden)){if(e&&!n.series.noSharedTooltip){for(h=m.length;h--;)(m[h].clientX!==n.clientX||m[h].series.noSharedTooltip)&&m.splice(h,1);m.length&&d&&d.refresh(m,a);o(m,function(b){b.onMouseOver(a,b!==
  170 + (g&&g.directTouch&&f||n))})}else if(d&&d.refresh(n,a),!g||!g.directTouch)n.onMouseOver(a);this.prevKDPoint=n}else c=g&&g.tooltipOptions.followPointer,d&&c&&!d.isHidden&&(c=d.getAnchor([{}],a),d.updatePosition({plotX:c[0],plotY:c[1]}));if(d&&!this._onDocumentMouseMove)this._onDocumentMouseMove=function(a){if(X[oa])X[oa].pointer.onDocumentMouseMove(a)},I(C,"mousemove",this._onDocumentMouseMove);o(b.axes,function(b){b.drawCrosshair(a,p(n,f))})},reset:function(a,b){var c=this.chart,d=c.hoverSeries,e=
  171 + c.hoverPoint,f=c.hoverPoints,g=c.tooltip,h=g&&g.shared?f:e;(a=a&&g&&h)&&ra(h)[0].plotX===x&&(a=!1);if(a)g.refresh(h),e&&(e.setState(e.state,!0),o(c.axes,function(a){p(a.options.crosshair&&a.options.crosshair.snap,!0)?a.drawCrosshair(null,e):a.hideCrosshair()}));else{if(e)e.onMouseOut();f&&o(f,function(a){a.setState()});if(d)d.onMouseOut();g&&g.hide(b);if(this._onDocumentMouseMove)Y(C,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null;o(c.axes,function(a){a.hideCrosshair()});this.hoverX=
  172 + c.hoverPoints=c.hoverPoint=null}},scaleGroups:function(a,b){var c=this.chart,d;o(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=
  173 + this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,m,n=this.selectionMarker,l=this.mouseDownX,u=this.mouseDownY,r=c.panKey&&a[c.panKey+"Key"];if(!n||!n.touch)if(d<h?d=h:d>h+j&&(d=h+j),e<i?e=i:e>i+k&&(e=i+k),this.hasDragged=Math.sqrt(Math.pow(l-d,2)+Math.pow(u-e,2)),this.hasDragged>10){m=b.isInsidePlot(l-h,u-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&m&&!r&&!n)this.selectionMarker=n=b.renderer.rect(h,i,
  174 + f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();n&&f&&(d-=l,n.attr({width:O(d),x:(d>0?0:d)+l}));n&&g&&(d=e-u,n.attr({height:O(d),y:(d>0?0:d)+u}));m&&!n&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this,c=this.chart,d=this.hasPinched;if(this.selectionMarker){var e={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},f=this.selectionMarker,g=f.attr?f.attr("x"):f.x,h=f.attr?f.attr("y"):f.y,i=f.attr?f.attr("width"):f.width,j=f.attr?f.attr("height"):
  175 + f.height,k;if(this.hasDragged||d)o(c.axes,function(c){if(c.zoomEnabled&&q(c.min)&&(d||b[{xAxis:"zoomX",yAxis:"zoomY"}[c.coll]])){var f=c.horiz,l=a.type==="touchend"?c.minPixelPadding:0,u=c.toValue((f?g:h)+l),f=c.toValue((f?g+i:h+j)-l);e[c.coll].push({axis:c,min:z(u,f),max:s(u,f)});k=!0}}),k&&J(c,"selection",e,function(a){c.zoom(t(a,d?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();d&&this.scaleGroups()}if(c)M(c.container,{cursor:c._cursor}),c.cancelClick=this.hasDragged>
  176 + 10,c.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){X[oa]&&X[oa].pointer.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,a=this.normalize(a,c);c&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){var a=X[oa];if(a)a.pointer.reset(),
  177 + a.pointer.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart;oa=b.index;a=this.normalize(a);a.returnValue=!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=K(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=
  178 + this.chart.hoverSeries,a=a.relatedTarget||a.toElement;if(b&&!b.options.stickyTracking&&!this.inClass(a,"highcharts-tooltip")&&!this.inClass(a,"highcharts-series-"+b.index))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,a=this.normalize(a);a.originalEvent=a;b.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(J(c.series,"click",t(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(t(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-
  179 + d,a.chartY-e)&&J(b,"click",a)))},setDOMEvents:function(){var a=this,b=a.chart.container;b.onmousedown=function(b){a.onContainerMouseDown(b)};b.onmousemove=function(b){a.onContainerMouseMove(b)};b.onclick=function(b){a.onContainerClick(b)};I(b,"mouseleave",a.onContainerMouseLeave);bb===1&&I(C,"mouseup",a.onDocumentMouseUp);if(ab)b.ontouchstart=function(b){a.onContainerTouchStart(b)},b.ontouchmove=function(b){a.onContainerTouchMove(b)},bb===1&&I(C,"touchend",a.onDocumentTouchEnd)},destroy:function(){var a;
  180 + Y(this.chart.container,"mouseleave",this.onContainerMouseLeave);bb||(Y(C,"mouseup",this.onDocumentMouseUp),Y(C,"touchend",this.onDocumentTouchEnd));clearInterval(this.tooltipTimeout);for(a in this)this[a]=null}};t(B.Pointer.prototype,{pinchTranslate:function(a,b,c,d,e,f){(this.zoomHor||this.pinchHor)&&this.pinchTranslateDirection(!0,a,b,c,d,e,f);(this.zoomVert||this.pinchVert)&&this.pinchTranslateDirection(!1,a,b,c,d,e,f)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x":
  181 + "y",k=a?"X":"Y",m="chart"+k,n=a?"width":"height",l=i["plot"+(a?"Left":"Top")],u,r,p=h||1,o=i.inverted,v=i.bounds[a?"h":"v"],s=b.length===1,q=b[0][m],t=c[0][m],x=!s&&b[1][m],w=!s&&c[1][m],z,c=function(){!s&&O(q-x)>20&&(p=h||O(t-w)/O(q-x));r=(l-t)/p+q;u=i["plot"+(a?"Width":"Height")]/p};c();b=r;b<v.min?(b=v.min,z=!0):b+u>v.max&&(b=v.max-u,z=!0);z?(t-=0.8*(t-g[j][0]),s||(w-=0.8*(w-g[j][1])),c()):g[j]=[t,w];o||(f[j]=r-l,f[n]=u);f=o?1/p:p;e[n]=u;e[j]=b;d[o?a?"scaleY":"scaleX":"scale"+k]=p;d["translate"+
  182 +k]=f*l+(t-f*q)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=a.touches,f=e.length,g=b.lastValidTouch,h=b.hasZoom,i=b.selectionMarker,j={},k=f===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||b.runChartClick),m={};if(f>1)b.initiated=!0;h&&b.initiated&&!k&&a.preventDefault();Ua(e,function(a){return b.normalize(a)});if(a.type==="touchstart")o(e,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),g.x=[d[0].chartX,d[1]&&d[1].chartX],g.y=[d[0].chartY,d[1]&&d[1].chartY],o(c.axes,
  183 + function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(p(a.options.min,a.dataMin)),f=a.toPixels(p(a.options.max,a.dataMax)),g=z(e,f),e=s(e,f);b.min=z(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}}),b.res=!0;else if(d.length){if(!i)b.selectionMarker=i=t({destroy:ua,touch:!0},c.plotBox);b.pinchTranslate(d,e,j,i,m,g);b.hasPinched=h;b.scaleGroups(j,m);if(!h&&b.followTouchMove&&f===1)this.runPointActions(b.normalize(a));else if(b.res)b.res=!1,this.reset(!1,0)}},touch:function(a,
  184 + b){var c=this.chart;oa=c.index;a.touches.length===1?(a=this.normalize(a),c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop)&&!c.openMenu?(b&&this.runPointActions(a),this.pinch(a)):b&&this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchStart:function(a){this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(a){X[oa]&&X[oa].pointer.drop(a)}});if(L.PointerEvent||L.MSPointerEvent){var wa={},Ab=!!L.PointerEvent,Wb=function(){var a,b=[];b.item=function(a){return this[a]};
  185 + for(a in wa)wa.hasOwnProperty(a)&&b.push({pageX:wa[a].pageX,pageY:wa[a].pageY,target:wa[a].target});return b},Bb=function(a,b,c,d){a=a.originalEvent||a;if((a.pointerType==="touch"||a.pointerType===a.MSPOINTER_TYPE_TOUCH)&&X[oa])d(a),d=X[oa].pointer,d[b]({type:c,target:a.currentTarget,preventDefault:ua,touches:Wb()})};t(Va.prototype,{onContainerPointerDown:function(a){Bb(a,"onContainerTouchStart","touchstart",function(a){wa[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){Bb(a,
  186 + "onContainerTouchMove","touchmove",function(a){wa[a.pointerId]={pageX:a.pageX,pageY:a.pageY};if(!wa[a.pointerId].target)wa[a.pointerId].target=a.currentTarget})},onDocumentPointerUp:function(a){Bb(a,"onDocumentTouchEnd","touchend",function(a){delete wa[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,Ab?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,Ab?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(C,Ab?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});
  187 + Ta(Va.prototype,"init",function(a,b,c){a.call(this,b,c);this.hasZoom&&M(b.container,{"-ms-touch-action":P,"touch-action":P})});Ta(Va.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(I)});Ta(Va.prototype,"destroy",function(a){this.batchMSEvents(Y);a.call(this)})}var mb=B.Legend=function(a,b){this.init(a,b)};mb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=b.itemMarginTop||0;this.options=b;if(b.enabled)c.itemStyle=d,c.itemHiddenStyle=
  188 + D(d,b.itemHiddenStyle),c.itemMarginTop=e,c.padding=d=p(b.padding,8),c.initialItemX=d,c.initialItemY=d-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.symbolWidth=p(b.symbolWidth,16),c.pages=[],c.render(),I(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.legendColor||a.color||"#CCC":g,g=a.options&&a.options.marker,i={fill:h},j;d&&d.css({fill:c,
  189 + color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in i.stroke=h,g=a.convertAttribs(g),g)d=g[j],d!==x&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;o(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Qa(a.checkbox)},
  190 + destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,o(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,M(f,{left:b.translateX+e.checkboxOffset+f.x-20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":P}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,
  191 + a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},setText:function(a){var b=this.options;a.legendItem.attr({text:b.labelFormat?Ia(b.labelFormat,a):b.labelFormatter.call(a)})},renderItem:function(a){var b=this.chart,c=b.renderer,d=this.options,e=d.layout==="horizontal",f=this.symbolWidth,g=d.symbolPadding,h=this.itemStyle,i=this.itemHiddenStyle,
  192 + j=this.padding,k=e?p(d.itemDistance,20):0,m=!d.rtl,n=d.width,l=d.itemMarginBottom||0,u=this.itemMarginTop,r=this.initialItemX,o=a.legendItem,A=a.series&&a.series.drawLegendSymbol?a.series:a,v=A.options,v=this.createCheckboxForItem&&v&&v.showCheckbox,q=d.useHTML;if(!o){a.legendGroup=c.g("legend-item").attr({zIndex:1}).add(this.scrollGroup);a.legendItem=o=c.text("",m?f+g:-g,this.baseline||0,q).css(D(a.visible?h:i)).attr({align:m?"left":"right",zIndex:2}).add(a.legendGroup);if(!this.baseline)this.fontMetrics=
  193 + c.fontMetrics(h.fontSize,o),this.baseline=this.fontMetrics.f+3+u,o.attr("y",this.baseline);A.drawLegendSymbol(this,a);this.setItemEvents&&this.setItemEvents(a,o,q,h,i);this.colorizeItem(a,a.visible);v&&this.createCheckboxForItem(a)}this.setText(a);c=o.getBBox();f=a.checkboxOffset=d.itemWidth||a.legendItemWidth||f+g+c.width+k+(v?20:0);this.itemHeight=g=w(a.legendItemHeight||c.height);if(e&&this.itemX-r+f>(n||b.chartWidth-2*j-r-d.x))this.itemX=r,this.itemY+=u+this.lastLineHeight+l,this.lastLineHeight=
  194 + 0;this.maxItemWidth=s(this.maxItemWidth,f);this.lastItemY=u+this.itemY+l;this.lastLineHeight=s(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=f:(this.itemY+=u+g+l,this.lastLineHeight=g);this.offsetWidth=n||s((e?this.itemX-r-k:f)+j,this.offsetWidth)},getAllItems:function(){var a=[];o(this.chart.series,function(b){var c=b.options;if(p(c.showInLegend,!q(c.linkedTo)?x:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},adjustMargins:function(a,
  195 + b){var c=this.chart,d=this.options,e=d.align.charAt(0)+d.verticalAlign.charAt(0)+d.layout.charAt(0);this.display&&!d.floating&&o([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(f,g){f.test(e)&&!q(a[g])&&(c[ib[g]]=s(c[ib[g]],c.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*d[g%2?"x":"y"]+p(d.margin,12)+b[g]))})},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,m=j.borderWidth,n=j.backgroundColor;a.itemX=a.initialItemX;
  196 + a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=a.getAllItems();qb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;a.lastLineHeight=0;o(e,function(b){a.renderItem(b)});g=(j.width||a.offsetWidth)+k;h=a.lastItemY+a.lastLineHeight+
  197 + a.titleHeight;h=a.handleOverflow(h);h+=k;if(m||n){if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp({width:g,height:h})),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,m||0).attr({stroke:j.borderColor,"stroke-width":m||0,fill:n||P}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;o(e,function(b){a.positionItem(b)});f&&d.align(t({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=
  198 + this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,j=e.navigation,k=p(j.animation,!0),m=j.arrowSize||12,n=this.nav,l=this.pages,u=this.padding,r,q=this.allItems,A=function(a){i.attr({height:a});if(b.contentGroup.div)b.contentGroup.div.style.clip="rect("+u+"px,9999px,"+(u+a)+"px,0)"};e.layout==="horizontal"&&(f/=2);g&&(f=z(f,g));l.length=0;if(a>f){this.clipHeight=h=s(f-20-this.titleHeight-u,0);this.currentPage=
  199 + p(this.currentPage,1);this.fullHeight=a;o(q,function(a,b){var c=a._legendItemPos[1],d=w(a.legendItem.getBBox().height),e=l.length;if(!e||c-l[e-1]>h&&(r||c)!==l[e-1])l.push(r||c),e++;b===q.length-1&&c+d-l[e-1]>h&&l.push(c);c!==r&&(r=c)});if(!i)i=b.clipRect=d.clipRect(0,u,9999,0),b.contentGroup.clip(i);A(h);if(!n)this.nav=n=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,m,m).on("click",function(){b.scroll(-1,k)}).add(n),this.pager=d.text("",15,10).css(j.style).add(n),this.down=
  200 + d.symbol("triangle-down",0,0,m,m).on("click",function(){b.scroll(1,k)}).add(n);b.scroll(0);a=f}else if(n)A(c.chartHeight),n.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,h=g.activeColor,g=g.inactiveColor,i=this.pager,j=this.padding;e>d&&(e=d);if(e>0)b!==x&&Ra(b,this.chart),this.nav.attr({translateX:j,translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}),
  201 + this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default":"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?"default":"pointer"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};Ma=B.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||a.fontMetrics.f;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-c+1,a.symbolWidth,c,a.options.symbolRadius||
  202 + 0).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d;d=a.symbolWidth;var e=this.chart.renderer,f=this.legendGroup,a=a.baseline-w(a.fontMetrics.b*0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled!==!1)b=c.radius,this.legendSymbol=d=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b).add(f),d.isMarker=!0}};(/Trident\/7\.0/.test(za)||Ka)&&Ta(mb.prototype,
  203 + "positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();setTimeout(d)});E=B.Chart=function(){this.init.apply(this,arguments)};E.prototype={callbacks:[],init:function(a,b){var c,d=a.series;a.series=null;c=D(S,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=
  204 + d.showAxes;var f=this,g;f.index=X.length;X.push(f);bb++;d.reflow!==!1&&I(f,"load",function(){f.initReflow()});if(e)for(g in e)I(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=fa?!1:p(d.animation,!0);f.pointCount=f.colorCounter=f.symbolCounter=0;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=N[a.type||b.type||b.defaultSeriesType])||la(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},
  205 + redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.hasCartesianSeries,j=this.isDirtyBox,k=c.length,m=k,n=this.renderer,l=n.isHidden(),p=[];Ra(a,this);l&&this.cloneRenderTo();for(this.layOutTitles();m--;)if(a=c[m],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(m=k;m--;)if(a=c[m],a.options.stacking)a.isDirty=!0;o(c,function(a){a.isDirty&&a.options.legendType==="point"&&(a.updateTotals&&a.updateTotals(),f=!0)});if(f&&e.options.enabled)e.render(),
  206 + this.isDirtyLegend=!1;g&&this.getStacks();if(i&&!this.isResizing)this.maxTicks=null,o(b,function(a){a.setScale()});this.getMargins();i&&(o(b,function(a){a.isDirty&&(j=!0)}),o(b,function(a){var b=a.min+","+a.max;if(a.extKey!==b)a.extKey=b,p.push(function(){J(a,"afterSetExtremes",t(a.eventArgs,a.getExtremes()));delete a.eventArgs});(j||g)&&a.redraw()}));j&&this.drawChartBox();o(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset(!0);n.draw();J(this,"redraw");l&&this.cloneRenderTo(!0);
  207 + o(p,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ra(b.xAxis||{}),b=b.yAxis=ra(b.yAxis||{});o(c,function(a,b){a.index=b;a.isX=!0});o(b,function(a,b){a.index=b});c=c.concat(b);o(c,function(b){new ha(a,
  208 + b)})},getSelectedPoints:function(){var a=[];o(this.series,function(b){a=a.concat(kb(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return kb(this.series,function(a){return a.selected})},setTitle:function(a,b,c){var g;var d=this,e=d.options,f;f=e.title=D(e.title,a);g=e.subtitle=D(e.subtitle,b),e=g;o([["title",a,f],["subtitle",b,e]],function(a){var b=a[0],c=d[b],e=a[1],a=a[2];c&&e&&(d[b]=c=c.destroy());a&&a.text&&!c&&(d[b]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,
  209 + "class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c=this.title,d=this.subtitle,e=this.options,f=e.title,e=e.subtitle,g=this.renderer,h=this.spacingBox.width-44;if(c&&(c.css({width:(f.width||h)+"px"}).align(t({y:g.fontMetrics(f.style.fontSize,c).b-3},f),!1,"spacingBox"),!f.floating&&!f.verticalAlign))b=c.getBBox().height;d&&(d.css({width:(e.width||h)+"px"}).align(t({y:b+(f.margin-13)+g.fontMetrics(e.style.fontSize,c).b},e),!1,"spacingBox"),
  210 + !e.floating&&!e.verticalAlign&&(b=ta(b+d.getBBox().height)));c=this.titleOffset!==b;this.titleOffset=b;if(!this.isDirtyBox&&c)this.isDirtyBox=c,this.hasRendered&&p(a,!0)&&this.isDirtyBox&&this.redraw()},getChartSize:function(){var a=this.options.chart,b=a.width,a=a.height,c=this.renderToClone||this.renderTo;if(!q(b))this.containerWidth=jb(c,"width");if(!q(a))this.containerHeight=jb(c,"height");this.chartWidth=s(0,b||this.containerWidth||600);this.chartHeight=s(0,p(a,this.containerHeight>19?this.containerHeight:
  211 + 400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Qa(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),M(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block","important"),C.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options,c=b.chart,d,e,f;this.renderTo=
  212 + a=c.renderTo;f="highcharts-"+xb++;if(Ba(a))this.renderTo=a=C.getElementById(a);a||la(13,!0);d=G(K(a,"data-highcharts-chart"));!isNaN(d)&&X[d]&&X[d].hasRendered&&X[d].destroy();K(a,"data-highcharts-chart",this.index);a.innerHTML="";!c.skipClone&&!a.offsetWidth&&this.cloneRenderTo();this.getChartSize();d=this.chartWidth;e=this.chartHeight;this.container=a=$(Ja,{className:"highcharts-container"+(c.className?" "+c.className:""),id:f},t({position:"relative",overflow:"hidden",width:d+"px",height:e+"px",
  213 + textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},c.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=new (B[c.renderer]||$a)(a,d,e,c.style,c.forExport,b.exporting&&b.exporting.allowHTML);fa&&this.renderer.create(this,a,d,e);this.renderer.chartIndex=this.index},getMargins:function(a){var b=this.spacing,c=this.margin,d=this.titleOffset;this.resetMargins();if(d&&!q(c[0]))this.plotTop=s(this.plotTop,d+this.options.title.margin+b[0]);this.legend.adjustMargins(c,
  214 + b);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],c=a.margin;a.hasCartesianSeries&&o(a.axes,function(a){a.visible&&a.getOffset()});o(ib,function(d,e){q(c[e])||(a[d]+=b[e])});a.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||jb(d,"width"),f=c.height||jb(d,"height"),c=a?a.target:L,d=function(){if(b.container)b.setSize(e,
  215 + f,!1),b.hasUserSize=null};if(!b.hasUserSize&&!b.isPrinting&&e&&f&&(c===L||c===C)){if(e!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),a?b.reflowTimeout=setTimeout(d,100):d();b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};I(L,"resize",b);I(a,"destroy",function(){Y(L,"resize",b)})},setSize:function(a,b,c){var d=this,e,f,g,h=d.renderer;d.isResizing+=1;g=function(){d&&J(d,"endResize",null,function(){d.isResizing-=1})};Ra(c,
  216 + d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(q(a))d.chartWidth=e=s(0,w(a)),d.hasUserSize=!!e;if(q(b))d.chartHeight=f=s(0,w(b));a=h.globalAnimation;(a?lb:M)(d.container,{width:e+"px",height:f+"px"},a);d.setChartSize(!0);h.setSize(e,f,c);d.maxTicks=null;o(d.axes,function(a){a.isDirty=!0;a.setScale()});o(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(c);d.oldChartHeight=null;J(d,"resize");a=h.globalAnimation;a===!1?
  217 + g():setTimeout(g,a&&a.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,m;this.plotLeft=i=w(this.plotLeft);this.plotTop=j=w(this.plotTop);this.plotWidth=k=s(0,w(d-i-this.marginRight));this.plotHeight=m=s(0,w(e-j-this.marginBottom));this.plotSizeX=b?m:k;this.plotSizeY=b?k:m;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],
  218 + height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:m};d=2*T(this.plotBorderWidth/2);b=ta(s(d,h[3])/2);c=ta(s(d,h[0])/2);this.clipBox={x:b,y:c,width:T(this.plotSizeX-s(d,h[1])/2-b),height:s(0,T(this.plotSizeY-s(d,h[2])/2-c))};a||o(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this;o(ib,function(b,c){a[b]=p(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,
  219 + c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,m=a.plotBackgroundImage,n=a.plotBorderWidth||0,l,p=this.plotLeft,o=this.plotTop,q=this.plotWidth,s=this.plotHeight,v=this.plotBox,t=this.clipRect,x=this.clipBox;l=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp({width:c-l,height:d-l}));else{e={fill:j||P};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=
  220 + b.rect(l/2,l/2,c-l,d-l,a.borderRadius,i).attr(e).addClass("highcharts-background").add().shadow(a.shadow)}if(k)f?f.animate(v):this.plotBackground=b.rect(p,o,q,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(m)h?h.animate(v):this.plotBGImage=b.image(m,p,o,q,s).add();t?t.animate({width:x.width,height:x.height}):this.clipRect=b.clipRect(x);if(n)g?g.animate(g.crisp({x:p,y:o,width:q,height:s,strokeWidth:-n})):this.plotBorder=b.rect(p,o,q,s,0,-n).attr({stroke:a.plotBorderColor,"stroke-width":n,fill:P,
  221 + zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;o(["inverted","angular","polar"],function(g){c=N[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=N[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;o(b,function(a){a.linkedSeries.length=0});o(b,function(b){var d=b.options.linkedTo;if(Ba(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),
  222 + b.linkedParent=d,b.visible=p(b.options.visible,d.options.visible,b.visible)})},renderSeries:function(){o(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&o(b.items,function(c){var d=t(b.style,c.style),e=G(d.left)+a.plotLeft,f=G(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,e,f).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,c=this.options,d,e,f,g;this.setTitle();this.legend=
  223 + new mb(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;e=this.plotHeight-=13;o(a,function(a){a.setScale()});this.getAxisMargins();f=d/this.plotWidth>1.1;g=e/this.plotHeight>1.1;if(f||g)this.maxTicks=null,o(a,function(a){(a.horiz&&f||!a.horiz&&g)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&o(a,function(a){a.visible&&a.render()});if(!this.seriesGroup)this.seriesGroup=b.g("series-group").attr({zIndex:3}).add();
  224 + this.renderSeries();this.renderLabels();this.showCredits(c.credits);this.hasRendered=!0},showCredits:function(a){if(a.enabled&&!this.credits)this.credits=this.renderer.text(a.text,0,0).on("click",function(){if(a.href)location.href=a.href}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position)},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;J(a,"destroy");X[a.index]=x;bb--;a.renderTo.removeAttribute("data-highcharts-chart");Y(a);for(e=b.length;e--;)b[e]=
  225 + b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();o("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",Y(d),f&&Qa(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!ca&&L==L.top&&C.readyState!=="complete"||fa&&!L.canvg?(fa?Lb.push(function(){a.firstRender()},a.options.global.canvasToolsURL):
  226 + C.attachEvent("onreadystatechange",function(){C.detachEvent("onreadystatechange",a.firstRender);C.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender()){a.getContainer();J(a,"init");a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();o(b.series||[],function(b){a.initSeries(b)});a.linkSeries();J(a,"beforeRender");if(B.Pointer)a.pointer=new Va(a,b);a.render();a.renderer.draw();c&&c.apply(a,[a]);o(a.callbacks,
  227 + function(b){a.index!==x&&b.apply(a,[a])});J(a,"load");a.cloneRenderTo(!0)}},splashArray:function(a,b){var c=b[a],c=da(c)?c:[c,c,c,c];return[p(b[a+"Top"],c[0]),p(b[a+"Right"],c[1]),p(b[a+"Bottom"],c[2]),p(b[a+"Left"],c[3])]}};var Xb=B.CenteredSeriesMixin={getCenter:function(){var a=this.options,b=this.chart,c=2*(a.slicedOffset||0),d=b.plotWidth-2*c,b=b.plotHeight-2*c,e=a.center,e=[p(e[0],"50%"),p(e[1],"50%"),a.size||"100%",a.innerSize||0],f=z(d,b),g,h;for(g=0;g<4;++g)h=e[g],a=g<2||g===2&&/%$/.test(h),
  228 + e[g]=(/%$/.test(h)?[d,b,f,e[2]][g]*parseFloat(h)/100:parseFloat(h))+(a?c:0);e[3]>e[2]&&(e[3]=e[2]);return e}},Fa=function(){};Fa.prototype={init:function(a,b,c){this.series=a;this.color=a.color;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey,
  229 + a=Fa.prototype.optionsToObject.call(this,a);t(this,a);this.options=this.options?t(this.options,a):a;if(d)this.y=this[d];if(this.x===x&&c)this.x=b===x?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.options.keys,e=d||c.pointArrayMap||["y"],f=e.length,g=0,h=0;if(typeof a==="number"||a===null)b[e[0]]=a;else if(Ga(a)){if(!d&&a.length>f){c=typeof a[0];if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];g++}for(;h<f;){if(!d||a[g]!==void 0)b[e[h]]=a[g];g++;h++}}else if(typeof a===
  230 + "object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ja(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)Y(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],
  231 + b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=p(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";o(b.pointArrayMap||["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});
  232 + return Ia(a,{point:this,series:this.series})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select&&d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});J(this,a,b,c)},visible:!0};var R=B.Series=function(){};R.prototype={isCartesian:!0,type:"line",pointClass:Fa,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",
  233 + fill:"fillColor",r:"radius"},directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],init:function(a,b){var c=this,d,e,f=a.series,g=function(a,b){return p(a.options.index,a._i)-p(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();t(c,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if(fa)b.animation=!1;e=b.events;for(d in e)I(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||
  234 + b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();o(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);if(c.isCartesian)a.hasCartesianSeries=!0;f.push(c);c._i=f.length-1;qb(f,g);this.yAxis&&qb(this.yAxis.series,g);o(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;o(a.axisTypes||[],function(e){o(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==x&&b[e]===d.id||b[e]===x&&d.index===0)c.series.push(a),
  235 + a[e]=c,c.isDirty=!0});!a[e]&&a.optionalAxis!==e&&la(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments;o(c.parallelArrays,typeof b==="number"?function(d){var f=d==="y"&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=f}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))})},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,b=p(b,a.pointStart,0);this.pointInterval=c=p(this.pointInterval,a.pointInterval,1);if(d==="month"||
  236 + d==="year")a=new ya(b),a=d==="month"?+a[vb](a[Ya]()+c):+a[wb](a[Za]()+c),c=a-b;this.xIncrement=b+c;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else o(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];
  237 + this.userOptions=a;c=D(e,c.series,a);this.tooltipOptions=D(S.tooltip,S.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();if((c.negativeColor||c.negativeFillColor)&&!c.zones)a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&q(a[a.length-1].value)&&a.push({color:this.color,
  238 + fillColor:this.fillColor});return c},getCyclic:function(a,b,c){var d=this.userOptions,e="_"+a+"Index",f=a+"Counter";b||(q(d[e])?b=d[e]:(d[e]=b=this.chart[f]%c.length,this.chart[f]+=1),b=c[b]);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||ba[this.type].color,this.chart.options.colors)},getSymbol:function(){var a=this.options.marker;this.getCyclic("symbol",a.symbol,this.chart.options.symbols);if(/^url/.test(this.symbol))a.radius=
  239 + 0},drawLegendSymbol:Ma.drawLineMarker,setData:function(a,b,c,d){var e=this,f=e.points,g=f&&f.length||0,h,i=e.options,j=e.chart,k=null,m=e.xAxis,n=m&&!!m.categories,l=i.turboThreshold,u=this.xData,r=this.yData,s=(h=e.pointArrayMap)&&h.length,a=a||[];h=a.length;b=p(b,!0);if(d!==!1&&h&&g===h&&!e.cropped&&!e.hasGroupedData&&e.visible)o(a,function(a,b){f[b].update&&f[b].update(a,!1,null,!1)});else{e.xIncrement=null;e.pointRange=n?1:i.pointRange;e.colorCounter=0;o(this.parallelArrays,function(a){e[a+"Data"].length=
  240 + 0});if(l&&h>l){for(c=0;k===null&&c<h;)k=a[c],c++;if(qa(k)){n=p(i.pointStart,0);k=p(i.pointInterval,1);for(c=0;c<h;c++)u[c]=n,r[c]=a[c],n+=k;e.xIncrement=n}else if(Ga(k))if(s)for(c=0;c<h;c++)k=a[c],u[c]=k[0],r[c]=k.slice(1,s+1);else for(c=0;c<h;c++)k=a[c],u[c]=k[0],r[c]=k[1];else la(12)}else for(c=0;c<h;c++)if(a[c]!==x&&(k={series:e},e.pointClass.prototype.applyOptions.apply(k,[a[c]]),e.updateParallelArrays(k,c),n&&q(k.name)))m.names[k.x]=k.name;Ba(r[0])&&la(14,!0);e.data=[];e.options.data=a;for(c=
  241 + g;c--;)f[c]&&f[c].destroy&&f[c].destroy();if(m)m.minRange=m.userMinRange;e.isDirty=e.isDirtyData=j.isDirtyBox=!0;c=!1}i.legendType==="point"&&(this.processData(),this.generatePoints());b&&j.redraw(c)},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i,j=this.options;i=j.cropThreshold;var k=this.getExtremesFromAll||j.getExtremesFromAll,m=this.isCartesian,n,l;if(m&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(h)a=h.getExtremes(),n=a.min,l=
  242 + a.max;if(m&&this.sorted&&!k&&(!i||d>i||this.forceCrop))if(b[d-1]<n||b[0]>l)b=[],c=[];else if(b[0]<n||b[d-1]>l)e=this.cropData(this.xData,this.yData,n,l),b=e.xData,c=e.yData,e=e.start,f=!0;for(i=b.length-1;i>=0;i--)d=b[i]-b[i-1],d>0&&(g===x||d<g)?g=d:d<0&&this.requireSorting&&la(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(j.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=p(this.cropShoulder,
  243 + 1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,m=[],n;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(n=0;n<g;n++)i=h+n,j?m[n]=(new f).init(this,[d[n]].concat(ra(e[n]))):(b[i]?k=b[i]:a[i]!==x&&(b[i]=k=(new f).init(this,
  244 + a[i],d[n])),m[n]=k),m[n].index=i;if(b&&(g!==(c=b.length)||j))for(n=0;n<c;n++)if(n===h&&!j&&(n+=g),b[n])b[n].destroyElements(),b[n].plotX=x;this.data=b;this.points=m},getExtremes:function(a){var b=this.yAxis,c=this.processedXData,d,e=[],f=0;d=this.xAxis.getExtremes();var g=d.min,h=d.max,i,j,k,m,a=a||this.stackedYData||this.processedYData;d=a.length;for(m=0;m<d;m++)if(j=c[m],k=a[m],i=k!==null&&k!==x&&(!b.isLog||k.length||k>0),j=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||
  245 + (c[m+1]||j)>=g&&(c[m-1]||j)<=h,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=Oa(e);this.dataMax=Da(e)},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||qa(i),k=a.threshold,m=a.startFromThreshold?k:0,n,l,u,o,t=Number.MAX_VALUE,a=0;a<g;a++){var A=f[a],v=A.x,y=A.y;l=A.low;var w=
  246 + b&&e.stacks[(this.negStacks&&y<(m?0:k)?"-":"")+this.stackKey];if(e.isLog&&y!==null&&y<=0)A.y=y=null,la(10);A.plotX=n=z(s(-1E5,c.translate(v,0,0,0,1,i,this.type==="flags")),1E5);if(b&&this.visible&&w&&w[v])o=this.getStackIndicator(o,v,this.index),w=w[v],y=w.points[o.key],l=y[0],y=y[1],l===m&&(l=p(k,e.min)),e.isLog&&l<=0&&(l=null),A.total=A.stackTotal=w.total,A.percentage=w.total&&A.y/w.total*100,A.stackY=y,w.setOffset(this.pointXOffset||0,this.barW||0);A.yBottom=q(l)?e.translate(l,0,1,0,1):null;h&&
  247 +(y=this.modifyValue(y,A));A.plotY=l=typeof y==="number"&&y!==Infinity?z(s(-1E5,e.translate(y,0,1,0,1)),1E5):x;A.isInside=l!==x&&l>=0&&l<=e.len&&n>=0&&n<=c.len;A.clientX=j?c.translate(v,0,0,0,1):n;A.negative=A.y<(k||0);A.category=d&&d[A.x]!==x?d[A.x]:A.x;a&&(t=z(t,O(n-u)));u=n}this.closestPointRangePx=t;this.getSegments()},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,h=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,
  248 + c.xAxis,c.yAxis].join(","),i=b[h],j=b[h+"m"];if(!i){if(a)g.width=0,b[h+"m"]=j=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight);b[h]=i=d.clipRect(g)}a&&(i.count+=1);if(c.clip!==!1)this.group.clip(a||f?i:b.clipRect),this.markerGroup.clip(j),this.sharedClipKey=h;a||(i.count-=1,i.count<=0&&h&&b[h]&&(f||(b[h]=b[h].destroy()),b[h+"m"]&&(b[h+"m"]=b[h+"m"].destroy())))},animate:function(a){var b=this.chart,c=this.options.animation,d;if(c&&!da(c))c=ba[this.type].animation;a?this.setClip(c):
  249 + (d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip();J(this,"afterAnimate")},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,j,k,m=this.options.marker,n=this.pointAttr[""],l,o,r,s=this.markerGroup,q=p(m.enabled,this.xAxis.isRadial,this.closestPointRangePx>2*m.radius);if(m.enabled!==!1||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=T(g.plotX),e=g.plotY,
  250 + k=g.graphic,l=g.marker||{},o=!!g.marker,a=q&&l.enabled===x||l.enabled,r=g.isInside,a&&e!==x&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""]||n,h=a.r,i=p(l.symbol,this.symbol),j=i.indexOf("url")===0,k)k[r?"show":"hide"](!0).animate(t({x:d-h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(r&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h,o?l:m).attr(a).add(s)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||
  251 + {},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=p(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=ba[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h=a.options.negativeColor;f={stroke:g,fill:g};var i=a.points||[],j,k,m=[],n=a.pointAttrToOptions;j=a.hasPointSpecificOptions;var l=c.lineColor,u=c.fillColor;k=b.turboThreshold;var r=a.zones,s=a.zoneAxis||"y",A;b.marker?(e.radius=e.radius||c.radius+e.radiusPlus,e.lineWidth=e.lineWidth||c.lineWidth+e.lineWidthPlus):
  252 + (e.color=e.color||na(e.color||g).brighten(e.brightness).get(),e.negativeColor=e.negativeColor||na(e.negativeColor||h).brighten(e.brightness).get());m[""]=a.convertAttribs(c,f);o(["hover","select"],function(b){m[b]=a.convertAttribs(d[b],m[""])});a.pointAttr=m;g=i.length;if(!k||g<k||j)for(;g--;){k=i[g];if((c=k.options&&k.options.marker||k.options)&&c.enabled===!1)c.radius=0;if(r.length){j=0;for(f=r[j];k[s]>=f.value;)f=r[++j];k.color=k.fillColor=p(f.color,a.color)}j=b.colorByPoint||k.color;if(k.options)for(A in n)q(c[n[A]])&&
  253 +(j=!0);if(j){c=c||{};j=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker||k.negative&&!f.fillColor&&!e.fillColor)f[a.pointAttrToOptions.fill]=f.color||!k.options.color&&e[k.negative&&h?"negativeColor":"color"]||na(k.color).brighten(f.brightness||e.brightness).get();f={color:k.color};if(!u)f.fillColor=k.color;if(!l)f.lineColor=k.color;c.hasOwnProperty("color")&&!c.color&&delete c.color;j[""]=a.convertAttribs(t(f,c),m[""]);j.hover=a.convertAttribs(d.hover,m.hover,j[""]);j.select=a.convertAttribs(d.select,
  254 + m.select,j[""])}else j=m;k.pointAttr=j}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(za),d,e=a.data||[],f,g,h;J(a,"destroy");Y(a);o(a.axisTypes||[],function(b){if(h=a[b])ja(h.series,a),h.isDirty=h.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(d=e.length;d--;)(f=e[d])&&f.destroy&&f.destroy();a.points=null;clearTimeout(a.animationTimeout);for(g in a)a[g]instanceof Q&&!a[g].survive&&(d=c&&g==="group"?"hide":"destroy",a[g][d]());if(b.hoverSeries===a)b.hoverSeries=
  255 + null;ja(b.series,a);for(g in a)delete a[g]},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;o(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h,"L"):d==="center"?c.push((i.plotX+g)/2,i.plotY,"L",(i.plotX+g)/2,h,"L"):c.push(g,i.plotY,"L")),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];o(a.segments,function(e){c=a.getSegmentPath(e);e.length>
  256 +1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color,b.dashStyle]],d=b.lineWidth,e=b.linecap!=="square",f=this.getGraphPath(),g=this.fillGraph&&this.color||P;o(this.zones,function(d,e){c.push(["zoneGraph"+e,d.color||a.color,d.dashStyle||b.dashStyle])});o(c,function(c,i){var j=c[0],k=a[j];if(k)k.animate({d:f});else if((d||g)&&f.length)k={stroke:c[1],"stroke-width":d,fill:g,zIndex:1},c[2]?k.dashstyle=
  257 + c[2]:e&&(k["stroke-linecap"]=k["stroke-linejoin"]="round"),a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(i<2&&b.shadow)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],h,i=this.graph,j=this.area,k=s(b.chartWidth,b.chartHeight),m=this[(this.zoneAxis||"y")+"Axis"],n,l=m.reversed,u=b.inverted,r=m.horiz,q,t,v,y=!1;if(d.length&&(i||j)&&m.min!==x)i&&i.hide(),j&&j.hide(),n=m.getExtremes(),o(d,function(d,o){e=l?r?b.plotWidth:0:r?0:m.toPixels(n.min);
  258 + e=z(s(p(f,e),0),k);f=z(s(w(m.toPixels(p(d.value,n.max),!0)),0),k);y&&(e=f=m.toPixels(n.max));q=Math.abs(e-f);t=z(e,f);v=s(e,f);if(m.isXAxis){if(h={x:u?v:t,y:0,width:q,height:k},!r)h.x=b.plotHeight-h.x}else if(h={x:0,y:u?v:t,width:k,height:q},r)h.y=b.plotWidth-h.y;b.inverted&&c.isVML&&(h=m.isXAxis?{x:0,y:l?t:v,height:h.width,width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,height:b.chartHeight});g[o]?g[o].animate(h):(g[o]=c.clipRect(h),i&&a["zoneGraph"+o].clip(g[o]),j&&a["zoneArea"+
  259 + o].clip(g[o]));y=d.value>n.max}),this.clips=g},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};o(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)I(c,"resize",a),I(b,"destroy",function(){Y(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e),f.addClass("highcharts-series-"+this.index));f[g?"attr":"animate"](this.getPlotBox());
  260 + return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;if(a.inverted)b=c,c=this.xAxis;return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=(c=d.animation)&&!!a.animate&&b.renderer.isSVG&&p(c.duration,500)||0,f=a.visible?"visible":"hidden",g=d.zIndex,h=a.hasRendered,i=b.seriesGroup;c=a.plotGroup("group","series",f,g,i);a.markerGroup=a.plotGroup("markerGroup","markers",f,g,i);e&&a.animate(!0);
  261 + a.getAttribs();c.inverted=a.isCartesian?b.inverted:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());o(a.points,function(a){a.redraw&&a.redraw()});a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&a.options.enableMouseTracking!==!1&&a.drawTracker();b.inverted&&a.invertGroups();d.clip!==!1&&!a.sharedClipKey&&!h&&c.clip(b.clipRect);e&&a.animate();if(!h)e?a.animationTimeout=setTimeout(function(){a.afterAnimate()},e):a.afterAnimate();a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},
  262 + redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.isDirty,d=this.group,e=this.xAxis,f=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:p(e&&e.left,a.plotLeft),translateY:p(f&&f.top,a.plotTop)}));this.translate();this.render();b&&J(this,"updatedData");(c||b)&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-
  263 + a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(b,d,g){var h,i;if(i=b&&b.length)return h=c.kdAxisArray[d%g],b.sort(function(a,b){return a[h]-b[h]}),i=Math.floor(i/2),{point:b[i],left:a(b.slice(0,i),d+1,g),right:a(b.slice(i+1),d+1,g)}}function b(){var b=kb(c.points||[],function(a){return a.y!==null});c.kdTree=a(b,d,d)}var c=this,d=c.kdDimensions;delete c.kdTree;c.options.kdSync?b():setTimeout(b)},searchKDTree:function(a,b){function c(a,
  264 + b,j,k){var m=b.point,n=d.kdAxisArray[j%k],l,p,o=m;p=q(a[e])&&q(m[e])?Math.pow(a[e]-m[e],2):null;l=q(a[f])&&q(m[f])?Math.pow(a[f]-m[f],2):null;l=(p||0)+(l||0);m.dist=q(l)?Math.sqrt(l):Number.MAX_VALUE;m.distX=q(p)?Math.sqrt(p):Number.MAX_VALUE;n=a[n]-m[n];l=n<0?"left":"right";p=n<0?"right":"left";b[l]&&(l=c(a,b[l],j+1,k),o=l[g]<o[g]?l:m);b[p]&&Math.sqrt(n*n)<o[g]&&(a=c(a,b[p],j+1,k),o=a[g]<o[g]?a:o);return o}var d=this,e=this.kdAxisArray[0],f=this.kdAxisArray[1],g=b?"distX":"dist";this.kdTree||this.buildKDTree();
  265 + if(this.kdTree)return c(a,this.kdTree,this.kdDimensions,this.kdDimensions)}};Hb.prototype={destroy:function(){Pa(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ia(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,null,null,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=c.reversed,
  266 + f=this.isNegative&&!f||!this.isNegative&&f,g=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=O(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e[this.options.crop===!1||d.isInsidePlot(f.x,f.y)?"show":"hide"](!0)}};E.prototype.getStacks=function(){var a=this;o(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});o(a.series,
  267 + function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+p(b.options.stack,"")})};ha.prototype.buildStacks=function(){var a=this.series,b=p(this.options.reversedStacks,!0),c=a.length;if(!this.isXAxis){for(this.usePercentage=!1;c--;)a[b?c:a.length-c-1].setStackedPoints();if(this.usePercentage)for(c=0;c<a.length;c++)a[c].setPercentStacks()}};ha.prototype.renderStackTotals=function(){var a=this.chart,b=a.renderer,c=this.stacks,d,e,f=this.stackTotalGroup;
  268 + if(!f)this.stackTotalGroup=f=b.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();f.translate(a.plotLeft,a.plotTop);for(d in c)for(e in a=c[d],a)a[e].render(f)};ha.prototype.resetStacks=function(){var a=this.stacks,b,c;if(!this.isXAxis)for(b in a)for(c in a[b])a[b][c].touched<this.stacksTouched?(a[b][c].destroy(),delete a[b][c]):(a[b][c].total=null,a[b][c].cum=0)};ha.prototype.cleanStacks=function(){var a,b,c;if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=
  269 + a[b][c].total}};R.prototype.setStackedPoints=function(){if(this.options.stacking&&!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.startFromThreshold?f:0,h=e.stack,e=e.stacking,i=this.stackKey,j="-"+i,k=this.negStacks,m=this.yAxis,n=m.stacks,l=m.oldStacks,o,r,q,t,v,w,x;m.stacksTouched+=1;for(v=0;v<d;v++){w=a[v];x=b[v];o=this.getStackIndicator(o,w,this.index);t=o.key;q=(r=k&&x<(g?
  270 + 0:f))?j:i;n[q]||(n[q]={});if(!n[q][w])l[q]&&l[q][w]?(n[q][w]=l[q][w],n[q][w].total=null):n[q][w]=new Hb(m,m.options.stackLabels,r,w,h);q=n[q][w];q.points[t]=[p(q.cum,g)];q.touched=m.stacksTouched;e==="percent"?(r=r?i:j,k&&n[r]&&n[r][w]?(r=n[r][w],q.total=r.total=s(r.total,q.total)+O(x)||0):q.total=ea(q.total+(O(x)||0))):q.total=ea(q.total+(x||0));q.cum=p(q.cum,g)+(x||0);q.points[t].push(q.cum);c[v]=q.cum}if(e==="percent")m.usePercentage=!0;this.stackedYData=c;m.oldStacks={}}};R.prototype.setPercentStacks=
  271 + function(){var a=this,b=a.stackKey,c=a.yAxis.stacks,d=a.processedXData,e;o([b,"-"+b],function(b){var f;for(var g=d.length,h,i;g--;)if(h=d[g],e=a.getStackIndicator(e,h,a.index),f=(i=c[b]&&c[b][h])&&i.points[e.key],h=f)i=i.total?100/i.total:0,h[0]=ea(h[0]*i),h[1]=ea(h[1]*i),a.stackedYData[g]=h[1]})};R.prototype.getStackIndicator=function(a,b,c){!q(a)||a.x!==b?a={x:b,index:0}:a.index++;a.key=[c,b,a.index].join(",");return a};t(E.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=p(b,!0),J(e,"addSeries",
  272 + {options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new ha(this,D(a,{index:this[e].length,isX:b}));f[e]=ra(f[e]||{});f[e].push(a);p(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,e=c.loading,f=function(){d&&M(d,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};if(!d)b.loadingDiv=d=$(Ja,{className:"highcharts-loading"},
  273 + t(e.style,{zIndex:10,display:P}),b.container),b.loadingSpan=$("span",null,e.labelStyle,d),I(b,"redraw",f);b.loadingSpan.innerHTML=a||c.lang.loading;if(!b.loadingShown)M(d,{opacity:0,display:""}),lb(d,{opacity:e.style.opacity},{duration:e.showDuration||0}),b.loadingShown=!0;f()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&lb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){M(b,{display:P})}});this.loadingShown=!1}});t(Fa.prototype,{update:function(a,b,c,d){function e(){f.applyOptions(a);
  274 + if(f.y===null&&h)f.graphic=h.destroy();if(da(a)&&!Ga(a))f.redraw=function(){if(h&&h.element&&a&&a.marker&&a.marker.symbol)f.graphic=h.destroy();if(a&&a.dataLabels&&f.dataLabel)f.dataLabel=f.dataLabel.destroy();f.redraw=null};i=f.index;g.updateParallelArrays(f,i);if(m&&f.name)m[f.x]=f.name;k.data[i]=f.options;g.isDirty=g.isDirtyData=!0;if(!g.fixedBox&&g.hasCartesianSeries)j.isDirtyBox=!0;if(k.legendType==="point")j.isDirtyLegend=!0;b&&j.redraw(c)}var f=this,g=f.series,h=f.graphic,i,j=g.chart,k=g.options,
  275 + m=g.xAxis&&g.xAxis.names,b=p(b,!0);d===!1?e():f.firePointEvent("update",{options:a},e)},remove:function(a,b){this.series.removePoint(La(this,this.series.data),a,b)}});t(R.prototype,{addPoint:function(a,b,c,d){var e=this,f=e.options,g=e.data,h=e.graph,i=e.area,j=e.chart,k=e.xAxis&&e.xAxis.names,m=h&&h.shift||0,n=["graph","area"],h=f.data,l,u=e.xData;Ra(d,j);if(c){for(d=e.zones.length;d--;)n.push("zoneGraph"+d,"zoneArea"+d);o(n,function(a){if(e[a])e[a].shift=m+(f.step?2:1)})}if(i)i.isArea=!0;b=p(b,
  276 + !0);i={series:e};e.pointClass.prototype.applyOptions.apply(i,[a]);n=i.x;d=u.length;if(e.requireSorting&&n<u[d-1])for(l=!0;d&&u[d-1]>n;)d--;e.updateParallelArrays(i,"splice",d,0,0);e.updateParallelArrays(i,d);if(k&&i.name)k[n]=i.name;h.splice(d,0,a);l&&(e.data.splice(d,0,null),e.processData());f.legendType==="point"&&e.generatePoints();c&&(g[0]&&g[0].remove?g[0].remove(!1):(g.shift(),e.updateParallelArrays(i,"shift"),h.shift()));e.isDirty=!0;e.isDirtyData=!0;b&&(e.getAttribs(),j.redraw())},removePoint:function(a,
  277 + b,c){var d=this,e=d.data,f=e[a],g=d.points,h=d.chart,i=function(){e.length===g.length&&g.splice(a,1);e.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(f||{series:d},"splice",a,1);f&&f.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&h.redraw()};Ra(c,h);b=p(b,!0);f?f.firePointEvent("remove",null,i):i()},remove:function(a,b){var c=this,d=c.chart,a=p(a,!0);if(!c.isRemoving)c.isRemoving=!0,J(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});
  278 + c.isRemoving=!1},update:function(a,b){var c=this,d=this.chart,e=this.userOptions,f=this.type,g=N[f].prototype,h=["group","markerGroup","dataLabelsGroup"],i;if(a.type&&a.type!==f||a.zIndex!==void 0)h.length=0;o(h,function(a){h[a]=c[a];delete c[a]});a=D(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);for(i in g)this[i]=x;t(this,N[a.type||f].prototype);o(h,function(a){c[a]=h[a]});this.init(d,a);d.linkSeries();p(b,!0)&&d.redraw(!1)}});t(ha.prototype,
  279 + {update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=D(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.chart._labelPanes=x;this.init(c,t(a,{events:x}));c.isDirtyBox=!0;p(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);ja(b.axes,this);ja(b[c],this);b.options[c].splice(this.options.index,1);o(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;p(a,!0)&&b.redraw()},setTitle:function(a,
  280 + b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});var xa=ka(R);N.line=xa;ba.area=D(U,{softThreshold:!1,threshold:0});var pa=ka(R,{type:"area",getSegments:function(){var a=this,b=[],c=[],d=[],e=this.xAxis,f=this.yAxis,g=f.stacks[this.stackKey],h={},i,j,k=this.points,m=this.options.connectNulls,n,l,p;if(this.options.stacking&&!this.cropped){for(l=0;l<k.length;l++)h[k[l].x]=k[l];for(p in g)g[p].total!==null&&d.push(+p);d.sort(function(a,b){return a-b});o(d,function(b){var d=
  281 + null,k;if(!m||h[b]&&h[b].y!==null)if(h[b])c.push(h[b]);else{for(l=a.index;l<=f.series.length;l++)if(n=a.getStackIndicator(null,b,l),k=g[b].points[n.key]){d=k[1];break}i=e.translate(b);j=f.getThreshold(d);c.push({y:null,plotX:i,clientX:i,plotY:j,yBottom:j,onMouseOver:ua})}});c.length&&b.push(c)}else R.prototype.getSegments.call(this),b=this.segments;this.segments=b},getSegmentPath:function(a){var b=R.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),
  282 + g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-1;d>=0;d--)g=p(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];R.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=[["area",this.color,c.fillColor]];o(this.zones,function(b,
  283 + f){d.push(["zoneArea"+f,b.color||a.color,b.fillColor||c.fillColor])});o(d,function(d){var f=d[0],g=a[f];g?g.animate({d:b}):a[f]=a.chart.renderer.path(b).attr({fill:p(d[2],na(d[1]).setOpacity(p(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:Ma.drawRectangle});N.area=pa;ba.spline=D(U);xa=ka(R,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,m;h=(1.5*d+f.plotX)/2.5;i=(1.5*e+a)/2.5;j=(1.5*
  284 + d+j)/2.5;k=(1.5*e+g)/2.5;m=(k-i)*(j-d)/(j-h)+e-k;i+=m;k+=m;i>a&&i>e?(i=s(a,e),k=2*e-i):i<a&&i<e&&(i=z(a,e),k=2*e-i);k>g&&k>e?(k=s(g,e),i=2*e-k):k<g&&k<e&&(k=z(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});N.spline=xa;ba.areaspline=D(ba.area);pa=pa.prototype;xa=ka(xa,{type:"areaspline",closedStacks:!0,getSegmentPath:pa.getSegmentPath,closeSegment:pa.closeSegment,drawGraph:pa.drawGraph,
  285 + drawLegendSymbol:Ma.drawRectangle});N.areaspline=xa;ba.column=D(U,{borderColor:"#FFFFFF",borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1,halo:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0});xa=ka(R,{type:"column",pointAttrToOptions:{stroke:"borderColor",
  286 + fill:"color",r:"borderRadius"},cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){R.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:o(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?
  287 + (f=b.stackKey,g[f]===x&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var j=z(O(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),k=j*b.groupPadding,m=(j-2*k)/i,b=z(b.maxPointWidth||c.len,p(b.pointWidth,m*(1-2*b.pointPadding)));return a.columnMetrics={width:b,offset:(m-b)/2+(k+((e?i-(a.columnIndex||0):a.columnIndex)||0)*m-j/2)*(e?-1:1)}},crispCol:function(a,b,c,d){var e=this.chart,f=this.borderWidth,g=-(f%2?0.5:0),f=f%2?0.5:1;e.inverted&&e.renderer.isVML&&
  288 +(f+=1);c=Math.round(a+c)+g;a=Math.round(a)+g;c-=a;g=O(b)<=0.5;d=Math.round(b+d)+f;b=Math.round(b)+f;d-=b;g&&(b-=1,d+=1);return{x:a,y:b,width:c,height:d}},translate:function(){var a=this,b=a.chart,c=a.options,d=a.borderWidth=p(c.borderWidth,a.closestPointRange*a.xAxis.transA<2?0:1),e=a.yAxis,f=a.translatedThreshold=e.getThreshold(c.threshold),g=p(c.minPointLength,5),h=a.getColumnMetrics(),i=h.width,j=a.barW=s(i,1+2*d),k=a.pointXOffset=h.offset;b.inverted&&(f-=0.5);c.pointPadding&&(j=ta(j));R.prototype.translate.apply(a);
  289 + o(a.points,function(c){var d=z(p(c.yBottom,f),9E4),h=999+O(d),h=z(s(-h,c.plotY),e.len+h),o=c.plotX+k,q=j,t=z(h,d),w,v=s(h,d)-t;O(v)<g&&g&&(v=g,w=!e.reversed&&!c.negative||e.reversed&&c.negative,t=O(t-f)>g?d-g:f-(w?g:0));c.barX=o;c.pointWidth=i;c.tooltipPos=b.inverted?[e.len+e.pos-b.plotLeft-h,a.xAxis.len-o-q/2,v]:[o+q/2,h+e.pos-b.plotTop,v];c.shapeType="rect";c.shapeArgs=a.crispCol(o,t,q,v)})},getSymbol:ua,drawLegendSymbol:Ma.drawRectangle,drawGraph:ua,drawPoints:function(){var a=this,b=this.chart,
  290 + c=a.options,d=b.renderer,e=c.animationLimit||250,f,g;o(a.points,function(h){var i=h.plotY,j=h.graphic;if(i!==x&&!isNaN(i)&&h.y!==null)f=h.shapeArgs,i=q(a.borderWidth)?{"stroke-width":a.borderWidth}:{},g=h.pointAttr[h.selected?"select":""]||a.pointAttr[""],j?(cb(j),j.attr(i)[b.pointCount<e?"animate":"attr"](D(f))):h.graphic=d[h.shapeType](f).attr(i).attr(g).add(h.group||a.group).shadow(c.shadow,null,c.stacking&&!c.borderRadius);else if(j)h.graphic=j.destroy()})},animate:function(a){var b=this.yAxis,
  291 + c=this.options,d=this.chart.inverted,e={};if(ca)a?(e.scaleY=0.001,a=z(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0});R.prototype.remove.apply(a,arguments)}});N.column=xa;ba.bar=D(ba.column);pa=ka(xa,{type:"bar",inverted:!0});
  292 + N.bar=pa;ba.scatter=D(U,{lineWidth:0,marker:{enabled:!0},tooltip:{headerFormat:'<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px;"> {series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}});pa=ka(R,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,kdDimensions:2,drawGraph:function(){this.options.lineWidth&&R.prototype.drawGraph.call(this)}});N.scatter=
  293 + pa;ba.pie=D(U,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.y===null?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});U={type:"pie",isCartesian:!1,pointClass:ka(Fa,{init:function(){Fa.prototype.init.apply(this,arguments);var a=this,b;a.name=
  294 + p(a.name,"Slice");b=function(b){a.slice(b.type==="select")};I(a,"select",b);I(a,"unselect",b);return a},setVisible:function(a,b){var c=this,d=c.series,e=d.chart,f=d.options.ignoreHiddenPoint,b=p(b,f);if(a!==c.visible){c.visible=c.options.visible=a=a===x?!c.visible:a;d.options.data[La(c,d.data)]=c.options;o(["graphic","dataLabel","connector","shadowGroup"],function(b){if(c[b])c[b][a?"show":"hide"](!0)});c.legendItem&&e.legend.colorizeItem(c,a);!a&&c.state==="hover"&&c.setState("");if(f)d.isDirty=!0;
  295 + b&&e.redraw()}},slice:function(a,b,c){var d=this.series;Ra(c,d.chart);p(b,!0);this.sliced=this.options.sliced=a=q(a)?a:!this.sliced;d.options.data[La(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var b=this.shapeArgs,c=this.series.chart;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.plotLeft+b.x,c.plotTop+b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r,
  296 + start:b.start,end:b.end})}}),requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)o(c,function(a){var c=a.graphic,g=a.shapeArgs;c&&(c.attr({r:a.startR||b.center[3]/2,start:d,end:d}),c.animate({r:g.r,start:g.start,end:g.end},b.options.animation))}),b.animate=null},updateTotals:function(){var a,b=0,
  297 + c=this.points,d=c.length,e,f=this.options.ignoreHiddenPoint;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0&&(e.visible||!f)?e.y/b*100:0,e.total=b},generatePoints:function(){R.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=ma/180*(i-90),i=(this.endAngleRad=ma/180*(p(c.endAngle,i+360)-90))-j,k=
  298 + this.points,m=c.dataLabels.distance,c=c.ignoreHiddenPoint,n,l=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=V.asin(z((b-a[1])/(a[2]/2+m),1));return a[0]+(c?-1:1)*W(h)*(a[2]/2+m)};for(n=0;n<l;n++){o=k[n];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:w(f*1E3)/1E3,end:w(g*1E3)/1E3};h=(g+f)/2;h>1.5*ma?h-=2*ma:h<-ma/2&&(h+=2*ma);o.slicedTranslation={translateX:w(W(h)*d),translateY:w(aa(h)*d)};f=
  299 + W(h)*a[2]/2;g=aa(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ma/2||h>ma/2?1:0;o.angle=h;e=z(e,m/2);o.labelPos=[a[0]+f+W(h)*m,a[1]+g+aa(h)*m,a[0]+f+W(h)*e,a[1]+g+aa(h)*e,a[0]+f,a[1]+g,m<0?"center":o.half?"right":"left",h]}},drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g,h;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);o(a.points,function(i){if(i.y!==null){d=i.graphic;g=i.shapeArgs;f=i.shadowGroup;if(e&&!f)f=i.shadowGroup=b.g("shadow").add(a.shadowGroup);
  300 + c=i.sliced?i.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);if(d)d.setRadialReference(a.center).animate(t(g,c));else{h={"stroke-linejoin":"round"};if(!i.visible)h.visibility="hidden";i.graphic=d=b[i.shapeType](g).setRadialReference(a.center).attr(i.pointAttr[i.selected?"select":""]).attr(h).attr(c).add(a.group).shadow(e,f)}}})},searchPoint:ua,sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawLegendSymbol:Ma.drawRectangle,getCenter:Xb.getCenter,
  301 + getSymbol:ua};U=ka(R,U);N.pie=U;R.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,e=a.points,f,g,h=a.hasRendered||0,i,j,k=a.chart.renderer;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),j=a.plotGroup("dataLabelsGroup","data-labels",d.defer?"hidden":"visible",d.zIndex||6),p(d.defer,!0)&&(j.attr({opacity:+h}),h||I(a,"afterAnimate",function(){a.visible&&j.show();j[b.animation?"animate":"attr"]({opacity:1},{duration:200})})),g=d,o(e,function(e){var h,
  302 + l=e.dataLabel,o,r,s=e.connector,w=!0,v,y={};f=e.dlOptions||e.options&&e.options.dataLabels;h=p(f&&f.enabled,g.enabled);if(l&&!h)e.dataLabel=l.destroy();else if(h){d=D(g,f);v=d.style;h=d.rotation;o=e.getLabelConfig();i=d.format?Ia(d.format,o):d.formatter.call(o,d);v.color=p(d.color,v.color,a.color,"black");if(l)if(q(i))l.attr({text:i}),w=!1;else{if(e.dataLabel=l=l.destroy(),s)e.connector=s.destroy()}else if(q(i)){l={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||
  303 + 0,rotation:h,padding:d.padding,zIndex:1};if(v.color==="contrast")y.color=d.inside||d.distance<0||b.stacking?k.getContrast(e.color||a.color):"#000000";if(c)y.cursor=c;for(r in l)l[r]===x&&delete l[r];l=e.dataLabel=k[h?"text":"label"](i,0,-999,d.shape,null,null,d.useHTML).attr(l).css(t(v,y)).add(j).shadow(d.shadow)}l&&a.alignDataLabel(e,l,d,null,w)}})};R.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=p(a.plotX,-999),i=p(a.plotY,-999),j=b.getBBox(),k=f.renderer.fontMetrics(c.style.fontSize).b,
  304 + m=this.visible&&(a.series.forceDL||f.isInsidePlot(h,w(i),g)||d&&f.isInsidePlot(h,g?d.x+1:d.y+d.height-1,g));if(m)d=t({x:g?f.plotWidth-i:h,y:w(g?f.plotHeight-h:i),width:0,height:0},d),t(c,{width:j.width,height:j.height}),c.rotation?(a=f.renderer.rotCorr(k,c.rotation),b[e?"attr":"animate"]({x:d.x+c.x+d.width/2+a.x,y:d.y+c.y+d.height/2}).attr({align:c.align})):(b.align(c,null,d),g=b.alignAttr,p(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):p(c.crop,!0)&&(m=f.isInsidePlot(g.x,g.y)&&
  305 + f.isInsidePlot(g.x+j.width,g.y+j.height)),c.shape&&b.attr({anchorX:a.plotX,anchorY:a.plotY}));if(!m)cb(b),b.attr({y:-999}),b.placed=!1};R.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k,m=a.box?0:a.padding||0;j=c.x+m;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width-m;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y+m;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height-m;if(j>g.plotHeight)i==="top"?
  306 + b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)};if(N.pie)N.pie.prototype.drawDataLabels=function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=p(e.connectorPadding,10),g=p(e.connectorWidth,1),h=d.plotWidth,i=d.plotHeight,j,k,m=p(e.softConnector,!0),n=e.distance,l=a.center,q=l[2]/2,r=l[1],t=n>0,x,v,y,D=[[],[]],C,B,E,G,H,F=[0,0,0,0],M=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){R.prototype.drawDataLabels.apply(a);o(b,
  307 + function(a){a.dataLabel&&a.visible&&D[a.half].push(a)});for(G=2;G--;){var J=[],N=[],I=D[G],L=I.length,K;if(L){a.sortByAngle(I,G-0.5);for(H=b=0;!b&&I[H];)b=I[H]&&I[H].dataLabel&&(I[H].dataLabel.getBBox().height||21),H++;if(n>0){v=z(r+q+n,d.plotHeight);for(H=s(0,r-q-n);H<=v;H+=b)J.push(H);v=J.length;if(L>v){c=[].concat(I);c.sort(M);for(H=L;H--;)c[H].rank=H;for(H=L;H--;)I[H].rank>=v&&I.splice(H,1);L=I.length}for(H=0;H<L;H++){c=I[H];y=c.labelPos;c=9999;var Q,P;for(P=0;P<v;P++)Q=O(J[P]-y[1]),Q<c&&(c=Q,
  308 + K=P);if(K<H&&J[H]!==null)K=H;else for(v<L-H+K&&J[H]!==null&&(K=v-L+H);J[K]===null;)K++;N.push({i:K,y:J[K]});J[K]=null}N.sort(M)}for(H=0;H<L;H++){c=I[H];y=c.labelPos;x=c.dataLabel;E=c.visible===!1?"hidden":"inherit";c=y[1];if(n>0){if(v=N.pop(),K=v.i,B=v.y,c>B&&J[K+1]!==null||c<B&&J[K-1]!==null)B=z(s(0,c),d.plotHeight)}else B=c;C=e.justify?l[0]+(G?-1:1)*(q+n):a.getX(B===r-q-n||B===r+q+n?c:B,G);x._attr={visibility:E,align:y[6]};x._pos={x:C+e.x+({left:f,right:-f}[y[6]]||0),y:B+e.y-10};x.connX=C;x.connY=
  309 + B;if(this.options.size===null)v=x.width,C-v<f?F[3]=s(w(v-C+f),F[3]):C+v>h-f&&(F[1]=s(w(C+v-h+f),F[1])),B-b/2<0?F[0]=s(w(-B+b/2),F[0]):B+b/2>i&&(F[2]=s(w(B+b/2-i),F[2]))}}}if(Da(F)===0||this.verifyDataLabelOverflow(F))this.placeDataLabels(),t&&g&&o(this.points,function(b){j=b.connector;y=b.labelPos;if((x=b.dataLabel)&&x._pos&&b.visible)E=x._attr.visibility,C=x.connX,B=x.connY,k=m?["M",C+(y[6]==="left"?5:-5),B,"C",C,B,2*y[2]-y[4],2*y[3]-y[5],y[2],y[3],"L",y[4],y[5]]:["M",C+(y[6]==="left"?5:-5),B,"L",
  310 + y[2],y[3],"L",y[4],y[5]],j?(j.animate({d:k}),j.attr("visibility",E)):b.connector=j=a.chart.renderer.path(k).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.dataLabelsGroup);else if(j)b.connector=j.destroy()})}},N.pie.prototype.placeDataLabels=function(){o(this.points,function(a){var b=a.dataLabel;if(b&&a.visible)(a=b._pos)?(b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-999})})},N.pie.prototype.alignDataLabel=ua,N.pie.prototype.verifyDataLabelOverflow=
  311 + function(a){var b=this.center,c=this.options,d=c.center,e=c.minSize||80,f=e,g;d[0]!==null?f=s(b[2]-s(a[1],a[3]),e):(f=s(b[2]-a[1]-a[3],e),b[0]+=(a[3]-a[1])/2);d[1]!==null?f=s(z(f,b[2]-s(a[0],a[2])),e):(f=s(z(f,b[2]-a[0]-a[2]),e),b[1]+=(a[0]-a[2])/2);f<b[2]?(b[2]=f,b[3]=Math.min(/%$/.test(c.innerSize||0)?f*parseFloat(c.innerSize||0)/100:parseFloat(c.innerSize||0),f),this.translate(b),o(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels&&this.drawDataLabels()):g=!0;return g};
  312 + if(N.column)N.column.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart.inverted,g=a.series,h=a.dlBox||a.shapeArgs,i=p(a.below,a.plotY>p(this.translatedThreshold,g.yAxis.len)),j=p(c.inside,!!this.options.stacking);if(h&&(d=D(h),f&&(d={x:g.yAxis.len-d.y-d.height,y:g.xAxis.len-d.x-d.width,width:d.height,height:d.width}),!j))f?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=p(c.align,!f||j?"center":i?"right":"left");c.verticalAlign=p(c.verticalAlign,f||j?"middle":i?"top":
  313 + "bottom");R.prototype.alignDataLabel.call(this,a,b,c,d,e)};(function(a){var b=a.Chart,c=a.each,d=a.pick,e=HighchartsAdapter.addEvent;b.prototype.callbacks.push(function(a){function b(){var e=[];c(a.series,function(a){var b=a.options.dataLabels,f=a.dataLabelCollections||["dataLabel"];(b.enabled||a._hasPointLabels)&&!b.allowOverlap&&a.visible&&c(f,function(b){c(a.points,function(a){if(a[b])a[b].labelrank=d(a.labelrank,a.shapeArgs&&a.shapeArgs.height),e.push(a[b])})})});a.hideOverlappingLabels(e)}b();
  314 + e(a,"redraw",b)});b.prototype.hideOverlappingLabels=function(a){var b=a.length,d,e,j,k,m,n,l;for(e=0;e<b;e++)if(d=a[e])d.oldOpacity=d.opacity,d.newOpacity=1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(e=0;e<b;e++){j=a[e];for(d=e+1;d<b;++d)if(k=a[d],j&&k&&j.placed&&k.placed&&j.newOpacity!==0&&k.newOpacity!==0&&(m=j.alignAttr,n=k.alignAttr,l=2*(j.box?0:j.padding),m=!(n.x>m.x+(j.width-l)||n.x+(k.width-l)<m.x||n.y>m.y+(j.height-l)||n.y+(k.height-l)<m.y)))(j.labelrank<k.labelrank?
  315 + j:k).newOpacity=0}c(a,function(a){var b,c;if(a){c=a.newOpacity;if(a.oldOpacity!==c&&a.placed)c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?"animate":"attr"](a.alignAttr,null,b);a.isOld=!0}})}})(B);U=B.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(a){for(var c=a.target,d;c&&!d;)d=c.point,c=c.parentNode;if(d!==x&&d!==b.hoverPoint)d.onMouseOver(a)};o(a.points,function(a){if(a.graphic)a.graphic.element.point=
  316 + a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)o(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),ab))a[b].on("touchstart",f)}),a._hasTracking=!0},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,m=k&&{cursor:k},k=a.singlePoints,n,
  317 + l=function(){if(f.hoverSeries!==a)a.onMouseOver()},p="rgba(192,192,192,"+(ca?1.0E-4:0.002)+")";if(e&&!c)for(n=e+1;n--;)d[n]==="M"&&d.splice(n+1,0,d[n+1]-i,d[n+2],"L"),(n&&d[n]==="M"||n===e)&&d.splice(n,0,"L",d[n-2]+i,d[n-1]);for(n=0;n<k.length;n++)e=k[n],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:p,fill:c?p:P,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),o([a.tracker,
  318 + a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",l).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(m);if(ab)a.on("touchstart",l)}))}};if(N.column)xa.prototype.drawTracker=U.drawTrackerPoint;if(N.pie)N.pie.prototype.drawTracker=U.drawTrackerPoint;if(N.scatter)pa.prototype.drawTracker=U.drawTrackerPoint;t(mb.prototype,{setItemEvents:function(a,b,c,d,e){var f=this;(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");b.css(f.options.itemHoverStyle)}).on("mouseout",
  319 + function(){b.css(a.visible?d:e);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):J(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=$("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);I(a.checkbox,"click",function(b){J(a.series||a,"checkboxClick",{checked:b.target.checked,item:a},function(){a.select()})})}});
  320 + S.legend.itemStyle.cursor="pointer";t(E.prototype,{showResetZoom:function(){var a=this,b=S.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo==="chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;J(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,
  321 + d=!1,e;!a||a.resetSelection?o(this.axes,function(a){b=a.zoom()}):o(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&da(e))this.resetZoomButton=e.destroy();b&&this.redraw(p(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&o(d,function(a){a.setState()});o(b==="xy"?
  322 + [1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),m=h.toValue(i-d,!0)+j,j=h.toValue(i+c[b?"plotWidth":"plotHeight"]-d,!0)-j,i=i>d;if(h.series.length&&(i||m>z(k.dataMin,k.min))&&(!i||j<s(k.dataMax,k.max)))h.setExtremes(m,j,!1,!1,{trigger:"pan"}),e=!0;c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);M(c.container,{cursor:"move"})}});t(Fa.prototype,{select:function(a,b){var c=this,d=c.series,e=d.chart,
  323 + a=p(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[La(c,d.data)]=c.options;c.setState(a&&"select");b||o(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[La(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a,b){var c=this.series,d=c.chart,e=d.tooltip,f=d.hoverPoint;if(d.hoverSeries!==c)c.onMouseOver();if(f&&f!==this)f.onMouseOut();
  324 + if(this.series&&(this.firePointEvent("mouseOver"),e&&(!e.shared||c.noSharedTooltip)&&e.refresh(this,a),this.setState("hover"),!b))d.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;this.firePointEvent("mouseOut");if(!b||La(this,b)===-1)this.setState(),a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=D(this.series.options.point,this.options).events,b;this.events=a;for(b in a)I(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,b){var c=
  325 + T(this.plotX),d=this.plotY,e=this.series,f=e.options.states,g=ba[e.type].marker&&e.options.marker,h=g&&!g.enabled,i=g&&g.states[a],j=i&&i.enabled===!1,k=e.stateMarkerGraphic,m=this.marker||{},n=e.chart,l=e.halo,o,a=a||"";o=this.pointAttr[a]||e.pointAttr[a];if(!(a===this.state&&!b||this.selected&&a!=="select"||f[a]&&f[a].enabled===!1||a&&(j||h&&i.enabled===!1)||a&&m.states&&m.states[a]&&m.states[a].enabled===!1)){if(this.graphic)g=g&&this.graphic.symbolName&&o.r,this.graphic.attr(D(o,g?{x:c-g,y:d-
  326 + g,width:2*g,height:2*g}:{})),k&&k.hide();else{if(a&&i)if(g=i.radius,m=m.symbol||e.symbol,k&&k.currentSymbol!==m&&(k=k.destroy()),k)k[b?"animate":"attr"]({x:c-g,y:d-g});else if(m)e.stateMarkerGraphic=k=n.renderer.symbol(m,c-g,d-g,2*g,2*g).attr(o).add(e.markerGroup),k.currentSymbol=m;if(k)k[a&&n.isInsidePlot(c,d,n.inverted)?"show":"hide"](),k.element.point=this}if((c=f[a]&&f[a].halo)&&c.size){if(!l)e.halo=l=n.renderer.path().add(n.seriesGroup);l.attr(t({fill:na(this.color||e.color).setOpacity(c.opacity).get()},
  327 + c.attributes))[b?"animate":"attr"]({d:this.haloPath(c.size)})}else l&&l.attr({d:[]});this.state=a}},haloPath:function(a){var b=this.series,c=b.chart,d=b.getPlotBox(),e=c.inverted;return c.renderer.symbols.circle(d.translateX+(e?b.yAxis.len-this.plotY:this.plotX)-a,d.translateY+(e?b.xAxis.len-this.plotX:this.plotY)-a,a*2,a*2)}});t(R.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&J(this,"mouseOver");this.setState("hover");
  328 + a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&J(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState()},setState:function(a){var b=this.options,c=this.graph,d=b.states,e=b.lineWidth,b=0,a=a||"";if(this.state!==a&&(this.state=a,!(d[a]&&d[a].enabled===!1)&&(a&&(e=d[a].lineWidth||e+(d[a].lineWidthPlus||0)),c&&!c.dashstyle))){a={"stroke-width":e};
  329 + for(c.attr(a);this["zoneGraph"+b];)this["zoneGraph"+b].attr(a),b+=1}},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===x?!h:a)?"show":"hide";o(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&o(d.series,function(a){if(a.options.stacking&&
  330 + a.visible)a.isDirty=!0});o(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();J(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===x?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;J(this,a?"select":"unselect")},drawTracker:U.drawTrackerGraph});t(B,{Color:na,Point:Fa,Tick:Sa,Renderer:$a,SVGElement:Q,SVGRenderer:Aa,arrayMin:Oa,arrayMax:Da,charts:X,dateFormat:Na,error:la,format:Ia,pathAnim:yb,
  331 + getOptions:function(){return S},hasBidiBug:Nb,isTouchDevice:Jb,setOptions:function(a){S=D(!0,S,a);Cb();return S},addEvent:I,removeEvent:Y,createElement:$,discardElement:Qa,css:M,each:o,map:Ua,merge:D,splat:ra,extendClass:ka,pInt:G,svg:ca,canvas:fa,vml:!ca&&!fa,product:"Highcharts",version:"4.1.9"})})();
0 332 \ No newline at end of file
... ...
datalets/leafletjs-datalet/demo/index.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title></title>
  6 +
  7 + <script>
  8 + </script>
  9 +
  10 +</head>
  11 +<body>
  12 +
  13 +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>
  14 +<link rel="import" href="../leafletjs-datalet.html" />
  15 +
  16 +<leafletjs-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
  17 + fields='["result,records,Lat","result,records,Lng", "result,records,Link"]'></leafletjs-datalet>
  18 +
  19 +
  20 +</body>
  21 +</html>
0 22 \ No newline at end of file
... ...
datalets/leafletjs-datalet/leafletjs-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26 <link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html">
... ... @@ -30,10 +31,15 @@ THE SOFTWARE.
30 31  
31 32 Example:
32 33  
33   -<leafletjs-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
34   - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']###$['result']['records'][*]['Link']">
35   -
  34 + <leafletjs-datalet
  35 + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#"
  36 + fields='["field1","field2"]'>
  37 + </leafletjs-datalet>
36 38  
  39 +@element leafletjs-datalet
  40 +@status v0.1
  41 +@demo demo/index.html
  42 +@group datalets
37 43 -->
38 44  
39 45 <dom-module name="leafletjs-datalet">
... ...
datalets/linechart-datalet/demo/index.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title></title>
  6 +
  7 + <script>
  8 + </script>
  9 +
  10 +</head>
  11 +<body>
  12 +
  13 +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>
  14 +<link rel="import" href="../linechart-datalet.html" />
  15 +
  16 +<linechart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
  17 + fields='["result,records,Lat","result,records,Lng"]'></linechart-datalet>
  18 +
  19 +</body>
  20 +</html>
0 21 \ No newline at end of file
... ...
datalets/linechart-datalet/linechart-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26 <link rel="import" href="../highcharts-datalet/highcharts-datalet.html">
... ... @@ -30,10 +31,15 @@ THE SOFTWARE.
30 31  
31 32 Example:
32 33  
33   -<linechart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&amp;limit=10000"
34   - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']">
35   -
  34 + <linechart-datalet
  35 + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#"
  36 + fields='["field1","field2"]'>
  37 + </linechart-datalet>
36 38  
  39 +@element linechart-datalet
  40 +@status v0.1
  41 +@demo demo/index.html
  42 +@group datalets
37 43 -->
38 44  
39 45 <dom-module id="linechart-datalet">
... ... @@ -41,13 +47,13 @@ Example:
41 47 <highcharts-datalet id="charts" data-url="{{dataUrl}}" fields="{{fields}}"></highcharts-datalet>
42 48 </template>
43 49 <script>
44   - var LinechartBehavior = {
45 50  
  51 + var LinechartBehavior = {
46 52  
47 53 /**
48 54 * Bluid Highchart object
49 55 *
50   - * @method transformData
  56 + * @method presentData
51 57 */
52 58 presentData: function(){
53 59  
... ... @@ -56,7 +62,7 @@ Example:
56 62 text: 'Line chart'
57 63 },
58 64 chart: {
59   - zoomType: 'xy'
  65 + zoomType: 'xy'
60 66 },
61 67 xAxis: {
62 68 categories: this.properties.categories.value,//this._component.categories,
... ...
datalets/treemap-datalet/demo/index.html 0 โ†’ 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title></title>
  6 +
  7 + <script>
  8 + </script>
  9 +
  10 +</head>
  11 +<body>
  12 +
  13 +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script>
  14 +<link rel="import" href="../treemap-datalet.html" />
  15 +
  16 +
  17 +<treemap-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=0cb600fc-19ad-4aaf-9794-1e6ea851840a&amp;limit=10000"
  18 + fields='["result,records,categoria","result,records,capitolo","result,records,movimento"]'></treemap-datalet>
  19 +
  20 +</body>
  21 +</html>
0 22 \ No newline at end of file
... ...
datalets/treemap-datalet/treemap-datalet.html
1 1 <!--
2   -The MIT License (MIT)
3   -
4   -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM
5   -
6   -Permission is hereby granted, free of charge, to any person obtaining a copy
7   -of this software and associated documentation files (the "Software"), to deal
8   -in the Software without restriction, including without limitation the rights
9   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   -copies of the Software, and to permit persons to whom the Software is
11   -furnished to do so, subject to the following conditions:
12   -
13   -The above copyright notice and this permission notice shall be included in
14   -all copies or substantial portions of the Software.
15   -
16   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   -THE SOFTWARE.
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Universitร  di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
23 24 -->
24 25  
25 26 <link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html">
26 27  
  28 +<!--
  29 +
  30 +`treemap-datalet` is a treemap datalet based on d3js treemap project http://bl.ocks.org/mbostock/4063582
  31 +A treemap recursively subdivides area into rectangles; the area of any node in the tree corresponds to its value.
  32 +
  33 +Example:
  34 +
  35 + <treemap-datalet
  36 + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#"
  37 + fields='["field1","field2"]'>
  38 + </treemap-datalet>
  39 +
  40 +@element barchart-datalet
  41 +@status v0.1
  42 +@demo demo/index.html
  43 +@group datalets
  44 +-->
  45 +
27 46 <dom-module id="treemap-datalet">
28 47 <template>
29 48 <style is="custom-style">
... ...
node_modules/grunt-bosonic/.npmignore deleted
1   -node_modules/*
2   -tmp/*
3   -
node_modules/grunt-bosonic/AUTHORS deleted
1   -# Names should be added to this file with this pattern:
2   -#
3   -# For individuals:
4   -# Name <email address>
5   -#
6   -# For organizations:
7   -# Organization <fnmatch pattern>
8   -#
9   -
10   -Raphaรซl Rougeron <goldoraf@gmail.com>
11 0 \ No newline at end of file
node_modules/grunt-bosonic/Gruntfile.js deleted
1   -/*
2   - * grunt-bosonic
3   - * https://github.com/bosonic/grunt-bosonic
4   - *
5   - * Copyright (c) 2013 Raphaรซl Rougeron
6   - * Licensed under the MIT license.
7   - */
8   -
9   -'use strict';
10   -
11   -module.exports = function(grunt) {
12   -
13   - grunt.initConfig({
14   -
15   - clean: {
16   - tests: ['tmp'],
17   - },
18   -
19   - bosonic: {
20   - sample: {
21   - src: ['samples/spec_sample.html'],
22   - css: 'tmp/spec_sample.css',
23   - js: 'tmp/spec_sample.js'
24   - }
25   - }
26   -
27   - });
28   -
29   - grunt.loadTasks('tasks');
30   -
31   - grunt.loadNpmTasks('grunt-contrib-clean');
32   -
33   - grunt.registerTask('test', ['clean', 'bosonic']);
34   -
35   - grunt.registerTask('default', ['test']);
36   -
37   -};
38 0 \ No newline at end of file
node_modules/grunt-bosonic/LICENSE deleted
1   -The MIT License (MIT)
2   -
3   -Copyright (c) 2014 The Bosonic Authors
4   -
5   -Permission is hereby granted, free of charge, to any person obtaining a copy of
6   -this software and associated documentation files (the "Software"), to deal in
7   -the Software without restriction, including without limitation the rights to
8   -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9   -the Software, and to permit persons to whom the Software is furnished to do so,
10   -subject to the following conditions:
11   -
12   -The above copyright notice and this permission notice shall be included in all
13   -copies or substantial portions of the Software.
14   -
15   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17   -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18   -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19   -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20   -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
node_modules/grunt-bosonic/README.md deleted
1   -# grunt-bosonic
2   -
3   -> A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript
4   -
5   -## Getting Started
6   -This plugin requires Grunt `~0.4.2`
7   -
8   -If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
9   -
10   -```shell
11   -npm install grunt-bosonic --save-dev
12   -```
13   -
14   -Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
15   -
16   -```js
17   -grunt.loadNpmTasks('grunt-bosonic');
18   -```
19   -
20   -## The "bosonic" task
21   -
22   -### Usage
23   -In your project's Gruntfile, add a section named `bosonic` to the data object passed into `grunt.initConfig()`.
24   -
25   -```js
26   -grunt.initConfig({
27   - bosonic: {
28   - my_components: {
29   - src: ['src/**/*.html'],
30   - css: 'dist/components.css',
31   - js: 'dist/components.js'
32   - }
33   -});
34   -```
35   -
36   -## Contributing
37   -In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
38   -
39   -## Release History
40   -_(Nothing yet)_
41 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/.npmignore deleted
1   -node_modules/*
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/AUTHORS deleted
1   -# Names should be added to this file with this pattern:
2   -#
3   -# For individuals:
4   -# Name <email address>
5   -#
6   -# For organizations:
7   -# Organization <fnmatch pattern>
8   -#
9   -
10   -Raphaรซl Rougeron <goldoraf@gmail.com>
11 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/LICENSE deleted
1   -The MIT License (MIT)
2   -
3   -Copyright (c) 2014 The Bosonic Authors
4   -
5   -Permission is hereby granted, free of charge, to any person obtaining a copy of
6   -this software and associated documentation files (the "Software"), to deal in
7   -the Software without restriction, including without limitation the rights to
8   -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9   -the Software, and to permit persons to whom the Software is furnished to do so,
10   -subject to the following conditions:
11   -
12   -The above copyright notice and this permission notice shall be included in all
13   -copies or substantial portions of the Software.
14   -
15   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17   -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18   -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19   -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20   -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/README.md deleted
1   -# Bosonic transpiler
2   -
3   -> A node.js library that transpiles to-the-spec Web Components into polyfilled JavaScript
4   -
5   -## Getting started
6   -
7   -If you use Grunt, you may want to use [grunt-bosonic](https://github.com/bosonic/grunt-bosonic) instead.
8   -
9   -## Development
10   -
11   -### Contributing
12   -In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality.
13   -
14   -### Running tests
15   -
16   -```shell
17   -nodeunit test/transpiler.js
18   -```
19   -
20   -### Release History
21   -_(Nothing yet)_
22   -
23   -
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/index.js deleted
1   -module.exports = require('./lib/transpiler');
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/lib/macros/element.sjs deleted
1   -macro def__property {
2   - rule {
3   - get $key:ident ($args1 (,) ...) { $body1 ... } , def__property set $key:ident ($args2 (,) ...) { $body2 ... }
4   - } => {
5   - $key : {
6   - enumerable: true,
7   - get : function() {
8   - $body1 ...
9   - },
10   - set : function($args2 (,) ...) {
11   - $body2 ...
12   - }
13   - }
14   - }
15   - rule {
16   - set $key:ident ($args2 (,) ...) { $body2 ... }, def__property get $key:ident ($args1 (,) ...) { $body1 ... }
17   - } => {
18   - $key : {
19   - enumerable: true,
20   - get : function() {
21   - $body1 ...
22   - },
23   - set : function($args2 (,) ...) {
24   - $body2 ...
25   - }
26   - }
27   - }
28   - rule { get $key:ident ($args (,) ...) { $body ... } } => {
29   - $key : {
30   - enumerable: true,
31   - get : function() {
32   - $body ...
33   - }
34   - }
35   - }
36   - rule { set $key:ident ($args (,) ...) { $body ... } } => {
37   - $key : {
38   - enumerable: true,
39   - set : function($args (,) ...) {
40   - $body ...
41   - }
42   - }
43   - }
44   - rule { $key:ident : protected function($args (,) ...) { $body ... } } => {
45   - $key : {
46   - value : function($args (,) ...) {
47   - $body ...
48   - }
49   - }
50   - }
51   - rule { $key:ident : function($args (,) ...) { $body ... } } => {
52   - $key : {
53   - enumerable: true,
54   - value : function($args (,) ...) {
55   - $body ...
56   - }
57   - }
58   - }
59   - rule { $key:ident : $value:expr } => {
60   - $key : { value : $value }
61   - }
62   - rule { $key:ident : $value:lit } => {
63   - $key : { value : $value }
64   - }
65   - rule { $key } => {
66   - $key : { value : null }
67   - }
68   -}
69   -
70   -macro def__element {
71   - case { _ $name:lit extends $extendee:ident { $properties:def__property (,) ... } } => {
72   - var stx1 = #{$name},
73   - stx2 = #{$extendee},
74   - name = stx1[0].token.value,
75   - extendee = stx2[0].token.value,
76   - extendeeTag = extendee.decamelize(),
77   - tagName = makeValue(name, #{$name}),
78   - elementName = makeIdent(name.camelize(), #{$name}),
79   - protoName = makeIdent(name.camelize() + 'Prototype', #{$name});
80   -
81   - letstx $tagName = [tagName];
82   - letstx $elementName = [elementName];
83   - letstx $protoName = [protoName];
84   -
85   - if (extendee === 'HTMLElement') {
86   - return #{
87   - var $protoName = Object.create($extendee.prototype, { $properties (,) ... });
88   - window.$elementName = document.registerElement($tagName, {
89   - prototype: $protoName
90   - });
91   - }
92   - } else if (extendeeTag.indexOf('-') === -1) { // We extend a native element
93   - var htmlextendee = makeIdent('HTML'+extendee+'Element', #{$extendee}),
94   - htmlextendeeTag = makeValue(extendeeTag, #{$extendee});
95   - letstx $htmlextendeeTag = [htmlextendeeTag];
96   - letstx $htmlextendee = [htmlextendee];
97   - return #{
98   - var $protoName = Object.create($htmlextendee.prototype, { $properties (,) ... });
99   - window.$elementName = document.registerElement($tagName, {
100   - prototype: $protoName,
101   - extends: $htmlextendeeTag
102   - });
103   - Object.defineProperty($elementName.prototype, '_super', {
104   - enumerable: false,
105   - writable: false,
106   - configurable: false,
107   - value: $htmlextendee.prototype
108   - });
109   - }
110   - } else {
111   - return #{
112   - var $protoName = Object.create($extendee.prototype, { $properties (,) ... });
113   - window.$elementName = document.registerElement($tagName, {
114   - prototype: $protoName
115   - });
116   - Object.defineProperty($elementName.prototype, '_super', {
117   - enumerable: false,
118   - writable: false,
119   - configurable: false,
120   - value: $extendee.prototype
121   - });
122   - }
123   - }
124   - }
125   -
126   - case { $macro $name:lit extends $extendee:lit } => {
127   - var stx = #{$extendee},
128   - extendee = stx[0].token.value,
129   - extendeeName = makeIdent(extendee.camelize(), #{$extendee});
130   -
131   - letstx $extendeeName = [extendeeName];
132   -
133   - return #{
134   - $macro $name extends $extendeeName
135   - }
136   - }
137   -
138   - case { $macro $name:lit } => {
139   - return #{
140   - $macro $name extends HTMLElement
141   - }
142   - }
143   -}
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/lib/macros/template.sjs deleted
1   -macro def__template {
2   - case { _ $name:lit $html:lit } => {
3   - var stx = #{$name},
4   - tagName = stx[0].token.value,
5   - protoName = makeIdent(tagName.camelize() + 'Prototype', #{$name});
6   -
7   - letstx $protoName = [protoName];
8   -
9   - return #{
10   - Object.defineProperty($protoName, 'template', {
11   - get: function() {
12   - var fragment = document.createDocumentFragment();
13   - var div = fragment.appendChild(document.createElement('div'));
14   - div.innerHTML = $html;
15   - while (child = div.firstChild) {
16   - fragment.insertBefore(child, div);
17   - }
18   - fragment.removeChild(div);
19   - return { content: fragment }
20   - }
21   - });
22   - }
23   - }
24   -}
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/lib/transpiler.js deleted
1   -/*
2   - * Bosonic transpiler
3   - * https://github.com/bosonic/transpiler
4   - *
5   - * Copyright (c) 2013 Raphaรซl Rougeron
6   - * Licensed under the MIT license.
7   - */
8   -
9   -'use strict';
10   -
11   -var _ = require('underscore'),
12   - fs = require('fs'),
13   - cheerio = require('cheerio'),
14   - esprima = require('esprima'),
15   - escodegen = require('escodegen'),
16   - estraverse = require('estraverse'),
17   - sweet = require('sweet.js');
18   -
19   -function camelize(str) {
20   - var camelized = str.replace(/(\-|_|\.|\s)+(.)?/g, function(match, separator, chr) {
21   - return chr ? chr.toUpperCase() : '';
22   - }).replace(/^([A-Z])/, function(match, separator, chr) {
23   - return match.toLowerCase();
24   - });
25   - return camelized.charAt(0).toUpperCase() + camelized.slice(1);
26   -}
27   -String.prototype.camelize = function() {
28   - return camelize(this);
29   -};
30   -
31   -function decamelize(str) {
32   - str = str.charAt(0).toLowerCase() + str.slice(1);
33   - return str.replace(/([a-z\d])([A-Z])/g, '$1-$2').toLowerCase();
34   -}
35   -String.prototype.decamelize = function() {
36   - return decamelize(this);
37   -};
38   -
39   -function shimSelector(selector, elementName) {
40   - var shimed = false,
41   - selectorRegexes = [
42   - [/^:host\(([^:]+)\)$/, elementName+'$1'],
43   - [/^:host(:hover|:active|:focus)$/, elementName+'$1'],
44   - [/^:host(\[[^:]+\])$/, elementName+'$1'],
45   - [/^:host$/, elementName],
46   - [/^:ancestor\(([^:]+)\)$/, '$1 '+elementName], // deprecated; replaced by :host-context
47   - [/^:host-context\(([^:]+)\)$/, '$1 '+elementName],
48   - [/^::content/, elementName],
49   - ];
50   -
51   - for (var i = 0; i < selectorRegexes.length; i++) {
52   - var re = selectorRegexes[i];
53   - if (selector.match(re[0])) {
54   - shimed = true;
55   - selector = selector.replace(re[0], re[1]);
56   - break;
57   - }
58   - }
59   - if (!shimed && !selector.match(new RegExp(elementName))) {
60   - selector = elementName + ' ' + selector;
61   - }
62   - return selector;
63   -}
64   -
65   -function shimStyles(styles, elementName) {
66   - var css = require('css'),
67   - parseTree = css.parse(styles);
68   -
69   - parseTree.stylesheet.rules.forEach(function(rule) {
70   - rule.selectors.forEach(function(selector, i, selectorsRef) {
71   - selectorsRef[i] = shimSelector(selector, elementName);
72   - });
73   - });
74   -
75   - return css.stringify(parseTree);
76   -}
77   -
78   -function preCompile(elementName, script, template, extendee) {
79   - var sourceAst = esprima.parse(script, { loc: true }),
80   - fullElementName = extendee ? "'" + elementName + "' extends '" + extendee + "'" : "'" + elementName + "'";
81   -
82   - // According to the spec, the last value of the <script> must be an object whose properties will define
83   - // the new element's API. This object must therefore be wrapped in an ExpressionStatement
84   - var exprStmt = sourceAst.body[sourceAst.body.length - 1];
85   - if (exprStmt.type !== 'ExpressionStatement') {
86   - throw new Error('The last value of the <script> must be an ExpressionStatement');
87   - }
88   - if (exprStmt.expression.type !== 'ObjectExpression') {
89   - throw new Error('The last value of the <script> must be an ExpressionStatement whose expression must be an object literal');
90   - }
91   -
92   - // We grab all the code prior to the ExpressionStatement and prepend it to the code to output
93   - var outerCode = [];
94   - for (var i = 0; i <= sourceAst.body.length - 2; i++) {
95   - outerCode.push(escodegen.generate(sourceAst.body[i]));
96   - }
97   -
98   - var precompiledCode = outerCode.join("\n");
99   - precompiledCode+= '\ndef__element ' + fullElementName + ' ' + escodegen.generate(exprStmt.expression) + '\n';
100   - if (template) {
101   - template = "'"+template.replace(/\r?\n/g, '')+"'";
102   - precompiledCode+= '\ndef__template "' + elementName + '" ' + template + '\n';
103   - }
104   -
105   - return precompiledCode;
106   -}
107   -
108   -function compile(precompiledCode) {
109   - var macros = fs.readFileSync(__dirname + '/macros/element.sjs', 'utf8')
110   - + '\n' + fs.readFileSync(__dirname + '/macros/template.sjs', 'utf8');
111   - return sweet.compile(macros + '\n' + precompiledCode, { readableNames: true }).code;
112   -}
113   -
114   -function transpile(htmlString) {
115   - var mainScript,
116   - sourceAst,
117   - scriptDeps = [],
118   - cssDeps = [],
119   - $ = cheerio.load(htmlString),
120   - element = $('element'),
121   - template = $('template').html(),
122   - style = $('style').html(),
123   - scripts = $('script'),
124   - stylesheets = $('link[rel=stylesheet]'),
125   - elementName = element.attr('name'),
126   - extendee = element.attr('extends');
127   -
128   - scripts.each(function(i, script) {
129   - if ($(this).attr('src')) {
130   - scriptDeps.push($(this).attr('src'));
131   - } else {
132   - if (mainScript !== undefined) {
133   - throw new Error('Only one <script> is permitted in a Web Component declaration');
134   - }
135   - mainScript = $(this).html();
136   - }
137   - });
138   -
139   - stylesheets.each(function(i, link) {
140   - cssDeps.push($(this).attr('href'));
141   - });
142   -
143   - if (style !== null) {
144   - style = shimStyles(style, elementName);
145   - }
146   -
147   - // We can't normalize whitespace during the first parse because it will normalize WS in the JS too
148   - if (template !== null) {
149   - $ = cheerio.load(htmlString, {
150   - normalizeWhitespace: true
151   - });
152   - template = $('template').html();
153   - }
154   -
155   - if (mainScript === undefined) {
156   - throw new Error('A <script> is mandatory in a Web Component declaration');
157   - }
158   -
159   - var precompiledCode = preCompile(elementName, mainScript, template, extendee);
160   -
161   - var output = '(function () {\n' + compile(precompiledCode) + '\n}());\n';
162   -
163   - // We do another pass with Esprima in order to indent JS code correctly
164   - var outputAst = esprima.parse(output);
165   - output = escodegen.generate(outputAst);
166   -
167   - return {
168   - js: output,
169   - css: style,
170   - template: template,
171   - scripts: scriptDeps,
172   - stylesheets: cssDeps
173   - };
174   -}
175   -
176   -exports = module.exports = {
177   - transpile: transpile,
178   - preCompile: preCompile,
179   - compile: compile,
180   - shimStyles: shimStyles,
181   - shimSelector: shimSelector
182   -}
183   -
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/package.json deleted
1   -{
2   - "name": "bosonic-transpiler",
3   - "version": "0.4.6",
4   - "description": "A node.js library that transpiles to-the-spec Web Components into polyfilled JavaScript",
5   - "main": "index.js",
6   - "scripts": {
7   - "test": "echo \"Error: no test specified\" && exit 1"
8   - },
9   - "repository": {
10   - "type": "git",
11   - "url": "git://github.com/bosonic/transpiler.git"
12   - },
13   - "author": {
14   - "name": "Raphaรซl Rougeron",
15   - "email": "goldoraf@gmail.com"
16   - },
17   - "license": "MIT",
18   - "bugs": {
19   - "url": "https://github.com/bosonic/transpiler/issues"
20   - },
21   - "dependencies": {
22   - "underscore": "~1.6.0",
23   - "cheerio": "~0.13.1",
24   - "esprima": "~1.0.4",
25   - "escodegen": "~1.2.0",
26   - "estraverse": "~1.5.0",
27   - "css": "^1.6.0",
28   - "sweet.js": "^0.5.0"
29   - },
30   - "devDependencies": {
31   - "nodeunit": "~0.8.5"
32   - },
33   - "contributors": [
34   - {
35   - "name": "Raphaรซl Rougeron",
36   - "email": "goldoraf@gmail.com"
37   - }
38   - ],
39   - "readme": "# Bosonic transpiler\n\n> A node.js library that transpiles to-the-spec Web Components into polyfilled JavaScript\n\n## Getting started\n\nIf you use Grunt, you may want to use [grunt-bosonic](https://github.com/bosonic/grunt-bosonic) instead.\n\n## Development\n\n### Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality.\n\n### Running tests\n\n```shell\nnodeunit test/transpiler.js\n```\n\n### Release History\n_(Nothing yet)_\n\n\n",
40   - "readmeFilename": "README.md",
41   - "_id": "bosonic-transpiler@0.4.6",
42   - "_from": "bosonic-transpiler@0.4.*"
43   -}
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/compiled_spec_sample_script.js deleted
1   -function start() {
2   - this.tick();
3   - this._interval = window.setInterval(this.tick.bind(this), 1000);
4   -}
5   -function stop() {
6   - window.clearInterval(this._interval);
7   -}
8   -function fmt(n) {
9   - return (n < 10 ? '0' : '') + n;
10   -}
11   -var BTestPrototype = Object.create(HTMLElement.prototype, {
12   - readyCallback: {
13   - enumerable: true,
14   - value: function () {
15   - this._root = this.createShadowRoot();
16   - this._root.appendChild(this.template.content.cloneNode());
17   - if (this.parentElement) {
18   - start.call(this);
19   - }
20   - }
21   - },
22   - insertedCallback: { value: start },
23   - removedCallback: { value: stop },
24   - tick: {
25   - enumerable: true,
26   - value: function () {
27   - var now = new Date();
28   - this._root.querySelector('hh').textContent = fmt(now.getHours());
29   - this._root.querySelector('sep').style.visibility = now.getSeconds() % 2 ? 'visible' : 'hidden';
30   - this._root.querySelector('mm').textContent = fmt(now.getMinutes());
31   - }
32   - }
33   - });
34   -window.BTest = document.registerElement('b-test', { prototype: BTestPrototype });
35   -Object.defineProperty(BTestPrototype, 'template', {
36   - get: function () {
37   - var fragment = document.createDocumentFragment();
38   - var div = fragment.appendChild(document.createElement('div'));
39   - div.innerHTML = '<div><content></content></div>';
40   - while (child = div.firstChild) {
41   - fragment.insertBefore(child, div);
42   - }
43   - fragment.removeChild(div);
44   - return { content: fragment };
45   - }
46   -});
47 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/extended_bosonic_element.js deleted
1   -(function () {
2   - var BModalPrototype = Object.create(BDialog.prototype, {
3   - dummy: {
4   - enumerable: true,
5   - value: function () {
6   - console.log('bar');
7   - }
8   - }
9   - });
10   - window.BModal = document.registerElement('b-modal', { prototype: BModalPrototype });
11   - Object.defineProperty(BModal.prototype, '_super', {
12   - enumerable: false,
13   - writable: false,
14   - configurable: false,
15   - value: BDialog.prototype
16   - });
17   -}());
18 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/extended_native_element.js deleted
1   -(function () {
2   - var SuperButtonPrototype = Object.create(HTMLButtonElement.prototype, {
3   - dummy: {
4   - enumerable: true,
5   - value: function () {
6   - console.log('bar');
7   - }
8   - }
9   - });
10   - window.SuperButton = document.registerElement('super-button', {
11   - prototype: SuperButtonPrototype,
12   - extends: 'button'
13   - });
14   - Object.defineProperty(SuperButton.prototype, '_super', {
15   - enumerable: false,
16   - writable: false,
17   - configurable: false,
18   - value: HTMLButtonElement.prototype
19   - });
20   -}());
21 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/extended_spec_sample.js deleted
1   -(function () {
2   - var SuperTickTockClockPrototype = Object.create(TickTockClock.prototype, {
3   - tick: {
4   - enumerable: true,
5   - value: function () {
6   - this._super.tick.call(this);
7   - console.log('tick');
8   - }
9   - }
10   - });
11   - window.SuperTickTockClock = document.registerElement('super-tick-tock-clock', { prototype: SuperTickTockClockPrototype });
12   - Object.defineProperty(SuperTickTockClock.prototype, '_super', {
13   - enumerable: false,
14   - writable: false,
15   - configurable: false,
16   - value: TickTockClock.prototype
17   - });
18   -}());
19 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/getter_setter_bug.js deleted
1   -var BTestPrototype = Object.create(HTMLElement.prototype, {
2   - width: {
3   - enumerable: true,
4   - get: function () {
5   - return 100;
6   - }
7   - },
8   - height: {
9   - enumerable: true,
10   - get: function () {
11   - return 50;
12   - }
13   - },
14   - margin: {
15   - enumerable: true,
16   - set: function (val) {
17   - this.val = val;
18   - }
19   - }
20   - });
21   -window.BTest = document.registerElement('b-test', { prototype: BTestPrototype });
22 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/precompiled_spec_sample_script.js deleted
1   -function start() {
2   - this.tick();
3   - this._interval = window.setInterval(this.tick.bind(this), 1000);
4   -}
5   -function stop() {
6   - window.clearInterval(this._interval);
7   -}
8   -function fmt(n) {
9   - return (n < 10 ? '0' : '') + n;
10   -}
11   -def__element 'b-test' {
12   - readyCallback: function () {
13   - this._root = this.createShadowRoot();
14   - this._root.appendChild(this.template.content.cloneNode());
15   - if (this.parentElement) {
16   - start.call(this);
17   - }
18   - },
19   - insertedCallback: start,
20   - removedCallback: stop,
21   - tick: function () {
22   - var now = new Date();
23   - this._root.querySelector('hh').textContent = fmt(now.getHours());
24   - this._root.querySelector('sep').style.visibility = now.getSeconds() % 2 ? 'visible' : 'hidden';
25   - this._root.querySelector('mm').textContent = fmt(now.getMinutes());
26   - }
27   -}
28   -
29   -def__template "b-test" '<div><content></content></div>'
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/shimed_shadowCSS_sample.css deleted
1   -b-dummy {
2   - display: block;
3   -}
4   -
5   -b-dummy:hover {
6   - color: blue;
7   -}
8   -
9   -b-dummy.active {
10   - color: red;
11   -}
12 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/spec_sample.css deleted
1   -tick-tock-clock {
2   - border: 1px solid #ccc;
3   -}
4 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/spec_sample.js deleted
1   -(function () {
2   - function start() {
3   - this.tick();
4   - this._interval = window.setInterval(this.tick.bind(this), 1000);
5   - }
6   - function stop() {
7   - window.clearInterval(this._interval);
8   - }
9   - function fmt(n) {
10   - return (n < 10 ? '0' : '') + n;
11   - }
12   - var TickTockClockPrototype = Object.create(HTMLElement.prototype, {
13   - readyCallback: {
14   - enumerable: true,
15   - value: function () {
16   - this._root = this.createShadowRoot();
17   - this._root.appendChild(this.template.content.cloneNode());
18   - if (this.parentElement) {
19   - start.call(this);
20   - }
21   - }
22   - },
23   - insertedCallback: { value: start },
24   - removedCallback: { value: stop },
25   - tick: {
26   - enumerable: true,
27   - value: function () {
28   - var now = new Date();
29   - this._root.querySelector('hh').textContent = fmt(now.getHours());
30   - this._root.querySelector('sep').style.visibility = now.getSeconds() % 2 ? 'visible' : 'hidden';
31   - this._root.querySelector('mm').textContent = fmt(now.getMinutes());
32   - }
33   - }
34   - });
35   - window.TickTockClock = document.registerElement('tick-tock-clock', { prototype: TickTockClockPrototype });
36   - Object.defineProperty(TickTockClockPrototype, 'template', {
37   - get: function () {
38   - var fragment = document.createDocumentFragment();
39   - var div = fragment.appendChild(document.createElement('div'));
40   - div.innerHTML = ' <span id="hh"></span> <span id="sep">:</span> <span id="mm"></span> ';
41   - while (child = div.firstChild) {
42   - fragment.insertBefore(child, div);
43   - }
44   - fragment.removeChild(div);
45   - return { content: fragment };
46   - }
47   - });
48   -}());
49 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/extended_bosonic_element.html deleted
1   -<element name="b-modal" extends="b-dialog">
2   - <script>
3   - ({
4   - dummy: function () {
5   - console.log('bar');
6   - }
7   - });
8   - </script>
9   -</element>
10 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/extended_native_element.html deleted
1   -<element name="super-button" extends="button">
2   - <script>
3   - ({
4   - dummy: function () {
5   - console.log('bar');
6   - }
7   - });
8   - </script>
9   -</element>
10 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/extended_spec_sample.html deleted
1   -<element name="super-tick-tock-clock" extends="tick-tock-clock">
2   - <script>
3   - ({
4   - tick: function () {
5   - this._super.tick.call(this);
6   - console.log('tick');
7   - }
8   - });
9   - </script>
10   -</element>
11 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/getter_setter_bug.js deleted
1   -def__element 'b-test' {
2   - get width() {
3   - return 100;
4   - },
5   -
6   - get height() {
7   - return 50;
8   - },
9   -
10   - set margin(val) {
11   - this.val = val;
12   - }
13   -}
14 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/protected_function.html deleted
1   -<element name="b-protected">
2   - <script>
3   - ({
4   - //@protected
5   - dummy: function() {
6   - console.log('bar');
7   - }
8   - });
9   - </script>
10   -</element>
11 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/sample_with_deps.html deleted
1   -<element name="sample-with-deps">
2   - <template>
3   - <div></div>
4   - </template>
5   - <link href="../node_modules/pikaday/css/pikaday.css" rel="stylesheet">
6   - <script src="../node_modules/moment/moment.js"></script>
7   - <script>
8   - ({
9   - readyCallback: function () {
10   -
11   - }
12   - });
13   - </script>
14   - <script src="../node_modules/pikaday/pikaday.js"></script>
15   -</element>
16 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/shadowCSS_sample.css deleted
1   -:host {
2   - display: block;
3   -}
4   -
5   -:host:hover {
6   - color: blue;
7   -}
8   -
9   -:host(.active) {
10   - color: red;
11   -}
12 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/spec_sample.html deleted
1   -<element name="tick-tock-clock">
2   - <template>
3   - <span id="hh"></span>
4   - <span id="sep">:</span>
5   - <span id="mm"></span>
6   - </template>
7   - <style>
8   - :host {
9   - border: 1px solid #ccc;
10   - }
11   - </style>
12   - <script>
13   - function start() {
14   - this.tick();
15   - this._interval = window.setInterval(this.tick.bind(this), 1000);
16   - }
17   - function stop() {
18   - window.clearInterval(this._interval);
19   - }
20   - function fmt(n) {
21   - return (n < 10 ? '0' : '') + n;
22   - }
23   -
24   - ({
25   - readyCallback: function () {
26   - this._root = this.createShadowRoot();
27   - this._root.appendChild(this.template.content.cloneNode());
28   - if (this.parentElement) {
29   - start.call(this);
30   - }
31   - },
32   - insertedCallback: start,
33   - removedCallback: stop,
34   - tick: function () {
35   - var now = new Date();
36   - this._root.querySelector('hh').textContent = fmt(now.getHours());
37   - this._root.querySelector('sep').style.visibility =
38   - now.getSeconds() % 2 ? 'visible' : 'hidden';
39   - this._root.querySelector('mm').textContent = fmt(now.getMinutes());
40   - }
41   - });
42   - </script>
43   -</element>
44 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/spec_sample_script.js deleted
1   -function start() {
2   - this.tick();
3   - this._interval = window.setInterval(this.tick.bind(this), 1000);
4   -}
5   -function stop() {
6   - window.clearInterval(this._interval);
7   -}
8   -function fmt(n) {
9   - return (n < 10 ? '0' : '') + n;
10   -}
11   -
12   -({
13   - readyCallback: function () {
14   - this._root = this.createShadowRoot();
15   - this._root.appendChild(this.template.content.cloneNode());
16   - if (this.parentElement) {
17   - start.call(this);
18   - }
19   - },
20   - insertedCallback: start,
21   - removedCallback: stop,
22   - tick: function () {
23   - var now = new Date();
24   - this._root.querySelector('hh').textContent = fmt(now.getHours());
25   - this._root.querySelector('sep').style.visibility =
26   - now.getSeconds() % 2 ? 'visible' : 'hidden';
27   - this._root.querySelector('mm').textContent = fmt(now.getMinutes());
28   - }
29   -});
30 0 \ No newline at end of file
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/transpiler.js deleted
1   -var fs = require('fs'),
2   - transpiler = require('../'),
3   - sweet = require('sweet.js');
4   -
5   -exports.testSimpleTranspilation = function(test) {
6   - test.expect(4);
7   - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/spec_sample.html', 'utf8')),
8   - expected = {
9   - js: fs.readFileSync(__dirname + '/expected/spec_sample.js', 'utf8'),
10   - css: fs.readFileSync(__dirname + '/expected/spec_sample.css', 'utf8')
11   - };
12   - test.equal(transpiled.js, expected.js, "the JS should be transpiled");
13   - test.equal(transpiled.css, expected.css, "the CSS should be shimmed");
14   - test.equal(transpiled.scripts.length, 0);
15   - test.equal(transpiled.stylesheets.length, 0);
16   - test.done();
17   -}
18   -
19   -exports.testExtendsTranspilation = function(test) {
20   - test.expect(1);
21   - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/extended_spec_sample.html', 'utf8')),
22   - expected = fs.readFileSync(__dirname + '/expected/extended_spec_sample.js', 'utf8');
23   - test.equal(transpiled.js, expected, "the JS should be transpiled");
24   - test.done();
25   -}
26   -
27   -exports.testExtendsNativeElementTranspilation = function(test) {
28   - test.expect(1);
29   - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/extended_native_element.html', 'utf8')),
30   - expected = fs.readFileSync(__dirname + '/expected/extended_native_element.js', 'utf8');
31   - test.equal(transpiled.js, expected, "the JS should be transpiled");
32   - test.done();
33   -}
34   -
35   -exports.testExtendsBosonicElementTranspilation = function(test) {
36   - test.expect(1);
37   - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/extended_bosonic_element.html', 'utf8')),
38   - expected = fs.readFileSync(__dirname + '/expected/extended_bosonic_element.js', 'utf8');
39   - test.equal(transpiled.js, expected, "the JS should be transpiled");
40   - test.done();
41   -}
42   -
43   -exports.testScriptDependency = function(test) {
44   - test.expect(1);
45   - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/sample_with_deps.html', 'utf8')),
46   - expected = {
47   - scripts: ["../node_modules/moment/moment.js", "../node_modules/pikaday/pikaday.js"]
48   - };
49   - test.deepEqual(transpiled.scripts, expected.scripts, "the script dependencies should be found");
50   - test.done();
51   -}
52   -
53   -exports.testStylesheetDependency = function(test) {
54   - test.expect(1);
55   - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/sample_with_deps.html', 'utf8')),
56   - expected = {
57   - stylesheets: ["../node_modules/pikaday/css/pikaday.css"]
58   - };
59   - test.deepEqual(transpiled.stylesheets, expected.stylesheets, "the stylesheets dependencies should be found");
60   - test.done();
61   -}
62   -
63   -exports.testStylesShiming = function(test) {
64   - var tests = [
65   - [':host', 'b-dummy'],
66   - [':host:hover', 'b-dummy:hover'],
67   - [':host[visible]', 'b-dummy[visible]'],
68   - [':host(.cssClass)', 'b-dummy.cssClass'],
69   - [':ancestor(.cssClass)', '.cssClass b-dummy'],
70   - [':host-context(.cssClass)', '.cssClass b-dummy'],
71   - ['p', 'b-dummy p'],
72   - ['b-dummy', 'b-dummy'],
73   - ['b-dummy p', 'b-dummy p'],
74   - ['::content p', 'b-dummy p']
75   - ];
76   - test.expect(tests.length);
77   - tests.forEach(function(rule) {
78   - test.equal(transpiler.shimSelector(rule[0], 'b-dummy'), rule[1]);
79   - });
80   - test.done();
81   -}
82   -
83   -exports.testStylesheetShiming = function(test) {
84   - var stylesheet = fs.readFileSync(__dirname + '/fixtures/shadowCSS_sample.css', 'utf8'),
85   - shimmed = fs.readFileSync(__dirname + '/expected/shimed_shadowCSS_sample.css', 'utf8');
86   -
87   - test.expect(1);
88   - test.equal(transpiler.shimStyles(stylesheet, 'b-dummy'), shimmed);
89   - test.done();
90   -}
91   -
92   -exports.testPreCompile = function(test) {
93   - test.expect(1);
94   - var script = fs.readFileSync(__dirname + '/fixtures/spec_sample_script.js', 'utf8'),
95   - code = transpiler.preCompile('b-test', script, '<div><content></content></div>'),
96   - expected = fs.readFileSync(__dirname + '/expected/precompiled_spec_sample_script.js', 'utf8');
97   - test.equal(code, expected);
98   - test.done();
99   -}
100   -
101   -exports.testCompile = function(test) {
102   - test.expect(1);
103   - var code = transpiler.compile(fs.readFileSync(__dirname + '/expected/precompiled_spec_sample_script.js', 'utf8')),
104   - expected = fs.readFileSync(__dirname + '/expected/compiled_spec_sample_script.js', 'utf8');
105   - test.equal(code, expected);
106   - test.done();
107   -}
108   -
109   -exports.testGetterSetterBug = function(test) {
110   - test.expect(1);
111   - var code = transpiler.compile(fs.readFileSync(__dirname + '/fixtures/getter_setter_bug.js', 'utf8')),
112   - expected = fs.readFileSync(__dirname + '/expected/getter_setter_bug.js', 'utf8');
113   - test.equal(code, expected);
114   - test.done();
115   -}
node_modules/grunt-bosonic/package.json deleted
1   -{
2   - "name": "grunt-bosonic",
3   - "version": "0.4.0",
4   - "description": "> A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript",
5   - "main": "Gruntfile.js",
6   - "scripts": {
7   - "test": "grunt test"
8   - },
9   - "repository": {
10   - "type": "git",
11   - "url": "git://github.com/bosonic/grunt-bosonic.git"
12   - },
13   - "author": {
14   - "name": "Raphaรซl Rougeron",
15   - "email": "goldoraf@gmail.com"
16   - },
17   - "license": "MIT",
18   - "bugs": {
19   - "url": "https://github.com/bosonic/grunt-bosonic/issues"
20   - },
21   - "dependencies": {
22   - "bosonic-transpiler": "0.4.*"
23   - },
24   - "devDependencies": {
25   - "grunt": "~0.4.2",
26   - "grunt-contrib-clean": "~0.5.0"
27   - },
28   - "peerDependencies": {
29   - "grunt": "0.4.x"
30   - },
31   - "contributors": [
32   - {
33   - "name": "Raphaรซl Rougeron",
34   - "email": "goldoraf@gmail.com"
35   - }
36   - ],
37   - "readme": "# grunt-bosonic\n\n> A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript\n\n## Getting Started\nThis plugin requires Grunt `~0.4.2`\n\nIf you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:\n\n```shell\nnpm install grunt-bosonic --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-bosonic');\n```\n\n## The \"bosonic\" task\n\n### Usage\nIn your project's Gruntfile, add a section named `bosonic` to the data object passed into `grunt.initConfig()`.\n\n```js\ngrunt.initConfig({\n bosonic: {\n my_components: {\n src: ['src/**/*.html'],\n css: 'dist/components.css',\n js: 'dist/components.js'\n }\n});\n```\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n_(Nothing yet)_",
38   - "readmeFilename": "README.md",
39   - "_id": "grunt-bosonic@0.4.0",
40   - "_from": "grunt-bosonic@"
41   -}
node_modules/grunt-bosonic/samples/spec_sample.html deleted
1   -<element name="tick-tock-clock">
2   - <template>
3   - <span id="hh"></span>
4   - <span id="sep">:</span>
5   - <span id="mm"></span>
6   - </template>
7   - <script>
8   - function start() {
9   - this.tick();
10   - this._interval = window.setInterval(this.tick.bind(this), 1000);
11   - }
12   - function stop() {
13   - window.clearInterval(this._interval);
14   - }
15   - function fmt(n) {
16   - return (n < 10 ? '0' : '') + n;
17   - }
18   -
19   - ({
20   - readyCallback: function () {
21   - this._root = this.createShadowRoot();
22   - this._root.appendChild(this.template.content.cloneNode());
23   - if (this.parentElement) {
24   - start.call(this);
25   - }
26   - },
27   - insertedCallback: start,
28   - removedCallback: stop,
29   - tick: function () {
30   - var now = new Date();
31   - this._root.querySelector('hh').textContent = fmt(now.getHours());
32   - this._root.querySelector('sep').style.visibility =
33   - now.getSeconds() % 2 ? 'visible' : 'hidden';
34   - this._root.querySelector('mm').textContent = fmt(now.getMinutes());
35   - }
36   - });
37   - </script>
38   -</element>
39 0 \ No newline at end of file
node_modules/grunt-bosonic/tasks/bosonic.js deleted
1   -/*
2   - * grunt-bosonic
3   - * https://github.com/bosonic/grunt-bosonic
4   - *
5   - * Copyright (c) 2013 Raphaรซl Rougeron
6   - * Licensed under the MIT license.
7   - */
8   -
9   -'use strict';
10   -
11   -var path = require('path'),
12   - transpiler = require('bosonic-transpiler');
13   -
14   -module.exports = function(grunt) {
15   -
16   - grunt.registerMultiTask('bosonic', 'A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript', function() {
17   - var css = [], js = [];
18   -
19   - this.filesSrc.forEach(function(filepath) {
20   - var fileDir = path.dirname(filepath),
21   - transpiled = transpiler.transpile(grunt.file.read(filepath));
22   - transpiled.stylesheets.forEach(function(href) {
23   - css.push(grunt.file.read(fileDir + '/' + href));
24   - });
25   - css.push(transpiled.css);
26   - transpiled.scripts.forEach(function(src) {
27   - js.push(grunt.file.read(fileDir + '/' + src));
28   - });
29   - js.push(transpiled.js);
30   - });
31   -
32   - var jsFile = this.data.js,
33   - cssFile = this.data.css;
34   -
35   - grunt.file.write(jsFile, js.join("\n"));
36   - grunt.file.write(cssFile, css.join("\n"));
37   - });
38   -
39   -}
40   -
node_modules/grunt/.npmignore deleted
1   -docs
2   -test
3   -.travis.yml
4   -AUTHORS
5   -CHANGELOG
6   -custom-gruntfile.js
7   -Gruntfile.js
node_modules/grunt/CONTRIBUTING.md deleted
1   -Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project.
node_modules/grunt/LICENSE-MIT deleted
1   -Copyright (c) 2014 "Cowboy" Ben Alman
2   -
3   -Permission is hereby granted, free of charge, to any person
4   -obtaining a copy of this software and associated documentation
5   -files (the "Software"), to deal in the Software without
6   -restriction, including without limitation the rights to use,
7   -copy, modify, merge, publish, distribute, sublicense, and/or sell
8   -copies of the Software, and to permit persons to whom the
9   -Software is furnished to do so, subject to the following
10   -conditions:
11   -
12   -The above copyright notice and this permission notice shall be
13   -included in all copies or substantial portions of the Software.
14   -
15   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16   -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17   -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18   -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19   -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20   -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21   -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22   -OTHER DEALINGS IN THE SOFTWARE.
node_modules/grunt/README.md deleted
1   -# Grunt: The JavaScript Task Runner
2   -
3   -[![Build Status: Linux](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
4   -<a href="https://ci.appveyor.com/project/gruntjs/grunt"><img src="https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva/branch/master" alt="Build Status: Windows" height="18" /></a>
5   -[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)
6   -
7   -<img align="right" height="260" src="http://gruntjs.com/img/grunt-logo-no-wordmark.svg">
8   -
9   -
10   -### Documentation
11   -
12   -Visit the [gruntjs.com](http://gruntjs.com/) website for all the things.
13   -
14   -### Support / Contributing
15   -Before you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.
16   -
17   -You can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).
18   -
19   -### Release History
20   -See the [CHANGELOG](CHANGELOG).
node_modules/grunt/appveyor.yml deleted
1   -# http://www.appveyor.com/docs/appveyor-yml
2   -
3   -# Fix line endings in Windows. (runs before repo cloning)
4   -init:
5   - - git config --global core.autocrlf input
6   -
7   -# Test against these versions of Node.js.
8   -environment:
9   - matrix:
10   - - nodejs_version: "0.10"
11   - - nodejs_version: "0.8"
12   - - nodejs_version: "0.11"
13   -
14   -# Allow failing jobs for bleeding-edge Node.js versions.
15   -matrix:
16   - allow_failures:
17   - - nodejs_version: "0.11"
18   -
19   -# Install scripts. (runs after repo cloning)
20   -install:
21   - # Get the latest stable version of Node 0.STABLE.latest
22   - - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version)
23   - # Typical npm stuff.
24   - - npm install
25   - # Grunt-specific stuff.
26   - - npm install -g grunt-cli
27   - - npm uninstall grunt # https://github.com/npm/npm/issues/3958
28   -
29   -# Post-install test scripts.
30   -test_script:
31   - # Output useful info for debugging.
32   - - node --version
33   - - npm --version
34   - # We test multiple Windows shells because of prior stdout buffering issues
35   - # filed against Grunt. https://github.com/joyent/node/issues/3584
36   - - ps: "npm test # PowerShell" # Pass comment to PS for easier debugging
37   - - cmd: npm test
38   -
39   -# Don't actually build.
40   -build: off
41   -
42   -# Set build version format here instead of in the admin panel.
43   -version: "{build}"
node_modules/grunt/internal-tasks/bump.js deleted
1   -/*
2   - * grunt-contrib-bump
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman, contributors
6   - * Licensed under the MIT license.
7   - */
8   -
9   -'use strict';
10   -
11   -var semver = require('semver');
12   -var shell = require('shelljs');
13   -
14   -module.exports = function(grunt) {
15   -
16   - grunt.registerTask('bump', 'Bump the version property of a JSON file.', function() {
17   - // Validate specified semver increment modes.
18   - var valids = ['major', 'minor', 'patch', 'prerelease'];
19   - var modes = [];
20   - this.args.forEach(function(mode) {
21   - var matches = [];
22   - valids.forEach(function(valid) {
23   - if (valid.indexOf(mode) === 0) { matches.push(valid); }
24   - });
25   - if (matches.length === 0) {
26   - grunt.log.error('Error: mode "' + mode + '" does not match any known modes.');
27   - } else if (matches.length > 1) {
28   - grunt.log.error('Error: mode "' + mode + '" is ambiguous (possibly: ' + matches.join(', ') + ').');
29   - } else {
30   - modes.push(matches[0]);
31   - }
32   - });
33   - if (this.errorCount === 0 && modes.length === 0) {
34   - grunt.log.error('Error: no modes specified.');
35   - }
36   - if (this.errorCount > 0) {
37   - grunt.log.error('Valid modes are: ' + valids.join(', ') + '.');
38   - throw new Error('Use valid modes (or unambiguous mode abbreviations).');
39   - }
40   - // Options.
41   - var options = this.options({
42   - filepaths: ['package.json'],
43   - syncVersions: false,
44   - commit: true,
45   - commitMessage: 'Bumping version to {%= version %}.',
46   - tag: true,
47   - tagName: 'v{%= version %}',
48   - tagMessage: 'Version {%= version %}',
49   - tagPrerelease: false,
50   - });
51   - // Normalize filepaths to array.
52   - var filepaths = Array.isArray(options.filepaths) ? options.filepaths : [options.filepaths];
53   - // Process JSON files, in-order.
54   - var versions = {};
55   - filepaths.forEach(function(filepath) {
56   - var o = grunt.file.readJSON(filepath);
57   - var origVersion = o.version;
58   - // If syncVersions is enabled, only grab version from the first file,
59   - // guaranteeing new versions will always be in sync.
60   - var firstVersion = Object.keys(versions)[0];
61   - if (options.syncVersions && firstVersion) {
62   - o.version = firstVersion;
63   - }
64   - modes.forEach(function(mode) {
65   - var orig = o.version;
66   - var s = semver.parse(o.version);
67   - s.inc(mode);
68   - o.version = String(s);
69   - // Workaround for https://github.com/isaacs/node-semver/issues/50
70   - if (/-/.test(orig) && mode === 'patch') {
71   - o.version = o.version.replace(/\d+$/, function(n) { return n - 1; });
72   - }
73   - // If prerelease on an un-prerelease version, bump patch version first
74   - if (!/-/.test(orig) && mode === 'prerelease') {
75   - s.inc('patch');
76   - s.inc('prerelease');
77   - o.version = String(s);
78   - }
79   - });
80   - if (versions[origVersion]) {
81   - versions[origVersion].filepaths.push(filepath);
82   - } else {
83   - versions[origVersion] = {version: o.version, filepaths: [filepath]};
84   - }
85   - // Actually *do* something.
86   - grunt.log.write('Bumping version in ' + filepath + ' from ' + origVersion + ' to ' + o.version + '...');
87   - grunt.file.write(filepath, JSON.stringify(o, null, 2));
88   - grunt.log.ok();
89   - });
90   - // Commit changed files?
91   - if (options.commit) {
92   - Object.keys(versions).forEach(function(origVersion) {
93   - var o = versions[origVersion];
94   - commit(o.filepaths, processTemplate(options.commitMessage, {
95   - version: o.version,
96   - origVersion: origVersion
97   - }));
98   - });
99   - }
100   - // We're only going to create one tag. And it's going to be the new
101   - // version of the first bumped file. Because, sanity.
102   - var newVersion = versions[Object.keys(versions)[0]].version;
103   - if (options.tag) {
104   - if (options.tagPrerelease || modes.indexOf('prerelease') === -1) {
105   - tag(
106   - processTemplate(options.tagName, {version: newVersion}),
107   - processTemplate(options.tagMessage, {version: newVersion})
108   - );
109   - } else {
110   - grunt.log.writeln('Not tagging (prerelease version).');
111   - }
112   - }
113   - if (this.errorCount > 0) {
114   - grunt.warn('There were errors.');
115   - }
116   - });
117   -
118   - // Using custom delimiters keeps templates from being auto-processed.
119   - grunt.template.addDelimiters('bump', '{%', '%}');
120   -
121   - function processTemplate(message, data) {
122   - return grunt.template.process(message, {
123   - delimiters: 'bump',
124   - data: data,
125   - });
126   - }
127   -
128   - // Kinda borrowed from https://github.com/geddski/grunt-release
129   - function commit(filepaths, message) {
130   - grunt.log.writeln('Committing ' + filepaths.join(', ') + ' with message: ' + message);
131   - run("git commit -m '" + message + "' '" + filepaths.join("' '") + "'");
132   - }
133   -
134   - function tag(name, message) {
135   - grunt.log.writeln('Tagging ' + name + ' with message: ' + message);
136   - run("git tag '" + name + "' -m '" + message + "'");
137   - }
138   -
139   - function run(cmd) {
140   - if (grunt.option('no-write')) {
141   - grunt.verbose.writeln('Not actually running: ' + cmd);
142   - } else {
143   - grunt.verbose.writeln('Running: ' + cmd);
144   - var result = shell.exec(cmd, {silent:true});
145   - if (result.code !== 0) {
146   - grunt.log.error('Error (' + result.code + ') ' + result.output);
147   - }
148   - }
149   - }
150   -
151   -};
152 0 \ No newline at end of file
node_modules/grunt/internal-tasks/subgrunt.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -module.exports = function(grunt) {
13   -
14   - // Run sub-grunt files, because right now, testing tasks is a pain.
15   - grunt.registerMultiTask('subgrunt', 'Run a sub-gruntfile.', function() {
16   - var path = require('path');
17   - grunt.util.async.forEachSeries(this.filesSrc, function(gruntfile, next) {
18   - grunt.log.write('Loading ' + gruntfile + '...');
19   - grunt.util.spawn({
20   - grunt: true,
21   - args: ['--gruntfile', path.resolve(gruntfile)],
22   - }, function(error, result) {
23   - if (error) {
24   - grunt.log.error().error(result.stdout).writeln();
25   - next(new Error('Error running sub-gruntfile "' + gruntfile + '".'));
26   - } else {
27   - grunt.log.ok().verbose.ok(result.stdout);
28   - next();
29   - }
30   - });
31   - }, this.async());
32   - });
33   -
34   -};
node_modules/grunt/lib/grunt.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -// Nodejs libs.
13   -var path = require('path');
14   -
15   -// This allows grunt to require() .coffee files.
16   -require('coffee-script');
17   -
18   -// The module to be exported.
19   -var grunt = module.exports = {};
20   -
21   -// Expose internal grunt libs.
22   -function gRequire(name) {
23   - return grunt[name] = require('./grunt/' + name);
24   -}
25   -
26   -var util = require('grunt-legacy-util');
27   -grunt.util = util;
28   -grunt.util.task = require('./util/task');
29   -
30   -var Log = require('grunt-legacy-log').Log;
31   -var log = new Log({grunt: grunt});
32   -grunt.log = log;
33   -
34   -gRequire('template');
35   -gRequire('event');
36   -var fail = gRequire('fail');
37   -gRequire('file');
38   -var option = gRequire('option');
39   -var config = gRequire('config');
40   -var task = gRequire('task');
41   -var help = gRequire('help');
42   -gRequire('cli');
43   -var verbose = grunt.verbose = log.verbose;
44   -
45   -// Expose some grunt metadata.
46   -grunt.package = require('../package.json');
47   -grunt.version = grunt.package.version;
48   -
49   -// Expose specific grunt lib methods on grunt.
50   -function gExpose(obj, methodName, newMethodName) {
51   - grunt[newMethodName || methodName] = obj[methodName].bind(obj);
52   -}
53   -gExpose(task, 'registerTask');
54   -gExpose(task, 'registerMultiTask');
55   -gExpose(task, 'registerInitTask');
56   -gExpose(task, 'renameTask');
57   -gExpose(task, 'loadTasks');
58   -gExpose(task, 'loadNpmTasks');
59   -gExpose(config, 'init', 'initConfig');
60   -gExpose(fail, 'warn');
61   -gExpose(fail, 'fatal');
62   -
63   -// Expose the task interface. I've never called this manually, and have no idea
64   -// how it will work. But it might.
65   -grunt.tasks = function(tasks, options, done) {
66   - // Update options with passed-in options.
67   - option.init(options);
68   -
69   - // Display the grunt version and quit if the user did --version.
70   - var _tasks, _options;
71   - if (option('version')) {
72   - // Not --verbose.
73   - log.writeln('grunt v' + grunt.version);
74   -
75   - if (option('verbose')) {
76   - // --verbose
77   - verbose.writeln('Install path: ' + path.resolve(__dirname, '..'));
78   - // Yes, this is a total hack, but we don't want to log all that verbose
79   - // task initialization stuff here.
80   - grunt.log.muted = true;
81   - // Initialize task system so that available tasks can be listed.
82   - grunt.task.init([], {help: true});
83   - // Re-enable logging.
84   - grunt.log.muted = false;
85   -
86   - // Display available tasks (for shell completion, etc).
87   - _tasks = Object.keys(grunt.task._tasks).sort();
88   - verbose.writeln('Available tasks: ' + _tasks.join(' '));
89   -
90   - // Display available options (for shell completion, etc).
91   - _options = [];
92   - Object.keys(grunt.cli.optlist).forEach(function(long) {
93   - var o = grunt.cli.optlist[long];
94   - _options.push('--' + (o.negate ? 'no-' : '') + long);
95   - if (o.short) { _options.push('-' + o.short); }
96   - });
97   - verbose.writeln('Available options: ' + _options.join(' '));
98   - }
99   -
100   - return;
101   - }
102   -
103   - // Init colors.
104   - log.initColors();
105   -
106   - // Display help and quit if the user did --help.
107   - if (option('help')) {
108   - help.display();
109   - return;
110   - }
111   -
112   - // A little header stuff.
113   - verbose.header('Initializing').writeflags(option.flags(), 'Command-line options');
114   -
115   - // Determine and output which tasks will be run.
116   - var tasksSpecified = tasks && tasks.length > 0;
117   - tasks = task.parseArgs([tasksSpecified ? tasks : 'default']);
118   -
119   - // Initialize tasks.
120   - task.init(tasks);
121   -
122   - verbose.writeln();
123   - if (!tasksSpecified) {
124   - verbose.writeln('No tasks specified, running default tasks.');
125   - }
126   - verbose.writeflags(tasks, 'Running tasks');
127   -
128   - // Handle otherwise unhandleable (probably asynchronous) exceptions.
129   - var uncaughtHandler = function(e) {
130   - fail.fatal(e, fail.code.TASK_FAILURE);
131   - };
132   - process.on('uncaughtException', uncaughtHandler);
133   -
134   - // Report, etc when all tasks have completed.
135   - task.options({
136   - error: function(e) {
137   - fail.warn(e, fail.code.TASK_FAILURE);
138   - },
139   - done: function() {
140   - // Stop handling uncaught exceptions so that we don't leave any
141   - // unwanted process-level side effects behind. There is no need to do
142   - // this in the error callback, because fail.warn() will either kill
143   - // the process, or with --force keep on going all the way here.
144   - process.removeListener('uncaughtException', uncaughtHandler);
145   -
146   - // Output a final fail / success report.
147   - fail.report();
148   -
149   - if (done) {
150   - // Execute "done" function when done (only if passed, of course).
151   - done();
152   - } else {
153   - // Otherwise, explicitly exit.
154   - util.exit(0);
155   - }
156   - }
157   - });
158   -
159   - // Execute all tasks, in order. Passing each task individually in a forEach
160   - // allows the error callback to execute multiple times.
161   - tasks.forEach(function(name) { task.run(name); });
162   - // Run tasks async internally to reduce call-stack, per:
163   - // https://github.com/gruntjs/grunt/pull/1026
164   - task.start({asyncDone:true});
165   -};
node_modules/grunt/lib/grunt/cli.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -var grunt = require('../grunt');
13   -
14   -// Nodejs libs.
15   -var path = require('path');
16   -
17   -// External libs.
18   -var nopt = require('nopt');
19   -
20   -// This is only executed when run via command line.
21   -var cli = module.exports = function(options, done) {
22   - // CLI-parsed options override any passed-in "default" options.
23   - if (options) {
24   - // For each default option...
25   - Object.keys(options).forEach(function(key) {
26   - if (!(key in cli.options)) {
27   - // If this option doesn't exist in the parsed cli.options, add it in.
28   - cli.options[key] = options[key];
29   - } else if (cli.optlist[key].type === Array) {
30   - // If this option's type is Array, append it to any existing array
31   - // (or create a new array).
32   - [].push.apply(cli.options[key], options[key]);
33   - }
34   - });
35   - }
36   -
37   - // Run tasks.
38   - grunt.tasks(cli.tasks, cli.options, done);
39   -};
40   -
41   -// Default options.
42   -var optlist = cli.optlist = {
43   - help: {
44   - short: 'h',
45   - info: 'Display this help text.',
46   - type: Boolean
47   - },
48   - base: {
49   - info: 'Specify an alternate base path. By default, all file paths are relative to the Gruntfile. (grunt.file.setBase) *',
50   - type: path
51   - },
52   - color: {
53   - info: 'Disable colored output.',
54   - type: Boolean,
55   - negate: true
56   - },
57   - gruntfile: {
58   - info: 'Specify an alternate Gruntfile. By default, grunt looks in the current or parent directories for the nearest Gruntfile.js or Gruntfile.coffee file.',
59   - type: path
60   - },
61   - debug: {
62   - short: 'd',
63   - info: 'Enable debugging mode for tasks that support it.',
64   - type: [Number, Boolean]
65   - },
66   - stack: {
67   - info: 'Print a stack trace when exiting with a warning or fatal error.',
68   - type: Boolean
69   - },
70   - force: {
71   - short: 'f',
72   - info: 'A way to force your way past warnings. Want a suggestion? Don\'t use this option, fix your code.',
73   - type: Boolean
74   - },
75   - tasks: {
76   - info: 'Additional directory paths to scan for task and "extra" files. (grunt.loadTasks) *',
77   - type: Array
78   - },
79   - npm: {
80   - info: 'Npm-installed grunt plugins to scan for task and "extra" files. (grunt.loadNpmTasks) *',
81   - type: Array
82   - },
83   - write: {
84   - info: 'Disable writing files (dry run).',
85   - type: Boolean,
86   - negate: true
87   - },
88   - verbose: {
89   - short: 'v',
90   - info: 'Verbose mode. A lot more information output.',
91   - type: Boolean
92   - },
93   - version: {
94   - short: 'V',
95   - info: 'Print the grunt version. Combine with --verbose for more info.',
96   - type: Boolean
97   - },
98   - // Even though shell auto-completion is now handled by grunt-cli, leave this
99   - // option here for display in the --help screen.
100   - completion: {
101   - info: 'Output shell auto-completion rules. See the grunt-cli documentation for more information.',
102   - type: String
103   - },
104   -};
105   -
106   -// Parse `optlist` into a form that nopt can handle.
107   -var aliases = {};
108   -var known = {};
109   -
110   -Object.keys(optlist).forEach(function(key) {
111   - var short = optlist[key].short;
112   - if (short) {
113   - aliases[short] = '--' + key;
114   - }
115   - known[key] = optlist[key].type;
116   -});
117   -
118   -var parsed = nopt(known, aliases, process.argv, 2);
119   -cli.tasks = parsed.argv.remain;
120   -cli.options = parsed;
121   -delete parsed.argv;
122   -
123   -// Initialize any Array options that weren't initialized.
124   -Object.keys(optlist).forEach(function(key) {
125   - if (optlist[key].type === Array && !(key in cli.options)) {
126   - cli.options[key] = [];
127   - }
128   -});
node_modules/grunt/lib/grunt/config.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -var grunt = require('../grunt');
13   -
14   -// Get/set config data. If value was passed, set. Otherwise, get.
15   -var config = module.exports = function(prop, value) {
16   - if (arguments.length === 2) {
17   - // Two arguments were passed, set the property's value.
18   - return config.set(prop, value);
19   - } else {
20   - // Get the property's value (or the entire data object).
21   - return config.get(prop);
22   - }
23   -};
24   -
25   -// The actual config data.
26   -config.data = {};
27   -
28   -// Escape any . in name with \. so dot-based namespacing works properly.
29   -config.escape = function(str) {
30   - return str.replace(/\./g, '\\.');
31   -};
32   -
33   -// Return prop as a string.
34   -config.getPropString = function(prop) {
35   - return Array.isArray(prop) ? prop.map(config.escape).join('.') : prop;
36   -};
37   -
38   -// Get raw, unprocessed config data.
39   -config.getRaw = function(prop) {
40   - if (prop) {
41   - // Prop was passed, get that specific property's value.
42   - return grunt.util.namespace.get(config.data, config.getPropString(prop));
43   - } else {
44   - // No prop was passed, return the entire config.data object.
45   - return config.data;
46   - }
47   -};
48   -
49   -// Match '<%= FOO %>' where FOO is a propString, eg. foo or foo.bar but not
50   -// a method call like foo() or foo.bar().
51   -var propStringTmplRe = /^<%=\s*([a-z0-9_$]+(?:\.[a-z0-9_$]+)*)\s*%>$/i;
52   -
53   -// Get config data, recursively processing templates.
54   -config.get = function(prop) {
55   - return config.process(config.getRaw(prop));
56   -};
57   -
58   -// Expand a config value recursively. Used for post-processing raw values
59   -// already retrieved from the config.
60   -config.process = function(raw) {
61   - return grunt.util.recurse(raw, function(value) {
62   - // If the value is not a string, return it.
63   - if (typeof value !== 'string') { return value; }
64   - // If possible, access the specified property via config.get, in case it
65   - // doesn't refer to a string, but instead refers to an object or array.
66   - var matches = value.match(propStringTmplRe);
67   - var result;
68   - if (matches) {
69   - result = config.get(matches[1]);
70   - // If the result retrieved from the config data wasn't null or undefined,
71   - // return it.
72   - if (result != null) { return result; }
73   - }
74   - // Process the string as a template.
75   - return grunt.template.process(value, {data: config.data});
76   - });
77   -};
78   -
79   -// Set config data.
80   -config.set = function(prop, value) {
81   - return grunt.util.namespace.set(config.data, config.getPropString(prop), value);
82   -};
83   -
84   -// Deep merge config data.
85   -config.merge = function(obj) {
86   - grunt.util._.merge(config.data, obj);
87   - return config.data;
88   -};
89   -
90   -// Initialize config data.
91   -config.init = function(obj) {
92   - grunt.verbose.write('Initializing config...').ok();
93   - // Initialize and return data.
94   - return (config.data = obj || {});
95   -};
96   -
97   -// Test to see if required config params have been defined. If not, throw an
98   -// exception (use this inside of a task).
99   -config.requires = function() {
100   - var p = grunt.util.pluralize;
101   - var props = grunt.util.toArray(arguments).map(config.getPropString);
102   - var msg = 'Verifying propert' + p(props.length, 'y/ies') +
103   - ' ' + grunt.log.wordlist(props) + ' exist' + p(props.length, 's') +
104   - ' in config...';
105   - grunt.verbose.write(msg);
106   - var failProps = config.data && props.filter(function(prop) {
107   - return config.get(prop) == null;
108   - }).map(function(prop) {
109   - return '"' + prop + '"';
110   - });
111   - if (config.data && failProps.length === 0) {
112   - grunt.verbose.ok();
113   - return true;
114   - } else {
115   - grunt.verbose.or.write(msg);
116   - grunt.log.error().error('Unable to process task.');
117   - if (!config.data) {
118   - throw grunt.util.error('Unable to load config.');
119   - } else {
120   - throw grunt.util.error('Required config propert' +
121   - p(failProps.length, 'y/ies') + ' ' + failProps.join(', ') + ' missing.');
122   - }
123   - }
124   -};
node_modules/grunt/lib/grunt/event.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -// External lib.
13   -var EventEmitter2 = require('eventemitter2').EventEmitter2;
14   -
15   -// Awesome.
16   -module.exports = new EventEmitter2({wildcard: true});
node_modules/grunt/lib/grunt/fail.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -var grunt = require('../grunt');
13   -
14   -// The module to be exported.
15   -var fail = module.exports = {};
16   -
17   -// Error codes.
18   -fail.code = {
19   - FATAL_ERROR: 1,
20   - MISSING_GRUNTFILE: 2,
21   - TASK_FAILURE: 3,
22   - TEMPLATE_ERROR: 4,
23   - INVALID_AUTOCOMPLETE: 5,
24   - WARNING: 6,
25   -};
26   -
27   -// DRY it up!
28   -function writeln(e, mode) {
29   - grunt.log.muted = false;
30   - var msg = String(e.message || e);
31   - if (!grunt.option('no-color')) { msg += '\x07'; } // Beep!
32   - if (mode === 'warn') {
33   - msg = 'Warning: ' + msg + ' ';
34   - msg += (grunt.option('force') ? 'Used --force, continuing.'.underline : 'Use --force to continue.');
35   - msg = msg.yellow;
36   - } else {
37   - msg = ('Fatal error: ' + msg).red;
38   - }
39   - grunt.log.writeln(msg);
40   -}
41   -
42   -// If --stack is enabled, log the appropriate error stack (if it exists).
43   -function dumpStack(e) {
44   - if (grunt.option('stack')) {
45   - if (e.origError && e.origError.stack) {
46   - console.log(e.origError.stack);
47   - } else if (e.stack) {
48   - console.log(e.stack);
49   - }
50   - }
51   -}
52   -
53   -// A fatal error occurred. Abort immediately.
54   -fail.fatal = function(e, errcode) {
55   - writeln(e, 'fatal');
56   - dumpStack(e);
57   - grunt.util.exit(typeof errcode === 'number' ? errcode : fail.code.FATAL_ERROR);
58   -};
59   -
60   -// Keep track of error and warning counts.
61   -fail.errorcount = 0;
62   -fail.warncount = 0;
63   -
64   -// A warning occurred. Abort immediately unless -f or --force was used.
65   -fail.warn = function(e, errcode) {
66   - var message = typeof e === 'string' ? e : e.message;
67   - fail.warncount++;
68   - writeln(message, 'warn');
69   - // If -f or --force aren't used, stop script processing.
70   - if (!grunt.option('force')) {
71   - dumpStack(e);
72   - grunt.log.writeln().fail('Aborted due to warnings.');
73   - grunt.util.exit(typeof errcode === 'number' ? errcode : fail.code.WARNING);
74   - }
75   -};
76   -
77   -// This gets called at the very end.
78   -fail.report = function() {
79   - if (fail.warncount > 0) {
80   - grunt.log.writeln().fail('Done, but with warnings.');
81   - } else {
82   - grunt.log.writeln().success('Done, without errors.');
83   - }
84   -};
node_modules/grunt/lib/grunt/file.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -var grunt = require('../grunt');
13   -
14   -// Nodejs libs.
15   -var fs = require('fs');
16   -var path = require('path');
17   -
18   -// The module to be exported.
19   -var file = module.exports = {};
20   -
21   -// External libs.
22   -file.glob = require('glob');
23   -file.minimatch = require('minimatch');
24   -file.findup = require('findup-sync');
25   -var YAML = require('js-yaml');
26   -var rimraf = require('rimraf');
27   -var iconv = require('iconv-lite');
28   -
29   -// Windows?
30   -var win32 = process.platform === 'win32';
31   -
32   -// Normalize \\ paths to / paths.
33   -var unixifyPath = function(filepath) {
34   - if (win32) {
35   - return filepath.replace(/\\/g, '/');
36   - } else {
37   - return filepath;
38   - }
39   -};
40   -
41   -// Change the current base path (ie, CWD) to the specified path.
42   -file.setBase = function() {
43   - var dirpath = path.join.apply(path, arguments);
44   - process.chdir(dirpath);
45   -};
46   -
47   -// Process specified wildcard glob patterns or filenames against a
48   -// callback, excluding and uniquing files in the result set.
49   -var processPatterns = function(patterns, fn) {
50   - // Filepaths to return.
51   - var result = [];
52   - // Iterate over flattened patterns array.
53   - grunt.util._.flatten(patterns).forEach(function(pattern) {
54   - // If the first character is ! it should be omitted
55   - var exclusion = pattern.indexOf('!') === 0;
56   - // If the pattern is an exclusion, remove the !
57   - if (exclusion) { pattern = pattern.slice(1); }
58   - // Find all matching files for this pattern.
59   - var matches = fn(pattern);
60   - if (exclusion) {
61   - // If an exclusion, remove matching files.
62   - result = grunt.util._.difference(result, matches);
63   - } else {
64   - // Otherwise add matching files.
65   - result = grunt.util._.union(result, matches);
66   - }
67   - });
68   - return result;
69   -};
70   -
71   -// Match a filepath or filepaths against one or more wildcard patterns. Returns
72   -// all matching filepaths.
73   -file.match = function(options, patterns, filepaths) {
74   - if (grunt.util.kindOf(options) !== 'object') {
75   - filepaths = patterns;
76   - patterns = options;
77   - options = {};
78   - }
79   - // Return empty set if either patterns or filepaths was omitted.
80   - if (patterns == null || filepaths == null) { return []; }
81   - // Normalize patterns and filepaths to arrays.
82   - if (!Array.isArray(patterns)) { patterns = [patterns]; }
83   - if (!Array.isArray(filepaths)) { filepaths = [filepaths]; }
84   - // Return empty set if there are no patterns or filepaths.
85   - if (patterns.length === 0 || filepaths.length === 0) { return []; }
86   - // Return all matching filepaths.
87   - return processPatterns(patterns, function(pattern) {
88   - return file.minimatch.match(filepaths, pattern, options);
89   - });
90   -};
91   -
92   -// Match a filepath or filepaths against one or more wildcard patterns. Returns
93   -// true if any of the patterns match.
94   -file.isMatch = function() {
95   - return file.match.apply(file, arguments).length > 0;
96   -};
97   -
98   -// Return an array of all file paths that match the given wildcard patterns.
99   -file.expand = function() {
100   - var args = grunt.util.toArray(arguments);
101   - // If the first argument is an options object, save those options to pass
102   - // into the file.glob.sync method.
103   - var options = grunt.util.kindOf(args[0]) === 'object' ? args.shift() : {};
104   - // Use the first argument if it's an Array, otherwise convert the arguments
105   - // object to an array and use that.
106   - var patterns = Array.isArray(args[0]) ? args[0] : args;
107   - // Return empty set if there are no patterns or filepaths.
108   - if (patterns.length === 0) { return []; }
109   - // Return all matching filepaths.
110   - var matches = processPatterns(patterns, function(pattern) {
111   - // Find all matching files for this pattern.
112   - return file.glob.sync(pattern, options);
113   - });
114   - // Filter result set?
115   - if (options.filter) {
116   - matches = matches.filter(function(filepath) {
117   - filepath = path.join(options.cwd || '', filepath);
118   - try {
119   - if (typeof options.filter === 'function') {
120   - return options.filter(filepath);
121   - } else {
122   - // If the file is of the right type and exists, this should work.
123   - return fs.statSync(filepath)[options.filter]();
124   - }
125   - } catch(e) {
126   - // Otherwise, it's probably not the right type.
127   - return false;
128   - }
129   - });
130   - }
131   - return matches;
132   -};
133   -
134   -var pathSeparatorRe = /[\/\\]/g;
135   -
136   -// The "ext" option refers to either everything after the first dot (default)
137   -// or everything after the last dot.
138   -var extDotRe = {
139   - first: /(\.[^\/]*)?$/,
140   - last: /(\.[^\/\.]*)?$/,
141   -};
142   -
143   -// Build a multi task "files" object dynamically.
144   -file.expandMapping = function(patterns, destBase, options) {
145   - options = grunt.util._.defaults({}, options, {
146   - extDot: 'first',
147   - rename: function(destBase, destPath) {
148   - return path.join(destBase || '', destPath);
149   - }
150   - });
151   - var files = [];
152   - var fileByDest = {};
153   - // Find all files matching pattern, using passed-in options.
154   - file.expand(options, patterns).forEach(function(src) {
155   - var destPath = src;
156   - // Flatten?
157   - if (options.flatten) {
158   - destPath = path.basename(destPath);
159   - }
160   - // Change the extension?
161   - if ('ext' in options) {
162   - destPath = destPath.replace(extDotRe[options.extDot], options.ext);
163   - }
164   - // Generate destination filename.
165   - var dest = options.rename(destBase, destPath, options);
166   - // Prepend cwd to src path if necessary.
167   - if (options.cwd) { src = path.join(options.cwd, src); }
168   - // Normalize filepaths to be unix-style.
169   - dest = dest.replace(pathSeparatorRe, '/');
170   - src = src.replace(pathSeparatorRe, '/');
171   - // Map correct src path to dest path.
172   - if (fileByDest[dest]) {
173   - // If dest already exists, push this src onto that dest's src array.
174   - fileByDest[dest].src.push(src);
175   - } else {
176   - // Otherwise create a new src-dest file mapping object.
177   - files.push({
178   - src: [src],
179   - dest: dest,
180   - });
181   - // And store a reference for later use.
182   - fileByDest[dest] = files[files.length - 1];
183   - }
184   - });
185   - return files;
186   -};
187   -
188   -// Like mkdir -p. Create a directory and any intermediary directories.
189   -file.mkdir = function(dirpath, mode) {
190   - if (grunt.option('no-write')) { return; }
191   - // Set directory mode in a strict-mode-friendly way.
192   - if (mode == null) {
193   - mode = parseInt('0777', 8) & (~process.umask());
194   - }
195   - dirpath.split(pathSeparatorRe).reduce(function(parts, part) {
196   - parts += part + '/';
197   - var subpath = path.resolve(parts);
198   - if (!file.exists(subpath)) {
199   - try {
200   - fs.mkdirSync(subpath, mode);
201   - } catch(e) {
202   - throw grunt.util.error('Unable to create directory "' + subpath + '" (Error code: ' + e.code + ').', e);
203   - }
204   - }
205   - return parts;
206   - }, '');
207   -};
208   -
209   -// Recurse into a directory, executing callback for each file.
210   -file.recurse = function recurse(rootdir, callback, subdir) {
211   - var abspath = subdir ? path.join(rootdir, subdir) : rootdir;
212   - fs.readdirSync(abspath).forEach(function(filename) {
213   - var filepath = path.join(abspath, filename);
214   - if (fs.statSync(filepath).isDirectory()) {
215   - recurse(rootdir, callback, unixifyPath(path.join(subdir || '', filename || '')));
216   - } else {
217   - callback(unixifyPath(filepath), rootdir, subdir, filename);
218   - }
219   - });
220   -};
221   -
222   -// The default file encoding to use.
223   -file.defaultEncoding = 'utf8';
224   -// Whether to preserve the BOM on file.read rather than strip it.
225   -file.preserveBOM = false;
226   -
227   -// Read a file, return its contents.
228   -file.read = function(filepath, options) {
229   - if (!options) { options = {}; }
230   - var contents;
231   - grunt.verbose.write('Reading ' + filepath + '...');
232   - try {
233   - contents = fs.readFileSync(String(filepath));
234   - // If encoding is not explicitly null, convert from encoded buffer to a
235   - // string. If no encoding was specified, use the default.
236   - if (options.encoding !== null) {
237   - contents = iconv.decode(contents, options.encoding || file.defaultEncoding);
238   - // Strip any BOM that might exist.
239   - if (!file.preserveBOM && contents.charCodeAt(0) === 0xFEFF) {
240   - contents = contents.substring(1);
241   - }
242   - }
243   - grunt.verbose.ok();
244   - return contents;
245   - } catch(e) {
246   - grunt.verbose.error();
247   - throw grunt.util.error('Unable to read "' + filepath + '" file (Error code: ' + e.code + ').', e);
248   - }
249   -};
250   -
251   -// Read a file, parse its contents, return an object.
252   -file.readJSON = function(filepath, options) {
253   - var src = file.read(filepath, options);
254   - var result;
255   - grunt.verbose.write('Parsing ' + filepath + '...');
256   - try {
257   - result = JSON.parse(src);
258   - grunt.verbose.ok();
259   - return result;
260   - } catch(e) {
261   - grunt.verbose.error();
262   - throw grunt.util.error('Unable to parse "' + filepath + '" file (' + e.message + ').', e);
263   - }
264   -};
265   -
266   -// Read a YAML file, parse its contents, return an object.
267   -file.readYAML = function(filepath, options) {
268   - var src = file.read(filepath, options);
269   - var result;
270   - grunt.verbose.write('Parsing ' + filepath + '...');
271   - try {
272   - result = YAML.load(src);
273   - grunt.verbose.ok();
274   - return result;
275   - } catch(e) {
276   - grunt.verbose.error();
277   - throw grunt.util.error('Unable to parse "' + filepath + '" file (' + e.problem + ').', e);
278   - }
279   -};
280   -
281   -// Write a file.
282   -file.write = function(filepath, contents, options) {
283   - if (!options) { options = {}; }
284   - var nowrite = grunt.option('no-write');
285   - grunt.verbose.write((nowrite ? 'Not actually writing ' : 'Writing ') + filepath + '...');
286   - // Create path, if necessary.
287   - file.mkdir(path.dirname(filepath));
288   - try {
289   - // If contents is already a Buffer, don't try to encode it. If no encoding
290   - // was specified, use the default.
291   - if (!Buffer.isBuffer(contents)) {
292   - contents = iconv.encode(contents, options.encoding || file.defaultEncoding);
293   - }
294   - // Actually write file.
295   - if (!nowrite) {
296   - fs.writeFileSync(filepath, contents);
297   - }
298   - grunt.verbose.ok();
299   - return true;
300   - } catch(e) {
301   - grunt.verbose.error();
302   - throw grunt.util.error('Unable to write "' + filepath + '" file (Error code: ' + e.code + ').', e);
303   - }
304   -};
305   -
306   -// Read a file, optionally processing its content, then write the output.
307   -file.copy = function(srcpath, destpath, options) {
308   - if (!options) { options = {}; }
309   - // If a process function was specified, and noProcess isn't true or doesn't
310   - // match the srcpath, process the file's source.
311   - var process = options.process && options.noProcess !== true &&
312   - !(options.noProcess && file.isMatch(options.noProcess, srcpath));
313   - // If the file will be processed, use the encoding as-specified. Otherwise,
314   - // use an encoding of null to force the file to be read/written as a Buffer.
315   - var readWriteOptions = process ? options : {encoding: null};
316   - // Actually read the file.
317   - var contents = file.read(srcpath, readWriteOptions);
318   - if (process) {
319   - grunt.verbose.write('Processing source...');
320   - try {
321   - contents = options.process(contents, srcpath);
322   - grunt.verbose.ok();
323   - } catch(e) {
324   - grunt.verbose.error();
325   - throw grunt.util.error('Error while processing "' + srcpath + '" file.', e);
326   - }
327   - }
328   - // Abort copy if the process function returns false.
329   - if (contents === false) {
330   - grunt.verbose.writeln('Write aborted.');
331   - } else {
332   - file.write(destpath, contents, readWriteOptions);
333   - }
334   -};
335   -
336   -// Delete folders and files recursively
337   -file.delete = function(filepath, options) {
338   - filepath = String(filepath);
339   -
340   - var nowrite = grunt.option('no-write');
341   - if (!options) {
342   - options = {force: grunt.option('force') || false};
343   - }
344   -
345   - grunt.verbose.write((nowrite ? 'Not actually deleting ' : 'Deleting ') + filepath + '...');
346   -
347   - if (!file.exists(filepath)) {
348   - grunt.verbose.error();
349   - grunt.log.warn('Cannot delete nonexistent file.');
350   - return false;
351   - }
352   -
353   - // Only delete cwd or outside cwd if --force enabled. Be careful, people!
354   - if (!options.force) {
355   - if (file.isPathCwd(filepath)) {
356   - grunt.verbose.error();
357   - grunt.fail.warn('Cannot delete the current working directory.');
358   - return false;
359   - } else if (!file.isPathInCwd(filepath)) {
360   - grunt.verbose.error();
361   - grunt.fail.warn('Cannot delete files outside the current working directory.');
362   - return false;
363   - }
364   - }
365   -
366   - try {
367   - // Actually delete. Or not.
368   - if (!nowrite) {
369   - rimraf.sync(filepath);
370   - }
371   - grunt.verbose.ok();
372   - return true;
373   - } catch(e) {
374   - grunt.verbose.error();
375   - throw grunt.util.error('Unable to delete "' + filepath + '" file (' + e.message + ').', e);
376   - }
377   -};
378   -
379   -// True if the file path exists.
380   -file.exists = function() {
381   - var filepath = path.join.apply(path, arguments);
382   - return fs.existsSync(filepath);
383   -};
384   -
385   -// True if the file is a symbolic link.
386   -file.isLink = function() {
387   - var filepath = path.join.apply(path, arguments);
388   - return file.exists(filepath) && fs.lstatSync(filepath).isSymbolicLink();
389   -};
390   -
391   -// True if the path is a directory.
392   -file.isDir = function() {
393   - var filepath = path.join.apply(path, arguments);
394   - return file.exists(filepath) && fs.statSync(filepath).isDirectory();
395   -};
396   -
397   -// True if the path is a file.
398   -file.isFile = function() {
399   - var filepath = path.join.apply(path, arguments);
400   - return file.exists(filepath) && fs.statSync(filepath).isFile();
401   -};
402   -
403   -// Is a given file path absolute?
404   -file.isPathAbsolute = function() {
405   - var filepath = path.join.apply(path, arguments);
406   - return path.resolve(filepath) === filepath.replace(/[\/\\]+$/, '');
407   -};
408   -
409   -// Do all the specified paths refer to the same path?
410   -file.arePathsEquivalent = function(first) {
411   - first = path.resolve(first);
412   - for (var i = 1; i < arguments.length; i++) {
413   - if (first !== path.resolve(arguments[i])) { return false; }
414   - }
415   - return true;
416   -};
417   -
418   -// Are descendant path(s) contained within ancestor path? Note: does not test
419   -// if paths actually exist.
420   -file.doesPathContain = function(ancestor) {
421   - ancestor = path.resolve(ancestor);
422   - var relative;
423   - for (var i = 1; i < arguments.length; i++) {
424   - relative = path.relative(path.resolve(arguments[i]), ancestor);
425   - if (relative === '' || /\w+/.test(relative)) { return false; }
426   - }
427   - return true;
428   -};
429   -
430   -// Test to see if a filepath is the CWD.
431   -file.isPathCwd = function() {
432   - var filepath = path.join.apply(path, arguments);
433   - try {
434   - return file.arePathsEquivalent(fs.realpathSync(process.cwd()), fs.realpathSync(filepath));
435   - } catch(e) {
436   - return false;
437   - }
438   -};
439   -
440   -// Test to see if a filepath is contained within the CWD.
441   -file.isPathInCwd = function() {
442   - var filepath = path.join.apply(path, arguments);
443   - try {
444   - return file.doesPathContain(fs.realpathSync(process.cwd()), fs.realpathSync(filepath));
445   - } catch(e) {
446   - return false;
447   - }
448   -};
node_modules/grunt/lib/grunt/help.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -var grunt = require('../grunt');
13   -
14   -// Nodejs libs.
15   -var path = require('path');
16   -
17   -// Set column widths.
18   -var col1len = 0;
19   -exports.initCol1 = function(str) {
20   - col1len = Math.max(col1len, str.length);
21   -};
22   -exports.initWidths = function() {
23   - // Widths for options/tasks table output.
24   - exports.widths = [1, col1len, 2, 76 - col1len];
25   -};
26   -
27   -// Render an array in table form.
28   -exports.table = function(arr) {
29   - arr.forEach(function(item) {
30   - grunt.log.writetableln(exports.widths, ['', grunt.util._.pad(item[0], col1len), '', item[1]]);
31   - });
32   -};
33   -
34   -// Methods to run, in-order.
35   -exports.queue = [
36   - 'initOptions',
37   - 'initTasks',
38   - 'initWidths',
39   - 'header',
40   - 'usage',
41   - 'options',
42   - 'optionsFooter',
43   - 'tasks',
44   - 'footer',
45   -];
46   -
47   -// Actually display stuff.
48   -exports.display = function() {
49   - exports.queue.forEach(function(name) { exports[name](); });
50   -};
51   -
52   -
53   -// Header.
54   -exports.header = function() {
55   - grunt.log.writeln('Grunt: The JavaScript Task Runner (v' + grunt.version + ')');
56   -};
57   -
58   -// Usage info.
59   -exports.usage = function() {
60   - grunt.log.header('Usage');
61   - grunt.log.writeln(' ' + path.basename(process.argv[1]) + ' [options] [task [task ...]]');
62   -};
63   -
64   -// Options.
65   -exports.initOptions = function() {
66   - // Build 2-column array for table view.
67   - exports._options = Object.keys(grunt.cli.optlist).map(function(long) {
68   - var o = grunt.cli.optlist[long];
69   - var col1 = '--' + (o.negate ? 'no-' : '') + long + (o.short ? ', -' + o.short : '');
70   - exports.initCol1(col1);
71   - return [col1, o.info];
72   - });
73   -};
74   -
75   -exports.options = function() {
76   - grunt.log.header('Options');
77   - exports.table(exports._options);
78   -};
79   -
80   -exports.optionsFooter = function() {
81   - grunt.log.writeln().writelns(
82   - 'Options marked with * have methods exposed via the grunt API and should ' +
83   - 'instead be specified inside the Gruntfile wherever possible.'
84   - );
85   -};
86   -
87   -// Tasks.
88   -exports.initTasks = function() {
89   - // Initialize task system so that the tasks can be listed.
90   - grunt.task.init([], {help: true});
91   -
92   - // Build object of tasks by info (where they were loaded from).
93   - exports._tasks = [];
94   - Object.keys(grunt.task._tasks).forEach(function(name) {
95   - exports.initCol1(name);
96   - var task = grunt.task._tasks[name];
97   - exports._tasks.push(task);
98   - });
99   -};
100   -
101   -exports.tasks = function() {
102   - grunt.log.header('Available tasks');
103   - if (exports._tasks.length === 0) {
104   - grunt.log.writeln('(no tasks found)');
105   - } else {
106   - exports.table(exports._tasks.map(function(task) {
107   - var info = task.info;
108   - if (task.multi) { info += ' *'; }
109   - return [task.name, info];
110   - }));
111   -
112   - grunt.log.writeln().writelns(
113   - 'Tasks run in the order specified. Arguments may be passed to tasks that ' +
114   - 'accept them by using colons, like "lint:files". Tasks marked with * are ' +
115   - '"multi tasks" and will iterate over all sub-targets if no argument is ' +
116   - 'specified.'
117   - );
118   - }
119   -
120   - grunt.log.writeln().writelns(
121   - 'The list of available tasks may change based on tasks directories or ' +
122   - 'grunt plugins specified in the Gruntfile or via command-line options.'
123   - );
124   -};
125   -
126   -// Footer.
127   -exports.footer = function() {
128   - grunt.log.writeln().writeln('For more information, see http://gruntjs.com/');
129   -};
node_modules/grunt/lib/grunt/option.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -// The actual option data.
13   -var data = {};
14   -
15   -// Get or set an option value.
16   -var option = module.exports = function(key, value) {
17   - var no = key.match(/^no-(.+)$/);
18   - if (arguments.length === 2) {
19   - return (data[key] = value);
20   - } else if (no) {
21   - return data[no[1]] === false;
22   - } else {
23   - return data[key];
24   - }
25   -};
26   -
27   -// Initialize option data.
28   -option.init = function(obj) {
29   - return (data = obj || {});
30   -};
31   -
32   -// List of options as flags.
33   -option.flags = function() {
34   - return Object.keys(data).filter(function(key) {
35   - // Don't display empty arrays.
36   - return !(Array.isArray(data[key]) && data[key].length === 0);
37   - }).map(function(key) {
38   - var val = data[key];
39   - return '--' + (val === false ? 'no-' : '') + key +
40   - (typeof val === 'boolean' ? '' : '=' + val);
41   - });
42   -};
node_modules/grunt/lib/grunt/task.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -var grunt = require('../grunt');
13   -
14   -// Nodejs libs.
15   -var path = require('path');
16   -
17   -// Extend generic "task" util lib.
18   -var parent = grunt.util.task.create();
19   -
20   -// The module to be exported.
21   -var task = module.exports = Object.create(parent);
22   -
23   -// A temporary registry of tasks and metadata.
24   -var registry = {tasks: [], untasks: [], meta: {}};
25   -
26   -// The last specified tasks message.
27   -var lastInfo;
28   -
29   -// Number of levels of recursion when loading tasks in collections.
30   -var loadTaskDepth = 0;
31   -
32   -// Keep track of the number of log.error() calls.
33   -var errorcount;
34   -
35   -// Override built-in registerTask.
36   -task.registerTask = function(name) {
37   - // Add task to registry.
38   - registry.tasks.push(name);
39   - // Register task.
40   - parent.registerTask.apply(task, arguments);
41   - // This task, now that it's been registered.
42   - var thisTask = task._tasks[name];
43   - // Metadata about the current task.
44   - thisTask.meta = grunt.util._.clone(registry.meta);
45   - // Override task function.
46   - var _fn = thisTask.fn;
47   - thisTask.fn = function(arg) {
48   - // Guaranteed to always be the actual task name.
49   - var name = thisTask.name;
50   - // Initialize the errorcount for this task.
51   - errorcount = grunt.fail.errorcount;
52   - // Return the number of errors logged during this task.
53   - Object.defineProperty(this, 'errorCount', {
54   - enumerable: true,
55   - get: function() {
56   - return grunt.fail.errorcount - errorcount;
57   - }
58   - });
59   - // Expose task.requires on `this`.
60   - this.requires = task.requires.bind(task);
61   - // Expose config.requires on `this`.
62   - this.requiresConfig = grunt.config.requires;
63   - // Return an options object with the specified defaults overwritten by task-
64   - // specific overrides, via the "options" property.
65   - this.options = function() {
66   - var args = [{}].concat(grunt.util.toArray(arguments)).concat([
67   - grunt.config([name, 'options'])
68   - ]);
69   - var options = grunt.util._.extend.apply(null, args);
70   - grunt.verbose.writeflags(options, 'Options');
71   - return options;
72   - };
73   - // If this task was an alias or a multi task called without a target,
74   - // only log if in verbose mode.
75   - var logger = _fn.alias || (thisTask.multi && (!arg || arg === '*')) ? 'verbose' : 'log';
76   - // Actually log.
77   - grunt[logger].header('Running "' + this.nameArgs + '"' +
78   - (this.name !== this.nameArgs ? ' (' + this.name + ')' : '') + ' task');
79   - // If --debug was specified, log the path to this task's source file.
80   - grunt[logger].debug('Task source: ' + thisTask.meta.filepath);
81   - // Actually run the task.
82   - return _fn.apply(this, arguments);
83   - };
84   - return task;
85   -};
86   -
87   -// Multi task targets can't start with _ or be a reserved property (options).
88   -function isValidMultiTaskTarget(target) {
89   - return !/^_|^options$/.test(target);
90   -}
91   -
92   -// Normalize multi task files.
93   -task.normalizeMultiTaskFiles = function(data, target) {
94   - var prop, obj;
95   - var files = [];
96   - if (grunt.util.kindOf(data) === 'object') {
97   - if ('src' in data || 'dest' in data) {
98   - obj = {};
99   - for (prop in data) {
100   - if (prop !== 'options') {
101   - obj[prop] = data[prop];
102   - }
103   - }
104   - files.push(obj);
105   - } else if (grunt.util.kindOf(data.files) === 'object') {
106   - for (prop in data.files) {
107   - files.push({src: data.files[prop], dest: grunt.config.process(prop)});
108   - }
109   - } else if (Array.isArray(data.files)) {
110   - grunt.util._.flatten(data.files).forEach(function(obj) {
111   - var prop;
112   - if ('src' in obj || 'dest' in obj) {
113   - files.push(obj);
114   - } else {
115   - for (prop in obj) {
116   - files.push({src: obj[prop], dest: grunt.config.process(prop)});
117   - }
118   - }
119   - });
120   - }
121   - } else {
122   - files.push({src: data, dest: grunt.config.process(target)});
123   - }
124   -
125   - // If no src/dest or files were specified, return an empty files array.
126   - if (files.length === 0) {
127   - grunt.verbose.writeln('File: ' + '[no files]'.yellow);
128   - return [];
129   - }
130   -
131   - // Process all normalized file objects.
132   - files = grunt.util._(files).chain().forEach(function(obj) {
133   - if (!('src' in obj) || !obj.src) { return; }
134   - // Normalize .src properties to flattened array.
135   - if (Array.isArray(obj.src)) {
136   - obj.src = grunt.util._.flatten(obj.src);
137   - } else {
138   - obj.src = [obj.src];
139   - }
140   - }).map(function(obj) {
141   - // Build options object, removing unwanted properties.
142   - var expandOptions = grunt.util._.extend({}, obj);
143   - delete expandOptions.src;
144   - delete expandOptions.dest;
145   -
146   - // Expand file mappings.
147   - if (obj.expand) {
148   - return grunt.file.expandMapping(obj.src, obj.dest, expandOptions).map(function(mapObj) {
149   - // Copy obj properties to result.
150   - var result = grunt.util._.extend({}, obj);
151   - // Make a clone of the orig obj available.
152   - result.orig = grunt.util._.extend({}, obj);
153   - // Set .src and .dest, processing both as templates.
154   - result.src = grunt.config.process(mapObj.src);
155   - result.dest = grunt.config.process(mapObj.dest);
156   - // Remove unwanted properties.
157   - ['expand', 'cwd', 'flatten', 'rename', 'ext'].forEach(function(prop) {
158   - delete result[prop];
159   - });
160   - return result;
161   - });
162   - }
163   -
164   - // Copy obj properties to result, adding an .orig property.
165   - var result = grunt.util._.extend({}, obj);
166   - // Make a clone of the orig obj available.
167   - result.orig = grunt.util._.extend({}, obj);
168   -
169   - if ('src' in result) {
170   - // Expose an expand-on-demand getter method as .src.
171   - Object.defineProperty(result, 'src', {
172   - enumerable: true,
173   - get: function fn() {
174   - var src;
175   - if (!('result' in fn)) {
176   - src = obj.src;
177   - // If src is an array, flatten it. Otherwise, make it into an array.
178   - src = Array.isArray(src) ? grunt.util._.flatten(src) : [src];
179   - // Expand src files, memoizing result.
180   - fn.result = grunt.file.expand(expandOptions, src);
181   - }
182   - return fn.result;
183   - }
184   - });
185   - }
186   -
187   - if ('dest' in result) {
188   - result.dest = obj.dest;
189   - }
190   -
191   - return result;
192   - }).flatten().value();
193   -
194   - // Log this.file src and dest properties when --verbose is specified.
195   - if (grunt.option('verbose')) {
196   - files.forEach(function(obj) {
197   - var output = [];
198   - if ('src' in obj) {
199   - output.push(obj.src.length > 0 ? grunt.log.wordlist(obj.src) : '[no src]'.yellow);
200   - }
201   - if ('dest' in obj) {
202   - output.push('-> ' + (obj.dest ? String(obj.dest).cyan : '[no dest]'.yellow));
203   - }
204   - if (output.length > 0) {
205   - grunt.verbose.writeln('Files: ' + output.join(' '));
206   - }
207   - });
208   - }
209   -
210   - return files;
211   -};
212   -
213   -// This is the most common "multi task" pattern.
214   -task.registerMultiTask = function(name, info, fn) {
215   - // If optional "info" string is omitted, shuffle arguments a bit.
216   - if (fn == null) {
217   - fn = info;
218   - info = 'Custom multi task.';
219   - }
220   - // Store a reference to the task object, in case the task gets renamed.
221   - var thisTask;
222   - task.registerTask(name, info, function(target) {
223   - // Guaranteed to always be the actual task name.
224   - var name = thisTask.name;
225   - // Arguments (sans target) as an array.
226   - this.args = grunt.util.toArray(arguments).slice(1);
227   - // If a target wasn't specified, run this task once for each target.
228   - if (!target || target === '*') {
229   - return task.runAllTargets(name, this.args);
230   - } else if (!isValidMultiTaskTarget(target)) {
231   - throw new Error('Invalid target "' + target + '" specified.');
232   - }
233   - // Fail if any required config properties have been omitted.
234   - this.requiresConfig([name, target]);
235   - // Return an options object with the specified defaults overwritten by task-
236   - // and/or target-specific overrides, via the "options" property.
237   - this.options = function() {
238   - var targetObj = grunt.config([name, target]);
239   - var args = [{}].concat(grunt.util.toArray(arguments)).concat([
240   - grunt.config([name, 'options']),
241   - grunt.util.kindOf(targetObj) === 'object' ? targetObj.options : {}
242   - ]);
243   - var options = grunt.util._.extend.apply(null, args);
244   - grunt.verbose.writeflags(options, 'Options');
245   - return options;
246   - };
247   - // Expose the current target.
248   - this.target = target;
249   - // Recreate flags object so that the target isn't set as a flag.
250   - this.flags = {};
251   - this.args.forEach(function(arg) { this.flags[arg] = true; }, this);
252   - // Expose data on `this` (as well as task.current).
253   - this.data = grunt.config([name, target]);
254   - // Expose normalized files object.
255   - this.files = task.normalizeMultiTaskFiles(this.data, target);
256   - // Expose normalized, flattened, uniqued array of src files.
257   - Object.defineProperty(this, 'filesSrc', {
258   - enumerable: true,
259   - get: function() {
260   - return grunt.util._(this.files).chain().pluck('src').flatten().uniq().value();
261   - }.bind(this)
262   - });
263   - // Call original task function, passing in the target and any other args.
264   - return fn.apply(this, this.args);
265   - });
266   -
267   - thisTask = task._tasks[name];
268   - thisTask.multi = true;
269   -};
270   -
271   -// Init tasks don't require properties in config, and as such will preempt
272   -// config loading errors.
273   -task.registerInitTask = function(name, info, fn) {
274   - task.registerTask(name, info, fn);
275   - task._tasks[name].init = true;
276   -};
277   -
278   -// Override built-in renameTask to use the registry.
279   -task.renameTask = function(oldname, newname) {
280   - var result;
281   - try {
282   - // Actually rename task.
283   - result = parent.renameTask.apply(task, arguments);
284   - // Add and remove task.
285   - registry.untasks.push(oldname);
286   - registry.tasks.push(newname);
287   - // Return result.
288   - return result;
289   - } catch(e) {
290   - grunt.log.error(e.message);
291   - }
292   -};
293   -
294   -// If a property wasn't passed, run all task targets in turn.
295   -task.runAllTargets = function(taskname, args) {
296   - // Get an array of sub-property keys under the given config object.
297   - var targets = Object.keys(grunt.config.getRaw(taskname) || {});
298   - // Fail if there are no actual properties to iterate over.
299   - if (targets.length === 0) {
300   - grunt.log.error('No "' + taskname + '" targets found.');
301   - return false;
302   - }
303   - // Iterate over all valid target properties, running a task for each.
304   - targets.filter(isValidMultiTaskTarget).forEach(function(target) {
305   - // Be sure to pass in any additionally specified args.
306   - task.run([taskname, target].concat(args || []).join(':'));
307   - });
308   -};
309   -
310   -// Load tasks and handlers from a given tasks file.
311   -var loadTaskStack = [];
312   -function loadTask(filepath) {
313   - // In case this was called recursively, save registry for later.
314   - loadTaskStack.push(registry);
315   - // Reset registry.
316   - registry = {tasks: [], untasks: [], meta: {info: lastInfo, filepath: filepath}};
317   - var filename = path.basename(filepath);
318   - var msg = 'Loading "' + filename + '" tasks...';
319   - var regCount = 0;
320   - var fn;
321   - try {
322   - // Load taskfile.
323   - fn = require(path.resolve(filepath));
324   - if (typeof fn === 'function') {
325   - fn.call(grunt, grunt);
326   - }
327   - grunt.verbose.write(msg).ok();
328   - // Log registered/renamed/unregistered tasks.
329   - ['un', ''].forEach(function(prefix) {
330   - var list = grunt.util._.chain(registry[prefix + 'tasks']).uniq().sort().value();
331   - if (list.length > 0) {
332   - regCount++;
333   - grunt.verbose.writeln((prefix ? '- ' : '+ ') + grunt.log.wordlist(list));
334   - }
335   - });
336   - if (regCount === 0) {
337   - grunt.verbose.warn('No tasks were registered or unregistered.');
338   - }
339   - } catch(e) {
340   - // Something went wrong.
341   - grunt.log.write(msg).error().verbose.error(e.stack).or.error(e);
342   - }
343   - // Restore registry.
344   - registry = loadTaskStack.pop() || {};
345   -}
346   -
347   -// Log a message when loading tasks.
348   -function loadTasksMessage(info) {
349   - // Only keep track of names of top-level loaded tasks and collections,
350   - // not sub-tasks.
351   - if (loadTaskDepth === 0) { lastInfo = info; }
352   - grunt.verbose.subhead('Registering ' + info + ' tasks.');
353   -}
354   -
355   -// Load tasks and handlers from a given directory.
356   -function loadTasks(tasksdir) {
357   - try {
358   - var files = grunt.file.glob.sync('*.{js,coffee}', {cwd: tasksdir, maxDepth: 1});
359   - // Load tasks from files.
360   - files.forEach(function(filename) {
361   - loadTask(path.join(tasksdir, filename));
362   - });
363   - } catch(e) {
364   - grunt.log.verbose.error(e.stack).or.error(e);
365   - }
366   -}
367   -
368   -// Load tasks and handlers from a given directory.
369   -task.loadTasks = function(tasksdir) {
370   - loadTasksMessage('"' + tasksdir + '"');
371   - if (grunt.file.exists(tasksdir)) {
372   - loadTasks(tasksdir);
373   - } else {
374   - grunt.log.error('Tasks directory "' + tasksdir + '" not found.');
375   - }
376   -};
377   -
378   -// Load tasks and handlers from a given locally-installed Npm module (installed
379   -// relative to the base dir).
380   -task.loadNpmTasks = function(name) {
381   - loadTasksMessage('"' + name + '" local Npm module');
382   - var root = path.resolve('node_modules');
383   - var pkgfile = path.join(root, name, 'package.json');
384   - var pkg = grunt.file.exists(pkgfile) ? grunt.file.readJSON(pkgfile) : {keywords: []};
385   -
386   - // Process collection plugins.
387   - if (pkg.keywords && pkg.keywords.indexOf('gruntcollection') !== -1) {
388   - loadTaskDepth++;
389   - Object.keys(pkg.dependencies).forEach(function(depName) {
390   - // Npm sometimes pulls dependencies out if they're shared, so find
391   - // upwards if not found locally.
392   - var filepath = grunt.file.findup('node_modules/' + depName, {
393   - cwd: path.resolve('node_modules', name),
394   - nocase: true
395   - });
396   - if (filepath) {
397   - // Load this task plugin recursively.
398   - task.loadNpmTasks(path.relative(root, filepath));
399   - }
400   - });
401   - loadTaskDepth--;
402   - return;
403   - }
404   -
405   - // Process task plugins.
406   - var tasksdir = path.join(root, name, 'tasks');
407   - if (grunt.file.exists(tasksdir)) {
408   - loadTasks(tasksdir);
409   - } else {
410   - grunt.log.error('Local Npm module "' + name + '" not found. Is it installed?');
411   - }
412   -};
413   -
414   -// Initialize tasks.
415   -task.init = function(tasks, options) {
416   - if (!options) { options = {}; }
417   -
418   - // Were only init tasks specified?
419   - var allInit = tasks.length > 0 && tasks.every(function(name) {
420   - var obj = task._taskPlusArgs(name).task;
421   - return obj && obj.init;
422   - });
423   -
424   - // Get any local Gruntfile or tasks that might exist. Use --gruntfile override
425   - // if specified, otherwise search the current directory or any parent.
426   - var gruntfile = allInit ? null : grunt.option('gruntfile') ||
427   - grunt.file.findup('Gruntfile.{js,coffee}', {nocase: true});
428   -
429   - var msg = 'Reading "' + (gruntfile ? path.basename(gruntfile) : '???') + '" Gruntfile...';
430   - if (gruntfile && grunt.file.exists(gruntfile)) {
431   - grunt.verbose.writeln().write(msg).ok();
432   - // Change working directory so that all paths are relative to the
433   - // Gruntfile's location (or the --base option, if specified).
434   - process.chdir(grunt.option('base') || path.dirname(gruntfile));
435   - // Load local tasks, if the file exists.
436   - loadTasksMessage('Gruntfile');
437   - loadTask(gruntfile);
438   - } else if (options.help || allInit) {
439   - // Don't complain about missing Gruntfile.
440   - } else if (grunt.option('gruntfile')) {
441   - // If --config override was specified and it doesn't exist, complain.
442   - grunt.log.writeln().write(msg).error();
443   - grunt.fatal('Unable to find "' + gruntfile + '" Gruntfile.', grunt.fail.code.MISSING_GRUNTFILE);
444   - } else if (!grunt.option('help')) {
445   - grunt.verbose.writeln().write(msg).error();
446   - grunt.log.writelns(
447   - 'A valid Gruntfile could not be found. Please see the getting ' +
448   - 'started guide for more information on how to configure grunt: ' +
449   - 'http://gruntjs.com/getting-started'
450   - );
451   - grunt.fatal('Unable to find Gruntfile.', grunt.fail.code.MISSING_GRUNTFILE);
452   - }
453   -
454   - // Load all user-specified --npm tasks.
455   - (grunt.option('npm') || []).forEach(task.loadNpmTasks);
456   - // Load all user-specified --tasks.
457   - (grunt.option('tasks') || []).forEach(task.loadTasks);
458   -};
node_modules/grunt/lib/grunt/template.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -'use strict';
11   -
12   -var grunt = require('../grunt');
13   -
14   -// The module to be exported.
15   -var template = module.exports = {};
16   -
17   -// External libs.
18   -template.date = require('dateformat');
19   -
20   -// Format today's date.
21   -template.today = function(format) {
22   - return template.date(new Date(), format);
23   -};
24   -
25   -// Template delimiters.
26   -var allDelimiters = {};
27   -
28   -// Initialize template delimiters.
29   -template.addDelimiters = function(name, opener, closer) {
30   - var delimiters = allDelimiters[name] = {};
31   - // Used by grunt.
32   - delimiters.opener = opener;
33   - delimiters.closer = closer;
34   - // Generate RegExp patterns dynamically.
35   - var a = delimiters.opener.replace(/(.)/g, '\\$1');
36   - var b = '([\\s\\S]+?)' + delimiters.closer.replace(/(.)/g, '\\$1');
37   - // Used by Lo-Dash.
38   - delimiters.lodash = {
39   - evaluate: new RegExp(a + b, 'g'),
40   - interpolate: new RegExp(a + '=' + b, 'g'),
41   - escape: new RegExp(a + '-' + b, 'g')
42   - };
43   -};
44   -
45   -// The underscore default template syntax should be a pretty sane default for
46   -// the config system.
47   -template.addDelimiters('config', '<%', '%>');
48   -
49   -// Set Lo-Dash template delimiters.
50   -template.setDelimiters = function(name) {
51   - // Get the appropriate delimiters.
52   - var delimiters = allDelimiters[name in allDelimiters ? name : 'config'];
53   - // Tell Lo-Dash which delimiters to use.
54   - grunt.util._.templateSettings = delimiters.lodash;
55   - // Return the delimiters.
56   - return delimiters;
57   -};
58   -
59   -// Process template + data with Lo-Dash.
60   -template.process = function(tmpl, options) {
61   - if (!options) { options = {}; }
62   - // Set delimiters, and get a opening match character.
63   - var delimiters = template.setDelimiters(options.delimiters);
64   - // Clone data, initializing to config data or empty object if omitted.
65   - var data = Object.create(options.data || grunt.config.data || {});
66   - // Expose grunt so that grunt utilities can be accessed, but only if it
67   - // doesn't conflict with an existing .grunt property.
68   - if (!('grunt' in data)) { data.grunt = grunt; }
69   - // Keep track of last change.
70   - var last = tmpl;
71   - try {
72   - // As long as tmpl contains template tags, render it and get the result,
73   - // otherwise just use the template string.
74   - while (tmpl.indexOf(delimiters.opener) >= 0) {
75   - tmpl = grunt.util._.template(tmpl, data);
76   - // Abort if template didn't change - nothing left to process!
77   - if (tmpl === last) { break; }
78   - last = tmpl;
79   - }
80   - } catch (e) {
81   - // In upgrading to Lo-Dash (or Underscore.js 1.3.3), \n and \r in template
82   - // tags now causes an exception to be thrown. Warn the user why this is
83   - // happening. https://github.com/documentcloud/underscore/issues/553
84   - if (String(e) === 'SyntaxError: Unexpected token ILLEGAL' && /\n|\r/.test(tmpl)) {
85   - grunt.log.errorlns('A special character was detected in this template. ' +
86   - 'Inside template tags, the \\n and \\r special characters must be ' +
87   - 'escaped as \\\\n and \\\\r. (grunt 0.4.0+)');
88   - }
89   - // Slightly better error message.
90   - e.message = 'An error occurred while processing a template (' + e.message + ').';
91   - grunt.warn(e, grunt.fail.code.TEMPLATE_ERROR);
92   - }
93   - // Normalize linefeeds and return.
94   - return grunt.util.normalizelf(tmpl);
95   -};
node_modules/grunt/lib/util/task.js deleted
1   -/*
2   - * grunt
3   - * http://gruntjs.com/
4   - *
5   - * Copyright (c) 2014 "Cowboy" Ben Alman
6   - * Licensed under the MIT license.
7   - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
8   - */
9   -
10   -(function(exports) {
11   -
12   - 'use strict';
13   -
14   - // Construct-o-rama.
15   - function Task() {
16   - // Information about the currently-running task.
17   - this.current = {};
18   - // Tasks.
19   - this._tasks = {};
20   - // Task queue.
21   - this._queue = [];
22   - // Queue placeholder (for dealing with nested tasks).
23   - this._placeholder = {placeholder: true};
24   - // Queue marker (for clearing the queue programmatically).
25   - this._marker = {marker: true};
26   - // Options.
27   - this._options = {};
28   - // Is the queue running?
29   - this._running = false;
30   - // Success status of completed tasks.
31   - this._success = {};
32   - }
33   -
34   - // Expose the constructor function.
35   - exports.Task = Task;
36   -
37   - // Create a new Task instance.
38   - exports.create = function() {
39   - return new Task();
40   - };
41   -
42   - // If the task runner is running or an error handler is not defined, throw
43   - // an exception. Otherwise, call the error handler directly.
44   - Task.prototype._throwIfRunning = function(obj) {
45   - if (this._running || !this._options.error) {
46   - // Throw an exception that the task runner will catch.
47   - throw obj;
48   - } else {
49   - // Not inside the task runner. Call the error handler and abort.
50   - this._options.error.call({name: null}, obj);
51   - }
52   - };
53   -
54   - // Register a new task.
55   - Task.prototype.registerTask = function(name, info, fn) {
56   - // If optional "info" string is omitted, shuffle arguments a bit.
57   - if (fn == null) {
58   - fn = info;
59   - info = null;
60   - }
61   - // String or array of strings was passed instead of fn.
62   - var tasks;
63   - if (typeof fn !== 'function') {
64   - // Array of task names.
65   - tasks = this.parseArgs([fn]);
66   - // This task function just runs the specified tasks.
67   - fn = this.run.bind(this, fn);
68   - fn.alias = true;
69   - // Generate an info string if one wasn't explicitly passed.
70   - if (!info) {
71   - info = 'Alias for "' + tasks.join('", "') + '" task' +
72   - (tasks.length === 1 ? '' : 's') + '.';
73   - }
74   - } else if (!info) {
75   - info = 'Custom task.';
76   - }
77   - // Add task into cache.
78   - this._tasks[name] = {name: name, info: info, fn: fn};
79   - // Make chainable!
80   - return this;
81   - };
82   -
83   - // Is the specified task an alias?
84   - Task.prototype.isTaskAlias = function(name) {
85   - return !!this._tasks[name].fn.alias;
86   - };
87   -
88   - // Has the specified task been registered?
89   - Task.prototype.exists = function(name) {
90   - return name in this._tasks;
91   - };
92   -
93   - // Rename a task. This might be useful if you want to override the default
94   - // behavior of a task, while retaining the old name. This is a billion times
95   - // easier to implement than some kind of in-task "super" functionality.
96   - Task.prototype.renameTask = function(oldname, newname) {
97   - if (!this._tasks[oldname]) {
98   - throw new Error('Cannot rename missing "' + oldname + '" task.');
99   - }
100   - // Rename task.
101   - this._tasks[newname] = this._tasks[oldname];
102   - // Update name property of task.
103   - this._tasks[newname].name = newname;
104   - // Remove old name.
105   - delete this._tasks[oldname];
106   - // Make chainable!
107   - return this;
108   - };
109   -
110   - // Argument parsing helper. Supports these signatures:
111   - // fn('foo') // ['foo']
112   - // fn('foo', 'bar', 'baz') // ['foo', 'bar', 'baz']
113   - // fn(['foo', 'bar', 'baz']) // ['foo', 'bar', 'baz']
114   - Task.prototype.parseArgs = function(args) {
115   - // Return the first argument if it's an array, otherwise return an array
116   - // of all arguments.
117   - return Array.isArray(args[0]) ? args[0] : [].slice.call(args);
118   - };
119   -
120   - // Split a colon-delimited string into an array, unescaping (but not
121   - // splitting on) any \: escaped colons.
122   - Task.prototype.splitArgs = function(str) {
123   - if (!str) { return []; }
124   - // Store placeholder for \\ followed by \:
125   - str = str.replace(/\\\\/g, '\uFFFF').replace(/\\:/g, '\uFFFE');
126   - // Split on :
127   - return str.split(':').map(function(s) {
128   - // Restore place-held : followed by \\
129   - return s.replace(/\uFFFE/g, ':').replace(/\uFFFF/g, '\\');
130   - });
131   - };
132   -
133   - // Given a task name, determine which actual task will be called, and what
134   - // arguments will be passed into the task callback. "foo" -> task "foo", no
135   - // args. "foo:bar:baz" -> task "foo:bar:baz" with no args (if "foo:bar:baz"
136   - // task exists), otherwise task "foo:bar" with arg "baz" (if "foo:bar" task
137   - // exists), otherwise task "foo" with args "bar" and "baz".
138   - Task.prototype._taskPlusArgs = function(name) {
139   - // Get task name / argument parts.
140   - var parts = this.splitArgs(name);
141   - // Start from the end, not the beginning!
142   - var i = parts.length;
143   - var task;
144   - do {
145   - // Get a task.
146   - task = this._tasks[parts.slice(0, i).join(':')];
147   - // If the task doesn't exist, decrement `i`, and if `i` is greater than
148   - // 0, repeat.
149   - } while (!task && --i > 0);
150   - // Just the args.
151   - var args = parts.slice(i);
152   - // Maybe you want to use them as flags instead of as positional args?
153   - var flags = {};
154   - args.forEach(function(arg) { flags[arg] = true; });
155   - // The task to run and the args to run it with.
156   - return {task: task, nameArgs: name, args: args, flags: flags};
157   - };
158   -
159   - // Append things to queue in the correct spot.
160   - Task.prototype._push = function(things) {
161   - // Get current placeholder index.
162   - var index = this._queue.indexOf(this._placeholder);
163   - if (index === -1) {
164   - // No placeholder, add task+args objects to end of queue.
165   - this._queue = this._queue.concat(things);
166   - } else {
167   - // Placeholder exists, add task+args objects just before placeholder.
168   - [].splice.apply(this._queue, [index, 0].concat(things));
169   - }
170   - };
171   -
172   - // Enqueue a task.
173   - Task.prototype.run = function() {
174   - // Parse arguments into an array, returning an array of task+args objects.
175   - var things = this.parseArgs(arguments).map(this._taskPlusArgs, this);
176   - // Throw an exception if any tasks weren't found.
177   - var fails = things.filter(function(thing) { return !thing.task; });
178   - if (fails.length > 0) {
179   - this._throwIfRunning(new Error('Task "' + fails[0].nameArgs + '" not found.'));
180   - return this;
181   - }
182   - // Append things to queue in the correct spot.
183   - this._push(things);
184   - // Make chainable!
185   - return this;
186   - };
187   -
188   - // Add a marker to the queue to facilitate clearing it programmatically.
189   - Task.prototype.mark = function() {
190   - this._push(this._marker);
191   - // Make chainable!
192   - return this;
193   - };
194   -
195   - // Run a task function, handling this.async / return value.
196   - Task.prototype.runTaskFn = function(context, fn, done, asyncDone) {
197   - // Async flag.
198   - var async = false;
199   -
200   - // Update the internal status object and run the next task.
201   - var complete = function(success) {
202   - var err = null;
203   - if (success === false) {
204   - // Since false was passed, the task failed generically.
205   - err = new Error('Task "' + context.nameArgs + '" failed.');
206   - } else if (success instanceof Error || {}.toString.call(success) === '[object Error]') {
207   - // An error object was passed, so the task failed specifically.
208   - err = success;
209   - success = false;
210   - } else {
211   - // The task succeeded.
212   - success = true;
213   - }
214   - // The task has ended, reset the current task object.
215   - this.current = {};
216   - // A task has "failed" only if it returns false (async) or if the
217   - // function returned by .async is passed false.
218   - this._success[context.nameArgs] = success;
219   - // If task failed, call error handler.
220   - if (!success && this._options.error) {
221   - this._options.error.call({name: context.name, nameArgs: context.nameArgs}, err);
222   - }
223   - // only call done async if explicitly requested to
224   - // see: https://github.com/gruntjs/grunt/pull/1026
225   - if (asyncDone) {
226   - process.nextTick(function () {
227   - done(err, success);
228   - });
229   - } else {
230   - done(err, success);
231   - }
232   - }.bind(this);
233   -
234   - // When called, sets the async flag and returns a function that can
235   - // be used to continue processing the queue.
236   - context.async = function() {
237   - async = true;
238   - // The returned function should execute asynchronously in case
239   - // someone tries to do this.async()(); inside a task (WTF).
240   - return function(success) {
241   - setTimeout(function() { complete(success); }, 1);
242   - };
243   - };
244   -
245   - // Expose some information about the currently-running task.
246   - this.current = context;
247   -
248   - try {
249   - // Get the current task and run it, setting `this` inside the task
250   - // function to be something useful.
251   - var success = fn.call(context);
252   - // If the async flag wasn't set, process the next task in the queue.
253   - if (!async) {
254   - complete(success);
255   - }
256   - } catch (err) {
257   - complete(err);
258   - }
259   - };
260   -
261   - // Begin task queue processing. Ie. run all tasks.
262   - Task.prototype.start = function(opts) {
263   - if (!opts) {
264   - opts = {};
265   - }
266   - // Abort if already running.
267   - if (this._running) { return false; }
268   - // Actually process the next task.
269   - var nextTask = function() {
270   - // Get next task+args object from queue.
271   - var thing;
272   - // Skip any placeholders or markers.
273   - do {
274   - thing = this._queue.shift();
275   - } while (thing === this._placeholder || thing === this._marker);
276   - // If queue was empty, we're all done.
277   - if (!thing) {
278   - this._running = false;
279   - if (this._options.done) {
280   - this._options.done();
281   - }
282   - return;
283   - }
284   - // Add a placeholder to the front of the queue.
285   - this._queue.unshift(this._placeholder);
286   -
287   - // Expose some information about the currently-running task.
288   - var context = {
289   - // The current task name plus args, as-passed.
290   - nameArgs: thing.nameArgs,
291   - // The current task name.
292   - name: thing.task.name,
293   - // The current task arguments.
294   - args: thing.args,
295   - // The current arguments, available as named flags.
296   - flags: thing.flags
297   - };
298   -
299   - // Actually run the task function (handling this.async, etc)
300   - this.runTaskFn(context, function() {
301   - return thing.task.fn.apply(this, this.args);
302   - }, nextTask, !!opts.asyncDone);
303   -
304   - }.bind(this);
305   -
306   - // Update flag.
307   - this._running = true;
308   - // Process the next task.
309   - nextTask();
310   - };
311   -
312   - // Clear remaining tasks from the queue.
313   - Task.prototype.clearQueue = function(options) {
314   - if (!options) { options = {}; }
315   - if (options.untilMarker) {
316   - this._queue.splice(0, this._queue.indexOf(this._marker) + 1);
317   - } else {
318   - this._queue = [];
319   - }
320   - // Make chainable!
321   - return this;
322   - };
323   -
324   - // Test to see if all of the given tasks have succeeded.
325   - Task.prototype.requires = function() {
326   - this.parseArgs(arguments).forEach(function(name) {
327   - var success = this._success[name];
328   - if (!success) {
329   - throw new Error('Required task "' + name +
330   - '" ' + (success === false ? 'failed' : 'must be run first') + '.');
331   - }
332   - }.bind(this));
333   - };
334   -
335   - // Override default options.
336   - Task.prototype.options = function(options) {
337   - Object.keys(options).forEach(function(name) {
338   - this._options[name] = options[name];
339   - }.bind(this));
340   - };
341   -
342   -}(typeof exports === 'object' && exports || this));
node_modules/grunt/node_modules/.bin/cake deleted
1   -../coffee-script/bin/cake
2 0 \ No newline at end of file
node_modules/grunt/node_modules/.bin/coffee deleted
1   -../coffee-script/bin/coffee
2 0 \ No newline at end of file
node_modules/grunt/node_modules/.bin/js-yaml deleted
1   -../js-yaml/bin/js-yaml.js
2 0 \ No newline at end of file
node_modules/grunt/node_modules/.bin/nopt deleted
1   -../nopt/bin/nopt.js
2 0 \ No newline at end of file
node_modules/grunt/node_modules/.bin/rimraf deleted
1   -../rimraf/bin.js
2 0 \ No newline at end of file
node_modules/grunt/node_modules/.bin/which deleted
1   -../which/bin/which
2 0 \ No newline at end of file
node_modules/grunt/node_modules/async/.gitmodules deleted
1   -[submodule "deps/nodeunit"]
2   - path = deps/nodeunit
3   - url = git://github.com/caolan/nodeunit.git
4   -[submodule "deps/UglifyJS"]
5   - path = deps/UglifyJS
6   - url = https://github.com/mishoo/UglifyJS.git
7   -[submodule "deps/nodelint"]
8   - path = deps/nodelint
9   - url = https://github.com/tav/nodelint.git
node_modules/grunt/node_modules/async/.npmignore deleted
1   -deps
2   -dist
3   -test
4   -nodelint.cfg
5 0 \ No newline at end of file
node_modules/grunt/node_modules/async/LICENSE deleted
1   -Copyright (c) 2010 Caolan McMahon
2   -
3   -Permission is hereby granted, free of charge, to any person obtaining a copy
4   -of this software and associated documentation files (the "Software"), to deal
5   -in the Software without restriction, including without limitation the rights
6   -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7   -copies of the Software, and to permit persons to whom the Software is
8   -furnished to do so, subject to the following conditions:
9   -
10   -The above copyright notice and this permission notice shall be included in
11   -all copies or substantial portions of the Software.
12   -
13   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15   -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16   -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17   -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18   -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19   -THE SOFTWARE.
node_modules/grunt/node_modules/async/Makefile deleted
1   -PACKAGE = asyncjs
2   -NODEJS = $(if $(shell test -f /usr/bin/nodejs && echo "true"),nodejs,node)
3   -CWD := $(shell pwd)
4   -NODEUNIT = $(CWD)/node_modules/nodeunit/bin/nodeunit
5   -UGLIFY = $(CWD)/node_modules/uglify-js/bin/uglifyjs
6   -NODELINT = $(CWD)/node_modules/nodelint/nodelint
7   -
8   -BUILDDIR = dist
9   -
10   -all: clean test build
11   -
12   -build: $(wildcard lib/*.js)
13   - mkdir -p $(BUILDDIR)
14   - $(UGLIFY) lib/async.js > $(BUILDDIR)/async.min.js
15   -
16   -test:
17   - $(NODEUNIT) test
18   -
19   -clean:
20   - rm -rf $(BUILDDIR)
21   -
22   -lint:
23   - $(NODELINT) --config nodelint.cfg lib/async.js
24   -
25   -.PHONY: test build all
node_modules/grunt/node_modules/async/README.md deleted
1   -# Async.js
2   -
3   -Async is a utility module which provides straight-forward, powerful functions
4   -for working with asynchronous JavaScript. Although originally designed for
5   -use with [node.js](http://nodejs.org), it can also be used directly in the
6   -browser.
7   -
8   -Async provides around 20 functions that include the usual 'functional'
9   -suspects (map, reduce, filter, forEachโ€ฆ) as well as some common patterns
10   -for asynchronous control flow (parallel, series, waterfallโ€ฆ). All these
11   -functions assume you follow the node.js convention of providing a single
12   -callback as the last argument of your async function.
13   -
14   -
15   -## Quick Examples
16   -
17   - async.map(['file1','file2','file3'], fs.stat, function(err, results){
18   - // results is now an array of stats for each file
19   - });
20   -
21   - async.filter(['file1','file2','file3'], path.exists, function(results){
22   - // results now equals an array of the existing files
23   - });
24   -
25   - async.parallel([
26   - function(){ ... },
27   - function(){ ... }
28   - ], callback);
29   -
30   - async.series([
31   - function(){ ... },
32   - function(){ ... }
33   - ]);
34   -
35   -There are many more functions available so take a look at the docs below for a
36   -full list. This module aims to be comprehensive, so if you feel anything is
37   -missing please create a GitHub issue for it.
38   -
39   -
40   -## Download
41   -
42   -Releases are available for download from
43   -[GitHub](http://github.com/caolan/async/downloads).
44   -Alternatively, you can install using Node Package Manager (npm):
45   -
46   - npm install async
47   -
48   -
49   -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed
50   -
51   -__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped
52   -
53   -
54   -## In the Browser
55   -
56   -So far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:
57   -
58   - <script type="text/javascript" src="async.js"></script>
59   - <script type="text/javascript">
60   -
61   - async.map(data, asyncProcess, function(err, results){
62   - alert(results);
63   - });
64   -
65   - </script>
66   -
67   -
68   -## Documentation
69   -
70   -### Collections
71   -
72   -* [forEach](#forEach)
73   -* [map](#map)
74   -* [filter](#filter)
75   -* [reject](#reject)
76   -* [reduce](#reduce)
77   -* [detect](#detect)
78   -* [sortBy](#sortBy)
79   -* [some](#some)
80   -* [every](#every)
81   -* [concat](#concat)
82   -
83   -### Control Flow
84   -
85   -* [series](#series)
86   -* [parallel](#parallel)
87   -* [whilst](#whilst)
88   -* [until](#until)
89   -* [waterfall](#waterfall)
90   -* [queue](#queue)
91   -* [auto](#auto)
92   -* [iterator](#iterator)
93   -* [apply](#apply)
94   -* [nextTick](#nextTick)
95   -
96   -### Utils
97   -
98   -* [memoize](#memoize)
99   -* [unmemoize](#unmemoize)
100   -* [log](#log)
101   -* [dir](#dir)
102   -* [noConflict](#noConflict)
103   -
104   -
105   -## Collections
106   -
107   -<a name="forEach" />
108   -### forEach(arr, iterator, callback)
109   -
110   -Applies an iterator function to each item in an array, in parallel.
111   -The iterator is called with an item from the list and a callback for when it
112   -has finished. If the iterator passes an error to this callback, the main
113   -callback for the forEach function is immediately called with the error.
114   -
115   -Note, that since this function applies the iterator to each item in parallel
116   -there is no guarantee that the iterator functions will complete in order.
117   -
118   -__Arguments__
119   -
120   -* arr - An array to iterate over.
121   -* iterator(item, callback) - A function to apply to each item in the array.
122   - The iterator is passed a callback which must be called once it has completed.
123   -* callback(err) - A callback which is called after all the iterator functions
124   - have finished, or an error has occurred.
125   -
126   -__Example__
127   -
128   - // assuming openFiles is an array of file names and saveFile is a function
129   - // to save the modified contents of that file:
130   -
131   - async.forEach(openFiles, saveFile, function(err){
132   - // if any of the saves produced an error, err would equal that error
133   - });
134   -
135   ----------------------------------------
136   -
137   -<a name="forEachSeries" />
138   -### forEachSeries(arr, iterator, callback)
139   -
140   -The same as forEach only the iterator is applied to each item in the array in
141   -series. The next iterator is only called once the current one has completed
142   -processing. This means the iterator functions will complete in order.
143   -
144   -
145   ----------------------------------------
146   -
147   -<a name="forEachLimit" />
148   -### forEachLimit(arr, limit, iterator, callback)
149   -
150   -The same as forEach only the iterator is applied to batches of items in the
151   -array, in series. The next batch of iterators is only called once the current
152   -one has completed processing.
153   -
154   -__Arguments__
155   -
156   -* arr - An array to iterate over.
157   -* limit - How many items should be in each batch.
158   -* iterator(item, callback) - A function to apply to each item in the array.
159   - The iterator is passed a callback which must be called once it has completed.
160   -* callback(err) - A callback which is called after all the iterator functions
161   - have finished, or an error has occurred.
162   -
163   -__Example__
164   -
165   - // Assume documents is an array of JSON objects and requestApi is a
166   - // function that interacts with a rate-limited REST api.
167   -
168   - async.forEachLimit(documents, 20, requestApi, function(err){
169   - // if any of the saves produced an error, err would equal that error
170   - });
171   ----------------------------------------
172   -
173   -<a name="map" />
174   -### map(arr, iterator, callback)
175   -
176   -Produces a new array of values by mapping each value in the given array through
177   -the iterator function. The iterator is called with an item from the array and a
178   -callback for when it has finished processing. The callback takes 2 arguments,
179   -an error and the transformed item from the array. If the iterator passes an
180   -error to this callback, the main callback for the map function is immediately
181   -called with the error.
182   -
183   -Note, that since this function applies the iterator to each item in parallel
184   -there is no guarantee that the iterator functions will complete in order, however
185   -the results array will be in the same order as the original array.
186   -
187   -__Arguments__
188   -
189   -* arr - An array to iterate over.
190   -* iterator(item, callback) - A function to apply to each item in the array.
191   - The iterator is passed a callback which must be called once it has completed
192   - with an error (which can be null) and a transformed item.
193   -* callback(err, results) - A callback which is called after all the iterator
194   - functions have finished, or an error has occurred. Results is an array of the
195   - transformed items from the original array.
196   -
197   -__Example__
198   -
199   - async.map(['file1','file2','file3'], fs.stat, function(err, results){
200   - // results is now an array of stats for each file
201   - });
202   -
203   ----------------------------------------
204   -
205   -<a name="mapSeries" />
206   -### mapSeries(arr, iterator, callback)
207   -
208   -The same as map only the iterator is applied to each item in the array in
209   -series. The next iterator is only called once the current one has completed
210   -processing. The results array will be in the same order as the original.
211   -
212   -
213   ----------------------------------------
214   -
215   -<a name="filter" />
216   -### filter(arr, iterator, callback)
217   -
218   -__Alias:__ select
219   -
220   -Returns a new array of all the values which pass an async truth test.
221   -_The callback for each iterator call only accepts a single argument of true or
222   -false, it does not accept an error argument first!_ This is in-line with the
223   -way node libraries work with truth tests like path.exists. This operation is
224   -performed in parallel, but the results array will be in the same order as the
225   -original.
226   -
227   -__Arguments__
228   -
229   -* arr - An array to iterate over.
230   -* iterator(item, callback) - A truth test to apply to each item in the array.
231   - The iterator is passed a callback which must be called once it has completed.
232   -* callback(results) - A callback which is called after all the iterator
233   - functions have finished.
234   -
235   -__Example__
236   -
237   - async.filter(['file1','file2','file3'], path.exists, function(results){
238   - // results now equals an array of the existing files
239   - });
240   -
241   ----------------------------------------
242   -
243   -<a name="filterSeries" />
244   -### filterSeries(arr, iterator, callback)
245   -
246   -__alias:__ selectSeries
247   -
248   -The same as filter only the iterator is applied to each item in the array in
249   -series. The next iterator is only called once the current one has completed
250   -processing. The results array will be in the same order as the original.
251   -
252   ----------------------------------------
253   -
254   -<a name="reject" />
255   -### reject(arr, iterator, callback)
256   -
257   -The opposite of filter. Removes values that pass an async truth test.
258   -
259   ----------------------------------------
260   -
261   -<a name="rejectSeries" />
262   -### rejectSeries(arr, iterator, callback)
263   -
264   -The same as filter, only the iterator is applied to each item in the array
265   -in series.
266   -
267   -
268   ----------------------------------------
269   -
270   -<a name="reduce" />
271   -### reduce(arr, memo, iterator, callback)
272   -
273   -__aliases:__ inject, foldl
274   -
275   -Reduces a list of values into a single value using an async iterator to return
276   -each successive step. Memo is the initial state of the reduction. This
277   -function only operates in series. For performance reasons, it may make sense to
278   -split a call to this function into a parallel map, then use the normal
279   -Array.prototype.reduce on the results. This function is for situations where
280   -each step in the reduction needs to be async, if you can get the data before
281   -reducing it then its probably a good idea to do so.
282   -
283   -__Arguments__
284   -
285   -* arr - An array to iterate over.
286   -* memo - The initial state of the reduction.
287   -* iterator(memo, item, callback) - A function applied to each item in the
288   - array to produce the next step in the reduction. The iterator is passed a
289   - callback which accepts an optional error as its first argument, and the state
290   - of the reduction as the second. If an error is passed to the callback, the
291   - reduction is stopped and the main callback is immediately called with the
292   - error.
293   -* callback(err, result) - A callback which is called after all the iterator
294   - functions have finished. Result is the reduced value.
295   -
296   -__Example__
297   -
298   - async.reduce([1,2,3], 0, function(memo, item, callback){
299   - // pointless async:
300   - process.nextTick(function(){
301   - callback(null, memo + item)
302   - });
303   - }, function(err, result){
304   - // result is now equal to the last value of memo, which is 6
305   - });
306   -
307   ----------------------------------------
308   -
309   -<a name="reduceRight" />
310   -### reduceRight(arr, memo, iterator, callback)
311   -
312   -__Alias:__ foldr
313   -
314   -Same as reduce, only operates on the items in the array in reverse order.
315   -
316   -
317   ----------------------------------------
318   -
319   -<a name="detect" />
320   -### detect(arr, iterator, callback)
321   -
322   -Returns the first value in a list that passes an async truth test. The
323   -iterator is applied in parallel, meaning the first iterator to return true will
324   -fire the detect callback with that result. That means the result might not be
325   -the first item in the original array (in terms of order) that passes the test.
326   -
327   -If order within the original array is important then look at detectSeries.
328   -
329   -__Arguments__
330   -
331   -* arr - An array to iterate over.
332   -* iterator(item, callback) - A truth test to apply to each item in the array.
333   - The iterator is passed a callback which must be called once it has completed.
334   -* callback(result) - A callback which is called as soon as any iterator returns
335   - true, or after all the iterator functions have finished. Result will be
336   - the first item in the array that passes the truth test (iterator) or the
337   - value undefined if none passed.
338   -
339   -__Example__
340   -
341   - async.detect(['file1','file2','file3'], path.exists, function(result){
342   - // result now equals the first file in the list that exists
343   - });
344   -
345   ----------------------------------------
346   -
347   -<a name="detectSeries" />
348   -### detectSeries(arr, iterator, callback)
349   -
350   -The same as detect, only the iterator is applied to each item in the array
351   -in series. This means the result is always the first in the original array (in
352   -terms of array order) that passes the truth test.
353   -
354   -
355   ----------------------------------------
356   -
357   -<a name="sortBy" />
358   -### sortBy(arr, iterator, callback)
359   -
360   -Sorts a list by the results of running each value through an async iterator.
361   -
362   -__Arguments__
363   -
364   -* arr - An array to iterate over.
365   -* iterator(item, callback) - A function to apply to each item in the array.
366   - The iterator is passed a callback which must be called once it has completed
367   - with an error (which can be null) and a value to use as the sort criteria.
368   -* callback(err, results) - A callback which is called after all the iterator
369   - functions have finished, or an error has occurred. Results is the items from
370   - the original array sorted by the values returned by the iterator calls.
371   -
372   -__Example__
373   -
374   - async.sortBy(['file1','file2','file3'], function(file, callback){
375   - fs.stat(file, function(err, stats){
376   - callback(err, stats.mtime);
377   - });
378   - }, function(err, results){
379   - // results is now the original array of files sorted by
380   - // modified date
381   - });
382   -
383   -
384   ----------------------------------------
385   -
386   -<a name="some" />
387   -### some(arr, iterator, callback)
388   -
389   -__Alias:__ any
390   -
391   -Returns true if at least one element in the array satisfies an async test.
392   -_The callback for each iterator call only accepts a single argument of true or
393   -false, it does not accept an error argument first!_ This is in-line with the
394   -way node libraries work with truth tests like path.exists. Once any iterator
395   -call returns true, the main callback is immediately called.
396   -
397   -__Arguments__
398   -
399   -* arr - An array to iterate over.
400   -* iterator(item, callback) - A truth test to apply to each item in the array.
401   - The iterator is passed a callback which must be called once it has completed.
402   -* callback(result) - A callback which is called as soon as any iterator returns
403   - true, or after all the iterator functions have finished. Result will be
404   - either true or false depending on the values of the async tests.
405   -
406   -__Example__
407   -
408   - async.some(['file1','file2','file3'], path.exists, function(result){
409   - // if result is true then at least one of the files exists
410   - });
411   -
412   ----------------------------------------
413   -
414   -<a name="every" />
415   -### every(arr, iterator, callback)
416   -
417   -__Alias:__ all
418   -
419   -Returns true if every element in the array satisfies an async test.
420   -_The callback for each iterator call only accepts a single argument of true or
421   -false, it does not accept an error argument first!_ This is in-line with the
422   -way node libraries work with truth tests like path.exists.
423   -
424   -__Arguments__
425   -
426   -* arr - An array to iterate over.
427   -* iterator(item, callback) - A truth test to apply to each item in the array.
428   - The iterator is passed a callback which must be called once it has completed.
429   -* callback(result) - A callback which is called after all the iterator
430   - functions have finished. Result will be either true or false depending on
431   - the values of the async tests.
432   -
433   -__Example__
434   -
435   - async.every(['file1','file2','file3'], path.exists, function(result){
436   - // if result is true then every file exists
437   - });
438   -
439   ----------------------------------------
440   -
441   -<a name="concat" />
442   -### concat(arr, iterator, callback)
443   -
444   -Applies an iterator to each item in a list, concatenating the results. Returns the
445   -concatenated list. The iterators are called in parallel, and the results are
446   -concatenated as they return. There is no guarantee that the results array will
447   -be returned in the original order of the arguments passed to the iterator function.
448   -
449   -__Arguments__
450   -
451   -* arr - An array to iterate over
452   -* iterator(item, callback) - A function to apply to each item in the array.
453   - The iterator is passed a callback which must be called once it has completed
454   - with an error (which can be null) and an array of results.
455   -* callback(err, results) - A callback which is called after all the iterator
456   - functions have finished, or an error has occurred. Results is an array containing
457   - the concatenated results of the iterator function.
458   -
459   -__Example__
460   -
461   - async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){
462   - // files is now a list of filenames that exist in the 3 directories
463   - });
464   -
465   ----------------------------------------
466   -
467   -<a name="concatSeries" />
468   -### concatSeries(arr, iterator, callback)
469   -
470   -Same as async.concat, but executes in series instead of parallel.
471   -
472   -
473   -## Control Flow
474   -
475   -<a name="series" />
476   -### series(tasks, [callback])
477   -
478   -Run an array of functions in series, each one running once the previous
479   -function has completed. If any functions in the series pass an error to its
480   -callback, no more functions are run and the callback for the series is
481   -immediately called with the value of the error. Once the tasks have completed,
482   -the results are passed to the final callback as an array.
483   -
484   -It is also possible to use an object instead of an array. Each property will be
485   -run as a function and the results will be passed to the final callback as an object
486   -instead of an array. This can be a more readable way of handling results from
487   -async.series.
488   -
489   -
490   -__Arguments__
491   -
492   -* tasks - An array or object containing functions to run, each function is passed
493   - a callback it must call on completion.
494   -* callback(err, results) - An optional callback to run once all the functions
495   - have completed. This function gets an array of all the arguments passed to
496   - the callbacks used in the array.
497   -
498   -__Example__
499   -
500   - async.series([
501   - function(callback){
502   - // do some stuff ...
503   - callback(null, 'one');
504   - },
505   - function(callback){
506   - // do some more stuff ...
507   - callback(null, 'two');
508   - },
509   - ],
510   - // optional callback
511   - function(err, results){
512   - // results is now equal to ['one', 'two']
513   - });
514   -
515   -
516   - // an example using an object instead of an array
517   - async.series({
518   - one: function(callback){
519   - setTimeout(function(){
520   - callback(null, 1);
521   - }, 200);
522   - },
523   - two: function(callback){
524   - setTimeout(function(){
525   - callback(null, 2);
526   - }, 100);
527   - },
528   - },
529   - function(err, results) {
530   - // results is now equal to: {one: 1, two: 2}
531   - });
532   -
533   -
534   ----------------------------------------
535   -
536   -<a name="parallel" />
537   -### parallel(tasks, [callback])
538   -
539   -Run an array of functions in parallel, without waiting until the previous
540   -function has completed. If any of the functions pass an error to its
541   -callback, the main callback is immediately called with the value of the error.
542   -Once the tasks have completed, the results are passed to the final callback as an
543   -array.
544   -
545   -It is also possible to use an object instead of an array. Each property will be
546   -run as a function and the results will be passed to the final callback as an object
547   -instead of an array. This can be a more readable way of handling results from
548   -async.parallel.
549   -
550   -
551   -__Arguments__
552   -
553   -* tasks - An array or object containing functions to run, each function is passed a
554   - callback it must call on completion.
555   -* callback(err, results) - An optional callback to run once all the functions
556   - have completed. This function gets an array of all the arguments passed to
557   - the callbacks used in the array.
558   -
559   -__Example__
560   -
561   - async.parallel([
562   - function(callback){
563   - setTimeout(function(){
564   - callback(null, 'one');
565   - }, 200);
566   - },
567   - function(callback){
568   - setTimeout(function(){
569   - callback(null, 'two');
570   - }, 100);
571   - },
572   - ],
573   - // optional callback
574   - function(err, results){
575   - // the results array will equal ['one','two'] even though
576   - // the second function had a shorter timeout.
577   - });
578   -
579   -
580   - // an example using an object instead of an array
581   - async.parallel({
582   - one: function(callback){
583   - setTimeout(function(){
584   - callback(null, 1);
585   - }, 200);
586   - },
587   - two: function(callback){
588   - setTimeout(function(){
589   - callback(null, 2);
590   - }, 100);
591   - },
592   - },
593   - function(err, results) {
594   - // results is now equals to: {one: 1, two: 2}
595   - });
596   -
597   -
598   ----------------------------------------
599   -
600   -<a name="whilst" />
601   -### whilst(test, fn, callback)
602   -
603   -Repeatedly call fn, while test returns true. Calls the callback when stopped,
604   -or an error occurs.
605   -
606   -__Arguments__
607   -
608   -* test() - synchronous truth test to perform before each execution of fn.
609   -* fn(callback) - A function to call each time the test passes. The function is
610   - passed a callback which must be called once it has completed with an optional
611   - error as the first argument.
612   -* callback(err) - A callback which is called after the test fails and repeated
613   - execution of fn has stopped.
614   -
615   -__Example__
616   -
617   - var count = 0;
618   -
619   - async.whilst(
620   - function () { return count < 5; },
621   - function (callback) {
622   - count++;
623   - setTimeout(callback, 1000);
624   - },
625   - function (err) {
626   - // 5 seconds have passed
627   - }
628   - );
629   -
630   -
631   ----------------------------------------
632   -
633   -<a name="until" />
634   -### until(test, fn, callback)
635   -
636   -Repeatedly call fn, until test returns true. Calls the callback when stopped,
637   -or an error occurs.
638   -
639   -The inverse of async.whilst.
640   -
641   -
642   ----------------------------------------
643   -
644   -<a name="waterfall" />
645   -### waterfall(tasks, [callback])
646   -
647   -Runs an array of functions in series, each passing their results to the next in
648   -the array. However, if any of the functions pass an error to the callback, the
649   -next function is not executed and the main callback is immediately called with
650   -the error.
651   -
652   -__Arguments__
653   -
654   -* tasks - An array of functions to run, each function is passed a callback it
655   - must call on completion.
656   -* callback(err, [results]) - An optional callback to run once all the functions
657   - have completed. This will be passed the results of the last task's callback.
658   -
659   -
660   -
661   -__Example__
662   -
663   - async.waterfall([
664   - function(callback){
665   - callback(null, 'one', 'two');
666   - },
667   - function(arg1, arg2, callback){
668   - callback(null, 'three');
669   - },
670   - function(arg1, callback){
671   - // arg1 now equals 'three'
672   - callback(null, 'done');
673   - }
674   - ], function (err, result) {
675   - // result now equals 'done'
676   - });
677   -
678   -
679   ----------------------------------------
680   -
681   -<a name="queue" />
682   -### queue(worker, concurrency)
683   -
684   -Creates a queue object with the specified concurrency. Tasks added to the
685   -queue will be processed in parallel (up to the concurrency limit). If all
686   -workers are in progress, the task is queued until one is available. Once
687   -a worker has completed a task, the task's callback is called.
688   -
689   -__Arguments__
690   -
691   -* worker(task, callback) - An asynchronous function for processing a queued
692   - task.
693   -* concurrency - An integer for determining how many worker functions should be
694   - run in parallel.
695   -
696   -__Queue objects__
697   -
698   -The queue object returned by this function has the following properties and
699   -methods:
700   -
701   -* length() - a function returning the number of items waiting to be processed.
702   -* concurrency - an integer for determining how many worker functions should be
703   - run in parallel. This property can be changed after a queue is created to
704   - alter the concurrency on-the-fly.
705   -* push(task, [callback]) - add a new task to the queue, the callback is called
706   - once the worker has finished processing the task.
707   - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.
708   -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued
709   -* empty - a callback that is called when the last item from the queue is given to a worker
710   -* drain - a callback that is called when the last item from the queue has returned from the worker
711   -
712   -__Example__
713   -
714   - // create a queue object with concurrency 2
715   -
716   - var q = async.queue(function (task, callback) {
717   - console.log('hello ' + task.name);
718   - callback();
719   - }, 2);
720   -
721   -
722   - // assign a callback
723   - q.drain = function() {
724   - console.log('all items have been processed');
725   - }
726   -
727   - // add some items to the queue
728   -
729   - q.push({name: 'foo'}, function (err) {
730   - console.log('finished processing foo');
731   - });
732   - q.push({name: 'bar'}, function (err) {
733   - console.log('finished processing bar');
734   - });
735   -
736   - // add some items to the queue (batch-wise)
737   -
738   - q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {
739   - console.log('finished processing bar');
740   - });
741   -
742   -
743   ----------------------------------------
744   -
745   -<a name="auto" />
746   -### auto(tasks, [callback])
747   -
748   -Determines the best order for running functions based on their requirements.
749   -Each function can optionally depend on other functions being completed first,
750   -and each function is run as soon as its requirements are satisfied. If any of
751   -the functions pass an error to their callback, that function will not complete
752   -(so any other functions depending on it will not run) and the main callback
753   -will be called immediately with the error. Functions also receive an object
754   -containing the results of functions which have completed so far.
755   -
756   -__Arguments__
757   -
758   -* tasks - An object literal containing named functions or an array of
759   - requirements, with the function itself the last item in the array. The key
760   - used for each function or array is used when specifying requirements. The
761   - syntax is easier to understand by looking at the example.
762   -* callback(err, results) - An optional callback which is called when all the
763   - tasks have been completed. The callback will receive an error as an argument
764   - if any tasks pass an error to their callback. If all tasks complete
765   - successfully, it will receive an object containing their results.
766   -
767   -__Example__
768   -
769   - async.auto({
770   - get_data: function(callback){
771   - // async code to get some data
772   - },
773   - make_folder: function(callback){
774   - // async code to create a directory to store a file in
775   - // this is run at the same time as getting the data
776   - },
777   - write_file: ['get_data', 'make_folder', function(callback){
778   - // once there is some data and the directory exists,
779   - // write the data to a file in the directory
780   - callback(null, filename);
781   - }],
782   - email_link: ['write_file', function(callback, results){
783   - // once the file is written let's email a link to it...
784   - // results.write_file contains the filename returned by write_file.
785   - }]
786   - });
787   -
788   -This is a fairly trivial example, but to do this using the basic parallel and
789   -series functions would look like this:
790   -
791   - async.parallel([
792   - function(callback){
793   - // async code to get some data
794   - },
795   - function(callback){
796   - // async code to create a directory to store a file in
797   - // this is run at the same time as getting the data
798   - }
799   - ],
800   - function(results){
801   - async.series([
802   - function(callback){
803   - // once there is some data and the directory exists,
804   - // write the data to a file in the directory
805   - },
806   - email_link: function(callback){
807   - // once the file is written let's email a link to it...
808   - }
809   - ]);
810   - });
811   -
812   -For a complicated series of async tasks using the auto function makes adding
813   -new tasks much easier and makes the code more readable.
814   -
815   -
816   ----------------------------------------
817   -
818   -<a name="iterator" />
819   -### iterator(tasks)
820   -
821   -Creates an iterator function which calls the next function in the array,
822   -returning a continuation to call the next one after that. Its also possible to
823   -'peek' the next iterator by doing iterator.next().
824   -
825   -This function is used internally by the async module but can be useful when
826   -you want to manually control the flow of functions in series.
827   -
828   -__Arguments__
829   -
830   -* tasks - An array of functions to run, each function is passed a callback it
831   - must call on completion.
832   -
833   -__Example__
834   -
835   - var iterator = async.iterator([
836   - function(){ sys.p('one'); },
837   - function(){ sys.p('two'); },
838   - function(){ sys.p('three'); }
839   - ]);
840   -
841   - node> var iterator2 = iterator();
842   - 'one'
843   - node> var iterator3 = iterator2();
844   - 'two'
845   - node> iterator3();
846   - 'three'
847   - node> var nextfn = iterator2.next();
848   - node> nextfn();
849   - 'three'
850   -
851   -
852   ----------------------------------------
853   -
854   -<a name="apply" />
855   -### apply(function, arguments..)
856   -
857   -Creates a continuation function with some arguments already applied, a useful
858   -shorthand when combined with other control flow functions. Any arguments
859   -passed to the returned function are added to the arguments originally passed
860   -to apply.
861   -
862   -__Arguments__
863   -
864   -* function - The function you want to eventually apply all arguments to.
865   -* arguments... - Any number of arguments to automatically apply when the
866   - continuation is called.
867   -
868   -__Example__
869   -
870   - // using apply
871   -
872   - async.parallel([
873   - async.apply(fs.writeFile, 'testfile1', 'test1'),
874   - async.apply(fs.writeFile, 'testfile2', 'test2'),
875   - ]);
876   -
877   -
878   - // the same process without using apply
879   -
880   - async.parallel([
881   - function(callback){
882   - fs.writeFile('testfile1', 'test1', callback);
883   - },
884   - function(callback){
885   - fs.writeFile('testfile2', 'test2', callback);
886   - },
887   - ]);
888   -
889   -It's possible to pass any number of additional arguments when calling the
890   -continuation:
891   -
892   - node> var fn = async.apply(sys.puts, 'one');
893   - node> fn('two', 'three');
894   - one
895   - two
896   - three
897   -
898   ----------------------------------------
899   -
900   -<a name="nextTick" />
901   -### nextTick(callback)
902   -
903   -Calls the callback on a later loop around the event loop. In node.js this just
904   -calls process.nextTick, in the browser it falls back to setTimeout(callback, 0),
905   -which means other higher priority events may precede the execution of the callback.
906   -
907   -This is used internally for browser-compatibility purposes.
908   -
909   -__Arguments__
910   -
911   -* callback - The function to call on a later loop around the event loop.
912   -
913   -__Example__
914   -
915   - var call_order = [];
916   - async.nextTick(function(){
917   - call_order.push('two');
918   - // call_order now equals ['one','two]
919   - });
920   - call_order.push('one')
921   -
922   -
923   -## Utils
924   -
925   -<a name="memoize" />
926   -### memoize(fn, [hasher])
927   -
928   -Caches the results of an async function. When creating a hash to store function
929   -results against, the callback is omitted from the hash and an optional hash
930   -function can be used.
931   -
932   -__Arguments__
933   -
934   -* fn - the function you to proxy and cache results from.
935   -* hasher - an optional function for generating a custom hash for storing
936   - results, it has all the arguments applied to it apart from the callback, and
937   - must be synchronous.
938   -
939   -__Example__
940   -
941   - var slow_fn = function (name, callback) {
942   - // do something
943   - callback(null, result);
944   - };
945   - var fn = async.memoize(slow_fn);
946   -
947   - // fn can now be used as if it were slow_fn
948   - fn('some name', function () {
949   - // callback
950   - });
951   -
952   -<a name="unmemoize" />
953   -### unmemoize(fn)
954   -
955   -Undoes a memoized function, reverting it to the original, unmemoized
956   -form. Comes handy in tests.
957   -
958   -__Arguments__
959   -
960   -* fn - the memoized function
961   -
962   -<a name="log" />
963   -### log(function, arguments)
964   -
965   -Logs the result of an async function to the console. Only works in node.js or
966   -in browsers that support console.log and console.error (such as FF and Chrome).
967   -If multiple arguments are returned from the async function, console.log is
968   -called on each argument in order.
969   -
970   -__Arguments__
971   -
972   -* function - The function you want to eventually apply all arguments to.
973   -* arguments... - Any number of arguments to apply to the function.
974   -
975   -__Example__
976   -
977   - var hello = function(name, callback){
978   - setTimeout(function(){
979   - callback(null, 'hello ' + name);
980   - }, 1000);
981   - };
982   -
983   - node> async.log(hello, 'world');
984   - 'hello world'
985   -
986   -
987   ----------------------------------------
988   -
989   -<a name="dir" />
990   -### dir(function, arguments)
991   -
992   -Logs the result of an async function to the console using console.dir to
993   -display the properties of the resulting object. Only works in node.js or
994   -in browsers that support console.dir and console.error (such as FF and Chrome).
995   -If multiple arguments are returned from the async function, console.dir is
996   -called on each argument in order.
997   -
998   -__Arguments__
999   -
1000   -* function - The function you want to eventually apply all arguments to.
1001   -* arguments... - Any number of arguments to apply to the function.
1002   -
1003   -__Example__
1004   -
1005   - var hello = function(name, callback){
1006   - setTimeout(function(){
1007   - callback(null, {hello: name});
1008   - }, 1000);
1009   - };
1010   -
1011   - node> async.dir(hello, 'world');
1012   - {hello: 'world'}
1013   -
1014   -
1015   ----------------------------------------
1016   -
1017   -<a name="noConflict" />
1018   -### noConflict()
1019   -
1020   -Changes the value of async back to its original value, returning a reference to the
1021   -async object.
node_modules/grunt/node_modules/async/index.js deleted
1   -// This file is just added for convenience so this repository can be
2   -// directly checked out into a project's deps folder
3   -module.exports = require('./lib/async');
node_modules/grunt/node_modules/async/lib/async.js deleted
1   -/*global setTimeout: false, console: false */
2   -(function () {
3   -
4   - var async = {};
5   -
6   - // global on the server, window in the browser
7   - var root = this,
8   - previous_async = root.async;
9   -
10   - if (typeof module !== 'undefined' && module.exports) {
11   - module.exports = async;
12   - }
13   - else {
14   - root.async = async;
15   - }
16   -
17   - async.noConflict = function () {
18   - root.async = previous_async;
19   - return async;
20   - };
21   -
22   - //// cross-browser compatiblity functions ////
23   -
24   - var _forEach = function (arr, iterator) {
25   - if (arr.forEach) {
26   - return arr.forEach(iterator);
27   - }
28   - for (var i = 0; i < arr.length; i += 1) {
29   - iterator(arr[i], i, arr);
30   - }
31   - };
32   -
33   - var _map = function (arr, iterator) {
34   - if (arr.map) {
35   - return arr.map(iterator);
36   - }
37   - var results = [];
38   - _forEach(arr, function (x, i, a) {
39   - results.push(iterator(x, i, a));
40   - });
41   - return results;
42   - };
43   -
44   - var _reduce = function (arr, iterator, memo) {
45   - if (arr.reduce) {
46   - return arr.reduce(iterator, memo);
47   - }
48   - _forEach(arr, function (x, i, a) {
49   - memo = iterator(memo, x, i, a);
50   - });
51   - return memo;
52   - };
53   -
54   - var _keys = function (obj) {
55   - if (Object.keys) {
56   - return Object.keys(obj);
57   - }
58   - var keys = [];
59   - for (var k in obj) {
60   - if (obj.hasOwnProperty(k)) {
61   - keys.push(k);
62   - }
63   - }
64   - return keys;
65   - };
66   -
67   - //// exported async module functions ////
68   -
69   - //// nextTick implementation with browser-compatible fallback ////
70   - if (typeof process === 'undefined' || !(process.nextTick)) {
71   - async.nextTick = function (fn) {
72   - setTimeout(fn, 0);
73   - };
74   - }
75   - else {
76   - async.nextTick = process.nextTick;
77   - }
78   -
79   - async.forEach = function (arr, iterator, callback) {
80   - callback = callback || function () {};
81   - if (!arr.length) {
82   - return callback();
83   - }
84   - var completed = 0;
85   - _forEach(arr, function (x) {
86   - iterator(x, function (err) {
87   - if (err) {
88   - callback(err);
89   - callback = function () {};
90   - }
91   - else {
92   - completed += 1;
93   - if (completed === arr.length) {
94   - callback(null);
95   - }
96   - }
97   - });
98   - });
99   - };
100   -
101   - async.forEachSeries = function (arr, iterator, callback) {
102   - callback = callback || function () {};
103   - if (!arr.length) {
104   - return callback();
105   - }
106   - var completed = 0;
107   - var iterate = function () {
108   - iterator(arr[completed], function (err) {
109   - if (err) {
110   - callback(err);
111   - callback = function () {};
112   - }
113   - else {
114   - completed += 1;
115   - if (completed === arr.length) {
116   - callback(null);
117   - }
118   - else {
119   - iterate();
120   - }
121   - }
122   - });
123   - };
124   - iterate();
125   - };
126   -
127   - async.forEachLimit = function (arr, limit, iterator, callback) {
128   - callback = callback || function () {};
129   - if (!arr.length || limit <= 0) {
130   - return callback();
131   - }
132   - var completed = 0;
133   - var started = 0;
134   - var running = 0;
135   -
136   - (function replenish () {
137   - if (completed === arr.length) {
138   - return callback();
139   - }
140   -
141   - while (running < limit && started < arr.length) {
142   - started += 1;
143   - running += 1;
144   - iterator(arr[started - 1], function (err) {
145   - if (err) {
146   - callback(err);
147   - callback = function () {};
148   - }
149   - else {
150   - completed += 1;
151   - running -= 1;
152   - if (completed === arr.length) {
153   - callback();
154   - }
155   - else {
156   - replenish();
157   - }
158   - }
159   - });
160   - }
161   - })();
162   - };
163   -
164   -
165   - var doParallel = function (fn) {
166   - return function () {
167   - var args = Array.prototype.slice.call(arguments);
168   - return fn.apply(null, [async.forEach].concat(args));
169   - };
170   - };
171   - var doSeries = function (fn) {
172   - return function () {
173   - var args = Array.prototype.slice.call(arguments);
174   - return fn.apply(null, [async.forEachSeries].concat(args));
175   - };
176   - };
177   -
178   -
179   - var _asyncMap = function (eachfn, arr, iterator, callback) {
180   - var results = [];
181   - arr = _map(arr, function (x, i) {
182   - return {index: i, value: x};
183   - });
184   - eachfn(arr, function (x, callback) {
185   - iterator(x.value, function (err, v) {
186   - results[x.index] = v;
187   - callback(err);
188   - });
189   - }, function (err) {
190   - callback(err, results);
191   - });
192   - };
193   - async.map = doParallel(_asyncMap);
194   - async.mapSeries = doSeries(_asyncMap);
195   -
196   -
197   - // reduce only has a series version, as doing reduce in parallel won't
198   - // work in many situations.
199   - async.reduce = function (arr, memo, iterator, callback) {
200   - async.forEachSeries(arr, function (x, callback) {
201   - iterator(memo, x, function (err, v) {
202   - memo = v;
203   - callback(err);
204   - });
205   - }, function (err) {
206   - callback(err, memo);
207   - });
208   - };
209   - // inject alias
210   - async.inject = async.reduce;
211   - // foldl alias
212   - async.foldl = async.reduce;
213   -
214   - async.reduceRight = function (arr, memo, iterator, callback) {
215   - var reversed = _map(arr, function (x) {
216   - return x;
217   - }).reverse();
218   - async.reduce(reversed, memo, iterator, callback);
219   - };
220   - // foldr alias
221   - async.foldr = async.reduceRight;
222   -
223   - var _filter = function (eachfn, arr, iterator, callback) {
224   - var results = [];
225   - arr = _map(arr, function (x, i) {
226   - return {index: i, value: x};
227   - });
228   - eachfn(arr, function (x, callback) {
229   - iterator(x.value, function (v) {
230   - if (v) {
231   - results.push(x);
232   - }
233   - callback();
234   - });
235   - }, function (err) {
236   - callback(_map(results.sort(function (a, b) {
237   - return a.index - b.index;
238   - }), function (x) {
239   - return x.value;
240   - }));
241   - });
242   - };
243   - async.filter = doParallel(_filter);
244   - async.filterSeries = doSeries(_filter);
245   - // select alias
246   - async.select = async.filter;
247   - async.selectSeries = async.filterSeries;
248   -
249   - var _reject = function (eachfn, arr, iterator, callback) {
250   - var results = [];
251   - arr = _map(arr, function (x, i) {
252   - return {index: i, value: x};
253   - });
254   - eachfn(arr, function (x, callback) {
255   - iterator(x.value, function (v) {
256   - if (!v) {
257   - results.push(x);
258   - }
259   - callback();
260   - });
261   - }, function (err) {
262   - callback(_map(results.sort(function (a, b) {
263   - return a.index - b.index;
264   - }), function (x) {
265   - return x.value;
266   - }));
267   - });
268   - };
269   - async.reject = doParallel(_reject);
270   - async.rejectSeries = doSeries(_reject);
271   -
272   - var _detect = function (eachfn, arr, iterator, main_callback) {
273   - eachfn(arr, function (x, callback) {
274   - iterator(x, function (result) {
275   - if (result) {
276   - main_callback(x);
277   - main_callback = function () {};
278   - }
279   - else {
280   - callback();
281   - }
282   - });
283   - }, function (err) {
284   - main_callback();
285   - });
286   - };
287   - async.detect = doParallel(_detect);
288   - async.detectSeries = doSeries(_detect);
289   -
290   - async.some = function (arr, iterator, main_callback) {
291   - async.forEach(arr, function (x, callback) {
292   - iterator(x, function (v) {
293   - if (v) {
294   - main_callback(true);
295   - main_callback = function () {};
296   - }
297   - callback();
298   - });
299   - }, function (err) {
300   - main_callback(false);
301   - });
302   - };
303   - // any alias
304   - async.any = async.some;
305   -
306   - async.every = function (arr, iterator, main_callback) {
307   - async.forEach(arr, function (x, callback) {
308   - iterator(x, function (v) {
309   - if (!v) {
310   - main_callback(false);
311   - main_callback = function () {};
312   - }
313   - callback();
314   - });
315   - }, function (err) {
316   - main_callback(true);
317   - });
318   - };
319   - // all alias
320   - async.all = async.every;
321   -
322   - async.sortBy = function (arr, iterator, callback) {
323   - async.map(arr, function (x, callback) {
324   - iterator(x, function (err, criteria) {
325   - if (err) {
326   - callback(err);
327   - }
328   - else {
329   - callback(null, {value: x, criteria: criteria});
330   - }
331   - });
332   - }, function (err, results) {
333   - if (err) {
334   - return callback(err);
335   - }
336   - else {
337   - var fn = function (left, right) {
338   - var a = left.criteria, b = right.criteria;
339   - return a < b ? -1 : a > b ? 1 : 0;
340   - };
341   - callback(null, _map(results.sort(fn), function (x) {
342   - return x.value;
343   - }));
344   - }
345   - });
346   - };
347   -
348   - async.auto = function (tasks, callback) {
349   - callback = callback || function () {};
350   - var keys = _keys(tasks);
351   - if (!keys.length) {
352   - return callback(null);
353   - }
354   -
355   - var results = {};
356   -
357   - var listeners = [];
358   - var addListener = function (fn) {
359   - listeners.unshift(fn);
360   - };
361   - var removeListener = function (fn) {
362   - for (var i = 0; i < listeners.length; i += 1) {
363   - if (listeners[i] === fn) {
364   - listeners.splice(i, 1);
365   - return;
366   - }
367   - }
368   - };
369   - var taskComplete = function () {
370   - _forEach(listeners.slice(0), function (fn) {
371   - fn();
372   - });
373   - };
374   -
375   - addListener(function () {
376   - if (_keys(results).length === keys.length) {
377   - callback(null, results);
378   - callback = function () {};
379   - }
380   - });
381   -
382   - _forEach(keys, function (k) {
383   - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
384   - var taskCallback = function (err) {
385   - if (err) {
386   - callback(err);
387   - // stop subsequent errors hitting callback multiple times
388   - callback = function () {};
389   - }
390   - else {
391   - var args = Array.prototype.slice.call(arguments, 1);
392   - if (args.length <= 1) {
393   - args = args[0];
394   - }
395   - results[k] = args;
396   - taskComplete();
397   - }
398   - };
399   - var requires = task.slice(0, Math.abs(task.length - 1)) || [];
400   - var ready = function () {
401   - return _reduce(requires, function (a, x) {
402   - return (a && results.hasOwnProperty(x));
403   - }, true) && !results.hasOwnProperty(k);
404   - };
405   - if (ready()) {
406   - task[task.length - 1](taskCallback, results);
407   - }
408   - else {
409   - var listener = function () {
410   - if (ready()) {
411   - removeListener(listener);
412   - task[task.length - 1](taskCallback, results);
413   - }
414   - };
415   - addListener(listener);
416   - }
417   - });
418   - };
419   -
420   - async.waterfall = function (tasks, callback) {
421   - callback = callback || function () {};
422   - if (!tasks.length) {
423   - return callback();
424   - }
425   - var wrapIterator = function (iterator) {
426   - return function (err) {
427   - if (err) {
428   - callback(err);
429   - callback = function () {};
430   - }
431   - else {
432   - var args = Array.prototype.slice.call(arguments, 1);
433   - var next = iterator.next();
434   - if (next) {
435   - args.push(wrapIterator(next));
436   - }
437   - else {
438   - args.push(callback);
439   - }
440   - async.nextTick(function () {
441   - iterator.apply(null, args);
442   - });
443   - }
444   - };
445   - };
446   - wrapIterator(async.iterator(tasks))();
447   - };
448   -
449   - async.parallel = function (tasks, callback) {
450   - callback = callback || function () {};
451   - if (tasks.constructor === Array) {
452   - async.map(tasks, function (fn, callback) {
453   - if (fn) {
454   - fn(function (err) {
455   - var args = Array.prototype.slice.call(arguments, 1);
456   - if (args.length <= 1) {
457   - args = args[0];
458   - }
459   - callback.call(null, err, args);
460   - });
461   - }
462   - }, callback);
463   - }
464   - else {
465   - var results = {};
466   - async.forEach(_keys(tasks), function (k, callback) {
467   - tasks[k](function (err) {
468   - var args = Array.prototype.slice.call(arguments, 1);
469   - if (args.length <= 1) {
470   - args = args[0];
471   - }
472   - results[k] = args;
473   - callback(err);
474   - });
475   - }, function (err) {
476   - callback(err, results);
477   - });
478   - }
479   - };
480   -
481   - async.series = function (tasks, callback) {
482   - callback = callback || function () {};
483   - if (tasks.constructor === Array) {
484   - async.mapSeries(tasks, function (fn, callback) {
485   - if (fn) {
486   - fn(function (err) {
487   - var args = Array.prototype.slice.call(arguments, 1);
488   - if (args.length <= 1) {
489   - args = args[0];
490   - }
491   - callback.call(null, err, args);
492   - });
493   - }
494   - }, callback);
495   - }
496   - else {
497   - var results = {};
498   - async.forEachSeries(_keys(tasks), function (k, callback) {
499   - tasks[k](function (err) {
500   - var args = Array.prototype.slice.call(arguments, 1);
501   - if (args.length <= 1) {
502   - args = args[0];
503   - }
504   - results[k] = args;
505   - callback(err);
506   - });
507   - }, function (err) {
508   - callback(err, results);
509   - });
510   - }
511   - };
512   -
513   - async.iterator = function (tasks) {
514   - var makeCallback = function (index) {
515   - var fn = function () {
516   - if (tasks.length) {
517   - tasks[index].apply(null, arguments);
518   - }
519   - return fn.next();
520   - };
521   - fn.next = function () {
522   - return (index < tasks.length - 1) ? makeCallback(index + 1): null;
523   - };
524   - return fn;
525   - };
526   - return makeCallback(0);
527   - };
528   -
529   - async.apply = function (fn) {
530   - var args = Array.prototype.slice.call(arguments, 1);
531   - return function () {
532   - return fn.apply(
533   - null, args.concat(Array.prototype.slice.call(arguments))
534   - );
535   - };
536   - };
537   -
538   - var _concat = function (eachfn, arr, fn, callback) {
539   - var r = [];
540   - eachfn(arr, function (x, cb) {
541   - fn(x, function (err, y) {
542   - r = r.concat(y || []);
543   - cb(err);
544   - });
545   - }, function (err) {
546   - callback(err, r);
547   - });
548   - };
549   - async.concat = doParallel(_concat);
550   - async.concatSeries = doSeries(_concat);
551   -
552   - async.whilst = function (test, iterator, callback) {
553   - if (test()) {
554   - iterator(function (err) {
555   - if (err) {
556   - return callback(err);
557   - }
558   - async.whilst(test, iterator, callback);
559   - });
560   - }
561   - else {
562   - callback();
563   - }
564   - };
565   -
566   - async.until = function (test, iterator, callback) {
567   - if (!test()) {
568   - iterator(function (err) {
569   - if (err) {
570   - return callback(err);
571   - }
572   - async.until(test, iterator, callback);
573   - });
574   - }
575   - else {
576   - callback();
577   - }
578   - };
579   -
580   - async.queue = function (worker, concurrency) {
581   - var workers = 0;
582   - var q = {
583   - tasks: [],
584   - concurrency: concurrency,
585   - saturated: null,
586   - empty: null,
587   - drain: null,
588   - push: function (data, callback) {
589   - if(data.constructor !== Array) {
590   - data = [data];
591   - }
592   - _forEach(data, function(task) {
593   - q.tasks.push({
594   - data: task,
595   - callback: typeof callback === 'function' ? callback : null
596   - });
597   - if (q.saturated && q.tasks.length == concurrency) {
598   - q.saturated();
599   - }
600   - async.nextTick(q.process);
601   - });
602   - },
603   - process: function () {
604   - if (workers < q.concurrency && q.tasks.length) {
605   - var task = q.tasks.shift();
606   - if(q.empty && q.tasks.length == 0) q.empty();
607   - workers += 1;
608   - worker(task.data, function () {
609   - workers -= 1;
610   - if (task.callback) {
611   - task.callback.apply(task, arguments);
612   - }
613   - if(q.drain && q.tasks.length + workers == 0) q.drain();
614   - q.process();
615   - });
616   - }
617   - },
618   - length: function () {
619   - return q.tasks.length;
620   - },
621   - running: function () {
622   - return workers;
623   - }
624   - };
625   - return q;
626   - };
627   -
628   - var _console_fn = function (name) {
629   - return function (fn) {
630   - var args = Array.prototype.slice.call(arguments, 1);
631   - fn.apply(null, args.concat([function (err) {
632   - var args = Array.prototype.slice.call(arguments, 1);
633   - if (typeof console !== 'undefined') {
634   - if (err) {
635   - if (console.error) {
636   - console.error(err);
637   - }
638   - }
639   - else if (console[name]) {
640   - _forEach(args, function (x) {
641   - console[name](x);
642   - });
643   - }
644   - }
645   - }]));
646   - };
647   - };
648   - async.log = _console_fn('log');
649   - async.dir = _console_fn('dir');
650   - /*async.info = _console_fn('info');
651   - async.warn = _console_fn('warn');
652   - async.error = _console_fn('error');*/
653   -
654   - async.memoize = function (fn, hasher) {
655   - var memo = {};
656   - var queues = {};
657   - hasher = hasher || function (x) {
658   - return x;
659   - };
660   - var memoized = function () {
661   - var args = Array.prototype.slice.call(arguments);
662   - var callback = args.pop();
663   - var key = hasher.apply(null, args);
664   - if (key in memo) {
665   - callback.apply(null, memo[key]);
666   - }
667   - else if (key in queues) {
668   - queues[key].push(callback);
669   - }
670   - else {
671   - queues[key] = [callback];
672   - fn.apply(null, args.concat([function () {
673   - memo[key] = arguments;
674   - var q = queues[key];
675   - delete queues[key];
676   - for (var i = 0, l = q.length; i < l; i++) {
677   - q[i].apply(null, arguments);
678   - }
679   - }]));
680   - }
681   - };
682   - memoized.unmemoized = fn;
683   - return memoized;
684   - };
685   -
686   - async.unmemoize = function (fn) {
687   - return function () {
688   - return (fn.unmemoized || fn).apply(null, arguments);
689   - };
690   - };
691   -
692   -}());
node_modules/grunt/node_modules/async/package.json deleted
1   -{
2   - "name": "async",
3   - "description": "Higher-order functions and common patterns for asynchronous code",
4   - "main": "./index",
5   - "author": {
6   - "name": "Caolan McMahon"
7   - },
8   - "version": "0.1.22",
9   - "repository": {
10   - "type": "git",
11   - "url": "http://github.com/caolan/async.git"
12   - },
13   - "bugs": {
14   - "url": "http://github.com/caolan/async/issues"
15   - },
16   - "licenses": [
17   - {
18   - "type": "MIT",
19   - "url": "http://github.com/caolan/async/raw/master/LICENSE"
20   - }
21   - ],
22   - "devDependencies": {
23   - "nodeunit": ">0.0.0",
24   - "uglify-js": "1.2.x",
25   - "nodelint": ">0.0.0"
26   - },
27   - "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEachโ€ฆ) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfallโ€ฆ). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n async.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n });\n\n async.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n });\n\n async.parallel([\n function(){ ... },\n function(){ ... }\n ], callback);\n\n async.series([\n function(){ ... },\n function(){ ... }\n ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n <script type=\"text/javascript\" src=\"async.js\"></script>\n <script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n // assuming openFiles is an array of file names and saveFile is a function\n // to save the modified contents of that file:\n\n async.forEach(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n // Assume documents is an array of JSON objects and requestApi is a\n // function that interacts with a rate-limited REST api.\n\n async.forEachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n async.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n async.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback which accepts an optional error as its first argument, and the state\n of the reduction as the second. If an error is passed to the callback, the\n reduction is stopped and the main callback is immediately called with the\n error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n async.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n }, function(err, result){\n // result is now equal to the last value of memo, which is 6\n });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n async.detect(['file1','file2','file3'], path.exists, function(result){\n // result now equals the first file in the list that exists\n });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n async.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n }, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n async.some(['file1','file2','file3'], path.exists, function(result){\n // if result is true then at least one of the files exists\n });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n async.every(['file1','file2','file3'], path.exists, function(result){\n // if result is true then every file exists\n });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets an array of all the arguments passed to\n the callbacks used in the array.\n\n__Example__\n\n async.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n },\n ],\n // optional callback\n function(err, results){\n // results is now equal to ['one', 'two']\n });\n\n\n // an example using an object instead of an array\n async.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n },\n },\n function(err, results) {\n // results is now equal to: {one: 1, two: 2}\n });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets an array of all the arguments passed to\n the callbacks used in the array.\n\n__Example__\n\n async.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n },\n ],\n // optional callback\n function(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n });\n\n\n // an example using an object instead of an array\n async.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n },\n },\n function(err, results) {\n // results is now equals to: {one: 1, two: 2}\n });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback which must be called once it has completed with an optional\n error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n var count = 0;\n\n async.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n async.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n ], function (err, result) {\n // result now equals 'done' \n });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n // create a queue object with concurrency 2\n\n var q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n }, 2);\n\n\n // assign a callback\n q.drain = function() {\n console.log('all items have been processed');\n }\n\n // add some items to the queue\n\n q.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n });\n q.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n });\n\n // add some items to the queue (batch-wise)\n\n q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The\n syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. If all tasks complete\n successfully, it will receive an object containing their results.\n\n__Example__\n\n async.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n async.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n ],\n function(results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n email_link: function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n must call on completion.\n\n__Example__\n\n var iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n ]);\n\n node> var iterator2 = iterator();\n 'one'\n node> var iterator3 = iterator2();\n 'two'\n node> iterator3();\n 'three'\n node> var nextfn = iterator2.next();\n node> nextfn();\n 'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n // using apply\n\n async.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n ]);\n\n\n // the same process without using apply\n\n async.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n },\n ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n node> var fn = async.apply(sys.puts, 'one');\n node> fn('two', 'three');\n one\n two\n three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n var call_order = [];\n async.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two]\n });\n call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n var slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n };\n var fn = async.memoize(slow_fn);\n\n // fn can now be used as if it were slow_fn\n fn('some name', function () {\n // callback\n });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n var hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n };\n\n node> async.log(hello, 'world');\n 'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n var hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n };\n\n node> async.dir(hello, 'world');\n {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
28   - "readmeFilename": "README.md",
29   - "_id": "async@0.1.22",
30   - "dist": {
31   - "shasum": "16e128d886add7ca553a871f9fcb0cc189befa58"
32   - },
33   - "_from": "async@~0.1.22",
34   - "_resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz"
35   -}
node_modules/grunt/node_modules/coffee-script/.npmignore deleted
1   -*.coffee
2   -*.html
3   -.DS_Store
4   -.git*
5   -Cakefile
6   -documentation/
7   -examples/
8   -extras/coffee-script.js
9   -raw/
10   -src/
11   -test/
node_modules/grunt/node_modules/coffee-script/CNAME deleted
1   -coffeescript.org
2 0 \ No newline at end of file
node_modules/grunt/node_modules/coffee-script/LICENSE deleted
1   -Copyright (c) 2009-2012 Jeremy Ashkenas
2   -
3   -Permission is hereby granted, free of charge, to any person
4   -obtaining a copy of this software and associated documentation
5   -files (the "Software"), to deal in the Software without
6   -restriction, including without limitation the rights to use,
7   -copy, modify, merge, publish, distribute, sublicense, and/or sell
8   -copies of the Software, and to permit persons to whom the
9   -Software is furnished to do so, subject to the following
10   -conditions:
11   -
12   -The above copyright notice and this permission notice shall be
13   -included in all copies or substantial portions of the Software.
14   -
15   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16   -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17   -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18   -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19   -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20   -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21   -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22   -OTHER DEALINGS IN THE SOFTWARE.
23 0 \ No newline at end of file
node_modules/grunt/node_modules/coffee-script/README deleted
1   -
2   - {
3   - } } {
4   - { { } }
5   - } }{ {
6   - { }{ } } _____ __ __
7   - ( }{ }{ { ) / ____| / _|/ _|
8   - .- { { } { }} -. | | ___ | |_| |_ ___ ___
9   - ( ( } { } { } } ) | | / _ \| _| _/ _ \/ _ \
10   - |`-..________ ..-'| | |___| (_) | | | || __/ __/
11   - | | \_____\___/|_| |_| \___|\___|
12   - | ;--.
13   - | (__ \ _____ _ _
14   - | | ) ) / ____| (_) | |
15   - | |/ / | (___ ___ _ __ _ _ __ | |_
16   - | ( / \___ \ / __| '__| | '_ \| __|
17   - | |/ ____) | (__| | | | |_) | |_
18   - | | |_____/ \___|_| |_| .__/ \__|
19   - `-.._________..-' | |
20   - |_|
21   -
22   -
23   - CoffeeScript is a little language that compiles into JavaScript.
24   -
25   - Install Node.js, and then the CoffeeScript compiler:
26   - sudo bin/cake install
27   -
28   - Or, if you have the Node Package Manager installed:
29   - npm install -g coffee-script
30   - (Leave off the -g if you don't wish to install globally.)
31   -
32   - Execute a script:
33   - coffee /path/to/script.coffee
34   -
35   - Compile a script:
36   - coffee -c /path/to/script.coffee
37   -
38   - For documentation, usage, and examples, see:
39   - http://coffeescript.org/
40   -
41   - To suggest a feature, report a bug, or general discussion:
42   - http://github.com/jashkenas/coffee-script/issues/
43   -
44   - If you'd like to chat, drop by #coffeescript on Freenode IRC,
45   - or on webchat.freenode.net.
46   -
47   - The source repository:
48   - git://github.com/jashkenas/coffee-script.git
49   -
50   - All contributors are listed here:
51   - http://github.com/jashkenas/coffee-script/contributors
node_modules/grunt/node_modules/coffee-script/Rakefile deleted
1   -require 'rubygems'
2   -require 'erb'
3   -require 'fileutils'
4   -require 'rake/testtask'
5   -require 'json'
6   -
7   -desc "Build the documentation page"
8   -task :doc do
9   - source = 'documentation/index.html.erb'
10   - child = fork { exec "bin/coffee -bcw -o documentation/js documentation/coffee/*.coffee" }
11   - at_exit { Process.kill("INT", child) }
12   - Signal.trap("INT") { exit }
13   - loop do
14   - mtime = File.stat(source).mtime
15   - if !@mtime || mtime > @mtime
16   - rendered = ERB.new(File.read(source)).result(binding)
17   - File.open('index.html', 'w+') {|f| f.write(rendered) }
18   - end
19   - @mtime = mtime
20   - sleep 1
21   - end
22   -end
23   -
24   -desc "Build coffee-script-source gem"
25   -task :gem do
26   - require 'rubygems'
27   - require 'rubygems/package'
28   -
29   - gemspec = Gem::Specification.new do |s|
30   - s.name = 'coffee-script-source'
31   - s.version = JSON.parse(File.read('package.json'))["version"]
32   - s.date = Time.now.strftime("%Y-%m-%d")
33   -
34   - s.homepage = "http://jashkenas.github.com/coffee-script/"
35   - s.summary = "The CoffeeScript Compiler"
36   - s.description = <<-EOS
37   - CoffeeScript is a little language that compiles into JavaScript.
38   - Underneath all of those embarrassing braces and semicolons,
39   - JavaScript has always had a gorgeous object model at its heart.
40   - CoffeeScript is an attempt to expose the good parts of JavaScript
41   - in a simple way.
42   - EOS
43   -
44   - s.files = [
45   - 'lib/coffee_script/coffee-script.js',
46   - 'lib/coffee_script/source.rb'
47   - ]
48   -
49   - s.authors = ['Jeremy Ashkenas']
50   - s.email = 'jashkenas@gmail.com'
51   - s.rubyforge_project = 'coffee-script-source'
52   - end
53   -
54   - file = File.open("coffee-script-source.gem", "w")
55   - Gem::Package.open(file, 'w') do |pkg|
56   - pkg.metadata = gemspec.to_yaml
57   -
58   - path = "lib/coffee_script/source.rb"
59   - contents = <<-ERUBY
60   -module CoffeeScript
61   - module Source
62   - def self.bundled_path
63   - File.expand_path("../coffee-script.js", __FILE__)
64   - end
65   - end
66   -end
67   - ERUBY
68   - pkg.add_file_simple(path, 0644, contents.size) do |tar_io|
69   - tar_io.write(contents)
70   - end
71   -
72   - contents = File.read("extras/coffee-script.js")
73   - path = "lib/coffee_script/coffee-script.js"
74   - pkg.add_file_simple(path, 0644, contents.size) do |tar_io|
75   - tar_io.write(contents)
76   - end
77   - end
78   -end
node_modules/grunt/node_modules/coffee-script/bin/cake deleted
1   -#!/usr/bin/env node
2   -
3   -var path = require('path');
4   -var fs = require('fs');
5   -var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');
6   -
7   -require(lib + '/coffee-script/cake').run();
node_modules/grunt/node_modules/coffee-script/bin/coffee deleted
1   -#!/usr/bin/env node
2   -
3   -var path = require('path');
4   -var fs = require('fs');
5   -var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');
6   -
7   -require(lib + '/coffee-script/command').run();
node_modules/grunt/node_modules/coffee-script/extras/jsl.conf deleted
1   -# JavaScriptLint configuration file for CoffeeScript.
2   -
3   -+no_return_value # function {0} does not always return a value
4   -+duplicate_formal # duplicate formal argument {0}
5   --equal_as_assign # test for equality (==) mistyped as assignment (=)?{0}
6   -+var_hides_arg # variable {0} hides argument
7   -+redeclared_var # redeclaration of {0} {1}
8   --anon_no_return_value # anonymous function does not always return a value
9   -+missing_semicolon # missing semicolon
10   -+meaningless_block # meaningless block; curly braces have no impact
11   --comma_separated_stmts # multiple statements separated by commas (use semicolons?)
12   -+unreachable_code # unreachable code
13   -+missing_break # missing break statement
14   --missing_break_for_last_case # missing break statement for last case in switch
15   --comparison_type_conv # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
16   --inc_dec_within_stmt # increment (++) and decrement (--) operators used as part of greater statement
17   --useless_void # use of the void type may be unnecessary (void is always undefined)
18   -+multiple_plus_minus # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
19   -+use_of_label # use of label
20   --block_without_braces # block statement without curly braces
21   -+leading_decimal_point # leading decimal point may indicate a number or an object member
22   -+trailing_decimal_point # trailing decimal point may indicate a number or an object member
23   -+octal_number # leading zeros make an octal number
24   -+nested_comment # nested comment
25   -+misplaced_regex # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
26   -+ambiguous_newline # unexpected end of line; it is ambiguous whether these lines are part of the same statement
27   -+empty_statement # empty statement or extra semicolon
28   --missing_option_explicit # the "option explicit" control comment is missing
29   -+partial_option_explicit # the "option explicit" control comment, if used, must be in the first script tag
30   -+dup_option_explicit # duplicate "option explicit" control comment
31   -+useless_assign # useless assignment
32   -+ambiguous_nested_stmt # block statements containing block statements should use curly braces to resolve ambiguity
33   -+ambiguous_else_stmt # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent)
34   --missing_default_case # missing default case in switch statement
35   -+duplicate_case_in_switch # duplicate case in switch statements
36   -+default_not_at_end # the default case is not at the end of the switch statement
37   -+legacy_cc_not_understood # couldn't understand control comment using /*@keyword@*/ syntax
38   -+jsl_cc_not_understood # couldn't understand control comment using /*jsl:keyword*/ syntax
39   -+useless_comparison # useless comparison; comparing identical expressions
40   -+with_statement # with statement hides undeclared variables; use temporary variable instead
41   -+trailing_comma_in_array # extra comma is not recommended in array initializers
42   -+assign_to_function_call # assignment to a function call
43   -+parseint_missing_radix # parseInt missing radix parameter
44   -+lambda_assign_requires_semicolon