Merge ~canonical-bootstack/+git/cloud-status:operator into ~canonical-bootstack/+git/cloud-status:master

Proposed by Wouter van Bommel
Status: Needs review
Proposed branch: ~canonical-bootstack/+git/cloud-status:operator
Merge into: ~canonical-bootstack/+git/cloud-status:master
Diff against target: 2548 lines (+121/-63)
11 files modified
.gitmodules (+6/-0)
dev/null (+0/-59)
juju-cloud-status/config.yaml (+0/-4)
juju-cloud-status/hooks/install (+1/-0)
juju-cloud-status/lib/jinja2 (+1/-0)
juju-cloud-status/lib/ops (+1/-0)
juju-cloud-status/metadata.yaml (+4/-0)
juju-cloud-status/mod/jinja (+1/-0)
juju-cloud-status/mod/operator (+1/-0)
juju-cloud-status/src/charm.py (+92/-0)
juju-cloud-status/templates/juju-cloud-status.j2 (+14/-0)
Reviewer Review Type Date Requested Status
Legacy - Canonical WTFB Pending
Review via email: mp+380665@code.launchpad.net
To post a comment you must log in.

Unmerged commits

e6ba548... by Wouter van Bommel

Implement charm via operator framework

With this commit the charm has been rewritten to use the operator
framework. It works around a missing functionality of the framework
(https://github.com/canonical/operator/issues/183) by a rough
implementation in the code.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/.gitmodules b/.gitmodules
2new file mode 100644
3index 0000000..fe47180
4--- /dev/null
5+++ b/.gitmodules
6@@ -0,0 +1,6 @@
7+[submodule "juju-cloud-status/mod/operator"]
8+ path = juju-cloud-status/mod/operator
9+ url = https://github.com/canonical/operator
10+[submodule "juju-cloud-status/mod/jinja"]
11+ path = juju-cloud-status/mod/jinja
12+ url = https://github.com/pallets/jinja
13diff --git a/juju-cloud-status/actions.yaml b/juju-cloud-status/actions.yaml
14deleted file mode 100644
15index 53ec325..0000000
16--- a/juju-cloud-status/actions.yaml
17+++ /dev/null
18@@ -1,2 +0,0 @@
19-status:
20- description: "run the cloudstatus command"
21diff --git a/juju-cloud-status/actions/status b/juju-cloud-status/actions/status
22deleted file mode 100755
23index e9997d7..0000000
24--- a/juju-cloud-status/actions/status
25+++ /dev/null
26@@ -1,6 +0,0 @@
27-#!/usr/local/sbin/charm-env python3
28-
29-from lib_cloud_status import Cloud_statusHelper
30-
31-helper = Cloud_statusHelper()
32-helper.status_function()
33diff --git a/juju-cloud-status/config.yaml b/juju-cloud-status/config.yaml
34index 32a3777..fcacebd 100644
35--- a/juju-cloud-status/config.yaml
36+++ b/juju-cloud-status/config.yaml
37@@ -3,7 +3,3 @@ options:
38 type: boolean
39 default: False
40 description: "Enable the script to run the juju cloud status during login"
41- snap-channel:
42- type: string
43- default: "stable"
44- description: "Which channel to use to install the juju-cloud-status snap from"
45diff --git a/juju-cloud-status/hooks/install b/juju-cloud-status/hooks/install
46new file mode 120000
47index 0000000..25b1f68
48--- /dev/null
49+++ b/juju-cloud-status/hooks/install
50@@ -0,0 +1 @@
51+../src/charm.py
52\ No newline at end of file
53diff --git a/juju-cloud-status/interfaces/.empty b/juju-cloud-status/interfaces/.empty
54deleted file mode 100644
55index 792d600..0000000
56--- a/juju-cloud-status/interfaces/.empty
57+++ /dev/null
58@@ -1 +0,0 @@
59-#
60diff --git a/juju-cloud-status/layer.yaml b/juju-cloud-status/layer.yaml
61deleted file mode 100644
62index 019e8aa..0000000
63--- a/juju-cloud-status/layer.yaml
64+++ /dev/null
65@@ -1,9 +0,0 @@
66-# exclude the interfaces and layers folders we use for submodules
67-exclude:
68- - interfaces
69- - layers
70-# include required layers here
71-includes:
72- - layer:basic
73- - layer:snap
74-
75diff --git a/juju-cloud-status/layers/.empty b/juju-cloud-status/layers/.empty
76deleted file mode 100644
77index 792d600..0000000
78--- a/juju-cloud-status/layers/.empty
79+++ /dev/null
80@@ -1 +0,0 @@
81-#
82diff --git a/juju-cloud-status/lib/jinja2 b/juju-cloud-status/lib/jinja2
83new file mode 120000
84index 0000000..38b85c5
85--- /dev/null
86+++ b/juju-cloud-status/lib/jinja2
87@@ -0,0 +1 @@
88+../mod/jinja/src/jinja2
89\ No newline at end of file
90diff --git a/juju-cloud-status/lib/lib_cloud_status.py b/juju-cloud-status/lib/lib_cloud_status.py
91deleted file mode 100644
92index 3811ec8..0000000
93--- a/juju-cloud-status/lib/lib_cloud_status.py
94+++ /dev/null
95@@ -1,10 +0,0 @@
96-from charmhelpers.core import hookenv
97-
98-
99-class Cloud_statusHelper():
100- def __init__(self):
101- self.charm_config = hookenv.config()
102-
103- def status_function(self):
104- ''' An example function for calling from an action '''
105- return
106diff --git a/juju-cloud-status/lib/ops b/juju-cloud-status/lib/ops
107new file mode 120000
108index 0000000..d934193
109--- /dev/null
110+++ b/juju-cloud-status/lib/ops
111@@ -0,0 +1 @@
112+../mod/operator/ops
113\ No newline at end of file
114diff --git a/juju-cloud-status/metadata.yaml b/juju-cloud-status/metadata.yaml
115index a4407f9..68cbe8a 100644
116--- a/juju-cloud-status/metadata.yaml
117+++ b/juju-cloud-status/metadata.yaml
118@@ -19,3 +19,7 @@ resources:
119 type: file
120 filename: juju-cloud-status.snap
121 description: Juju-cloud-status snap
122+ core:
123+ type: file
124+ filename: core.snap
125+ description: core snap
126diff --git a/juju-cloud-status/mod/jinja b/juju-cloud-status/mod/jinja
127new file mode 160000
128index 0000000..45a76a3
129--- /dev/null
130+++ b/juju-cloud-status/mod/jinja
131@@ -0,0 +1 @@
132+Subproject commit 45a76a3794a91e6d7077ced88c814a96cc87d5c2
133diff --git a/juju-cloud-status/mod/operator b/juju-cloud-status/mod/operator
134new file mode 160000
135index 0000000..6620d0d
136--- /dev/null
137+++ b/juju-cloud-status/mod/operator
138@@ -0,0 +1 @@
139+Subproject commit 6620d0d18e82f02401203ab29ea3712f93031989
140diff --git a/juju-cloud-status/reactive/cloud_status.py b/juju-cloud-status/reactive/cloud_status.py
141deleted file mode 100644
142index 2a8369a..0000000
143--- a/juju-cloud-status/reactive/cloud_status.py
144+++ /dev/null
145@@ -1,36 +0,0 @@
146-from lib_cloud_status import Cloud_statusHelper
147-from charmhelpers.core import hookenv
148-from charms.reactive import set_flag, when, when_not, clear_flag
149-from charms.layer import snap
150-
151-"""
152-Flags used in this module:
153- * snap.installed.juju-cloud-status, is the snap installed
154- * juju-cloud-status.application.available, snap is installed and ready to be
155- used
156-"""
157-
158-helper = Cloud_statusHelper()
159-
160-
161-@when("snap.installed.juju-cloud-status")
162-def set_juju_cloud_status_available():
163- """
164- When the snap is installed, just keep it up to date
165- """
166- version = snap.get_installed_version("juju-cloud-status")
167- channel = snap.get_installed_channel("juju-cloud-status")
168- hookenv.application_version_set(version)
169- hookenv.status_set(
170- "active", "Ready, running juju-cloud-status-{} ({})".format(version, channel)
171- )
172- set_flag("juju-cloud-status.application.available")
173-
174-
175-@when_not("snap.installed.juju-cloud-status")
176-def juju_cloud_status_not_installed():
177- """Install the snap, with the correct options."""
178- hookenv.application_version_set("")
179- clear_flag("juju-cloud-status.application.available")
180- hookenv.status_set("waiting", "juju-cloud-status snap not installed.")
181- snap.install("juju-cloud-status", channel=hookenv.config()["snap-channel"])
182diff --git a/juju-cloud-status/repo-info b/juju-cloud-status/repo-info
183deleted file mode 100644
184index e69de29..0000000
185--- a/juju-cloud-status/repo-info
186+++ /dev/null
187diff --git a/juju-cloud-status/report/.empty b/juju-cloud-status/report/.empty
188deleted file mode 100644
189index e69de29..0000000
190--- a/juju-cloud-status/report/.empty
191+++ /dev/null
192diff --git a/juju-cloud-status/report/annotated/actions_status,cover b/juju-cloud-status/report/annotated/actions_status,cover
193deleted file mode 100644
194index 726f158..0000000
195--- a/juju-cloud-status/report/annotated/actions_status,cover
196+++ /dev/null
197@@ -1,6 +0,0 @@
198- #!/usr/local/sbin/charm-env python3
199-
200-> from lib_cloud_status import Cloud_statusHelper
201-
202-> helper = Cloud_statusHelper()
203-> helper.status_function()
204diff --git a/juju-cloud-status/report/annotated/lib_lib_cloud_status.py,cover b/juju-cloud-status/report/annotated/lib_lib_cloud_status.py,cover
205deleted file mode 100644
206index f2d0ea1..0000000
207--- a/juju-cloud-status/report/annotated/lib_lib_cloud_status.py,cover
208+++ /dev/null
209@@ -1,10 +0,0 @@
210-> from charmhelpers.core import hookenv
211-
212-
213-> class Cloud_statusHelper():
214-> def __init__(self):
215-> self.charm_config = hookenv.config()
216-
217-> def status_function(self):
218-> ''' An example function for calling from an action '''
219-! return
220diff --git a/juju-cloud-status/report/annotated/reactive_cloud_status.py,cover b/juju-cloud-status/report/annotated/reactive_cloud_status.py,cover
221deleted file mode 100644
222index f3e6534..0000000
223--- a/juju-cloud-status/report/annotated/reactive_cloud_status.py,cover
224+++ /dev/null
225@@ -1,27 +0,0 @@
226-! from lib_cloud_status import Cloud_statusHelper
227-! from charmhelpers.core import hookenv
228-! from charms.reactive import set_flag, when_not
229-! from charms.layer import snap
230-
231-! helper = Cloud_statusHelper()
232-
233-
234-! @when_not("cloud_status.installed")
235-! def install_cloud_status():
236- # Do your setup here.
237- #
238- # If your charm has other dependencies before it can install,
239- # add those as @when() clauses above., or as additional @when()
240- # decorated handlers below
241- #
242- # See the following for information about reactive charms:
243- #
244- # * https://jujucharms.com/docs/devel/developer-getting-started
245- # * https://github.com/juju-solutions/layer-basic#overview
246- #
247-! config = hookenv.config()
248-! channel = config.get("risk-level", "stable")
249-! snap.install("cloud-status", channel=channel, force_dangerous=False)
250-
251-! hookenv.status_set("active", "")
252-! set_flag("cloud_status.installed")
253diff --git a/juju-cloud-status/report/html/actions_status.html b/juju-cloud-status/report/html/actions_status.html
254deleted file mode 100644
255index 31376e9..0000000
256--- a/juju-cloud-status/report/html/actions_status.html
257+++ /dev/null
258@@ -1,101 +0,0 @@
259-
260-
261-
262-<!DOCTYPE html>
263-<html>
264-<head>
265- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
266-
267-
268- <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
269- <title>Coverage for actions/status: 100%</title>
270- <link rel="stylesheet" href="style.css" type="text/css">
271-
272- <script type="text/javascript" src="jquery.min.js"></script>
273- <script type="text/javascript" src="jquery.hotkeys.js"></script>
274- <script type="text/javascript" src="jquery.isonscreen.js"></script>
275- <script type="text/javascript" src="coverage_html.js"></script>
276- <script type="text/javascript">
277- jQuery(document).ready(coverage.pyfile_ready);
278- </script>
279-</head>
280-<body class="pyfile">
281-
282-<div id="header">
283- <div class="content">
284- <h1>Coverage for <b>actions/status</b> :
285- <span class="pc_cov">100%</span>
286- </h1>
287-
288- <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
289-
290- <h2 class="stats">
291- 3 statements &nbsp;
292- <span class="run hide_run shortkey_r button_toggle_run">3 run</span>
293- <span class="mis shortkey_m button_toggle_mis">0 missing</span>
294- <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
295-
296-
297- </h2>
298- </div>
299-</div>
300-
301-<div class="help_panel">
302- <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
303- <p class="legend">Hot-keys on this page</p>
304- <div>
305- <p class="keyhelp">
306- <span class="key">r</span>
307- <span class="key">m</span>
308- <span class="key">x</span>
309- <span class="key">p</span> &nbsp; toggle line displays
310- </p>
311- <p class="keyhelp">
312- <span class="key">j</span>
313- <span class="key">k</span> &nbsp; next/prev highlighted chunk
314- </p>
315- <p class="keyhelp">
316- <span class="key">0</span> &nbsp; (zero) top of page
317- </p>
318- <p class="keyhelp">
319- <span class="key">1</span> &nbsp; (one) first highlighted chunk
320- </p>
321- </div>
322-</div>
323-
324-<div id="source">
325- <table>
326- <tr>
327- <td class="linenos">
328-<p id="n1" class="pln"><a href="#n1">1</a></p>
329-<p id="n2" class="pln"><a href="#n2">2</a></p>
330-<p id="n3" class="stm run hide_run"><a href="#n3">3</a></p>
331-<p id="n4" class="pln"><a href="#n4">4</a></p>
332-<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
333-<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
334-
335- </td>
336- <td class="text">
337-<p id="t1" class="pln"><span class="com">#!/usr/local/sbin/charm-env python3</span><span class="strut">&nbsp;</span></p>
338-<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
339-<p id="t3" class="stm run hide_run"><span class="key">from</span> <span class="nam">lib_cloud_status</span> <span class="key">import</span> <span class="nam">Cloud_statusHelper</span><span class="strut">&nbsp;</span></p>
340-<p id="t4" class="pln"><span class="strut">&nbsp;</span></p>
341-<p id="t5" class="stm run hide_run"><span class="nam">helper</span> <span class="op">=</span> <span class="nam">Cloud_statusHelper</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
342-<p id="t6" class="stm run hide_run"><span class="nam">helper</span><span class="op">.</span><span class="nam">status_function</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
343-
344- </td>
345- </tr>
346- </table>
347-</div>
348-
349-<div id="footer">
350- <div class="content">
351- <p>
352- <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.5.4</a>,
353- created at 2019-11-05 22:42
354- </p>
355- </div>
356-</div>
357-
358-</body>
359-</html>
360diff --git a/juju-cloud-status/report/html/coverage_html.js b/juju-cloud-status/report/html/coverage_html.js
361deleted file mode 100644
362index f6f5de2..0000000
363--- a/juju-cloud-status/report/html/coverage_html.js
364+++ /dev/null
365@@ -1,584 +0,0 @@
366-// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
367-// For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
368-
369-// Coverage.py HTML report browser code.
370-/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
371-/*global coverage: true, document, window, $ */
372-
373-coverage = {};
374-
375-// Find all the elements with shortkey_* class, and use them to assign a shortcut key.
376-coverage.assign_shortkeys = function () {
377- $("*[class*='shortkey_']").each(function (i, e) {
378- $.each($(e).attr("class").split(" "), function (i, c) {
379- if (/^shortkey_/.test(c)) {
380- $(document).bind('keydown', c.substr(9), function () {
381- $(e).click();
382- });
383- }
384- });
385- });
386-};
387-
388-// Create the events for the help panel.
389-coverage.wire_up_help_panel = function () {
390- $("#keyboard_icon").click(function () {
391- // Show the help panel, and position it so the keyboard icon in the
392- // panel is in the same place as the keyboard icon in the header.
393- $(".help_panel").show();
394- var koff = $("#keyboard_icon").offset();
395- var poff = $("#panel_icon").position();
396- $(".help_panel").offset({
397- top: koff.top-poff.top,
398- left: koff.left-poff.left
399- });
400- });
401- $("#panel_icon").click(function () {
402- $(".help_panel").hide();
403- });
404-};
405-
406-// Create the events for the filter box.
407-coverage.wire_up_filter = function () {
408- // Cache elements.
409- var table = $("table.index");
410- var table_rows = table.find("tbody tr");
411- var table_row_names = table_rows.find("td.name a");
412- var no_rows = $("#no_rows");
413-
414- // Create a duplicate table footer that we can modify with dynamic summed values.
415- var table_footer = $("table.index tfoot tr");
416- var table_dynamic_footer = table_footer.clone();
417- table_dynamic_footer.attr('class', 'total_dynamic hidden');
418- table_footer.after(table_dynamic_footer);
419-
420- // Observe filter keyevents.
421- $("#filter").on("keyup change", $.debounce(150, function (event) {
422- var filter_value = $(this).val();
423-
424- if (filter_value === "") {
425- // Filter box is empty, remove all filtering.
426- table_rows.removeClass("hidden");
427-
428- // Show standard footer, hide dynamic footer.
429- table_footer.removeClass("hidden");
430- table_dynamic_footer.addClass("hidden");
431-
432- // Hide placeholder, show table.
433- if (no_rows.length > 0) {
434- no_rows.hide();
435- }
436- table.show();
437-
438- }
439- else {
440- // Filter table items by value.
441- var hidden = 0;
442- var shown = 0;
443-
444- // Hide / show elements.
445- $.each(table_row_names, function () {
446- var element = $(this).parents("tr");
447-
448- if ($(this).text().indexOf(filter_value) === -1) {
449- // hide
450- element.addClass("hidden");
451- hidden++;
452- }
453- else {
454- // show
455- element.removeClass("hidden");
456- shown++;
457- }
458- });
459-
460- // Show placeholder if no rows will be displayed.
461- if (no_rows.length > 0) {
462- if (shown === 0) {
463- // Show placeholder, hide table.
464- no_rows.show();
465- table.hide();
466- }
467- else {
468- // Hide placeholder, show table.
469- no_rows.hide();
470- table.show();
471- }
472- }
473-
474- // Manage dynamic header:
475- if (hidden > 0) {
476- // Calculate new dynamic sum values based on visible rows.
477- for (var column = 2; column < 20; column++) {
478- // Calculate summed value.
479- var cells = table_rows.find('td:nth-child(' + column + ')');
480- if (!cells.length) {
481- // No more columns...!
482- break;
483- }
484-
485- var sum = 0, numer = 0, denom = 0;
486- $.each(cells.filter(':visible'), function () {
487- var ratio = $(this).data("ratio");
488- if (ratio) {
489- var splitted = ratio.split(" ");
490- numer += parseInt(splitted[0], 10);
491- denom += parseInt(splitted[1], 10);
492- }
493- else {
494- sum += parseInt(this.innerHTML, 10);
495- }
496- });
497-
498- // Get footer cell element.
499- var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')');
500-
501- // Set value into dynamic footer cell element.
502- if (cells[0].innerHTML.indexOf('%') > -1) {
503- // Percentage columns use the numerator and denominator,
504- // and adapt to the number of decimal places.
505- var match = /\.([0-9]+)/.exec(cells[0].innerHTML);
506- var places = 0;
507- if (match) {
508- places = match[1].length;
509- }
510- var pct = numer * 100 / denom;
511- footer_cell.text(pct.toFixed(places) + '%');
512- }
513- else {
514- footer_cell.text(sum);
515- }
516- }
517-
518- // Hide standard footer, show dynamic footer.
519- table_footer.addClass("hidden");
520- table_dynamic_footer.removeClass("hidden");
521- }
522- else {
523- // Show standard footer, hide dynamic footer.
524- table_footer.removeClass("hidden");
525- table_dynamic_footer.addClass("hidden");
526- }
527- }
528- }));
529-
530- // Trigger change event on setup, to force filter on page refresh
531- // (filter value may still be present).
532- $("#filter").trigger("change");
533-};
534-
535-// Loaded on index.html
536-coverage.index_ready = function ($) {
537- // Look for a cookie containing previous sort settings:
538- var sort_list = [];
539- var cookie_name = "COVERAGE_INDEX_SORT";
540- var i;
541-
542- // This almost makes it worth installing the jQuery cookie plugin:
543- if (document.cookie.indexOf(cookie_name) > -1) {
544- var cookies = document.cookie.split(";");
545- for (i = 0; i < cookies.length; i++) {
546- var parts = cookies[i].split("=");
547-
548- if ($.trim(parts[0]) === cookie_name && parts[1]) {
549- sort_list = eval("[[" + parts[1] + "]]");
550- break;
551- }
552- }
553- }
554-
555- // Create a new widget which exists only to save and restore
556- // the sort order:
557- $.tablesorter.addWidget({
558- id: "persistentSort",
559-
560- // Format is called by the widget before displaying:
561- format: function (table) {
562- if (table.config.sortList.length === 0 && sort_list.length > 0) {
563- // This table hasn't been sorted before - we'll use
564- // our stored settings:
565- $(table).trigger('sorton', [sort_list]);
566- }
567- else {
568- // This is not the first load - something has
569- // already defined sorting so we'll just update
570- // our stored value to match:
571- sort_list = table.config.sortList;
572- }
573- }
574- });
575-
576- // Configure our tablesorter to handle the variable number of
577- // columns produced depending on report options:
578- var headers = [];
579- var col_count = $("table.index > thead > tr > th").length;
580-
581- headers[0] = { sorter: 'text' };
582- for (i = 1; i < col_count-1; i++) {
583- headers[i] = { sorter: 'digit' };
584- }
585- headers[col_count-1] = { sorter: 'percent' };
586-
587- // Enable the table sorter:
588- $("table.index").tablesorter({
589- widgets: ['persistentSort'],
590- headers: headers
591- });
592-
593- coverage.assign_shortkeys();
594- coverage.wire_up_help_panel();
595- coverage.wire_up_filter();
596-
597- // Watch for page unload events so we can save the final sort settings:
598- $(window).unload(function () {
599- document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/";
600- });
601-};
602-
603-// -- pyfile stuff --
604-
605-coverage.pyfile_ready = function ($) {
606- // If we're directed to a particular line number, highlight the line.
607- var frag = location.hash;
608- if (frag.length > 2 && frag[1] === 'n') {
609- $(frag).addClass('highlight');
610- coverage.set_sel(parseInt(frag.substr(2), 10));
611- }
612- else {
613- coverage.set_sel(0);
614- }
615-
616- $(document)
617- .bind('keydown', 'j', coverage.to_next_chunk_nicely)
618- .bind('keydown', 'k', coverage.to_prev_chunk_nicely)
619- .bind('keydown', '0', coverage.to_top)
620- .bind('keydown', '1', coverage.to_first_chunk)
621- ;
622-
623- $(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");});
624- $(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");});
625- $(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");});
626- $(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");});
627-
628- coverage.assign_shortkeys();
629- coverage.wire_up_help_panel();
630-
631- coverage.init_scroll_markers();
632-
633- // Rebuild scroll markers after window high changing
634- $(window).resize(coverage.resize_scroll_markers);
635-};
636-
637-coverage.toggle_lines = function (btn, cls) {
638- btn = $(btn);
639- var hide = "hide_"+cls;
640- if (btn.hasClass(hide)) {
641- $("#source ."+cls).removeClass(hide);
642- btn.removeClass(hide);
643- }
644- else {
645- $("#source ."+cls).addClass(hide);
646- btn.addClass(hide);
647- }
648-};
649-
650-// Return the nth line div.
651-coverage.line_elt = function (n) {
652- return $("#t" + n);
653-};
654-
655-// Return the nth line number div.
656-coverage.num_elt = function (n) {
657- return $("#n" + n);
658-};
659-
660-// Return the container of all the code.
661-coverage.code_container = function () {
662- return $(".linenos");
663-};
664-
665-// Set the selection. b and e are line numbers.
666-coverage.set_sel = function (b, e) {
667- // The first line selected.
668- coverage.sel_begin = b;
669- // The next line not selected.
670- coverage.sel_end = (e === undefined) ? b+1 : e;
671-};
672-
673-coverage.to_top = function () {
674- coverage.set_sel(0, 1);
675- coverage.scroll_window(0);
676-};
677-
678-coverage.to_first_chunk = function () {
679- coverage.set_sel(0, 1);
680- coverage.to_next_chunk();
681-};
682-
683-coverage.is_transparent = function (color) {
684- // Different browsers return different colors for "none".
685- return color === "transparent" || color === "rgba(0, 0, 0, 0)";
686-};
687-
688-coverage.to_next_chunk = function () {
689- var c = coverage;
690-
691- // Find the start of the next colored chunk.
692- var probe = c.sel_end;
693- var color, probe_line;
694- while (true) {
695- probe_line = c.line_elt(probe);
696- if (probe_line.length === 0) {
697- return;
698- }
699- color = probe_line.css("background-color");
700- if (!c.is_transparent(color)) {
701- break;
702- }
703- probe++;
704- }
705-
706- // There's a next chunk, `probe` points to it.
707- var begin = probe;
708-
709- // Find the end of this chunk.
710- var next_color = color;
711- while (next_color === color) {
712- probe++;
713- probe_line = c.line_elt(probe);
714- next_color = probe_line.css("background-color");
715- }
716- c.set_sel(begin, probe);
717- c.show_selection();
718-};
719-
720-coverage.to_prev_chunk = function () {
721- var c = coverage;
722-
723- // Find the end of the prev colored chunk.
724- var probe = c.sel_begin-1;
725- var probe_line = c.line_elt(probe);
726- if (probe_line.length === 0) {
727- return;
728- }
729- var color = probe_line.css("background-color");
730- while (probe > 0 && c.is_transparent(color)) {
731- probe--;
732- probe_line = c.line_elt(probe);
733- if (probe_line.length === 0) {
734- return;
735- }
736- color = probe_line.css("background-color");
737- }
738-
739- // There's a prev chunk, `probe` points to its last line.
740- var end = probe+1;
741-
742- // Find the beginning of this chunk.
743- var prev_color = color;
744- while (prev_color === color) {
745- probe--;
746- probe_line = c.line_elt(probe);
747- prev_color = probe_line.css("background-color");
748- }
749- c.set_sel(probe+1, end);
750- c.show_selection();
751-};
752-
753-// Return the line number of the line nearest pixel position pos
754-coverage.line_at_pos = function (pos) {
755- var l1 = coverage.line_elt(1),
756- l2 = coverage.line_elt(2),
757- result;
758- if (l1.length && l2.length) {
759- var l1_top = l1.offset().top,
760- line_height = l2.offset().top - l1_top,
761- nlines = (pos - l1_top) / line_height;
762- if (nlines < 1) {
763- result = 1;
764- }
765- else {
766- result = Math.ceil(nlines);
767- }
768- }
769- else {
770- result = 1;
771- }
772- return result;
773-};
774-
775-// Returns 0, 1, or 2: how many of the two ends of the selection are on
776-// the screen right now?
777-coverage.selection_ends_on_screen = function () {
778- if (coverage.sel_begin === 0) {
779- return 0;
780- }
781-
782- var top = coverage.line_elt(coverage.sel_begin);
783- var next = coverage.line_elt(coverage.sel_end-1);
784-
785- return (
786- (top.isOnScreen() ? 1 : 0) +
787- (next.isOnScreen() ? 1 : 0)
788- );
789-};
790-
791-coverage.to_next_chunk_nicely = function () {
792- coverage.finish_scrolling();
793- if (coverage.selection_ends_on_screen() === 0) {
794- // The selection is entirely off the screen: select the top line on
795- // the screen.
796- var win = $(window);
797- coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop()));
798- }
799- coverage.to_next_chunk();
800-};
801-
802-coverage.to_prev_chunk_nicely = function () {
803- coverage.finish_scrolling();
804- if (coverage.selection_ends_on_screen() === 0) {
805- var win = $(window);
806- coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height()));
807- }
808- coverage.to_prev_chunk();
809-};
810-
811-// Select line number lineno, or if it is in a colored chunk, select the
812-// entire chunk
813-coverage.select_line_or_chunk = function (lineno) {
814- var c = coverage;
815- var probe_line = c.line_elt(lineno);
816- if (probe_line.length === 0) {
817- return;
818- }
819- var the_color = probe_line.css("background-color");
820- if (!c.is_transparent(the_color)) {
821- // The line is in a highlighted chunk.
822- // Search backward for the first line.
823- var probe = lineno;
824- var color = the_color;
825- while (probe > 0 && color === the_color) {
826- probe--;
827- probe_line = c.line_elt(probe);
828- if (probe_line.length === 0) {
829- break;
830- }
831- color = probe_line.css("background-color");
832- }
833- var begin = probe + 1;
834-
835- // Search forward for the last line.
836- probe = lineno;
837- color = the_color;
838- while (color === the_color) {
839- probe++;
840- probe_line = c.line_elt(probe);
841- color = probe_line.css("background-color");
842- }
843-
844- coverage.set_sel(begin, probe);
845- }
846- else {
847- coverage.set_sel(lineno);
848- }
849-};
850-
851-coverage.show_selection = function () {
852- var c = coverage;
853-
854- // Highlight the lines in the chunk
855- c.code_container().find(".highlight").removeClass("highlight");
856- for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) {
857- c.num_elt(probe).addClass("highlight");
858- }
859-
860- c.scroll_to_selection();
861-};
862-
863-coverage.scroll_to_selection = function () {
864- // Scroll the page if the chunk isn't fully visible.
865- if (coverage.selection_ends_on_screen() < 2) {
866- // Need to move the page. The html,body trick makes it scroll in all
867- // browsers, got it from http://stackoverflow.com/questions/3042651
868- var top = coverage.line_elt(coverage.sel_begin);
869- var top_pos = parseInt(top.offset().top, 10);
870- coverage.scroll_window(top_pos - 30);
871- }
872-};
873-
874-coverage.scroll_window = function (to_pos) {
875- $("html,body").animate({scrollTop: to_pos}, 200);
876-};
877-
878-coverage.finish_scrolling = function () {
879- $("html,body").stop(true, true);
880-};
881-
882-coverage.init_scroll_markers = function () {
883- var c = coverage;
884- // Init some variables
885- c.lines_len = $('td.text p').length;
886- c.body_h = $('body').height();
887- c.header_h = $('div#header').height();
888- c.missed_lines = $('td.text p.mis, td.text p.par');
889-
890- // Build html
891- c.resize_scroll_markers();
892-};
893-
894-coverage.resize_scroll_markers = function () {
895- var c = coverage,
896- min_line_height = 3,
897- max_line_height = 10,
898- visible_window_h = $(window).height();
899-
900- $('#scroll_marker').remove();
901- // Don't build markers if the window has no scroll bar.
902- if (c.body_h <= visible_window_h) {
903- return;
904- }
905-
906- $("body").append("<div id='scroll_marker'>&nbsp;</div>");
907- var scroll_marker = $('#scroll_marker'),
908- marker_scale = scroll_marker.height() / c.body_h,
909- line_height = scroll_marker.height() / c.lines_len;
910-
911- // Line height must be between the extremes.
912- if (line_height > min_line_height) {
913- if (line_height > max_line_height) {
914- line_height = max_line_height;
915- }
916- }
917- else {
918- line_height = min_line_height;
919- }
920-
921- var previous_line = -99,
922- last_mark,
923- last_top;
924-
925- c.missed_lines.each(function () {
926- var line_top = Math.round($(this).offset().top * marker_scale),
927- id_name = $(this).attr('id'),
928- line_number = parseInt(id_name.substring(1, id_name.length));
929-
930- if (line_number === previous_line + 1) {
931- // If this solid missed block just make previous mark higher.
932- last_mark.css({
933- 'height': line_top + line_height - last_top
934- });
935- }
936- else {
937- // Add colored line in scroll_marker block.
938- scroll_marker.append('<div id="m' + line_number + '" class="marker"></div>');
939- last_mark = $('#m' + line_number);
940- last_mark.css({
941- 'height': line_height,
942- 'top': line_top
943- });
944- last_top = line_top;
945- }
946-
947- previous_line = line_number;
948- });
949-};
950diff --git a/juju-cloud-status/report/html/index.html b/juju-cloud-status/report/html/index.html
951deleted file mode 100644
952index db39f7f..0000000
953--- a/juju-cloud-status/report/html/index.html
954+++ /dev/null
955@@ -1,122 +0,0 @@
956-
957-
958-
959-<!DOCTYPE html>
960-<html>
961-<head>
962- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
963- <title>Coverage report</title>
964- <link rel="stylesheet" href="style.css" type="text/css">
965-
966- <script type="text/javascript" src="jquery.min.js"></script>
967- <script type="text/javascript" src="jquery.ba-throttle-debounce.min.js"></script>
968- <script type="text/javascript" src="jquery.tablesorter.min.js"></script>
969- <script type="text/javascript" src="jquery.hotkeys.js"></script>
970- <script type="text/javascript" src="coverage_html.js"></script>
971- <script type="text/javascript">
972- jQuery(document).ready(coverage.index_ready);
973- </script>
974-</head>
975-<body class="indexfile">
976-
977-<div id="header">
978- <div class="content">
979- <h1>Coverage report:
980- <span class="pc_cov">40%</span>
981- </h1>
982-
983- <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
984-
985- <form id="filter_container">
986- <input id="filter" type="text" value="" placeholder="filter..." />
987- </form>
988- </div>
989-</div>
990-
991-<div class="help_panel">
992- <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
993- <p class="legend">Hot-keys on this page</p>
994- <div>
995- <p class="keyhelp">
996- <span class="key">n</span>
997- <span class="key">s</span>
998- <span class="key">m</span>
999- <span class="key">x</span>
1000-
1001- <span class="key">c</span> &nbsp; change column sorting
1002- </p>
1003- </div>
1004-</div>
1005-
1006-<div id="index">
1007- <table class="index">
1008- <thead>
1009-
1010- <tr class="tablehead" title="Click to sort">
1011- <th class="name left headerSortDown shortkey_n">Module</th>
1012- <th class="shortkey_s">statements</th>
1013- <th class="shortkey_m">missing</th>
1014- <th class="shortkey_x">excluded</th>
1015-
1016- <th class="right shortkey_c">coverage</th>
1017- </tr>
1018- </thead>
1019-
1020- <tfoot>
1021- <tr class="total">
1022- <td class="name left">Total</td>
1023- <td>20</td>
1024- <td>12</td>
1025- <td>0</td>
1026-
1027- <td class="right" data-ratio="8 20">40%</td>
1028- </tr>
1029- </tfoot>
1030- <tbody>
1031-
1032- <tr class="file">
1033- <td class="name left"><a href="actions_status.html">actions/status</a></td>
1034- <td>3</td>
1035- <td>0</td>
1036- <td>0</td>
1037-
1038- <td class="right" data-ratio="3 3">100%</td>
1039- </tr>
1040-
1041- <tr class="file">
1042- <td class="name left"><a href="lib_lib_cloud_status_py.html">lib/lib_cloud_status.py</a></td>
1043- <td>6</td>
1044- <td>1</td>
1045- <td>0</td>
1046-
1047- <td class="right" data-ratio="5 6">83%</td>
1048- </tr>
1049-
1050- <tr class="file">
1051- <td class="name left"><a href="reactive_cloud_status_py.html">reactive/cloud_status.py</a></td>
1052- <td>11</td>
1053- <td>11</td>
1054- <td>0</td>
1055-
1056- <td class="right" data-ratio="0 11">0%</td>
1057- </tr>
1058-
1059- </tbody>
1060- </table>
1061-
1062- <p id="no_rows">
1063- No items found using the specified filter.
1064- </p>
1065-</div>
1066-
1067-<div id="footer">
1068- <div class="content">
1069- <p>
1070- <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.5.4</a>,
1071- created at 2019-11-05 22:42
1072- </p>
1073- </div>
1074-</div>
1075-
1076-</body>
1077-</html>
1078diff --git a/juju-cloud-status/report/html/jquery.ba-throttle-debounce.min.js b/juju-cloud-status/report/html/jquery.ba-throttle-debounce.min.js
1079deleted file mode 100644
1080index 648fe5d..0000000
1081--- a/juju-cloud-status/report/html/jquery.ba-throttle-debounce.min.js
1082+++ /dev/null
1083@@ -1,9 +0,0 @@
1084-/*
1085- * jQuery throttle / debounce - v1.1 - 3/7/2010
1086- * http://benalman.com/projects/jquery-throttle-debounce-plugin/
1087- *
1088- * Copyright (c) 2010 "Cowboy" Ben Alman
1089- * Dual licensed under the MIT and GPL licenses.
1090- * http://benalman.com/about/license/
1091- */
1092-(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
1093diff --git a/juju-cloud-status/report/html/jquery.hotkeys.js b/juju-cloud-status/report/html/jquery.hotkeys.js
1094deleted file mode 100644
1095index 09b21e0..0000000
1096--- a/juju-cloud-status/report/html/jquery.hotkeys.js
1097+++ /dev/null
1098@@ -1,99 +0,0 @@
1099-/*
1100- * jQuery Hotkeys Plugin
1101- * Copyright 2010, John Resig
1102- * Dual licensed under the MIT or GPL Version 2 licenses.
1103- *
1104- * Based upon the plugin by Tzury Bar Yochay:
1105- * http://github.com/tzuryby/hotkeys
1106- *
1107- * Original idea by:
1108- * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
1109-*/
1110-
1111-(function(jQuery){
1112-
1113- jQuery.hotkeys = {
1114- version: "0.8",
1115-
1116- specialKeys: {
1117- 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
1118- 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
1119- 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
1120- 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
1121- 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
1122- 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
1123- 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
1124- },
1125-
1126- shiftNums: {
1127- "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
1128- "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
1129- ".": ">", "/": "?", "\\": "|"
1130- }
1131- };
1132-
1133- function keyHandler( handleObj ) {
1134- // Only care when a possible input has been specified
1135- if ( typeof handleObj.data !== "string" ) {
1136- return;
1137- }
1138-
1139- var origHandler = handleObj.handler,
1140- keys = handleObj.data.toLowerCase().split(" ");
1141-
1142- handleObj.handler = function( event ) {
1143- // Don't fire in text-accepting inputs that we didn't directly bind to
1144- if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
1145- event.target.type === "text") ) {
1146- return;
1147- }
1148-
1149- // Keypress represents characters, not special keys
1150- var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
1151- character = String.fromCharCode( event.which ).toLowerCase(),
1152- key, modif = "", possible = {};
1153-
1154- // check combinations (alt|ctrl|shift+anything)
1155- if ( event.altKey && special !== "alt" ) {
1156- modif += "alt+";
1157- }
1158-
1159- if ( event.ctrlKey && special !== "ctrl" ) {
1160- modif += "ctrl+";
1161- }
1162-
1163- // TODO: Need to make sure this works consistently across platforms
1164- if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
1165- modif += "meta+";
1166- }
1167-
1168- if ( event.shiftKey && special !== "shift" ) {
1169- modif += "shift+";
1170- }
1171-
1172- if ( special ) {
1173- possible[ modif + special ] = true;
1174-
1175- } else {
1176- possible[ modif + character ] = true;
1177- possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
1178-
1179- // "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
1180- if ( modif === "shift+" ) {
1181- possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
1182- }
1183- }
1184-
1185- for ( var i = 0, l = keys.length; i < l; i++ ) {
1186- if ( possible[ keys[i] ] ) {
1187- return origHandler.apply( this, arguments );
1188- }
1189- }
1190- };
1191- }
1192-
1193- jQuery.each([ "keydown", "keyup", "keypress" ], function() {
1194- jQuery.event.special[ this ] = { add: keyHandler };
1195- });
1196-
1197-})( jQuery );
1198diff --git a/juju-cloud-status/report/html/jquery.isonscreen.js b/juju-cloud-status/report/html/jquery.isonscreen.js
1199deleted file mode 100644
1200index 0182ebd..0000000
1201--- a/juju-cloud-status/report/html/jquery.isonscreen.js
1202+++ /dev/null
1203@@ -1,53 +0,0 @@
1204-/* Copyright (c) 2010
1205- * @author Laurence Wheway
1206- * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
1207- * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
1208- *
1209- * @version 1.2.0
1210- */
1211-(function($) {
1212- jQuery.extend({
1213- isOnScreen: function(box, container) {
1214- //ensure numbers come in as intgers (not strings) and remove 'px' is it's there
1215- for(var i in box){box[i] = parseFloat(box[i])};
1216- for(var i in container){container[i] = parseFloat(container[i])};
1217-
1218- if(!container){
1219- container = {
1220- left: $(window).scrollLeft(),
1221- top: $(window).scrollTop(),
1222- width: $(window).width(),
1223- height: $(window).height()
1224- }
1225- }
1226-
1227- if( box.left+box.width-container.left > 0 &&
1228- box.left < container.width+container.left &&
1229- box.top+box.height-container.top > 0 &&
1230- box.top < container.height+container.top
1231- ) return true;
1232- return false;
1233- }
1234- })
1235-
1236-
1237- jQuery.fn.isOnScreen = function (container) {
1238- for(var i in container){container[i] = parseFloat(container[i])};
1239-
1240- if(!container){
1241- container = {
1242- left: $(window).scrollLeft(),
1243- top: $(window).scrollTop(),
1244- width: $(window).width(),
1245- height: $(window).height()
1246- }
1247- }
1248-
1249- if( $(this).offset().left+$(this).width()-container.left > 0 &&
1250- $(this).offset().left < container.width+container.left &&
1251- $(this).offset().top+$(this).height()-container.top > 0 &&
1252- $(this).offset().top < container.height+container.top
1253- ) return true;
1254- return false;
1255- }
1256-})(jQuery);
1257diff --git a/juju-cloud-status/report/html/jquery.min.js b/juju-cloud-status/report/html/jquery.min.js
1258deleted file mode 100644
1259index d1608e3..0000000
1260--- a/juju-cloud-status/report/html/jquery.min.js
1261+++ /dev/null
1262@@ -1,4 +0,0 @@
1263-/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
1264-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
1265-if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
1266-},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
1267\ No newline at end of file
1268diff --git a/juju-cloud-status/report/html/jquery.tablesorter.min.js b/juju-cloud-status/report/html/jquery.tablesorter.min.js
1269deleted file mode 100644
1270index 64c7007..0000000
1271--- a/juju-cloud-status/report/html/jquery.tablesorter.min.js
1272+++ /dev/null
1273@@ -1,2 +0,0 @@
1274-
1275-(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'.',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,cells[i]);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,node){var l=parsers.length;for(var i=1;i<l;i++){if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)){return parsers[i];}}return parsers[0];}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=table.tBodies[0].rows[i],cols=[];cache.row.push($(c));for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));}cols.push(i);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){if(!node)return"";var t="";if(config.textExtraction=="simple"){if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){t=node.childNodes[0].innerHTML;}else{t=node.innerHTML;}}else{if(typeof(config.textExtraction)=="function"){t=config.textExtraction(node);}else{t=$(node).text();}}return t;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){rows.push(r[n[i][checkCell]]);if(!table.config.appender){var o=r[n[i][checkCell]];var l=o.length;for(var j=0;j<l;j++){tableBody[0].appendChild(o[j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false,tableHeadersRows=[];for(var i=0;i<table.tHead.rows.length;i++){tableHeadersRows[i]=0;};$tableHeaders=$("thead th",table);$tableHeaders.each(function(index){this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(!this.sortDisabled){$(this).addClass(table.config.cssHeader);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){i=(v.toLowerCase()=="desc")?1:0;}else{i=(v==(0||1))?v:0;}return i;}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(getCachedSortType(table.config.parsers,c)=="text")?((order==0)?"sortText":"sortTextDesc"):((order==0)?"sortNumeric":"sortNumericDesc");var e="e"+i;dynamicExp+="var "+e+" = "+s+"(a["+c+"],b["+c+"]); ";dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function sortText(a,b){return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){var DECIMAL='\\'+config.decimal;var exp='/(^[+]?0('+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*'+DECIMAL+'0+$)/';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}$("tr:visible",table.tBodies[0]).filter(':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
1276\ No newline at end of file
1277diff --git a/juju-cloud-status/report/html/keybd_closed.png b/juju-cloud-status/report/html/keybd_closed.png
1278deleted file mode 100644
1279index db11402..0000000
1280Binary files a/juju-cloud-status/report/html/keybd_closed.png and /dev/null differ
1281diff --git a/juju-cloud-status/report/html/keybd_open.png b/juju-cloud-status/report/html/keybd_open.png
1282deleted file mode 100644
1283index db11402..0000000
1284Binary files a/juju-cloud-status/report/html/keybd_open.png and /dev/null differ
1285diff --git a/juju-cloud-status/report/html/lib_lib_cloud_status_py.html b/juju-cloud-status/report/html/lib_lib_cloud_status_py.html
1286deleted file mode 100644
1287index ae4bf2b..0000000
1288--- a/juju-cloud-status/report/html/lib_lib_cloud_status_py.html
1289+++ /dev/null
1290@@ -1,109 +0,0 @@
1291-
1292-
1293-
1294-<!DOCTYPE html>
1295-<html>
1296-<head>
1297- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
1298-
1299-
1300- <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
1301- <title>Coverage for lib/lib_cloud_status.py: 83%</title>
1302- <link rel="stylesheet" href="style.css" type="text/css">
1303-
1304- <script type="text/javascript" src="jquery.min.js"></script>
1305- <script type="text/javascript" src="jquery.hotkeys.js"></script>
1306- <script type="text/javascript" src="jquery.isonscreen.js"></script>
1307- <script type="text/javascript" src="coverage_html.js"></script>
1308- <script type="text/javascript">
1309- jQuery(document).ready(coverage.pyfile_ready);
1310- </script>
1311-</head>
1312-<body class="pyfile">
1313-
1314-<div id="header">
1315- <div class="content">
1316- <h1>Coverage for <b>lib/lib_cloud_status.py</b> :
1317- <span class="pc_cov">83%</span>
1318- </h1>
1319-
1320- <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
1321-
1322- <h2 class="stats">
1323- 6 statements &nbsp;
1324- <span class="run hide_run shortkey_r button_toggle_run">5 run</span>
1325- <span class="mis shortkey_m button_toggle_mis">1 missing</span>
1326- <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
1327-
1328-
1329- </h2>
1330- </div>
1331-</div>
1332-
1333-<div class="help_panel">
1334- <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
1335- <p class="legend">Hot-keys on this page</p>
1336- <div>
1337- <p class="keyhelp">
1338- <span class="key">r</span>
1339- <span class="key">m</span>
1340- <span class="key">x</span>
1341- <span class="key">p</span> &nbsp; toggle line displays
1342- </p>
1343- <p class="keyhelp">
1344- <span class="key">j</span>
1345- <span class="key">k</span> &nbsp; next/prev highlighted chunk
1346- </p>
1347- <p class="keyhelp">
1348- <span class="key">0</span> &nbsp; (zero) top of page
1349- </p>
1350- <p class="keyhelp">
1351- <span class="key">1</span> &nbsp; (one) first highlighted chunk
1352- </p>
1353- </div>
1354-</div>
1355-
1356-<div id="source">
1357- <table>
1358- <tr>
1359- <td class="linenos">
1360-<p id="n1" class="stm run hide_run"><a href="#n1">1</a></p>
1361-<p id="n2" class="pln"><a href="#n2">2</a></p>
1362-<p id="n3" class="pln"><a href="#n3">3</a></p>
1363-<p id="n4" class="stm run hide_run"><a href="#n4">4</a></p>
1364-<p id="n5" class="stm run hide_run"><a href="#n5">5</a></p>
1365-<p id="n6" class="stm run hide_run"><a href="#n6">6</a></p>
1366-<p id="n7" class="pln"><a href="#n7">7</a></p>
1367-<p id="n8" class="stm run hide_run"><a href="#n8">8</a></p>
1368-<p id="n9" class="pln"><a href="#n9">9</a></p>
1369-<p id="n10" class="stm mis"><a href="#n10">10</a></p>
1370-
1371- </td>
1372- <td class="text">
1373-<p id="t1" class="stm run hide_run"><span class="key">from</span> <span class="nam">charmhelpers</span><span class="op">.</span><span class="nam">core</span> <span class="key">import</span> <span class="nam">hookenv</span><span class="strut">&nbsp;</span></p>
1374-<p id="t2" class="pln"><span class="strut">&nbsp;</span></p>
1375-<p id="t3" class="pln"><span class="strut">&nbsp;</span></p>
1376-<p id="t4" class="stm run hide_run"><span class="key">class</span> <span class="nam">Cloud_statusHelper</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
1377-<p id="t5" class="stm run hide_run"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
1378-<p id="t6" class="stm run hide_run"> <span class="nam">self</span><span class="op">.</span><span class="nam">charm_config</span> <span class="op">=</span> <span class="nam">hookenv</span><span class="op">.</span><span class="nam">config</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1379-<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
1380-<p id="t8" class="stm run hide_run"> <span class="key">def</span> <span class="nam">status_function</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
1381-<p id="t9" class="pln"> <span class="str">''' An example function for calling from an action '''</span><span class="strut">&nbsp;</span></p>
1382-<p id="t10" class="stm mis"> <span class="key">return</span><span class="strut">&nbsp;</span></p>
1383-
1384- </td>
1385- </tr>
1386- </table>
1387-</div>
1388-
1389-<div id="footer">
1390- <div class="content">
1391- <p>
1392- <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.5.4</a>,
1393- created at 2019-11-05 22:38
1394- </p>
1395- </div>
1396-</div>
1397-
1398-</body>
1399-</html>
1400diff --git a/juju-cloud-status/report/html/reactive_cloud_status_py.html b/juju-cloud-status/report/html/reactive_cloud_status_py.html
1401deleted file mode 100644
1402index 3322cea..0000000
1403--- a/juju-cloud-status/report/html/reactive_cloud_status_py.html
1404+++ /dev/null
1405@@ -1,143 +0,0 @@
1406-
1407-
1408-
1409-<!DOCTYPE html>
1410-<html>
1411-<head>
1412- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
1413-
1414-
1415- <meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
1416- <title>Coverage for reactive/cloud_status.py: 0%</title>
1417- <link rel="stylesheet" href="style.css" type="text/css">
1418-
1419- <script type="text/javascript" src="jquery.min.js"></script>
1420- <script type="text/javascript" src="jquery.hotkeys.js"></script>
1421- <script type="text/javascript" src="jquery.isonscreen.js"></script>
1422- <script type="text/javascript" src="coverage_html.js"></script>
1423- <script type="text/javascript">
1424- jQuery(document).ready(coverage.pyfile_ready);
1425- </script>
1426-</head>
1427-<body class="pyfile">
1428-
1429-<div id="header">
1430- <div class="content">
1431- <h1>Coverage for <b>reactive/cloud_status.py</b> :
1432- <span class="pc_cov">0%</span>
1433- </h1>
1434-
1435- <img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
1436-
1437- <h2 class="stats">
1438- 11 statements &nbsp;
1439- <span class="run hide_run shortkey_r button_toggle_run">0 run</span>
1440- <span class="mis shortkey_m button_toggle_mis">11 missing</span>
1441- <span class="exc shortkey_x button_toggle_exc">0 excluded</span>
1442-
1443-
1444- </h2>
1445- </div>
1446-</div>
1447-
1448-<div class="help_panel">
1449- <img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
1450- <p class="legend">Hot-keys on this page</p>
1451- <div>
1452- <p class="keyhelp">
1453- <span class="key">r</span>
1454- <span class="key">m</span>
1455- <span class="key">x</span>
1456- <span class="key">p</span> &nbsp; toggle line displays
1457- </p>
1458- <p class="keyhelp">
1459- <span class="key">j</span>
1460- <span class="key">k</span> &nbsp; next/prev highlighted chunk
1461- </p>
1462- <p class="keyhelp">
1463- <span class="key">0</span> &nbsp; (zero) top of page
1464- </p>
1465- <p class="keyhelp">
1466- <span class="key">1</span> &nbsp; (one) first highlighted chunk
1467- </p>
1468- </div>
1469-</div>
1470-
1471-<div id="source">
1472- <table>
1473- <tr>
1474- <td class="linenos">
1475-<p id="n1" class="stm mis"><a href="#n1">1</a></p>
1476-<p id="n2" class="stm mis"><a href="#n2">2</a></p>
1477-<p id="n3" class="stm mis"><a href="#n3">3</a></p>
1478-<p id="n4" class="stm mis"><a href="#n4">4</a></p>
1479-<p id="n5" class="pln"><a href="#n5">5</a></p>
1480-<p id="n6" class="stm mis"><a href="#n6">6</a></p>
1481-<p id="n7" class="pln"><a href="#n7">7</a></p>
1482-<p id="n8" class="pln"><a href="#n8">8</a></p>
1483-<p id="n9" class="stm mis"><a href="#n9">9</a></p>
1484-<p id="n10" class="pln"><a href="#n10">10</a></p>
1485-<p id="n11" class="pln"><a href="#n11">11</a></p>
1486-<p id="n12" class="pln"><a href="#n12">12</a></p>
1487-<p id="n13" class="pln"><a href="#n13">13</a></p>
1488-<p id="n14" class="pln"><a href="#n14">14</a></p>
1489-<p id="n15" class="pln"><a href="#n15">15</a></p>
1490-<p id="n16" class="pln"><a href="#n16">16</a></p>
1491-<p id="n17" class="pln"><a href="#n17">17</a></p>
1492-<p id="n18" class="pln"><a href="#n18">18</a></p>
1493-<p id="n19" class="pln"><a href="#n19">19</a></p>
1494-<p id="n20" class="pln"><a href="#n20">20</a></p>
1495-<p id="n21" class="pln"><a href="#n21">21</a></p>
1496-<p id="n22" class="stm mis"><a href="#n22">22</a></p>
1497-<p id="n23" class="stm mis"><a href="#n23">23</a></p>
1498-<p id="n24" class="stm mis"><a href="#n24">24</a></p>
1499-<p id="n25" class="pln"><a href="#n25">25</a></p>
1500-<p id="n26" class="stm mis"><a href="#n26">26</a></p>
1501-<p id="n27" class="stm mis"><a href="#n27">27</a></p>
1502-
1503- </td>
1504- <td class="text">
1505-<p id="t1" class="stm mis"><span class="key">from</span> <span class="nam">lib_cloud_status</span> <span class="key">import</span> <span class="nam">Cloud_statusHelper</span><span class="strut">&nbsp;</span></p>
1506-<p id="t2" class="stm mis"><span class="key">from</span> <span class="nam">charmhelpers</span><span class="op">.</span><span class="nam">core</span> <span class="key">import</span> <span class="nam">hookenv</span><span class="strut">&nbsp;</span></p>
1507-<p id="t3" class="stm mis"><span class="key">from</span> <span class="nam">charms</span><span class="op">.</span><span class="nam">reactive</span> <span class="key">import</span> <span class="nam">set_flag</span><span class="op">,</span> <span class="nam">when_not</span><span class="strut">&nbsp;</span></p>
1508-<p id="t4" class="stm mis"><span class="key">from</span> <span class="nam">charms</span><span class="op">.</span><span class="nam">layer</span> <span class="key">import</span> <span class="nam">snap</span><span class="strut">&nbsp;</span></p>
1509-<p id="t5" class="pln"><span class="strut">&nbsp;</span></p>
1510-<p id="t6" class="stm mis"><span class="nam">helper</span> <span class="op">=</span> <span class="nam">Cloud_statusHelper</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1511-<p id="t7" class="pln"><span class="strut">&nbsp;</span></p>
1512-<p id="t8" class="pln"><span class="strut">&nbsp;</span></p>
1513-<p id="t9" class="stm mis"><span class="op">@</span><span class="nam">when_not</span><span class="op">(</span><span class="str">"cloud_status.installed"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1514-<p id="t10" class="pln"><span class="key">def</span> <span class="nam">install_cloud_status</span><span class="op">(</span><span class="op">)</span><span class="op">:</span><span class="strut">&nbsp;</span></p>
1515-<p id="t11" class="pln"> <span class="com"># Do your setup here.</span><span class="strut">&nbsp;</span></p>
1516-<p id="t12" class="pln"> <span class="com">#</span><span class="strut">&nbsp;</span></p>
1517-<p id="t13" class="pln"> <span class="com"># If your charm has other dependencies before it can install,</span><span class="strut">&nbsp;</span></p>
1518-<p id="t14" class="pln"> <span class="com"># add those as @when() clauses above., or as additional @when()</span><span class="strut">&nbsp;</span></p>
1519-<p id="t15" class="pln"> <span class="com"># decorated handlers below</span><span class="strut">&nbsp;</span></p>
1520-<p id="t16" class="pln"> <span class="com">#</span><span class="strut">&nbsp;</span></p>
1521-<p id="t17" class="pln"> <span class="com"># See the following for information about reactive charms:</span><span class="strut">&nbsp;</span></p>
1522-<p id="t18" class="pln"> <span class="com">#</span><span class="strut">&nbsp;</span></p>
1523-<p id="t19" class="pln"> <span class="com"># * https://jujucharms.com/docs/devel/developer-getting-started</span><span class="strut">&nbsp;</span></p>
1524-<p id="t20" class="pln"> <span class="com"># * https://github.com/juju-solutions/layer-basic#overview</span><span class="strut">&nbsp;</span></p>
1525-<p id="t21" class="pln"> <span class="com">#</span><span class="strut">&nbsp;</span></p>
1526-<p id="t22" class="stm mis"> <span class="nam">config</span> <span class="op">=</span> <span class="nam">hookenv</span><span class="op">.</span><span class="nam">config</span><span class="op">(</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1527-<p id="t23" class="stm mis"> <span class="nam">channel</span> <span class="op">=</span> <span class="nam">config</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"risk-level"</span><span class="op">,</span> <span class="str">"stable"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1528-<p id="t24" class="stm mis"> <span class="nam">snap</span><span class="op">.</span><span class="nam">install</span><span class="op">(</span><span class="str">"cloud-status"</span><span class="op">,</span> <span class="nam">channel</span><span class="op">=</span><span class="nam">channel</span><span class="op">,</span> <span class="nam">force_dangerous</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1529-<p id="t25" class="pln"><span class="strut">&nbsp;</span></p>
1530-<p id="t26" class="stm mis"> <span class="nam">hookenv</span><span class="op">.</span><span class="nam">status_set</span><span class="op">(</span><span class="str">"active"</span><span class="op">,</span> <span class="str">""</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1531-<p id="t27" class="stm mis"> <span class="nam">set_flag</span><span class="op">(</span><span class="str">"cloud_status.installed"</span><span class="op">)</span><span class="strut">&nbsp;</span></p>
1532-
1533- </td>
1534- </tr>
1535- </table>
1536-</div>
1537-
1538-<div id="footer">
1539- <div class="content">
1540- <p>
1541- <a class="nav" href="index.html">&#xab; index</a> &nbsp; &nbsp; <a class="nav" href="https://coverage.readthedocs.io">coverage.py v4.5.4</a>,
1542- created at 2019-11-05 22:38
1543- </p>
1544- </div>
1545-</div>
1546-
1547-</body>
1548-</html>
1549diff --git a/juju-cloud-status/report/html/status.json b/juju-cloud-status/report/html/status.json
1550deleted file mode 100644
1551index b554e73..0000000
1552--- a/juju-cloud-status/report/html/status.json
1553+++ /dev/null
1554@@ -1 +0,0 @@
1555-{"format":1,"version":"4.5.4","settings":"87961f4583b7ca5546484bc58c77d665","files":{"lib_lib_cloud_status_py":{"hash":"b9733613364db05cf36e6563f0c92ab2","index":{"nums":[1,6,0,1,0,0,0],"html_filename":"lib_lib_cloud_status_py.html","relative_filename":"lib/lib_cloud_status.py"}},"reactive_cloud_status_py":{"hash":"d4fbace92aa61d82dc0ea9a5675f93d3","index":{"nums":[1,11,0,11,0,0,0],"html_filename":"reactive_cloud_status_py.html","relative_filename":"reactive/cloud_status.py"}},"actions_status":{"hash":"8268b77f8055bcfccb0444b1dc27bf52","index":{"nums":[1,3,0,0,0,0,0],"html_filename":"actions_status.html","relative_filename":"actions/status"}}}}
1556\ No newline at end of file
1557diff --git a/juju-cloud-status/report/html/style.css b/juju-cloud-status/report/html/style.css
1558deleted file mode 100644
1559index 86b8209..0000000
1560--- a/juju-cloud-status/report/html/style.css
1561+++ /dev/null
1562@@ -1,375 +0,0 @@
1563-/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */
1564-/* For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt */
1565-
1566-/* CSS styles for coverage.py. */
1567-
1568-/* Page-wide styles */
1569-html, body, h1, h2, h3, p, table, td, th {
1570- margin: 0;
1571- padding: 0;
1572- border: 0;
1573- outline: 0;
1574- font-weight: inherit;
1575- font-style: inherit;
1576- font-size: 100%;
1577- font-family: inherit;
1578- vertical-align: baseline;
1579- }
1580-
1581-/* Set baseline grid to 16 pt. */
1582-body {
1583- font-family: georgia, serif;
1584- font-size: 1em;
1585- }
1586-
1587-html>body {
1588- font-size: 16px;
1589- }
1590-
1591-/* Set base font size to 12/16 */
1592-p {
1593- font-size: .75em; /* 12/16 */
1594- line-height: 1.33333333em; /* 16/12 */
1595- }
1596-
1597-table {
1598- border-collapse: collapse;
1599- }
1600-td {
1601- vertical-align: top;
1602-}
1603-table tr.hidden {
1604- display: none !important;
1605- }
1606-
1607-p#no_rows {
1608- display: none;
1609- font-size: 1.2em;
1610- }
1611-
1612-a.nav {
1613- text-decoration: none;
1614- color: inherit;
1615- }
1616-a.nav:hover {
1617- text-decoration: underline;
1618- color: inherit;
1619- }
1620-
1621-/* Page structure */
1622-#header {
1623- background: #f8f8f8;
1624- width: 100%;
1625- border-bottom: 1px solid #eee;
1626- }
1627-
1628-#source {
1629- padding: 1em;
1630- font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
1631- }
1632-
1633-.indexfile #footer {
1634- margin: 1em 3em;
1635- }
1636-
1637-.pyfile #footer {
1638- margin: 1em 1em;
1639- }
1640-
1641-#footer .content {
1642- padding: 0;
1643- font-size: 85%;
1644- font-family: verdana, sans-serif;
1645- color: #666666;
1646- font-style: italic;
1647- }
1648-
1649-#index {
1650- margin: 1em 0 0 3em;
1651- }
1652-
1653-/* Header styles */
1654-#header .content {
1655- padding: 1em 3em;
1656- }
1657-
1658-h1 {
1659- font-size: 1.25em;
1660- display: inline-block;
1661-}
1662-
1663-#filter_container {
1664- display: inline-block;
1665- float: right;
1666- margin: 0 2em 0 0;
1667-}
1668-#filter_container input {
1669- width: 10em;
1670-}
1671-
1672-h2.stats {
1673- margin-top: .5em;
1674- font-size: 1em;
1675-}
1676-.stats span {
1677- border: 1px solid;
1678- padding: .1em .25em;
1679- margin: 0 .1em;
1680- cursor: pointer;
1681- border-color: #999 #ccc #ccc #999;
1682-}
1683-.stats span.hide_run, .stats span.hide_exc,
1684-.stats span.hide_mis, .stats span.hide_par,
1685-.stats span.par.hide_run.hide_par {
1686- border-color: #ccc #999 #999 #ccc;
1687-}
1688-.stats span.par.hide_run {
1689- border-color: #999 #ccc #ccc #999;
1690-}
1691-
1692-.stats span.run {
1693- background: #ddffdd;
1694-}
1695-.stats span.exc {
1696- background: #eeeeee;
1697-}
1698-.stats span.mis {
1699- background: #ffdddd;
1700-}
1701-.stats span.hide_run {
1702- background: #eeffee;
1703-}
1704-.stats span.hide_exc {
1705- background: #f5f5f5;
1706-}
1707-.stats span.hide_mis {
1708- background: #ffeeee;
1709-}
1710-.stats span.par {
1711- background: #ffffaa;
1712-}
1713-.stats span.hide_par {
1714- background: #ffffcc;
1715-}
1716-
1717-/* Help panel */
1718-#keyboard_icon {
1719- float: right;
1720- margin: 5px;
1721- cursor: pointer;
1722-}
1723-
1724-.help_panel {
1725- position: absolute;
1726- background: #ffffcc;
1727- padding: .5em;
1728- border: 1px solid #883;
1729- display: none;
1730-}
1731-
1732-.indexfile .help_panel {
1733- width: 20em; height: 4em;
1734-}
1735-
1736-.pyfile .help_panel {
1737- width: 16em; height: 8em;
1738-}
1739-
1740-.help_panel .legend {
1741- font-style: italic;
1742- margin-bottom: 1em;
1743-}
1744-
1745-#panel_icon {
1746- float: right;
1747- cursor: pointer;
1748-}
1749-
1750-.keyhelp {
1751- margin: .75em;
1752-}
1753-
1754-.keyhelp .key {
1755- border: 1px solid black;
1756- border-color: #888 #333 #333 #888;
1757- padding: .1em .35em;
1758- font-family: monospace;
1759- font-weight: bold;
1760- background: #eee;
1761-}
1762-
1763-/* Source file styles */
1764-.linenos p {
1765- text-align: right;
1766- margin: 0;
1767- padding: 0 .5em;
1768- color: #999999;
1769- font-family: verdana, sans-serif;
1770- font-size: .625em; /* 10/16 */
1771- line-height: 1.6em; /* 16/10 */
1772- }
1773-.linenos p.highlight {
1774- background: #ffdd00;
1775- }
1776-.linenos p a {
1777- text-decoration: none;
1778- color: #999999;
1779- }
1780-.linenos p a:hover {
1781- text-decoration: underline;
1782- color: #999999;
1783- }
1784-
1785-td.text {
1786- width: 100%;
1787- }
1788-.text p {
1789- margin: 0;
1790- padding: 0 0 0 .5em;
1791- border-left: 2px solid #ffffff;
1792- white-space: pre;
1793- position: relative;
1794- }
1795-
1796-.text p.mis {
1797- background: #ffdddd;
1798- border-left: 2px solid #ff0000;
1799- }
1800-.text p.run, .text p.run.hide_par {
1801- background: #ddffdd;
1802- border-left: 2px solid #00ff00;
1803- }
1804-.text p.exc {
1805- background: #eeeeee;
1806- border-left: 2px solid #808080;
1807- }
1808-.text p.par, .text p.par.hide_run {
1809- background: #ffffaa;
1810- border-left: 2px solid #eeee99;
1811- }
1812-.text p.hide_run, .text p.hide_exc, .text p.hide_mis, .text p.hide_par,
1813-.text p.hide_run.hide_par {
1814- background: inherit;
1815- }
1816-
1817-.text span.annotate {
1818- font-family: georgia;
1819- color: #666;
1820- float: right;
1821- padding-right: .5em;
1822- }
1823-.text p.hide_par span.annotate {
1824- display: none;
1825- }
1826-.text span.annotate.long {
1827- display: none;
1828- }
1829-.text p:hover span.annotate.long {
1830- display: block;
1831- max-width: 50%;
1832- white-space: normal;
1833- float: right;
1834- position: absolute;
1835- top: 1.75em;
1836- right: 1em;
1837- width: 30em;
1838- height: auto;
1839- color: #333;
1840- background: #ffffcc;
1841- border: 1px solid #888;
1842- padding: .25em .5em;
1843- z-index: 999;
1844- border-radius: .2em;
1845- box-shadow: #cccccc .2em .2em .2em;
1846- }
1847-
1848-/* Syntax coloring */
1849-.text .com {
1850- color: green;
1851- font-style: italic;
1852- line-height: 1px;
1853- }
1854-.text .key {
1855- font-weight: bold;
1856- line-height: 1px;
1857- }
1858-.text .str {
1859- color: #000080;
1860- }
1861-
1862-/* index styles */
1863-#index td, #index th {
1864- text-align: right;
1865- width: 5em;
1866- padding: .25em .5em;
1867- border-bottom: 1px solid #eee;
1868- }
1869-#index th {
1870- font-style: italic;
1871- color: #333;
1872- border-bottom: 1px solid #ccc;
1873- cursor: pointer;
1874- }
1875-#index th:hover {
1876- background: #eee;
1877- border-bottom: 1px solid #999;
1878- }
1879-#index td.left, #index th.left {
1880- padding-left: 0;
1881- }
1882-#index td.right, #index th.right {
1883- padding-right: 0;
1884- }
1885-#index th.headerSortDown, #index th.headerSortUp {
1886- border-bottom: 1px solid #000;
1887- white-space: nowrap;
1888- background: #eee;
1889- }
1890-#index th.headerSortDown:after {
1891- content: " ↓";
1892-}
1893-#index th.headerSortUp:after {
1894- content: " ↑";
1895-}
1896-#index td.name, #index th.name {
1897- text-align: left;
1898- width: auto;
1899- }
1900-#index td.name a {
1901- text-decoration: none;
1902- color: #000;
1903- }
1904-#index tr.total,
1905-#index tr.total_dynamic {
1906- }
1907-#index tr.total td,
1908-#index tr.total_dynamic td {
1909- font-weight: bold;
1910- border-top: 1px solid #ccc;
1911- border-bottom: none;
1912- }
1913-#index tr.file:hover {
1914- background: #eeeeee;
1915- }
1916-#index tr.file:hover td.name {
1917- text-decoration: underline;
1918- color: #000;
1919- }
1920-
1921-/* scroll marker styles */
1922-#scroll_marker {
1923- position: fixed;
1924- right: 0;
1925- top: 0;
1926- width: 16px;
1927- height: 100%;
1928- background: white;
1929- border-left: 1px solid #eee;
1930- }
1931-
1932-#scroll_marker .marker {
1933- background: #eedddd;
1934- position: absolute;
1935- min-height: 3px;
1936- width: 100%;
1937- }
1938diff --git a/juju-cloud-status/requirements.txt b/juju-cloud-status/requirements.txt
1939deleted file mode 100644
1940index 8462291..0000000
1941--- a/juju-cloud-status/requirements.txt
1942+++ /dev/null
1943@@ -1 +0,0 @@
1944-# Include python requirements here
1945diff --git a/juju-cloud-status/src/charm.py b/juju-cloud-status/src/charm.py
1946new file mode 100755
1947index 0000000..37d5498
1948--- /dev/null
1949+++ b/juju-cloud-status/src/charm.py
1950@@ -0,0 +1,92 @@
1951+#!/usr/bin/env python3
1952+
1953+from pathlib import Path
1954+import subprocess
1955+import sys
1956+
1957+from jinja2 import Environment, FileSystemLoader
1958+
1959+sys.path.append("lib") # noqa
1960+
1961+from ops.charm import CharmBase, CharmEvents
1962+from ops.main import main
1963+from ops.model import ModelError, ActiveStatus
1964+from ops.framework import StoredState
1965+
1966+
1967+
1968+class JujuStatusCharmEvents(CharmEvents):
1969+ pass
1970+
1971+class JujuStatusCharm(CharmBase):
1972+ state = StoredState()
1973+ on = JujuStatusCharmEvents()
1974+
1975+ JCS_ON_LOGIN_PATH = Path("/etc/update-motd.d/99_jcs_login")
1976+
1977+ def __init__(self, framework, key):
1978+ super().__init__(framework, key)
1979+
1980+ # List all hooks that are implemented
1981+ for event in (
1982+ self.on.install,
1983+ self.on.config_changed,
1984+ self.on.upgrade_charm,
1985+ ):
1986+ self.framework.observe(event, self)
1987+ self.state.set_default(juju_cloud_status_hash=None)
1988+
1989+ def on_install(self, event):
1990+ try:
1991+ core_res = self.model.resources.fetch("core")
1992+ except ModelError:
1993+ core_res = None
1994+
1995+ try:
1996+ jcs_res = self.model.resources.fetch("juju-cloud-status")
1997+ except ModelError:
1998+ jcs_res = None
1999+
2000+ cmd = ["snap", "install"]
2001+
2002+ # Attempt to install the snap from the resources provided, fallback to
2003+ # the store
2004+ if core_res is not None and Path(core_res).stat().st_size:
2005+ subprocess.check_call(cmd + ["--dangerous", core_res])
2006+ if jcs_res is not None and Path(jcs_res).stat().st_size:
2007+ jcs_cmd = cmd + ["--dangerous", jcs_res]
2008+ else:
2009+ jcs_cmd = cmd + ["juju-cloud-status"]
2010+ subprocess.check_call(jcs_cmd)
2011+ self.set_snap_version("juju-cloud-status")
2012+
2013+ @staticmethod
2014+ def set_snap_version(snapname):
2015+ cmd = ['snap', 'info', snapname]
2016+ version = subprocess.check_output(cmd).decode('utf-8', errors='replace').partition(
2017+ 'installed:')[-1].split()[0]
2018+ cmd = ['application-version-set', version]
2019+ subprocess.check_call(cmd)
2020+
2021+ def on_config_changed(self, _):
2022+ self.reconfigure_juju_cloud_status()
2023+
2024+ def on_upgrade_charm(self, _):
2025+ self.reconfigure_juju_cloud_status()
2026+
2027+ def reconfigure_juju_cloud_status(self):
2028+ ctx = {"sudo_user": "jujumanage"}
2029+ if self.model.config["login-enabled"]:
2030+ tenv = Environment(loader=FileSystemLoader("templates"))
2031+ template = tenv.get_template("juju-cloud-status.j2")
2032+ rendered_content = template.render(ctx)
2033+ content_hash = hash(rendered_content)
2034+ old_hash = self.state.juju_cloud_status_hash
2035+ if old_hash != content_hash:
2036+ self.state.juju_cloud_status_hash = old_hash
2037+ self.JCS_ON_LOGIN_PATH.write_text(rendered_content)
2038+ self.model.unit.status = ActiveStatus()
2039+ self.set_snap_version("juju-cloud-status")
2040+
2041+if __name__ == "__main__":
2042+ main(JujuStatusCharm)
2043diff --git a/juju-cloud-status/templates/juju-cloud-status.j2 b/juju-cloud-status/templates/juju-cloud-status.j2
2044new file mode 100644
2045index 0000000..59cd913
2046--- /dev/null
2047+++ b/juju-cloud-status/templates/juju-cloud-status.j2
2048@@ -0,0 +1,14 @@
2049+#!/bin/sh
2050+
2051+cores=$(grep -c ^processor /proc/cpuinfo 2>/dev/null)
2052+[ "$cores" -eq "0" ] && cores=1
2053+threshold="${cores:-1}.0"
2054+if [ $(echo "`cut -f1 -d ' ' /proc/loadavg` < $threshold" | bc) -eq 1 ]; then
2055+ echo
2056+ echo -n " Juju cloud status information as of "
2057+ /bin/date
2058+ sudo -u {{sudo_user}} /snap/bin/juju-cloud-status
2059+else
2060+ echo
2061+ echo " Juju-cloud-status informatino disabled due to load higher than $threshold"
2062+fi
2063diff --git a/juju-cloud-status/tests/functional/conftest.py b/juju-cloud-status/tests/functional/conftest.py
2064deleted file mode 100644
2065index 19c7d8e..0000000
2066--- a/juju-cloud-status/tests/functional/conftest.py
2067+++ /dev/null
2068@@ -1,87 +0,0 @@
2069-#!/usr/bin/python3
2070-"""
2071-Reusable pytest fixtures for functional testing
2072-
2073-Environment variables
2074----------------------
2075-
2076-test_preserve_model:
2077-if set, the testing model won't be torn down at the end of the testing session
2078-"""
2079-
2080-import asyncio
2081-import os
2082-import uuid
2083-import pytest
2084-import subprocess
2085-
2086-from juju.controller import Controller
2087-from juju.model import Model
2088-from juju_tools import JujuTools
2089-from juju.errors import JujuConnectionError
2090-
2091-
2092-@pytest.fixture(scope="module")
2093-def event_loop():
2094- """Override the default pytest event loop to allow for fixtures using a
2095- broader scope"""
2096- loop = asyncio.get_event_loop_policy().new_event_loop()
2097- asyncio.set_event_loop(loop)
2098- loop.set_debug(True)
2099- yield loop
2100- loop.close()
2101- asyncio.set_event_loop(None)
2102-
2103-
2104-@pytest.fixture(scope="module")
2105-async def controller():
2106- """Connect to the current controller"""
2107- _controller = Controller()
2108- await _controller.connect_current()
2109- yield _controller
2110- await _controller.disconnect()
2111-
2112-
2113-@pytest.fixture(scope="module")
2114-async def model(controller):
2115- """Returns the model for the test"""
2116- model_name = os.getenv("PYTEST_MODEL")
2117- if model_name:
2118- # Reuse existing model
2119- _model = Model()
2120- full_name = "{}:{}".format(
2121- controller.controller_name, os.getenv("PYTEST_MODEL")
2122- )
2123- try:
2124- await _model.connect(full_name)
2125- except JujuConnectionError:
2126- # Let's create it since it's missing
2127- _model = await controller.add_model(
2128- model_name,
2129- cloud_name=os.getenv("PYTEST_CLOUD_NAME"),
2130- region=os.getenv("PYTEST_CLOUD_REGION"),
2131- )
2132- else:
2133- # Create a new random model
2134- model_name = "functest-{}".format(str(uuid.uuid4())[-12:])
2135- _model = await controller.add_model(
2136- model_name,
2137- cloud_name=os.getenv("PYTEST_CLOUD_NAME"),
2138- region=os.getenv("PYTEST_CLOUD_REGION"),
2139- )
2140- # https://github.com/juju/python-libjuju/issues/267
2141- subprocess.check_call(["juju", "models"])
2142- while model_name not in await controller.list_models():
2143- await asyncio.sleep(1)
2144- yield _model
2145- await _model.disconnect()
2146- if not os.getenv("PYTEST_KEEP_MODEL"):
2147- await controller.destroy_model(model_name)
2148- while model_name in await controller.list_models():
2149- await asyncio.sleep(1)
2150-
2151-
2152-@pytest.fixture(scope="module")
2153-async def jujutools(controller, model):
2154- tools = JujuTools(controller, model)
2155- return tools
2156diff --git a/juju-cloud-status/tests/functional/juju_tools.py b/juju-cloud-status/tests/functional/juju_tools.py
2157deleted file mode 100644
2158index 2fd501d..0000000
2159--- a/juju-cloud-status/tests/functional/juju_tools.py
2160+++ /dev/null
2161@@ -1,68 +0,0 @@
2162-import pickle
2163-import juju
2164-import base64
2165-
2166-# from juju.errors import JujuError
2167-
2168-
2169-class JujuTools:
2170- def __init__(self, controller, model):
2171- self.controller = controller
2172- self.model = model
2173-
2174- async def run_command(self, cmd, target):
2175- '''
2176- Runs a command on a unit.
2177-
2178- :param cmd: Command to be run
2179- :param unit: Unit object or unit name string
2180- '''
2181- unit = (
2182- target
2183- if isinstance(target, juju.unit.Unit)
2184- else await self.get_unit(target)
2185- )
2186- action = await unit.run(cmd)
2187- return action.results
2188-
2189- async def remote_object(self, imports, remote_cmd, target):
2190- '''
2191- Runs command on target machine and returns a python object of the result
2192-
2193- :param imports: Imports needed for the command to run
2194- :param remote_cmd: The python command to execute
2195- :param target: Unit object or unit name string
2196- '''
2197- python3 = "python3 -c '{}'"
2198- python_cmd = ('import pickle;'
2199- 'import base64;'
2200- '{}'
2201- 'print(base64.b64encode(pickle.dumps({})), end="")'
2202- .format(imports, remote_cmd))
2203- cmd = python3.format(python_cmd)
2204- results = await self.run_command(cmd, target)
2205- return pickle.loads(base64.b64decode(bytes(results['Stdout'][2:-1], 'utf8')))
2206-
2207- async def file_stat(self, path, target):
2208- '''
2209- Runs stat on a file
2210-
2211- :param path: File path
2212- :param target: Unit object or unit name string
2213- '''
2214- imports = 'import os;'
2215- python_cmd = ('os.stat("{}")'
2216- .format(path))
2217- print("Calling remote cmd: " + python_cmd)
2218- return await self.remote_object(imports, python_cmd, target)
2219-
2220- async def file_contents(self, path, target):
2221- '''
2222- Returns the contents of a file
2223-
2224- :param path: File path
2225- :param target: Unit object or unit name string
2226- '''
2227- cmd = 'cat {}'.format(path)
2228- result = await self.run_command(cmd, target)
2229- return result['Stdout']
2230diff --git a/juju-cloud-status/tests/functional/requirements.txt b/juju-cloud-status/tests/functional/requirements.txt
2231deleted file mode 100644
2232index 452a633..0000000
2233--- a/juju-cloud-status/tests/functional/requirements.txt
2234+++ /dev/null
2235@@ -1,7 +0,0 @@
2236-flake8
2237-juju
2238-mock
2239-pytest
2240-pytest-asyncio
2241-pytest-timeout
2242-requests
2243diff --git a/juju-cloud-status/tests/functional/test_deploy.py b/juju-cloud-status/tests/functional/test_deploy.py
2244deleted file mode 100644
2245index 2d79424..0000000
2246--- a/juju-cloud-status/tests/functional/test_deploy.py
2247+++ /dev/null
2248@@ -1,106 +0,0 @@
2249-import os
2250-import pytest
2251-import subprocess
2252-import stat
2253-
2254-# Treat all tests as coroutines
2255-pytestmark = pytest.mark.asyncio
2256-
2257-juju_repository = os.getenv("JUJU_REPOSITORY", ".").rstrip("/")
2258-series = [
2259- "xenial",
2260- "bionic",
2261- pytest.param("cosmic", marks=pytest.mark.xfail(reason="canary")),
2262-]
2263-sources = [
2264- ("local", "{}/builds/cloud_status".format(juju_repository)),
2265- # ('jujucharms', 'cs:...'),
2266-]
2267-
2268-
2269-# Custom fixtures
2270-@pytest.fixture(params=series)
2271-def series(request):
2272- return request.param
2273-
2274-
2275-@pytest.fixture(params=sources, ids=[s[0] for s in sources])
2276-def source(request):
2277- return request.param
2278-
2279-
2280-@pytest.fixture
2281-async def app(model, series, source):
2282- app_name = "cloud_status-{}-{}".format(series, source[0])
2283- return await model._wait_for_new("application", app_name)
2284-
2285-
2286-@pytest.mark.deploy
2287-async def test_cloud_status_deploy(model, series, source, request):
2288- # Starts a deploy for each series
2289- # Using subprocess b/c libjuju fails with JAAS
2290- # https://github.com/juju/python-libjuju/issues/221
2291- application_name = 'cloud_status-{}-{}'.format(series, source[0])
2292- cmd = ['juju', 'deploy', source[1], '-m', model.info.name,
2293- '--series', series, application_name]
2294- if request.node.get_closest_marker('xfail'):
2295- # If series is 'xfail' force install to allow testing against versions not in
2296- # metadata.yaml
2297- cmd.append('--force')
2298- subprocess.check_call(cmd)
2299-
2300-
2301-@pytest.mark.deploy
2302-@pytest.mark.timeout(300)
2303-async def test_charm_upgrade(model, app):
2304- if app.name.endswith("local"):
2305- pytest.skip("No need to upgrade the local deploy")
2306- unit = app.units[0]
2307- await model.block_until(lambda: unit.agent_status == "idle")
2308- subprocess.check_call(
2309- [
2310- "juju",
2311- "upgrade-charm",
2312- "--switch={}".format(sources[0][1]),
2313- "-m",
2314- model.info.name,
2315- app.name,
2316- ]
2317- )
2318- await model.block_until(lambda: unit.agent_status == "executing")
2319-
2320-
2321-@pytest.mark.deploy
2322-@pytest.mark.timeout(300)
2323-async def test_cloud_status_status(model, app):
2324- # Verifies status for all deployed series of the charm
2325- await model.block_until(lambda: app.status == 'active')
2326- unit = app.units[0]
2327- await model.block_until(lambda: unit.agent_status == 'idle')
2328-
2329-
2330-# Tests
2331-async def test_example_action(app):
2332- unit = app.units[0]
2333- action = await unit.run_action("example-action")
2334- action = await action.wait()
2335- assert action.status == "completed"
2336-
2337-
2338-async def test_run_command(app, jujutools):
2339- unit = app.units[0]
2340- cmd = "hostname --all-ip-addresses"
2341- results = await jujutools.run_command(cmd, unit)
2342- assert results["Code"] == "0"
2343- assert unit.public_address in results["Stdout"]
2344-
2345-
2346-async def test_file_stat(app, jujutools):
2347- unit = app.units[0]
2348- path = "/var/lib/juju/agents/unit-{}/charm/metadata.yaml".format(
2349- unit.entity_id.replace("/", "-")
2350- )
2351- fstat = await jujutools.file_stat(path, unit)
2352- assert stat.filemode(fstat.st_mode) == "-rw-r--r--"
2353- assert fstat.st_uid == 0
2354- assert fstat.st_gid == 0
2355diff --git a/juju-cloud-status/tests/unit/conftest.py b/juju-cloud-status/tests/unit/conftest.py
2356deleted file mode 100644
2357index 094bc55..0000000
2358--- a/juju-cloud-status/tests/unit/conftest.py
2359+++ /dev/null
2360@@ -1,69 +0,0 @@
2361-#!/usr/bin/python3
2362-import mock
2363-import pytest
2364-
2365-
2366-# If layer options are used, add this to cloud_status
2367-# and import layer in lib_cloud_status
2368-@pytest.fixture
2369-def mock_layers(monkeypatch):
2370- import sys
2371- sys.modules['charms.layer'] = mock.Mock()
2372- sys.modules['reactive'] = mock.Mock()
2373- # Mock any functions in layers that need to be mocked here
2374-
2375- def options(layer):
2376- # mock options for layers here
2377- if layer == 'example-layer':
2378- options = {'port': 9999}
2379- return options
2380- else:
2381- return None
2382-
2383- monkeypatch.setattr('lib_cloud_status.layer.options', options)
2384-
2385-
2386-@pytest.fixture
2387-def mock_hookenv_config(monkeypatch):
2388- import yaml
2389-
2390- def mock_config():
2391- cfg = {}
2392- yml = yaml.load(open('./config.yaml'))
2393-
2394- # Load all defaults
2395- for key, value in yml['options'].items():
2396- cfg[key] = value['default']
2397-
2398- # Manually add cfg from other layers
2399- # cfg['my-other-layer'] = 'mock'
2400- return cfg
2401-
2402- monkeypatch.setattr('lib_cloud_status.hookenv.config', mock_config)
2403-
2404-
2405-@pytest.fixture
2406-def mock_remote_unit(monkeypatch):
2407- monkeypatch.setattr('lib_cloud_status.hookenv.remote_unit', lambda: 'unit-mock/0')
2408-
2409-
2410-@pytest.fixture
2411-def mock_charm_dir(monkeypatch):
2412- monkeypatch.setattr('lib_cloud_status.hookenv.charm_dir', lambda: '/mock/charm/dir')
2413-
2414-
2415-@pytest.fixture
2416-def cloud_status(tmpdir, mock_hookenv_config, mock_charm_dir, monkeypatch):
2417- from lib_cloud_status import Cloud_statusHelper
2418- helper = Cloud_statusHelper()
2419-
2420- # Example config file patching
2421- cfg_file = tmpdir.join('example.cfg')
2422- with open('./tests/unit/example.cfg', 'r') as src_file:
2423- cfg_file.write(src_file.read())
2424- helper.example_config_file = cfg_file.strpath
2425-
2426- # Any other functions that load helper will get this version
2427- monkeypatch.setattr('lib_cloud_status.Cloud_statusHelper', lambda: helper)
2428-
2429- return helper
2430diff --git a/juju-cloud-status/tests/unit/example.cfg b/juju-cloud-status/tests/unit/example.cfg
2431deleted file mode 100644
2432index 81b1e94..0000000
2433--- a/juju-cloud-status/tests/unit/example.cfg
2434+++ /dev/null
2435@@ -1 +0,0 @@
2436-This is an example config file included with the unit tests
2437diff --git a/juju-cloud-status/tests/unit/requirements.txt b/juju-cloud-status/tests/unit/requirements.txt
2438deleted file mode 100644
2439index 9c685e5..0000000
2440--- a/juju-cloud-status/tests/unit/requirements.txt
2441+++ /dev/null
2442@@ -1,5 +0,0 @@
2443-charmhelpers
2444-charms.reactive
2445-mock
2446-pytest
2447-pytest-cov
2448diff --git a/juju-cloud-status/tests/unit/test_actions.py b/juju-cloud-status/tests/unit/test_actions.py
2449deleted file mode 100644
2450index c85a781..0000000
2451--- a/juju-cloud-status/tests/unit/test_actions.py
2452+++ /dev/null
2453@@ -1,12 +0,0 @@
2454-import imp
2455-
2456-import mock
2457-
2458-
2459-class TestActions():
2460- def test_example_action(self, cloud_status, monkeypatch):
2461- mock_function = mock.Mock()
2462- monkeypatch.setattr(cloud_status, 'status_function', mock_function)
2463- assert mock_function.call_count == 0
2464- imp.load_source('status', './actions/status')
2465- assert mock_function.call_count == 1
2466diff --git a/juju-cloud-status/tests/unit/test_lib.py b/juju-cloud-status/tests/unit/test_lib.py
2467deleted file mode 100644
2468index 5a836a3..0000000
2469--- a/juju-cloud-status/tests/unit/test_lib.py
2470+++ /dev/null
2471@@ -1,12 +0,0 @@
2472-#!/usr/bin/python3
2473-
2474-
2475-class TestLib():
2476- def test_pytest(self):
2477- assert True
2478-
2479- def test_cloud_status(self, cloud_status):
2480- ''' See if the helper fixture works to load charm configs '''
2481- assert isinstance(cloud_status.charm_config, dict)
2482-
2483- # Include tests for functions in lib_cloud_status
2484diff --git a/juju-cloud-status/tox.ini b/juju-cloud-status/tox.ini
2485deleted file mode 100644
2486index 3bea8e1..0000000
2487--- a/juju-cloud-status/tox.ini
2488+++ /dev/null
2489@@ -1,59 +0,0 @@
2490-[tox]
2491-skipsdist=True
2492-envlist = unit, functional
2493-skip_missing_interpreters = True
2494-
2495-[testenv]
2496-basepython = python3
2497-setenv =
2498- PYTHONPATH = .
2499-
2500-[testenv:unit]
2501-commands = pytest -v --ignore {toxinidir}/tests/functional \
2502- --cov=lib \
2503- --cov=reactive \
2504- --cov=actions \
2505- --cov-report=term \
2506- --cov-report=annotate:report/annotated \
2507- --cov-report=html:report/html
2508-deps = -r{toxinidir}/tests/unit/requirements.txt
2509- -r{toxinidir}/requirements.txt
2510-setenv = PYTHONPATH={toxinidir}/lib
2511-
2512-[testenv:functional]
2513-passenv =
2514- HOME
2515- JUJU_REPOSITORY
2516- PATH
2517- PYTEST_KEEP_MODEL
2518- PYTEST_CLOUD_NAME
2519- PYTEST_CLOUD_REGION
2520- PYTEST_MODEL
2521-commands = pytest -v --ignore {toxinidir}/tests/unit \
2522- -k {env:PYTEST_SELECT_TESTS:test} \
2523- -m "{env:PYTEST_SELECT_MARKS:not excluded}" \
2524- --ignore {toxinidir}/layers \
2525- --ignore {toxinidir}/interfaces
2526-deps = -r{toxinidir}/tests/functional/requirements.txt
2527- -r{toxinidir}/requirements.txt
2528-
2529-[testenv:lint]
2530-commands = flake8
2531-deps =
2532- flake8
2533- flake8-docstrings
2534- flake8-import-order
2535- pep8-naming
2536- flake8-colors
2537-
2538-[flake8]
2539-exclude =
2540- .git,
2541- __pycache__,
2542- .tox,
2543-max-line-length = 120
2544-max-complexity = 10
2545-
2546-[pytest]
2547-markers =
2548- deploy: mark deployment tests to allow running w/o redeploy

Subscribers

People subscribed via source and target branches

to all changes: