├── App.js ├── Constraint.js ├── LICENSE ├── README.md ├── Relax.js ├── Var.js ├── images ├── noun_102611_cc.svg ├── noun_1559_cc.svg ├── noun_1560_cc.svg ├── noun_29229_cc.svg ├── noun_32380_cc.svg ├── noun_33853_cc.svg ├── noun_33942_cc.svg ├── noun_58521_cc.svg ├── noun_61520.svg └── noun_86100_cc.svg ├── index.css ├── index.html └── lib ├── jquery-2.1.3.min.js ├── ohm.min.js └── toDOM.js /App.js: -------------------------------------------------------------------------------- 1 | const chartScale = 1; 2 | const chartBarWidth = 50; 3 | const chartBottomPadding = 100; 4 | 5 | const App = { 6 | GOOD_EFFORT_TIME_MS: 2000, 7 | 8 | init() { 9 | $('addConstraintButton').click(() => { 10 | const newC = addConstraint(); 11 | $('constraints').append(newC); 12 | newC.focus(); 13 | }); 14 | 15 | let relaxButtonDown = false; 16 | $('relaxButton').mousedown(() => { relaxButtonDown = true; }); 17 | $(document.body).mouseup(() => { relaxButtonDown = false; }); 18 | 19 | function setError(error) { 20 | $('errorValue').text(error.toFixed(5)); 21 | } 22 | 23 | let relaxingUntilTime = 0; 24 | let toDoWhenSatisfiedOrDone = []; 25 | function relaxForUpTo(millis, optFn) { 26 | relaxingUntilTime = Date.now() + millis; 27 | toDoWhenSatisfiedOrDone.push({ 28 | timeout: relaxingUntilTime, 29 | fn: optFn || (() => {}) 30 | }); 31 | } 32 | 33 | const errorFns = []; 34 | const varDict = {}; 35 | 36 | function addConstraint() { 37 | const constraint = App.Constraint.create(); 38 | $('constraints').append(constraint); 39 | errorFns.push(constraint.errorFn); 40 | relaxForUpTo(App.GOOD_EFFORT_TIME_MS); 41 | 42 | $(constraint).change(() => { 43 | errorFns.splice($(constraint).index(), 1, constraint.errorFn); 44 | constraint.varNames.forEach((name) => { 45 | if (!varDict[name]) { 46 | addVar(name); 47 | } 48 | }); 49 | relaxForUpTo(App.GOOD_EFFORT_TIME_MS); 50 | }); 51 | 52 | $(constraint).on('delete', () => deleteConstraint(constraint)); 53 | 54 | return constraint; 55 | } 56 | 57 | function addVar(name) { 58 | const aVar = App.Var.create(name, 0); 59 | $('vars').append(aVar); 60 | varDict[name] = aVar; 61 | 62 | let lockButtonClickCount = 0; 63 | $(aVar).on('lockbuttonclick', () => { 64 | lockButtonClickCount++; 65 | if (!aVar.locked) { 66 | relaxForUpTo(App.GOOD_EFFORT_TIME_MS); 67 | } 68 | }); 69 | 70 | $(aVar).change(() => { 71 | let fn; 72 | if (!aVar.locked) { 73 | aVar.locked = true; 74 | let oldLockButtonClickCount = lockButtonClickCount; 75 | fn = () => { 76 | if (lockButtonClickCount === oldLockButtonClickCount) { 77 | aVar.locked = false; 78 | relaxForUpTo(App.GOOD_EFFORT_TIME_MS); 79 | } 80 | }; 81 | } 82 | relaxForUpTo(App.GOOD_EFFORT_TIME_MS, fn); 83 | }); 84 | 85 | $(aVar).on('delete', () => { 86 | $('aConstraint').each(function() { 87 | this.inlineVar(aVar.name, aVar.value); 88 | if (this.varNames.length === 0) { 89 | deleteConstraint(this); 90 | } 91 | }); 92 | delete varDict[name]; 93 | $(aVar).remove(); 94 | }); 95 | } 96 | 97 | function deleteConstraint(constraint) { 98 | errorFns.splice($(constraint).index(), 1); 99 | $(constraint).remove(); 100 | relaxForUpTo(App.GOOD_EFFORT_TIME_MS); 101 | } 102 | 103 | setError(0); 104 | 105 | const relax = new Relax(varDict, errorFns); 106 | 107 | let relaxing = false; 108 | let relaxed = true; 109 | 110 | const ctxt = canvas.getContext('2d'); 111 | 112 | function doSomeRelaxing() { 113 | 114 | doBarStuff(); 115 | 116 | let currTime = Date.now(); 117 | relaxing = false; 118 | if (currTime < relaxingUntilTime || relaxButtonDown) { 119 | relaxing = true; 120 | const error = relax.iterateForUpTo(1000 / 50); 121 | setError(error); 122 | if (error < relax.epsilon) { 123 | relaxed = true; 124 | relaxingUntilTime = 0; 125 | while (toDoWhenSatisfiedOrDone.length > 0) { 126 | const fn = toDoWhenSatisfiedOrDone.shift().fn; 127 | fn(); 128 | } 129 | } else { 130 | relaxed = false; 131 | } 132 | } 133 | while (toDoWhenSatisfiedOrDone.length > 0 && currTime >= toDoWhenSatisfiedOrDone[0].timeout) { 134 | const fn = toDoWhenSatisfiedOrDone.shift().fn; 135 | fn(); 136 | } 137 | $('app').toggleClass('relaxing', relaxing); 138 | $('app').toggleClass('relaxed', relaxed); 139 | requestAnimationFrame(doSomeRelaxing); 140 | } 141 | 142 | function doBarStuff() { 143 | canvas.width = innerWidth; 144 | canvas.height = innerHeight; 145 | 146 | if (targetVar) { 147 | targetVar.value = targetVarDesiredValue; 148 | relaxForUpTo(App.GOOD_EFFORT_TIME_MS); 149 | } 150 | 151 | let x = 0; 152 | Object.keys(varDict).forEach(name => { 153 | if (!varDict[name].hasBar) { 154 | return; 155 | } 156 | const scaledValue = varDict[name].value * chartScale; 157 | ctxt.fillStyle = 'cornflowerblue'; 158 | ctxt.fillRect(x, innerHeight - scaledValue - chartBottomPadding, chartBarWidth - 2, scaledValue); 159 | ctxt.fillStyle = 'black'; 160 | ctxt.font = '10pt Avenir'; 161 | const w = ctxt.measureText(name).width; 162 | const yOffset = scaledValue > 0 ? 6 : -18; 163 | ctxt.fillText(name, x + (chartBarWidth - 2) / 2 - w / 2, innerHeight - scaledValue - chartBottomPadding - yOffset); 164 | x += chartBarWidth; 165 | }); 166 | } 167 | 168 | let targetVar = null; 169 | let targetVarOrigValue; 170 | let targetVarDesiredValue; 171 | let yOffset; 172 | 173 | canvas.onmousedown = e => { 174 | const idx = Math.floor(e.offsetX / chartBarWidth); 175 | targetVar = Object.values(varDict).filter(v => v.hasBar)[idx] || null; 176 | if (targetVar) { 177 | console.log(targetVar.name); 178 | targetVarOrigValue = targetVar.value; 179 | targetVarDesiredValue = targetVarOrigValue; 180 | yOffset = e.offsetY; 181 | } 182 | }; 183 | 184 | canvas.onmousemove = e => { 185 | if (!targetVar) { 186 | return; 187 | } 188 | 189 | const delta = (yOffset - e.offsetY) / chartScale; 190 | targetVarDesiredValue = targetVarOrigValue + delta; 191 | }; 192 | 193 | canvas.onmouseup = e => { 194 | targetVar = null; 195 | }; 196 | 197 | requestAnimationFrame(doSomeRelaxing); 198 | } 199 | }; 200 | -------------------------------------------------------------------------------- /Constraint.js: -------------------------------------------------------------------------------- 1 | App.Constraint = { 2 | grammar: ohm.namespace('rbs').getGrammar('Grammar'), 3 | create() { 4 | // TODO: replace element w/ CodeMirror to make syntax highlighting, etc. possible. 5 | const $self = $(''); 6 | const $input = $self.children('input'); 7 | const $deleteButton = $self.children('deleteButton'); 8 | const $error = $self.children('error'); 9 | 10 | let expr = ''; 11 | 12 | const self = $self[0]; 13 | self.errorFn = () => 0; 14 | self.varNames = []; 15 | 16 | const ENTER = 13; 17 | const ESC = 27; 18 | $input.keyup(e => { 19 | if (e.keyCode === ESC || e.keyCode === ENTER && !isDirty()) { 20 | $input.val(expr); 21 | parse($input.val()); 22 | $input.blur(); 23 | } else if (e.keyCode === ENTER) { 24 | exprChanged(); 25 | } 26 | updateView(); 27 | }); 28 | 29 | $input.keypress(e => { 30 | const pretty = toPrettyChar(e.charCode); 31 | if (pretty !== undefined && 32 | typeof this.selectionStart === 'number' && 33 | typeof this.selectionEnd == 'number') { 34 | const selectionStart = this.selectionStart; 35 | const selectionEnd = this.selectionEnd; 36 | this.value = this.value.slice(0, selectionStart) + pretty + this.value.slice(selectionEnd); 37 | this.setSelectionRange(selectionStart + 1, selectionStart + 1); 38 | return false; 39 | } 40 | }); 41 | 42 | $input.change(exprChanged); 43 | 44 | $deleteButton.click(() => { 45 | $self.trigger('delete'); 46 | }); 47 | 48 | self.focus = () => $input.focus(); 49 | 50 | function exprChanged() { 51 | const newExpr = $input.val(); 52 | if (newExpr === expr) { 53 | return; 54 | } 55 | 56 | const node = parse(newExpr); 57 | if (!node) { 58 | updateView(); 59 | return; 60 | } 61 | 62 | expr = newExpr; 63 | refreshVarNames(node); 64 | self.errorFn = toErrorFn(node); 65 | $self.trigger('change'); 66 | updateView(); 67 | $input.blur(); 68 | }; 69 | 70 | function updateView() { 71 | $self.toggleClass('dirty', isDirty()); 72 | $self.toggleClass('withError', $error.children().length > 0); 73 | } 74 | 75 | function toPrettyChar(charCode) { 76 | switch (charCode) { 77 | case 42: return '\u00D7'; 78 | case 45: return '\u2013'; 79 | case 47: return '\u00F7'; 80 | default: return undefined; 81 | } 82 | } 83 | 84 | function withoutPrettyChars(str) { 85 | return str. 86 | replace(/\u00D7/g, '*'). 87 | replace(/\u2013/g, '-'). 88 | replace(/\u00F7/g, '/'); 89 | } 90 | 91 | function isDirty() { 92 | return $input.val() !== expr; 93 | } 94 | 95 | self.inlineVar = (name, value) => { 96 | if (expr.length === 0) { 97 | return; 98 | } 99 | 100 | const node = App.Constraint.grammar.matchContents(withoutPrettyChars(expr), 'Constraint'); 101 | const intervals = []; 102 | const collectIntervals = App.Constraint.grammar.semanticAction({ 103 | ident(_1, _2) { 104 | if (this.interval.contents === name) { 105 | intervals.push(this.interval); 106 | } 107 | }, 108 | _terminal() {}, 109 | _default() { 110 | this.children.forEach(child => collectIntervals(child)); 111 | } 112 | }); 113 | collectIntervals(node); 114 | if (intervals.length === 0) { 115 | return; 116 | } 117 | let newExpr = expr; 118 | while (intervals.length > 0) { 119 | const interval = intervals.pop(); 120 | newExpr = newExpr.substr(0, interval.startIdx) + value + newExpr.substr(interval.endIdx); 121 | } 122 | $input.val(newExpr); 123 | $input.trigger('change'); 124 | }; 125 | 126 | function refreshVarNames(node) { 127 | const varName = {}; 128 | const recordVarNames = App.Constraint.grammar.semanticAction({ 129 | ident(_1, _2) { 130 | varName[this.interval.contents] = true; 131 | }, 132 | _terminal() {}, 133 | _default() { 134 | this.children.forEach(child => recordVarNames(child)); 135 | } 136 | }); 137 | recordVarNames(node); 138 | self.varNames = Object.keys(varName); 139 | } 140 | 141 | function toErrorFn(node) { 142 | return new Function('varDict', 'return ' + toErrorExpr(node) + ';'); 143 | } 144 | 145 | const toErrorExpr = App.Constraint.grammar.synthesizedAttribute({ 146 | Constraint(expr) { 147 | return toErrorExpr(expr); 148 | }, 149 | Constraint_lt(x, _, y) { 150 | return '1000000 * Math.max(0, ' + toErrorExpr(x) + ' - (' + toErrorExpr(y) + '))'; 151 | }, 152 | Constraint_eq(x, _, y) { 153 | return toErrorExpr(x) + ' - (' + toErrorExpr(y) + ')'; 154 | }, 155 | Constraint_gt(x, _, y) { 156 | return '1000000 * Math.max(0, ' + toErrorExpr(y) + ' - (' + toErrorExpr(x) + '))'; 157 | }, 158 | Constraint_def(x, _, e) { 159 | throw new Error('TODO'); 160 | }, 161 | Expr(expr) { 162 | return toErrorExpr(expr); 163 | }, 164 | AddExpr_plus(x, _, y) { 165 | return toErrorExpr(x) + ' + ' + toErrorExpr(y); 166 | }, 167 | AddExpr_minus(x, _, y) { 168 | return toErrorExpr(x) + ' - ' + toErrorExpr(y); 169 | }, 170 | AddExpr(expr) { 171 | return toErrorExpr(expr); 172 | }, 173 | MulExpr_times1(x, y) { 174 | return toErrorExpr(x) + ' * ' + toErrorExpr(y); 175 | }, 176 | MulExpr_times2(x, _, y) { 177 | return toErrorExpr(x) + ' * ' + toErrorExpr(y); 178 | }, 179 | MulExpr_divide(x, _, y) { 180 | return toErrorExpr(x) + ' / ' + toErrorExpr(y); 181 | }, 182 | MulExpr(expr) { 183 | return toErrorExpr(expr); 184 | }, 185 | ExpExpr_exp(x, _, y) { 186 | return 'Math.pow('+ toErrorExpr(x) + ', ' + toErrorExpr(y) + ')'; 187 | }, 188 | ExpExpr(expr) { 189 | return toErrorExpr(expr); 190 | }, 191 | PriExpr_paren(_1, e, _2) { 192 | return '(' + toErrorExpr(e) + ')'; 193 | }, 194 | PriExpr_pos(_, e) { 195 | return '(' + toErrorExpr(e) + ')'; 196 | }, 197 | PriExpr_neg(_, e) { 198 | return '-(' + toErrorExpr(e) + ')'; 199 | }, 200 | PriExpr(expr) { 201 | return toErrorExpr(expr); 202 | }, 203 | ident(_1, _2) { 204 | return 'varDict.' + this.interval.contents + '.value'; 205 | }, 206 | number(_) { 207 | return this.interval.contents; 208 | } 209 | }); 210 | 211 | function parse(newExpr) { 212 | $self.children('error').empty(); 213 | try { 214 | return App.Constraint.grammar.matchContents(withoutPrettyChars(newExpr), 'Constraint', true); 215 | } catch (e) { 216 | $('').appendTo($error); 217 | $input[0].setSelectionRange(e.getPos(), e.getPos()); 218 | e.getExpected().forEach((text, idx, expected) => { 219 | if (idx > 0) { 220 | $('').text( idx === expected.length - 1 ? ', or ' : ', ').appendTo($error); 221 | } 222 | if ( 223 | text.charAt(0) === '"' && text.charAt(text.length - 1) === '"' || 224 | text.charAt(0) === "'" && text.charAt(text.length - 1) === "'") 225 | { 226 | text = text.substr(1, text.length - 2); 227 | $('"' + text + '"').appendTo($error); 228 | } else { 229 | $('' + text + '').appendTo($error); 230 | } 231 | }); 232 | return undefined; 233 | } 234 | } 235 | 236 | return self; 237 | } 238 | }; 239 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Alessandro Warth 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Constraint-Based Spreadsheet 2 | ============================ 3 | 4 | [![Demo video](https://img.shields.io/badge/Demo%20video-%E2%86%92-9D6EB3.svg?style=flat-square)](http://alexwarth.github.io/media/constraint-based-spreadsheet.mp4) [![Live demo](https://img.shields.io/badge/Live%20demo-%E2%86%92-9D6EB3.svg?style=flat-square)](https://alexwarth.github.io/projects/constraint-based-spreadsheet) 5 | 6 | 7 | In a standard spreadsheet application, the relationships defined by formulas are strictly one-way: if the formula for `expenses` is `=rent+groceries`, then entering a new value for `rent` or `groceries` will cause the value of `expenses` to change, but entering a new value for `expenses` will simply replace its formula with the new value, leaving the other cells unchanged. There is no *direct* way for the user to set the value of a cell like `expenses` while still maintaining that cell's relationship to the other cells. Instead, the user must repeatedly enter different values for the other cells until the formula for `expenses` happens to yield the desired value. In our simple example, this kind of experimentation is not all that difficult or time-consuming (and it would be even easier to find an analytical solution) but in larger, more complex spreadsheets, it can be a significant burden to the user. 8 | 9 | The *Constraint-Based Spreadsheet* project is an attempt to make spreadsheets more powerful and user-friendly by replacing formulas with multi-way constraints. A constraint, unlike a formula, does not belong to or specify the value of a single cell. Rather, it specifies how the values of different cells relate to each other. A single cell can be referenced in (and influenced by) any number of constraints. When the user changes the value of a cell, the system automatically finds new values for the other cells (giving preference to smaller changes) such that all of the constraints are satisfied. If the user doesn't like these new values, it's because she hasn't yet communicated all of the relevant constraints to the system. Adding more constraints will further restrict the solution space and lead to the desired solution. 10 | 11 | ## User Interface 12 | 13 | * When the user adds a constraint, any cell that's referenced and doesn't already exist will be created automatically. 14 | * When the user deletes a cell, its current value gets inlined into each constraint that referenced that cell. (This was Bret's suggestion.) 15 | * The user can **lock** a cell to keep the solver from modifying the value of that cell in order to satisfy constraints. 16 | 17 | ## Interesting / Tricky Bits 18 | 19 | * When the user changes the value of a cell: 20 | * The solver spreads the resulting "error" more or less evenly among the other cells. (**TODO: Explain how this is implemented.**) Another alternative would have been to change one cell at a time to reduce the error as much as possible, but that felt too jerky / unfair most of the time. 21 | * If, after a certain amount of time, the solver still hasn't found a solution that uses the new value, it will assume that there is no such solution, and allow itself to change the value of that cell in order to satisfy the constraints. 22 | * It is possible for the user to enter a set of constraints that doesn't have a solution, i.e., that is unsatisfiable. When this happens, the solver will keep trying anyway. There is a "spinny" icon that you can click on to interrupt the solver. (It will start up again the next time you add / modify a constraint or modify the value of a cell.) 23 | 24 | ## Future work 25 | 26 | * Improve the user interface, e.g., there should be icons / buttons on the cells for "lock" and "delete". (They're currently unlabeled.) 27 | * Merge this project with RelaxCanvas so that the spreadsheet can generate graphs, etc. 28 | * The connection between the graph and the cells will be two-way, so the user can change the value of the cells by manipulating the graph directly. 29 | * Borrow some good ideas from [Lotus Improv](http://en.wikipedia.org/wiki/Lotus_Improv). 30 | 31 | ## Authors 32 | 33 | * [Alex Warth](http://github.com/alexwarth) 34 | -------------------------------------------------------------------------------- /Relax.js: -------------------------------------------------------------------------------- 1 | class Relax { 2 | epsilon = 0.001; 3 | tinyDelta = 0.000001; 4 | 5 | constructor(varDict, errorFns) { 6 | this.varDict = varDict; 7 | this.errorFns = errorFns; 8 | } 9 | 10 | getError() { 11 | return this.errorFns 12 | .map(errorFn => Math.abs(errorFn(this.varDict))) 13 | .reduce((e1, e2) => e1 + e2, 0); 14 | } 15 | 16 | // TODO: replace this w/ automatic differentiation 17 | derivative(errorFn, aVar) { 18 | const origValue = aVar.value; 19 | 20 | const calcDerivative = (x0, x1) => { 21 | aVar.value = x0; 22 | const y0 = errorFn(this.varDict); 23 | aVar.value = x1; 24 | const y1 = errorFn(this.varDict); 25 | aVar.value = origValue; 26 | return (y1 - y0) / (x1 - x0); 27 | } 28 | 29 | let m = calcDerivative(origValue - this.tinyDelta, origValue + this.tinyDelta); 30 | if (Math.abs(m) < this.tinyDelta) { 31 | m = calcDerivative(origValue, origValue + this.tinyDelta); 32 | } 33 | if (Math.abs(m) < this.tinyDelta) { 34 | m = calcDerivative(origValue - this.tinyDelta, origValue); 35 | } 36 | return m; 37 | } 38 | 39 | computeDelta(aVar) { 40 | let mbs = 0; 41 | let mms = 0; 42 | for (const errorFn of this.errorFns) { 43 | const m = this.derivative(errorFn, aVar); 44 | const b = errorFn(this.varDict) - m * aVar.value; 45 | mbs += m * b; 46 | mms += m * m; 47 | } 48 | const newValue = -mbs / mms; 49 | return isFinite(newValue) ? newValue - aVar.value : undefined; 50 | } 51 | 52 | getUnlockedVars() { 53 | return Object.keys(this.varDict) 54 | .map(varName => this.varDict[varName]) 55 | .filter(aVar => !aVar.locked); 56 | } 57 | 58 | relax(optVars) { 59 | const vars = optVars || this.getUnlockedVars(); 60 | const deltas = vars.map(aVar => this.computeDelta(aVar)); 61 | const numDeltas = deltas.filter(d => typeof d === 'number' /*&& d > this.epsilon*/).length; 62 | if (numDeltas === 0) { 63 | return; 64 | } 65 | for (let idx = 0; idx < vars.length; idx++) { 66 | const aVar = vars[idx]; 67 | const delta = deltas[idx]; 68 | if (typeof delta === 'number' /*&& delta > this.epsilon*/) { 69 | aVar.value += delta / numDeltas; 70 | } 71 | } 72 | } 73 | 74 | iterateForUpTo(tMillis) { 75 | const vars = this.getUnlockedVars(); 76 | const t0 = Date.now(); 77 | while (this.getError() > this.epsilon && (Date.now() - t0) < tMillis) { 78 | this.relax(vars); 79 | } 80 | const error = this.getError(); 81 | if (error > this.epsilon) { 82 | for (const aVar of vars) { 83 | const sign = Math.random() < 0.5 ? -1 : 1; 84 | aVar.value += sign * self.tinyDelta; 85 | } 86 | } 87 | return error; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Var.js: -------------------------------------------------------------------------------- 1 | App.Var = { 2 | create(name, value) { 3 | const $self = $('' + name + ''); 4 | const $input = $self.children('input'); 5 | const $lockButton = $self.children('lockButton'); 6 | const $barsButton = $self.children('barsButton'); 7 | const $deleteButton = $self.children('deleteButton'); 8 | const $name = $self.children('name'); 9 | 10 | let numDecimalPlaces = 2; 11 | let locked = false; 12 | let hasBar = false; 13 | 14 | const self = $self[0]; 15 | 16 | Object.defineProperties(self, { 17 | value: { 18 | get() { 19 | return value; 20 | }, 21 | set(newValue) { 22 | value = newValue; 23 | $input.val(newValue.toFixed(numDecimalPlaces)); 24 | $name.attr('title', value); 25 | $self.toggleClass('dirty', false); 26 | } 27 | }, 28 | locked: { 29 | get() { 30 | return locked; 31 | }, 32 | set(newLocked) { 33 | locked = newLocked; 34 | $self.toggleClass('locked', locked); 35 | } 36 | }, 37 | hasBar: { 38 | get() { 39 | return hasBar; 40 | }, 41 | set(newHasBar) { 42 | hasBar = newHasBar; 43 | $self.toggleClass('hasBar', hasBar); 44 | } 45 | } 46 | }); 47 | 48 | self.value = value; 49 | self.name = name; 50 | 51 | const ENTER = 13; 52 | const ESC = 27; 53 | $input.keyup(e => { 54 | const dirty = parseFloat($input.val()) !== parseFloat(value.toFixed(numDecimalPlaces)); 55 | if (e.keyCode === ENTER && !dirty || e.keyCode === ESC) { 56 | self.value = self.value; // to reset the contents of the input element 57 | $input.blur(); 58 | } else { 59 | $self.toggleClass('dirty', dirty); 60 | } 61 | }); 62 | 63 | $input.change(() => { 64 | if (isAllHashes($input.val())) { 65 | numDecimalPlaces = $input.val().length; 66 | self.value = self.value; // to reset the contents of the input element 67 | $input.blur(); 68 | return; 69 | } 70 | 71 | const newValue = parseFloat($input.val()); 72 | if (Number.isNaN(newValue)) { 73 | return; 74 | } 75 | 76 | const oldValue = self.value; 77 | if (newValue !== oldValue) { 78 | self.value = newValue; 79 | $self.trigger('change'); 80 | } else { 81 | // Do it anyway just to format the input 82 | self.value = newValue; 83 | } 84 | $input.blur(); 85 | }); 86 | 87 | $lockButton.click(() => { 88 | self.locked = !self.locked; 89 | $self.trigger('lockbuttonclick'); 90 | }); 91 | 92 | $barsButton.click(() => { 93 | self.hasBar = !self.hasBar; 94 | $self.trigger('barsbuttonclick'); 95 | }); 96 | 97 | $deleteButton.click(() => { 98 | $self.trigger('delete'); 99 | }); 100 | 101 | function isAllHashes(str) { 102 | for (let idx = 0; idx < str.length; idx++) { 103 | if (str[idx] !== '#') { 104 | return false; 105 | } 106 | } 107 | return true; 108 | } 109 | 110 | return self; 111 | } 112 | }; 113 | -------------------------------------------------------------------------------- /images/noun_102611_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /images/noun_1559_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /images/noun_1560_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /images/noun_29229_cc.svg: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /images/noun_32380_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /images/noun_33853_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /images/noun_33942_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /images/noun_58521_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /images/noun_61520.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /images/noun_86100_cc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /index.css: -------------------------------------------------------------------------------- 1 | #canvas { 2 | position: absolute; 3 | left: 10px; 4 | bottom: 40px; 5 | width: 100%; 6 | height: 100%; 7 | } 8 | 9 | body, aVar, input, addConstraintButton, bottom, relaxButton { 10 | font-family: "PT Sans", Arial, Helvetica, sans-serif; 11 | font-size: 14pt; 12 | color: #444; 13 | } 14 | 15 | aVar, aConstraint, addConstraintButton, relaxButton, bottom { 16 | -webkit-user-select: none; 17 | -moz-user-select: none; 18 | user-select: none; 19 | } 20 | 21 | app { 22 | position: absolute; 23 | pointer-events: none; 24 | top: 8pt; 25 | bottom: 8pt; 26 | left: 8pt; 27 | right: 8pt; 28 | } 29 | 30 | left, right, bottom { 31 | display: inline-block; 32 | position: absolute; 33 | } 34 | 35 | left { 36 | left: 0; 37 | width: 300px; 38 | } 39 | 40 | right { 41 | right: 0; 42 | width: 400px; 43 | } 44 | 45 | addConstraintButton::before { 46 | pointer-events: auto; 47 | content: url(images/noun_33942_cc.svg); 48 | width: 12pt; 49 | height: 12pt; 50 | opacity: .8; 51 | } 52 | 53 | addConstraintButton { 54 | pointer-events: auto; 55 | padding: 0 3pt; 56 | background: #f8f8f8; 57 | } 58 | 59 | addConstraintButton:active { 60 | box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, .2); 61 | } 62 | 63 | addConstraintButton::after { 64 | pointer-events: auto; 65 | content: 'add constraint'; 66 | } 67 | 68 | bottom { 69 | left: 0; 70 | right: 0; 71 | bottom: 0; 72 | } 73 | 74 | relaxButton { 75 | pointer-events: auto; 76 | display: inline-block; 77 | position: absolute; 78 | _min-width: 100px; 79 | text-align: center; 80 | right: 0pt; 81 | bottom: 0pt; 82 | padding: 1pt 2pt; 83 | border-radius: 10pt; 84 | background: #fee; 85 | border: 1px solid #ffe8e8; 86 | color: #777; 87 | } 88 | 89 | errorValue { 90 | pointer-events: auto; 91 | padding-left: 2px; 92 | color: #ff3333; 93 | } 94 | 95 | relaxButton::before { 96 | pointer-events: auto; 97 | display: inline-block; 98 | content: url(images/noun_32380_cc.svg); 99 | opacity: .5; 100 | width: 12pt; 101 | height: 12pt; 102 | } 103 | 104 | app.relaxed relaxButton { 105 | pointer-events: auto; 106 | background: #efe; 107 | border: 1px solid #e8ffe8; 108 | } 109 | 110 | app relaxButton:active, app.relaxing relaxButton { 111 | pointer-events: auto; 112 | box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, .2); 113 | -webkit-animation: glow 1.5s ease-in-out infinite; 114 | animation: glow 1.5s ease-in-out infinite; 115 | } 116 | 117 | @-webkit-keyframes glow { 118 | 0% { background: #efe; border-color: #e8ffe8; } 119 | 50% { background: #fee; border-color: #ffe8e8; } 120 | 100% { background: #efe; border-color: #e8ffe8; } 121 | } 122 | 123 | @keyframes glow { 124 | 0% { background: #efe; border-color: #e8ffe8; } 125 | 50% { background: #fee; border-color: #ffe8e8; } 126 | 100% { background: #efe; border-color: #e8ffe8; } 127 | } 128 | 129 | app relaxButton:active::after, app.relaxing relaxButton::after { 130 | -webkit-animation: levitate 2s linear infinite; 131 | animation: levitate 2s linear infinite; 132 | } 133 | 134 | @-webkit-keyframes levitate { 135 | 0% { transform: translate(0, 0); } 136 | 25% { transform: translate(0, -1pt); } 137 | 75% { transform: translate(0, 1pt); } 138 | 100% { transform: translate(0, 0); } 139 | } 140 | 141 | @keyframes levitate { 142 | 0% { transform: translate(0, 0); } 143 | 25% { transform: translate(0, -1pt); } 144 | 75% { transform: translate(0, 1pt); } 145 | 100% { transform: translate(0, 0); } 146 | } 147 | 148 | app relaxButton::after { 149 | display: inline-block; 150 | padding-left: 2pt; 151 | content: url(images/noun_86100_cc.svg); 152 | opacity: .5; 153 | padding-bottom: 2pt; 154 | } 155 | 156 | app.relaxed relaxButton::after { 157 | content: url(images/noun_58521_cc.svg); 158 | } 159 | 160 | app relaxButton:hover::after, app.relaxing relaxButton::after { 161 | content: url(images/noun_61520.svg); 162 | opacity: .8; 163 | } 164 | 165 | aConstraint, aVar, addConstraintButton, relaxButton { 166 | pointer-events: auto; 167 | display: inline-block; 168 | box-shadow: 1px 1px 2px 0px rgba(0, 0, 0, .5); 169 | border-radius: 4pt; 170 | clear: both; 171 | } 172 | 173 | aConstraint, aVar { 174 | margin-bottom: 6pt; 175 | } 176 | 177 | aConstraint > *, aVar > * { 178 | padding: 0 1pt; 179 | } 180 | 181 | input { 182 | pointer-events: auto; 183 | -webkit-user-select: text; 184 | -moz-user-select: text; 185 | user-select: text; 186 | width: 100px; 187 | border: none; 188 | outline: none; 189 | background: none; 190 | padding: 3pt 0pt; 191 | text-overflow: ellipsis; 192 | } 193 | 194 | aConstraint, addConstraintButton { 195 | float: right; 196 | border: #f9f9f9; 197 | } 198 | 199 | aConstraint { 200 | overflow: hidden; 201 | max-width: 322px; 202 | background: #efe; 203 | } 204 | 205 | aConstraint > input { 206 | padding-left: 4pt; 207 | width: 300px; 208 | } 209 | 210 | aConstraint > input { 211 | color: #444; 212 | } 213 | 214 | aVar > input { 215 | color: #77e; 216 | } 217 | 218 | aConstraint > error { 219 | display: none; 220 | } 221 | 222 | aConstraint.withError > error { 223 | display: block; 224 | padding: 2pt; 225 | background: #fcf68b; 226 | color: #928f63; 227 | font-size: 12pt; 228 | } 229 | 230 | aConstraint > error label { 231 | font-weight: bold; 232 | } 233 | 234 | aConstraint > error description { 235 | color: maroon; 236 | font-weight: bold; 237 | } 238 | 239 | aConstraint > error light { 240 | opacity: 0.5; 241 | } 242 | 243 | aConstraint > error literal { 244 | white-space: nowrap; 245 | } 246 | 247 | aConstraint > error code { 248 | opacity: 1; 249 | color: maroon; 250 | font-family: Monaco, "Lucida Console", monospace; 251 | } 252 | 253 | aVar { 254 | float: left; 255 | background: #f8f8f8; 256 | border: #f5f5f5; 257 | } 258 | 259 | aVar.locked { 260 | background: #f0f0f0; 261 | color: #333; 262 | } 263 | 264 | aVar.locked > input { 265 | color: #333; 266 | } 267 | 268 | aVar > name { 269 | display: inline-block; 270 | white-space: nowrap; 271 | width: 75px; 272 | max-width: 75px; 273 | } 274 | 275 | aVar > input { 276 | text-align: right; 277 | width: 100px; 278 | } 279 | 280 | aVar.dirty > name, aVar.dirty > input, aConstraint.dirty > input { 281 | color: #c55; 282 | font-weight: bold; 283 | } 284 | 285 | aVar > lockButton { 286 | width: 12pt; 287 | height: 12pt; 288 | } 289 | 290 | aVar > lockButton::after { 291 | display: inline-block; 292 | content: url(images/noun_1560_cc.svg); 293 | width: 12pt; 294 | height: 12pt; 295 | } 296 | 297 | aVar.locked > lockButton::after { 298 | content: url(images/noun_1559_cc.svg); 299 | width: 12pt; 300 | height: 12pt; 301 | } 302 | 303 | aVar > barsButton { 304 | width: 12pt; 305 | height: 12pt; 306 | margin-right: 2pt; 307 | } 308 | 309 | aVar > barsButton::after { 310 | display: inline-block; 311 | content: url(images/noun_29229_cc.svg); 312 | width: 12pt; 313 | height: 12pt; 314 | } 315 | 316 | aConstraint > deleteButton, aVar > deleteButton { 317 | width: 14pt; 318 | height: 14pt; 319 | } 320 | 321 | aConstraint > deleteButton::after, aVar > deleteButton::after { 322 | display: inline-block; 323 | content: url(images/noun_33853_cc.svg); 324 | width: 14pt; 325 | height: 14pt; 326 | } 327 | 328 | aVar > lockButton, 329 | aVar > barsButton, 330 | aVar > deleteButton, 331 | aConstraint > deleteButton { 332 | opacity: .5; 333 | } 334 | 335 | aVar > lockButton:hover, 336 | aVar.hasBar > barsButton, 337 | aVar > deleteButton:hover, 338 | aConstraint > deleteButton:hover { 339 | opacity: .8; 340 | } 341 | 342 | app about { 343 | display: inline-block; 344 | max-width: 300px; 345 | float: left; 346 | cursor: default; 347 | } 348 | 349 | about::before { 350 | font-size: 10pt; 351 | color: #77e; 352 | content: '[about]'; 353 | } 354 | 355 | about contents { 356 | display: none; 357 | } 358 | 359 | about:hover::before { 360 | display: none; 361 | } 362 | 363 | about:hover contents { 364 | font-size: 10pt; 365 | display: block; 366 | background: #efe; 367 | padding: 4pt; 368 | border-radius: 4pt; 369 | box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, .2); 370 | } 371 | 372 | about contents main { 373 | display: block; 374 | margin-bottom: 2pt; 375 | } 376 | 377 | iconInfo { 378 | display: block; 379 | font-size: 8pt; 380 | color: #444; 381 | } 382 | 383 | about appName { 384 | font-weight: bold; 385 | color: #928f63; 386 | } 387 | 388 | about contents a { 389 | text-decoration: none; 390 | } 391 | 392 | addConstraintButton, deleteButton, lockButton, relaxButton { 393 | cursor: pointer; 394 | } 395 | 396 | icons { 397 | font-size: 8pt; 398 | } 399 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Constraint-Based Spreadsheet 5 | 6 | 7 | 8 | 9 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 |
71 | Constraint-Based Spreadsheet 72 | by 73 | Alex Warth 74 |
75 | 76 | Icon credits:
77 | 78 | "Plus" and 79 | "Cross" icons 80 | by Berkay Sargin, 81 | 82 | "Equalizer" 83 | by Stephan Langenegger, 84 | 85 | "Lock" and 86 | "Unlock" icons 87 | by Ugur Akdemir, 88 | 89 | "Warning" icon 90 | by Stefan Parnarov, 91 | 92 | "Relax" icon 93 | by Claire Jones, 94 | 95 | "Guru" icon 96 | by Icons8, 97 | 98 | "Stress" icon 99 | by Aenne Brielmann 100 | 101 | from the Noun Project. 102 |
103 |
104 |
105 | = 106 |
107 |
108 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /lib/jquery-2.1.3.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ 2 | !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=a.document,m="2.1.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,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=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.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},n.extend=n.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||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},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=s(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(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;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=s(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&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","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}"+L+"?|("+L+")|.)","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)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(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||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(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 H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==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+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(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 pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&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="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(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 p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),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))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),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===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(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?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.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 gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.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},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.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=gb.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=gb.selectors={cacheLength:50,createPseudo:ib,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]||gb.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]&&gb.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("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.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.replace(Q," ")+" ").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()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(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),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.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:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(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 tb(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 ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(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 wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(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?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(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 wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(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]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.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)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(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&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.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?n.extend(a,d):d}},e={};return d.pipe=d.then,n.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&&n.isFunction(a.promise)?e:0,g=1===f?a:n.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]&&n.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;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(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};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c) 3 | },removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.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.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.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 L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!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(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=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=jb(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=jb(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?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(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,n.cleanData(ob(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,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("