##// END OF EJS Templates
front dashboard: turn into component
ergo -
Show More
This diff has been collapsed as it changes many lines, (6879 lines changed) Show them Hide them
@@ -1,13147 +1,13148 b''
1 1 // Underscore.js 1.6.0
2 2 // http://underscorejs.org
3 3 // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
4 4 // Underscore may be freely distributed under the MIT license.
5 5
6 6 (function() {
7 7
8 8 // Baseline setup
9 9 // --------------
10 10
11 11 // Establish the root object, `window` in the browser, or `exports` on the server.
12 12 var root = this;
13 13
14 14 // Save the previous value of the `_` variable.
15 15 var previousUnderscore = root._;
16 16
17 17 // Establish the object that gets returned to break out of a loop iteration.
18 18 var breaker = {};
19 19
20 20 // Save bytes in the minified (but not gzipped) version:
21 21 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
22 22
23 23 // Create quick reference variables for speed access to core prototypes.
24 24 var
25 25 push = ArrayProto.push,
26 26 slice = ArrayProto.slice,
27 27 concat = ArrayProto.concat,
28 28 toString = ObjProto.toString,
29 29 hasOwnProperty = ObjProto.hasOwnProperty;
30 30
31 31 // All **ECMAScript 5** native function implementations that we hope to use
32 32 // are declared here.
33 33 var
34 34 nativeForEach = ArrayProto.forEach,
35 35 nativeMap = ArrayProto.map,
36 36 nativeReduce = ArrayProto.reduce,
37 37 nativeReduceRight = ArrayProto.reduceRight,
38 38 nativeFilter = ArrayProto.filter,
39 39 nativeEvery = ArrayProto.every,
40 40 nativeSome = ArrayProto.some,
41 41 nativeIndexOf = ArrayProto.indexOf,
42 42 nativeLastIndexOf = ArrayProto.lastIndexOf,
43 43 nativeIsArray = Array.isArray,
44 44 nativeKeys = Object.keys,
45 45 nativeBind = FuncProto.bind;
46 46
47 47 // Create a safe reference to the Underscore object for use below.
48 48 var _ = function(obj) {
49 49 if (obj instanceof _) return obj;
50 50 if (!(this instanceof _)) return new _(obj);
51 51 this._wrapped = obj;
52 52 };
53 53
54 54 // Export the Underscore object for **Node.js**, with
55 55 // backwards-compatibility for the old `require()` API. If we're in
56 56 // the browser, add `_` as a global object via a string identifier,
57 57 // for Closure Compiler "advanced" mode.
58 58 if (typeof exports !== 'undefined') {
59 59 if (typeof module !== 'undefined' && module.exports) {
60 60 exports = module.exports = _;
61 61 }
62 62 exports._ = _;
63 63 } else {
64 64 root._ = _;
65 65 }
66 66
67 67 // Current version.
68 68 _.VERSION = '1.6.0';
69 69
70 70 // Collection Functions
71 71 // --------------------
72 72
73 73 // The cornerstone, an `each` implementation, aka `forEach`.
74 74 // Handles objects with the built-in `forEach`, arrays, and raw objects.
75 75 // Delegates to **ECMAScript 5**'s native `forEach` if available.
76 76 var each = _.each = _.forEach = function(obj, iterator, context) {
77 77 if (obj == null) return obj;
78 78 if (nativeForEach && obj.forEach === nativeForEach) {
79 79 obj.forEach(iterator, context);
80 80 } else if (obj.length === +obj.length) {
81 81 for (var i = 0, length = obj.length; i < length; i++) {
82 82 if (iterator.call(context, obj[i], i, obj) === breaker) return;
83 83 }
84 84 } else {
85 85 var keys = _.keys(obj);
86 86 for (var i = 0, length = keys.length; i < length; i++) {
87 87 if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
88 88 }
89 89 }
90 90 return obj;
91 91 };
92 92
93 93 // Return the results of applying the iterator to each element.
94 94 // Delegates to **ECMAScript 5**'s native `map` if available.
95 95 _.map = _.collect = function(obj, iterator, context) {
96 96 var results = [];
97 97 if (obj == null) return results;
98 98 if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
99 99 each(obj, function(value, index, list) {
100 100 results.push(iterator.call(context, value, index, list));
101 101 });
102 102 return results;
103 103 };
104 104
105 105 var reduceError = 'Reduce of empty array with no initial value';
106 106
107 107 // **Reduce** builds up a single result from a list of values, aka `inject`,
108 108 // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
109 109 _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
110 110 var initial = arguments.length > 2;
111 111 if (obj == null) obj = [];
112 112 if (nativeReduce && obj.reduce === nativeReduce) {
113 113 if (context) iterator = _.bind(iterator, context);
114 114 return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
115 115 }
116 116 each(obj, function(value, index, list) {
117 117 if (!initial) {
118 118 memo = value;
119 119 initial = true;
120 120 } else {
121 121 memo = iterator.call(context, memo, value, index, list);
122 122 }
123 123 });
124 124 if (!initial) throw new TypeError(reduceError);
125 125 return memo;
126 126 };
127 127
128 128 // The right-associative version of reduce, also known as `foldr`.
129 129 // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
130 130 _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
131 131 var initial = arguments.length > 2;
132 132 if (obj == null) obj = [];
133 133 if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
134 134 if (context) iterator = _.bind(iterator, context);
135 135 return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
136 136 }
137 137 var length = obj.length;
138 138 if (length !== +length) {
139 139 var keys = _.keys(obj);
140 140 length = keys.length;
141 141 }
142 142 each(obj, function(value, index, list) {
143 143 index = keys ? keys[--length] : --length;
144 144 if (!initial) {
145 145 memo = obj[index];
146 146 initial = true;
147 147 } else {
148 148 memo = iterator.call(context, memo, obj[index], index, list);
149 149 }
150 150 });
151 151 if (!initial) throw new TypeError(reduceError);
152 152 return memo;
153 153 };
154 154
155 155 // Return the first value which passes a truth test. Aliased as `detect`.
156 156 _.find = _.detect = function(obj, predicate, context) {
157 157 var result;
158 158 any(obj, function(value, index, list) {
159 159 if (predicate.call(context, value, index, list)) {
160 160 result = value;
161 161 return true;
162 162 }
163 163 });
164 164 return result;
165 165 };
166 166
167 167 // Return all the elements that pass a truth test.
168 168 // Delegates to **ECMAScript 5**'s native `filter` if available.
169 169 // Aliased as `select`.
170 170 _.filter = _.select = function(obj, predicate, context) {
171 171 var results = [];
172 172 if (obj == null) return results;
173 173 if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
174 174 each(obj, function(value, index, list) {
175 175 if (predicate.call(context, value, index, list)) results.push(value);
176 176 });
177 177 return results;
178 178 };
179 179
180 180 // Return all the elements for which a truth test fails.
181 181 _.reject = function(obj, predicate, context) {
182 182 return _.filter(obj, function(value, index, list) {
183 183 return !predicate.call(context, value, index, list);
184 184 }, context);
185 185 };
186 186
187 187 // Determine whether all of the elements match a truth test.
188 188 // Delegates to **ECMAScript 5**'s native `every` if available.
189 189 // Aliased as `all`.
190 190 _.every = _.all = function(obj, predicate, context) {
191 191 predicate || (predicate = _.identity);
192 192 var result = true;
193 193 if (obj == null) return result;
194 194 if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);
195 195 each(obj, function(value, index, list) {
196 196 if (!(result = result && predicate.call(context, value, index, list))) return breaker;
197 197 });
198 198 return !!result;
199 199 };
200 200
201 201 // Determine if at least one element in the object matches a truth test.
202 202 // Delegates to **ECMAScript 5**'s native `some` if available.
203 203 // Aliased as `any`.
204 204 var any = _.some = _.any = function(obj, predicate, context) {
205 205 predicate || (predicate = _.identity);
206 206 var result = false;
207 207 if (obj == null) return result;
208 208 if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
209 209 each(obj, function(value, index, list) {
210 210 if (result || (result = predicate.call(context, value, index, list))) return breaker;
211 211 });
212 212 return !!result;
213 213 };
214 214
215 215 // Determine if the array or object contains a given value (using `===`).
216 216 // Aliased as `include`.
217 217 _.contains = _.include = function(obj, target) {
218 218 if (obj == null) return false;
219 219 if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
220 220 return any(obj, function(value) {
221 221 return value === target;
222 222 });
223 223 };
224 224
225 225 // Invoke a method (with arguments) on every item in a collection.
226 226 _.invoke = function(obj, method) {
227 227 var args = slice.call(arguments, 2);
228 228 var isFunc = _.isFunction(method);
229 229 return _.map(obj, function(value) {
230 230 return (isFunc ? method : value[method]).apply(value, args);
231 231 });
232 232 };
233 233
234 234 // Convenience version of a common use case of `map`: fetching a property.
235 235 _.pluck = function(obj, key) {
236 236 return _.map(obj, _.property(key));
237 237 };
238 238
239 239 // Convenience version of a common use case of `filter`: selecting only objects
240 240 // containing specific `key:value` pairs.
241 241 _.where = function(obj, attrs) {
242 242 return _.filter(obj, _.matches(attrs));
243 243 };
244 244
245 245 // Convenience version of a common use case of `find`: getting the first object
246 246 // containing specific `key:value` pairs.
247 247 _.findWhere = function(obj, attrs) {
248 248 return _.find(obj, _.matches(attrs));
249 249 };
250 250
251 251 // Return the maximum element or (element-based computation).
252 252 // Can't optimize arrays of integers longer than 65,535 elements.
253 253 // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
254 254 _.max = function(obj, iterator, context) {
255 255 if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
256 256 return Math.max.apply(Math, obj);
257 257 }
258 258 var result = -Infinity, lastComputed = -Infinity;
259 259 each(obj, function(value, index, list) {
260 260 var computed = iterator ? iterator.call(context, value, index, list) : value;
261 261 if (computed > lastComputed) {
262 262 result = value;
263 263 lastComputed = computed;
264 264 }
265 265 });
266 266 return result;
267 267 };
268 268
269 269 // Return the minimum element (or element-based computation).
270 270 _.min = function(obj, iterator, context) {
271 271 if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
272 272 return Math.min.apply(Math, obj);
273 273 }
274 274 var result = Infinity, lastComputed = Infinity;
275 275 each(obj, function(value, index, list) {
276 276 var computed = iterator ? iterator.call(context, value, index, list) : value;
277 277 if (computed < lastComputed) {
278 278 result = value;
279 279 lastComputed = computed;
280 280 }
281 281 });
282 282 return result;
283 283 };
284 284
285 285 // Shuffle an array, using the modern version of the
286 286 // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
287 287 _.shuffle = function(obj) {
288 288 var rand;
289 289 var index = 0;
290 290 var shuffled = [];
291 291 each(obj, function(value) {
292 292 rand = _.random(index++);
293 293 shuffled[index - 1] = shuffled[rand];
294 294 shuffled[rand] = value;
295 295 });
296 296 return shuffled;
297 297 };
298 298
299 299 // Sample **n** random values from a collection.
300 300 // If **n** is not specified, returns a single random element.
301 301 // The internal `guard` argument allows it to work with `map`.
302 302 _.sample = function(obj, n, guard) {
303 303 if (n == null || guard) {
304 304 if (obj.length !== +obj.length) obj = _.values(obj);
305 305 return obj[_.random(obj.length - 1)];
306 306 }
307 307 return _.shuffle(obj).slice(0, Math.max(0, n));
308 308 };
309 309
310 310 // An internal function to generate lookup iterators.
311 311 var lookupIterator = function(value) {
312 312 if (value == null) return _.identity;
313 313 if (_.isFunction(value)) return value;
314 314 return _.property(value);
315 315 };
316 316
317 317 // Sort the object's values by a criterion produced by an iterator.
318 318 _.sortBy = function(obj, iterator, context) {
319 319 iterator = lookupIterator(iterator);
320 320 return _.pluck(_.map(obj, function(value, index, list) {
321 321 return {
322 322 value: value,
323 323 index: index,
324 324 criteria: iterator.call(context, value, index, list)
325 325 };
326 326 }).sort(function(left, right) {
327 327 var a = left.criteria;
328 328 var b = right.criteria;
329 329 if (a !== b) {
330 330 if (a > b || a === void 0) return 1;
331 331 if (a < b || b === void 0) return -1;
332 332 }
333 333 return left.index - right.index;
334 334 }), 'value');
335 335 };
336 336
337 337 // An internal function used for aggregate "group by" operations.
338 338 var group = function(behavior) {
339 339 return function(obj, iterator, context) {
340 340 var result = {};
341 341 iterator = lookupIterator(iterator);
342 342 each(obj, function(value, index) {
343 343 var key = iterator.call(context, value, index, obj);
344 344 behavior(result, key, value);
345 345 });
346 346 return result;
347 347 };
348 348 };
349 349
350 350 // Groups the object's values by a criterion. Pass either a string attribute
351 351 // to group by, or a function that returns the criterion.
352 352 _.groupBy = group(function(result, key, value) {
353 353 _.has(result, key) ? result[key].push(value) : result[key] = [value];
354 354 });
355 355
356 356 // Indexes the object's values by a criterion, similar to `groupBy`, but for
357 357 // when you know that your index values will be unique.
358 358 _.indexBy = group(function(result, key, value) {
359 359 result[key] = value;
360 360 });
361 361
362 362 // Counts instances of an object that group by a certain criterion. Pass
363 363 // either a string attribute to count by, or a function that returns the
364 364 // criterion.
365 365 _.countBy = group(function(result, key) {
366 366 _.has(result, key) ? result[key]++ : result[key] = 1;
367 367 });
368 368
369 369 // Use a comparator function to figure out the smallest index at which
370 370 // an object should be inserted so as to maintain order. Uses binary search.
371 371 _.sortedIndex = function(array, obj, iterator, context) {
372 372 iterator = lookupIterator(iterator);
373 373 var value = iterator.call(context, obj);
374 374 var low = 0, high = array.length;
375 375 while (low < high) {
376 376 var mid = (low + high) >>> 1;
377 377 iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
378 378 }
379 379 return low;
380 380 };
381 381
382 382 // Safely create a real, live array from anything iterable.
383 383 _.toArray = function(obj) {
384 384 if (!obj) return [];
385 385 if (_.isArray(obj)) return slice.call(obj);
386 386 if (obj.length === +obj.length) return _.map(obj, _.identity);
387 387 return _.values(obj);
388 388 };
389 389
390 390 // Return the number of elements in an object.
391 391 _.size = function(obj) {
392 392 if (obj == null) return 0;
393 393 return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
394 394 };
395 395
396 396 // Array Functions
397 397 // ---------------
398 398
399 399 // Get the first element of an array. Passing **n** will return the first N
400 400 // values in the array. Aliased as `head` and `take`. The **guard** check
401 401 // allows it to work with `_.map`.
402 402 _.first = _.head = _.take = function(array, n, guard) {
403 403 if (array == null) return void 0;
404 404 if ((n == null) || guard) return array[0];
405 405 if (n < 0) return [];
406 406 return slice.call(array, 0, n);
407 407 };
408 408
409 409 // Returns everything but the last entry of the array. Especially useful on
410 410 // the arguments object. Passing **n** will return all the values in
411 411 // the array, excluding the last N. The **guard** check allows it to work with
412 412 // `_.map`.
413 413 _.initial = function(array, n, guard) {
414 414 return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
415 415 };
416 416
417 417 // Get the last element of an array. Passing **n** will return the last N
418 418 // values in the array. The **guard** check allows it to work with `_.map`.
419 419 _.last = function(array, n, guard) {
420 420 if (array == null) return void 0;
421 421 if ((n == null) || guard) return array[array.length - 1];
422 422 return slice.call(array, Math.max(array.length - n, 0));
423 423 };
424 424
425 425 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
426 426 // Especially useful on the arguments object. Passing an **n** will return
427 427 // the rest N values in the array. The **guard**
428 428 // check allows it to work with `_.map`.
429 429 _.rest = _.tail = _.drop = function(array, n, guard) {
430 430 return slice.call(array, (n == null) || guard ? 1 : n);
431 431 };
432 432
433 433 // Trim out all falsy values from an array.
434 434 _.compact = function(array) {
435 435 return _.filter(array, _.identity);
436 436 };
437 437
438 438 // Internal implementation of a recursive `flatten` function.
439 439 var flatten = function(input, shallow, output) {
440 440 if (shallow && _.every(input, _.isArray)) {
441 441 return concat.apply(output, input);
442 442 }
443 443 each(input, function(value) {
444 444 if (_.isArray(value) || _.isArguments(value)) {
445 445 shallow ? push.apply(output, value) : flatten(value, shallow, output);
446 446 } else {
447 447 output.push(value);
448 448 }
449 449 });
450 450 return output;
451 451 };
452 452
453 453 // Flatten out an array, either recursively (by default), or just one level.
454 454 _.flatten = function(array, shallow) {
455 455 return flatten(array, shallow, []);
456 456 };
457 457
458 458 // Return a version of the array that does not contain the specified value(s).
459 459 _.without = function(array) {
460 460 return _.difference(array, slice.call(arguments, 1));
461 461 };
462 462
463 463 // Split an array into two arrays: one whose elements all satisfy the given
464 464 // predicate, and one whose elements all do not satisfy the predicate.
465 465 _.partition = function(array, predicate) {
466 466 var pass = [], fail = [];
467 467 each(array, function(elem) {
468 468 (predicate(elem) ? pass : fail).push(elem);
469 469 });
470 470 return [pass, fail];
471 471 };
472 472
473 473 // Produce a duplicate-free version of the array. If the array has already
474 474 // been sorted, you have the option of using a faster algorithm.
475 475 // Aliased as `unique`.
476 476 _.uniq = _.unique = function(array, isSorted, iterator, context) {
477 477 if (_.isFunction(isSorted)) {
478 478 context = iterator;
479 479 iterator = isSorted;
480 480 isSorted = false;
481 481 }
482 482 var initial = iterator ? _.map(array, iterator, context) : array;
483 483 var results = [];
484 484 var seen = [];
485 485 each(initial, function(value, index) {
486 486 if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
487 487 seen.push(value);
488 488 results.push(array[index]);
489 489 }
490 490 });
491 491 return results;
492 492 };
493 493
494 494 // Produce an array that contains the union: each distinct element from all of
495 495 // the passed-in arrays.
496 496 _.union = function() {
497 497 return _.uniq(_.flatten(arguments, true));
498 498 };
499 499
500 500 // Produce an array that contains every item shared between all the
501 501 // passed-in arrays.
502 502 _.intersection = function(array) {
503 503 var rest = slice.call(arguments, 1);
504 504 return _.filter(_.uniq(array), function(item) {
505 505 return _.every(rest, function(other) {
506 506 return _.contains(other, item);
507 507 });
508 508 });
509 509 };
510 510
511 511 // Take the difference between one array and a number of other arrays.
512 512 // Only the elements present in just the first array will remain.
513 513 _.difference = function(array) {
514 514 var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
515 515 return _.filter(array, function(value){ return !_.contains(rest, value); });
516 516 };
517 517
518 518 // Zip together multiple lists into a single array -- elements that share
519 519 // an index go together.
520 520 _.zip = function() {
521 521 var length = _.max(_.pluck(arguments, 'length').concat(0));
522 522 var results = new Array(length);
523 523 for (var i = 0; i < length; i++) {
524 524 results[i] = _.pluck(arguments, '' + i);
525 525 }
526 526 return results;
527 527 };
528 528
529 529 // Converts lists into objects. Pass either a single array of `[key, value]`
530 530 // pairs, or two parallel arrays of the same length -- one of keys, and one of
531 531 // the corresponding values.
532 532 _.object = function(list, values) {
533 533 if (list == null) return {};
534 534 var result = {};
535 535 for (var i = 0, length = list.length; i < length; i++) {
536 536 if (values) {
537 537 result[list[i]] = values[i];
538 538 } else {
539 539 result[list[i][0]] = list[i][1];
540 540 }
541 541 }
542 542 return result;
543 543 };
544 544
545 545 // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
546 546 // we need this function. Return the position of the first occurrence of an
547 547 // item in an array, or -1 if the item is not included in the array.
548 548 // Delegates to **ECMAScript 5**'s native `indexOf` if available.
549 549 // If the array is large and already in sort order, pass `true`
550 550 // for **isSorted** to use binary search.
551 551 _.indexOf = function(array, item, isSorted) {
552 552 if (array == null) return -1;
553 553 var i = 0, length = array.length;
554 554 if (isSorted) {
555 555 if (typeof isSorted == 'number') {
556 556 i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
557 557 } else {
558 558 i = _.sortedIndex(array, item);
559 559 return array[i] === item ? i : -1;
560 560 }
561 561 }
562 562 if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
563 563 for (; i < length; i++) if (array[i] === item) return i;
564 564 return -1;
565 565 };
566 566
567 567 // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
568 568 _.lastIndexOf = function(array, item, from) {
569 569 if (array == null) return -1;
570 570 var hasIndex = from != null;
571 571 if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
572 572 return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
573 573 }
574 574 var i = (hasIndex ? from : array.length);
575 575 while (i--) if (array[i] === item) return i;
576 576 return -1;
577 577 };
578 578
579 579 // Generate an integer Array containing an arithmetic progression. A port of
580 580 // the native Python `range()` function. See
581 581 // [the Python documentation](http://docs.python.org/library/functions.html#range).
582 582 _.range = function(start, stop, step) {
583 583 if (arguments.length <= 1) {
584 584 stop = start || 0;
585 585 start = 0;
586 586 }
587 587 step = arguments[2] || 1;
588 588
589 589 var length = Math.max(Math.ceil((stop - start) / step), 0);
590 590 var idx = 0;
591 591 var range = new Array(length);
592 592
593 593 while(idx < length) {
594 594 range[idx++] = start;
595 595 start += step;
596 596 }
597 597
598 598 return range;
599 599 };
600 600
601 601 // Function (ahem) Functions
602 602 // ------------------
603 603
604 604 // Reusable constructor function for prototype setting.
605 605 var ctor = function(){};
606 606
607 607 // Create a function bound to a given object (assigning `this`, and arguments,
608 608 // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
609 609 // available.
610 610 _.bind = function(func, context) {
611 611 var args, bound;
612 612 if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
613 613 if (!_.isFunction(func)) throw new TypeError;
614 614 args = slice.call(arguments, 2);
615 615 return bound = function() {
616 616 if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
617 617 ctor.prototype = func.prototype;
618 618 var self = new ctor;
619 619 ctor.prototype = null;
620 620 var result = func.apply(self, args.concat(slice.call(arguments)));
621 621 if (Object(result) === result) return result;
622 622 return self;
623 623 };
624 624 };
625 625
626 626 // Partially apply a function by creating a version that has had some of its
627 627 // arguments pre-filled, without changing its dynamic `this` context. _ acts
628 628 // as a placeholder, allowing any combination of arguments to be pre-filled.
629 629 _.partial = function(func) {
630 630 var boundArgs = slice.call(arguments, 1);
631 631 return function() {
632 632 var position = 0;
633 633 var args = boundArgs.slice();
634 634 for (var i = 0, length = args.length; i < length; i++) {
635 635 if (args[i] === _) args[i] = arguments[position++];
636 636 }
637 637 while (position < arguments.length) args.push(arguments[position++]);
638 638 return func.apply(this, args);
639 639 };
640 640 };
641 641
642 642 // Bind a number of an object's methods to that object. Remaining arguments
643 643 // are the method names to be bound. Useful for ensuring that all callbacks
644 644 // defined on an object belong to it.
645 645 _.bindAll = function(obj) {
646 646 var funcs = slice.call(arguments, 1);
647 647 if (funcs.length === 0) throw new Error('bindAll must be passed function names');
648 648 each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
649 649 return obj;
650 650 };
651 651
652 652 // Memoize an expensive function by storing its results.
653 653 _.memoize = function(func, hasher) {
654 654 var memo = {};
655 655 hasher || (hasher = _.identity);
656 656 return function() {
657 657 var key = hasher.apply(this, arguments);
658 658 return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
659 659 };
660 660 };
661 661
662 662 // Delays a function for the given number of milliseconds, and then calls
663 663 // it with the arguments supplied.
664 664 _.delay = function(func, wait) {
665 665 var args = slice.call(arguments, 2);
666 666 return setTimeout(function(){ return func.apply(null, args); }, wait);
667 667 };
668 668
669 669 // Defers a function, scheduling it to run after the current call stack has
670 670 // cleared.
671 671 _.defer = function(func) {
672 672 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
673 673 };
674 674
675 675 // Returns a function, that, when invoked, will only be triggered at most once
676 676 // during a given window of time. Normally, the throttled function will run
677 677 // as much as it can, without ever going more than once per `wait` duration;
678 678 // but if you'd like to disable the execution on the leading edge, pass
679 679 // `{leading: false}`. To disable execution on the trailing edge, ditto.
680 680 _.throttle = function(func, wait, options) {
681 681 var context, args, result;
682 682 var timeout = null;
683 683 var previous = 0;
684 684 options || (options = {});
685 685 var later = function() {
686 686 previous = options.leading === false ? 0 : _.now();
687 687 timeout = null;
688 688 result = func.apply(context, args);
689 689 context = args = null;
690 690 };
691 691 return function() {
692 692 var now = _.now();
693 693 if (!previous && options.leading === false) previous = now;
694 694 var remaining = wait - (now - previous);
695 695 context = this;
696 696 args = arguments;
697 697 if (remaining <= 0) {
698 698 clearTimeout(timeout);
699 699 timeout = null;
700 700 previous = now;
701 701 result = func.apply(context, args);
702 702 context = args = null;
703 703 } else if (!timeout && options.trailing !== false) {
704 704 timeout = setTimeout(later, remaining);
705 705 }
706 706 return result;
707 707 };
708 708 };
709 709
710 710 // Returns a function, that, as long as it continues to be invoked, will not
711 711 // be triggered. The function will be called after it stops being called for
712 712 // N milliseconds. If `immediate` is passed, trigger the function on the
713 713 // leading edge, instead of the trailing.
714 714 _.debounce = function(func, wait, immediate) {
715 715 var timeout, args, context, timestamp, result;
716 716
717 717 var later = function() {
718 718 var last = _.now() - timestamp;
719 719 if (last < wait) {
720 720 timeout = setTimeout(later, wait - last);
721 721 } else {
722 722 timeout = null;
723 723 if (!immediate) {
724 724 result = func.apply(context, args);
725 725 context = args = null;
726 726 }
727 727 }
728 728 };
729 729
730 730 return function() {
731 731 context = this;
732 732 args = arguments;
733 733 timestamp = _.now();
734 734 var callNow = immediate && !timeout;
735 735 if (!timeout) {
736 736 timeout = setTimeout(later, wait);
737 737 }
738 738 if (callNow) {
739 739 result = func.apply(context, args);
740 740 context = args = null;
741 741 }
742 742
743 743 return result;
744 744 };
745 745 };
746 746
747 747 // Returns a function that will be executed at most one time, no matter how
748 748 // often you call it. Useful for lazy initialization.
749 749 _.once = function(func) {
750 750 var ran = false, memo;
751 751 return function() {
752 752 if (ran) return memo;
753 753 ran = true;
754 754 memo = func.apply(this, arguments);
755 755 func = null;
756 756 return memo;
757 757 };
758 758 };
759 759
760 760 // Returns the first function passed as an argument to the second,
761 761 // allowing you to adjust arguments, run code before and after, and
762 762 // conditionally execute the original function.
763 763 _.wrap = function(func, wrapper) {
764 764 return _.partial(wrapper, func);
765 765 };
766 766
767 767 // Returns a function that is the composition of a list of functions, each
768 768 // consuming the return value of the function that follows.
769 769 _.compose = function() {
770 770 var funcs = arguments;
771 771 return function() {
772 772 var args = arguments;
773 773 for (var i = funcs.length - 1; i >= 0; i--) {
774 774 args = [funcs[i].apply(this, args)];
775 775 }
776 776 return args[0];
777 777 };
778 778 };
779 779
780 780 // Returns a function that will only be executed after being called N times.
781 781 _.after = function(times, func) {
782 782 return function() {
783 783 if (--times < 1) {
784 784 return func.apply(this, arguments);
785 785 }
786 786 };
787 787 };
788 788
789 789 // Object Functions
790 790 // ----------------
791 791
792 792 // Retrieve the names of an object's properties.
793 793 // Delegates to **ECMAScript 5**'s native `Object.keys`
794 794 _.keys = function(obj) {
795 795 if (!_.isObject(obj)) return [];
796 796 if (nativeKeys) return nativeKeys(obj);
797 797 var keys = [];
798 798 for (var key in obj) if (_.has(obj, key)) keys.push(key);
799 799 return keys;
800 800 };
801 801
802 802 // Retrieve the values of an object's properties.
803 803 _.values = function(obj) {
804 804 var keys = _.keys(obj);
805 805 var length = keys.length;
806 806 var values = new Array(length);
807 807 for (var i = 0; i < length; i++) {
808 808 values[i] = obj[keys[i]];
809 809 }
810 810 return values;
811 811 };
812 812
813 813 // Convert an object into a list of `[key, value]` pairs.
814 814 _.pairs = function(obj) {
815 815 var keys = _.keys(obj);
816 816 var length = keys.length;
817 817 var pairs = new Array(length);
818 818 for (var i = 0; i < length; i++) {
819 819 pairs[i] = [keys[i], obj[keys[i]]];
820 820 }
821 821 return pairs;
822 822 };
823 823
824 824 // Invert the keys and values of an object. The values must be serializable.
825 825 _.invert = function(obj) {
826 826 var result = {};
827 827 var keys = _.keys(obj);
828 828 for (var i = 0, length = keys.length; i < length; i++) {
829 829 result[obj[keys[i]]] = keys[i];
830 830 }
831 831 return result;
832 832 };
833 833
834 834 // Return a sorted list of the function names available on the object.
835 835 // Aliased as `methods`
836 836 _.functions = _.methods = function(obj) {
837 837 var names = [];
838 838 for (var key in obj) {
839 839 if (_.isFunction(obj[key])) names.push(key);
840 840 }
841 841 return names.sort();
842 842 };
843 843
844 844 // Extend a given object with all the properties in passed-in object(s).
845 845 _.extend = function(obj) {
846 846 each(slice.call(arguments, 1), function(source) {
847 847 if (source) {
848 848 for (var prop in source) {
849 849 obj[prop] = source[prop];
850 850 }
851 851 }
852 852 });
853 853 return obj;
854 854 };
855 855
856 856 // Return a copy of the object only containing the whitelisted properties.
857 857 _.pick = function(obj) {
858 858 var copy = {};
859 859 var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
860 860 each(keys, function(key) {
861 861 if (key in obj) copy[key] = obj[key];
862 862 });
863 863 return copy;
864 864 };
865 865
866 866 // Return a copy of the object without the blacklisted properties.
867 867 _.omit = function(obj) {
868 868 var copy = {};
869 869 var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
870 870 for (var key in obj) {
871 871 if (!_.contains(keys, key)) copy[key] = obj[key];
872 872 }
873 873 return copy;
874 874 };
875 875
876 876 // Fill in a given object with default properties.
877 877 _.defaults = function(obj) {
878 878 each(slice.call(arguments, 1), function(source) {
879 879 if (source) {
880 880 for (var prop in source) {
881 881 if (obj[prop] === void 0) obj[prop] = source[prop];
882 882 }
883 883 }
884 884 });
885 885 return obj;
886 886 };
887 887
888 888 // Create a (shallow-cloned) duplicate of an object.
889 889 _.clone = function(obj) {
890 890 if (!_.isObject(obj)) return obj;
891 891 return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
892 892 };
893 893
894 894 // Invokes interceptor with the obj, and then returns obj.
895 895 // The primary purpose of this method is to "tap into" a method chain, in
896 896 // order to perform operations on intermediate results within the chain.
897 897 _.tap = function(obj, interceptor) {
898 898 interceptor(obj);
899 899 return obj;
900 900 };
901 901
902 902 // Internal recursive comparison function for `isEqual`.
903 903 var eq = function(a, b, aStack, bStack) {
904 904 // Identical objects are equal. `0 === -0`, but they aren't identical.
905 905 // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
906 906 if (a === b) return a !== 0 || 1 / a == 1 / b;
907 907 // A strict comparison is necessary because `null == undefined`.
908 908 if (a == null || b == null) return a === b;
909 909 // Unwrap any wrapped objects.
910 910 if (a instanceof _) a = a._wrapped;
911 911 if (b instanceof _) b = b._wrapped;
912 912 // Compare `[[Class]]` names.
913 913 var className = toString.call(a);
914 914 if (className != toString.call(b)) return false;
915 915 switch (className) {
916 916 // Strings, numbers, dates, and booleans are compared by value.
917 917 case '[object String]':
918 918 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
919 919 // equivalent to `new String("5")`.
920 920 return a == String(b);
921 921 case '[object Number]':
922 922 // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
923 923 // other numeric values.
924 924 return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
925 925 case '[object Date]':
926 926 case '[object Boolean]':
927 927 // Coerce dates and booleans to numeric primitive values. Dates are compared by their
928 928 // millisecond representations. Note that invalid dates with millisecond representations
929 929 // of `NaN` are not equivalent.
930 930 return +a == +b;
931 931 // RegExps are compared by their source patterns and flags.
932 932 case '[object RegExp]':
933 933 return a.source == b.source &&
934 934 a.global == b.global &&
935 935 a.multiline == b.multiline &&
936 936 a.ignoreCase == b.ignoreCase;
937 937 }
938 938 if (typeof a != 'object' || typeof b != 'object') return false;
939 939 // Assume equality for cyclic structures. The algorithm for detecting cyclic
940 940 // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
941 941 var length = aStack.length;
942 942 while (length--) {
943 943 // Linear search. Performance is inversely proportional to the number of
944 944 // unique nested structures.
945 945 if (aStack[length] == a) return bStack[length] == b;
946 946 }
947 947 // Objects with different constructors are not equivalent, but `Object`s
948 948 // from different frames are.
949 949 var aCtor = a.constructor, bCtor = b.constructor;
950 950 if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
951 951 _.isFunction(bCtor) && (bCtor instanceof bCtor))
952 952 && ('constructor' in a && 'constructor' in b)) {
953 953 return false;
954 954 }
955 955 // Add the first object to the stack of traversed objects.
956 956 aStack.push(a);
957 957 bStack.push(b);
958 958 var size = 0, result = true;
959 959 // Recursively compare objects and arrays.
960 960 if (className == '[object Array]') {
961 961 // Compare array lengths to determine if a deep comparison is necessary.
962 962 size = a.length;
963 963 result = size == b.length;
964 964 if (result) {
965 965 // Deep compare the contents, ignoring non-numeric properties.
966 966 while (size--) {
967 967 if (!(result = eq(a[size], b[size], aStack, bStack))) break;
968 968 }
969 969 }
970 970 } else {
971 971 // Deep compare objects.
972 972 for (var key in a) {
973 973 if (_.has(a, key)) {
974 974 // Count the expected number of properties.
975 975 size++;
976 976 // Deep compare each member.
977 977 if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
978 978 }
979 979 }
980 980 // Ensure that both objects contain the same number of properties.
981 981 if (result) {
982 982 for (key in b) {
983 983 if (_.has(b, key) && !(size--)) break;
984 984 }
985 985 result = !size;
986 986 }
987 987 }
988 988 // Remove the first object from the stack of traversed objects.
989 989 aStack.pop();
990 990 bStack.pop();
991 991 return result;
992 992 };
993 993
994 994 // Perform a deep comparison to check if two objects are equal.
995 995 _.isEqual = function(a, b) {
996 996 return eq(a, b, [], []);
997 997 };
998 998
999 999 // Is a given array, string, or object empty?
1000 1000 // An "empty" object has no enumerable own-properties.
1001 1001 _.isEmpty = function(obj) {
1002 1002 if (obj == null) return true;
1003 1003 if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
1004 1004 for (var key in obj) if (_.has(obj, key)) return false;
1005 1005 return true;
1006 1006 };
1007 1007
1008 1008 // Is a given value a DOM element?
1009 1009 _.isElement = function(obj) {
1010 1010 return !!(obj && obj.nodeType === 1);
1011 1011 };
1012 1012
1013 1013 // Is a given value an array?
1014 1014 // Delegates to ECMA5's native Array.isArray
1015 1015 _.isArray = nativeIsArray || function(obj) {
1016 1016 return toString.call(obj) == '[object Array]';
1017 1017 };
1018 1018
1019 1019 // Is a given variable an object?
1020 1020 _.isObject = function(obj) {
1021 1021 return obj === Object(obj);
1022 1022 };
1023 1023
1024 1024 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
1025 1025 each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
1026 1026 _['is' + name] = function(obj) {
1027 1027 return toString.call(obj) == '[object ' + name + ']';
1028 1028 };
1029 1029 });
1030 1030
1031 1031 // Define a fallback version of the method in browsers (ahem, IE), where
1032 1032 // there isn't any inspectable "Arguments" type.
1033 1033 if (!_.isArguments(arguments)) {
1034 1034 _.isArguments = function(obj) {
1035 1035 return !!(obj && _.has(obj, 'callee'));
1036 1036 };
1037 1037 }
1038 1038
1039 1039 // Optimize `isFunction` if appropriate.
1040 1040 if (typeof (/./) !== 'function') {
1041 1041 _.isFunction = function(obj) {
1042 1042 return typeof obj === 'function';
1043 1043 };
1044 1044 }
1045 1045
1046 1046 // Is a given object a finite number?
1047 1047 _.isFinite = function(obj) {
1048 1048 return isFinite(obj) && !isNaN(parseFloat(obj));
1049 1049 };
1050 1050
1051 1051 // Is the given value `NaN`? (NaN is the only number which does not equal itself).
1052 1052 _.isNaN = function(obj) {
1053 1053 return _.isNumber(obj) && obj != +obj;
1054 1054 };
1055 1055
1056 1056 // Is a given value a boolean?
1057 1057 _.isBoolean = function(obj) {
1058 1058 return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
1059 1059 };
1060 1060
1061 1061 // Is a given value equal to null?
1062 1062 _.isNull = function(obj) {
1063 1063 return obj === null;
1064 1064 };
1065 1065
1066 1066 // Is a given variable undefined?
1067 1067 _.isUndefined = function(obj) {
1068 1068 return obj === void 0;
1069 1069 };
1070 1070
1071 1071 // Shortcut function for checking if an object has a given property directly
1072 1072 // on itself (in other words, not on a prototype).
1073 1073 _.has = function(obj, key) {
1074 1074 return hasOwnProperty.call(obj, key);
1075 1075 };
1076 1076
1077 1077 // Utility Functions
1078 1078 // -----------------
1079 1079
1080 1080 // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
1081 1081 // previous owner. Returns a reference to the Underscore object.
1082 1082 _.noConflict = function() {
1083 1083 root._ = previousUnderscore;
1084 1084 return this;
1085 1085 };
1086 1086
1087 1087 // Keep the identity function around for default iterators.
1088 1088 _.identity = function(value) {
1089 1089 return value;
1090 1090 };
1091 1091
1092 1092 _.constant = function(value) {
1093 1093 return function () {
1094 1094 return value;
1095 1095 };
1096 1096 };
1097 1097
1098 1098 _.property = function(key) {
1099 1099 return function(obj) {
1100 1100 return obj[key];
1101 1101 };
1102 1102 };
1103 1103
1104 1104 // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
1105 1105 _.matches = function(attrs) {
1106 1106 return function(obj) {
1107 1107 if (obj === attrs) return true; //avoid comparing an object to itself.
1108 1108 for (var key in attrs) {
1109 1109 if (attrs[key] !== obj[key])
1110 1110 return false;
1111 1111 }
1112 1112 return true;
1113 1113 }
1114 1114 };
1115 1115
1116 1116 // Run a function **n** times.
1117 1117 _.times = function(n, iterator, context) {
1118 1118 var accum = Array(Math.max(0, n));
1119 1119 for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
1120 1120 return accum;
1121 1121 };
1122 1122
1123 1123 // Return a random integer between min and max (inclusive).
1124 1124 _.random = function(min, max) {
1125 1125 if (max == null) {
1126 1126 max = min;
1127 1127 min = 0;
1128 1128 }
1129 1129 return min + Math.floor(Math.random() * (max - min + 1));
1130 1130 };
1131 1131
1132 1132 // A (possibly faster) way to get the current timestamp as an integer.
1133 1133 _.now = Date.now || function() { return new Date().getTime(); };
1134 1134
1135 1135 // List of HTML entities for escaping.
1136 1136 var entityMap = {
1137 1137 escape: {
1138 1138 '&': '&amp;',
1139 1139 '<': '&lt;',
1140 1140 '>': '&gt;',
1141 1141 '"': '&quot;',
1142 1142 "'": '&#x27;'
1143 1143 }
1144 1144 };
1145 1145 entityMap.unescape = _.invert(entityMap.escape);
1146 1146
1147 1147 // Regexes containing the keys and values listed immediately above.
1148 1148 var entityRegexes = {
1149 1149 escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
1150 1150 unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
1151 1151 };
1152 1152
1153 1153 // Functions for escaping and unescaping strings to/from HTML interpolation.
1154 1154 _.each(['escape', 'unescape'], function(method) {
1155 1155 _[method] = function(string) {
1156 1156 if (string == null) return '';
1157 1157 return ('' + string).replace(entityRegexes[method], function(match) {
1158 1158 return entityMap[method][match];
1159 1159 });
1160 1160 };
1161 1161 });
1162 1162
1163 1163 // If the value of the named `property` is a function then invoke it with the
1164 1164 // `object` as context; otherwise, return it.
1165 1165 _.result = function(object, property) {
1166 1166 if (object == null) return void 0;
1167 1167 var value = object[property];
1168 1168 return _.isFunction(value) ? value.call(object) : value;
1169 1169 };
1170 1170
1171 1171 // Add your own custom functions to the Underscore object.
1172 1172 _.mixin = function(obj) {
1173 1173 each(_.functions(obj), function(name) {
1174 1174 var func = _[name] = obj[name];
1175 1175 _.prototype[name] = function() {
1176 1176 var args = [this._wrapped];
1177 1177 push.apply(args, arguments);
1178 1178 return result.call(this, func.apply(_, args));
1179 1179 };
1180 1180 });
1181 1181 };
1182 1182
1183 1183 // Generate a unique integer id (unique within the entire client session).
1184 1184 // Useful for temporary DOM ids.
1185 1185 var idCounter = 0;
1186 1186 _.uniqueId = function(prefix) {
1187 1187 var id = ++idCounter + '';
1188 1188 return prefix ? prefix + id : id;
1189 1189 };
1190 1190
1191 1191 // By default, Underscore uses ERB-style template delimiters, change the
1192 1192 // following template settings to use alternative delimiters.
1193 1193 _.templateSettings = {
1194 1194 evaluate : /<%([\s\S]+?)%>/g,
1195 1195 interpolate : /<%=([\s\S]+?)%>/g,
1196 1196 escape : /<%-([\s\S]+?)%>/g
1197 1197 };
1198 1198
1199 1199 // When customizing `templateSettings`, if you don't want to define an
1200 1200 // interpolation, evaluation or escaping regex, we need one that is
1201 1201 // guaranteed not to match.
1202 1202 var noMatch = /(.)^/;
1203 1203
1204 1204 // Certain characters need to be escaped so that they can be put into a
1205 1205 // string literal.
1206 1206 var escapes = {
1207 1207 "'": "'",
1208 1208 '\\': '\\',
1209 1209 '\r': 'r',
1210 1210 '\n': 'n',
1211 1211 '\t': 't',
1212 1212 '\u2028': 'u2028',
1213 1213 '\u2029': 'u2029'
1214 1214 };
1215 1215
1216 1216 var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
1217 1217
1218 1218 // JavaScript micro-templating, similar to John Resig's implementation.
1219 1219 // Underscore templating handles arbitrary delimiters, preserves whitespace,
1220 1220 // and correctly escapes quotes within interpolated code.
1221 1221 _.template = function(text, data, settings) {
1222 1222 var render;
1223 1223 settings = _.defaults({}, settings, _.templateSettings);
1224 1224
1225 1225 // Combine delimiters into one regular expression via alternation.
1226 1226 var matcher = new RegExp([
1227 1227 (settings.escape || noMatch).source,
1228 1228 (settings.interpolate || noMatch).source,
1229 1229 (settings.evaluate || noMatch).source
1230 1230 ].join('|') + '|$', 'g');
1231 1231
1232 1232 // Compile the template source, escaping string literals appropriately.
1233 1233 var index = 0;
1234 1234 var source = "__p+='";
1235 1235 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1236 1236 source += text.slice(index, offset)
1237 1237 .replace(escaper, function(match) { return '\\' + escapes[match]; });
1238 1238
1239 1239 if (escape) {
1240 1240 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1241 1241 }
1242 1242 if (interpolate) {
1243 1243 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1244 1244 }
1245 1245 if (evaluate) {
1246 1246 source += "';\n" + evaluate + "\n__p+='";
1247 1247 }
1248 1248 index = offset + match.length;
1249 1249 return match;
1250 1250 });
1251 1251 source += "';\n";
1252 1252
1253 1253 // If a variable is not specified, place data values in local scope.
1254 1254 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
1255 1255
1256 1256 source = "var __t,__p='',__j=Array.prototype.join," +
1257 1257 "print=function(){__p+=__j.call(arguments,'');};\n" +
1258 1258 source + "return __p;\n";
1259 1259
1260 1260 try {
1261 1261 render = new Function(settings.variable || 'obj', '_', source);
1262 1262 } catch (e) {
1263 1263 e.source = source;
1264 1264 throw e;
1265 1265 }
1266 1266
1267 1267 if (data) return render(data, _);
1268 1268 var template = function(data) {
1269 1269 return render.call(this, data, _);
1270 1270 };
1271 1271
1272 1272 // Provide the compiled function source as a convenience for precompilation.
1273 1273 template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
1274 1274
1275 1275 return template;
1276 1276 };
1277 1277
1278 1278 // Add a "chain" function, which will delegate to the wrapper.
1279 1279 _.chain = function(obj) {
1280 1280 return _(obj).chain();
1281 1281 };
1282 1282
1283 1283 // OOP
1284 1284 // ---------------
1285 1285 // If Underscore is called as a function, it returns a wrapped object that
1286 1286 // can be used OO-style. This wrapper holds altered versions of all the
1287 1287 // underscore functions. Wrapped objects may be chained.
1288 1288
1289 1289 // Helper function to continue chaining intermediate results.
1290 1290 var result = function(obj) {
1291 1291 return this._chain ? _(obj).chain() : obj;
1292 1292 };
1293 1293
1294 1294 // Add all of the Underscore functions to the wrapper object.
1295 1295 _.mixin(_);
1296 1296
1297 1297 // Add all mutator Array functions to the wrapper.
1298 1298 each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1299 1299 var method = ArrayProto[name];
1300 1300 _.prototype[name] = function() {
1301 1301 var obj = this._wrapped;
1302 1302 method.apply(obj, arguments);
1303 1303 if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
1304 1304 return result.call(this, obj);
1305 1305 };
1306 1306 });
1307 1307
1308 1308 // Add all accessor Array functions to the wrapper.
1309 1309 each(['concat', 'join', 'slice'], function(name) {
1310 1310 var method = ArrayProto[name];
1311 1311 _.prototype[name] = function() {
1312 1312 return result.call(this, method.apply(this._wrapped, arguments));
1313 1313 };
1314 1314 });
1315 1315
1316 1316 _.extend(_.prototype, {
1317 1317
1318 1318 // Start chaining a wrapped Underscore object.
1319 1319 chain: function() {
1320 1320 this._chain = true;
1321 1321 return this;
1322 1322 },
1323 1323
1324 1324 // Extracts the result from a wrapped and chained object.
1325 1325 value: function() {
1326 1326 return this._wrapped;
1327 1327 }
1328 1328
1329 1329 });
1330 1330
1331 1331 // AMD registration happens at the end for compatibility with AMD loaders
1332 1332 // that may not enforce next-turn semantics on modules. Even though general
1333 1333 // practice for AMD registration is to be anonymous, underscore registers
1334 1334 // as a named module because, like jQuery, it is a base library that is
1335 1335 // popular enough to be bundled in a third party lib, but not be part of
1336 1336 // an AMD load request. Those cases could generate an error when an
1337 1337 // anonymous define() is called outside of a loader request.
1338 1338 if (typeof define === 'function' && define.amd) {
1339 1339 define('underscore', [], function() {
1340 1340 return _;
1341 1341 });
1342 1342 }
1343 1343 }).call(this);
1344 1344
1345 1345 ;/*
1346 1346 AngularJS v1.5.5
1347 1347 (c) 2010-2016 Google, Inc. http://angularjs.org
1348 1348 License: MIT
1349 1349 */
1350 1350 (function(v){'use strict';function O(a){return function(){var b=arguments[0],d;d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.5.5/"+(a?a+"/":"")+b;for(b=1;b<arguments.length;b++){d=d+(1==b?"?":"&")+"p"+(b-1)+"=";var c=encodeURIComponent,e;e=arguments[b];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;d+=c(e)}return Error(d)}}function ya(a){if(null==a||Va(a))return!1;if(K(a)||F(a)||B&&a instanceof B)return!0;
1351 1351 var b="length"in Object(a)&&a.length;return Q(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"==typeof a.item)}function q(a,b,d){var c,e;if(a)if(E(a))for(c in a)"prototype"==c||"length"==c||"name"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(K(a)||ya(a)){var f="object"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==q)a.forEach(b,d,a);else if(oc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&
1352 1352 b.call(d,a[c],c,a);else for(c in a)ua.call(a,c)&&b.call(d,a[c],c,a);return a}function pc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function qc(a){return function(b,d){a(d,b)}}function Xd(){return++nb}function Nb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(G(g)||E(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var n=h[k],m=g[n];d&&G(m)?fa(m)?a[n]=new Date(m.valueOf()):Wa(m)?a[n]=new RegExp(m):m.nodeName?a[n]=m.cloneNode(!0):
1353 1353 Ob(m)?a[n]=m.clone():(G(a[n])||(a[n]=K(m)?[]:{}),Nb(a[n],[m],!0)):a[n]=m}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function R(a){return Nb(a,za.call(arguments,1),!1)}function Yd(a){return Nb(a,za.call(arguments,1),!0)}function X(a){return parseInt(a,10)}function Pb(a,b){return R(Object.create(a),b)}function C(){}function Xa(a){return a}function da(a){return function(){return a}}function rc(a){return E(a.toString)&&a.toString!==ma}function y(a){return"undefined"===typeof a}function x(a){return"undefined"!==
1354 1354 typeof a}function G(a){return null!==a&&"object"===typeof a}function oc(a){return null!==a&&"object"===typeof a&&!sc(a)}function F(a){return"string"===typeof a}function Q(a){return"number"===typeof a}function fa(a){return"[object Date]"===ma.call(a)}function E(a){return"function"===typeof a}function Wa(a){return"[object RegExp]"===ma.call(a)}function Va(a){return a&&a.window===a}function Ya(a){return a&&a.$evalAsync&&a.$watch}function Da(a){return"boolean"===typeof a}function Zd(a){return a&&Q(a.length)&&
1355 1355 $d.test(ma.call(a))}function Ob(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function ae(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function va(a){return P(a.nodeName||a[0]&&a[0].nodeName)}function Za(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function qa(a,b){function d(a,b){var d=b.$$hashKey,e;if(K(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(oc(a))for(e in a)b[e]=c(a[e]);else if(a&&"function"===typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&
1356 1356 (b[e]=c(a[e]));else for(e in a)ua.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!G(a))return a;var b=f.indexOf(a);if(-1!==b)return g[b];if(Va(a)||Ya(a))throw Aa("cpws");var b=!1,c=e(a);void 0===c&&(c=K(a)?[]:Object.create(sc(a)),b=!0);f.push(a);g.push(c);return b?d(a,c):c}function e(a){switch(ma.call(a)){case "[object Int8Array]":case "[object Int16Array]":case "[object Int32Array]":case "[object Float32Array]":case "[object Float64Array]":case "[object Uint8Array]":case "[object Uint8ClampedArray]":case "[object Uint16Array]":case "[object Uint32Array]":return new a.constructor(c(a.buffer));
1357 1357 case "[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);(new Uint8Array(b)).set(new Uint8Array(a));return b}return a.slice(0);case "[object Boolean]":case "[object Number]":case "[object String]":case "[object Date]":return new a.constructor(a.valueOf());case "[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),b.lastIndex=a.lastIndex,b;case "[object Blob]":return new a.constructor([a],{type:a.type})}if(E(a.cloneNode))return a.cloneNode(!0)}var f=[],
1358 1358 g=[];if(b){if(Zd(b)||"[object ArrayBuffer]"===ma.call(b))throw Aa("cpta");if(a===b)throw Aa("cpi");K(b)?b.length=0:q(b,function(a,d){"$$hashKey"!==d&&delete b[d]});f.push(a);g.push(b);return d(a,b)}return c(a)}function ha(a,b){if(K(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(G(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function pa(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d==typeof b&&
1359 1359 "object"==d)if(K(a)){if(!K(b))return!1;if((d=a.length)==b.length){for(c=0;c<d;c++)if(!pa(a[c],b[c]))return!1;return!0}}else{if(fa(a))return fa(b)?pa(a.getTime(),b.getTime()):!1;if(Wa(a))return Wa(b)?a.toString()==b.toString():!1;if(Ya(a)||Ya(b)||Va(a)||Va(b)||K(b)||fa(b)||Wa(b))return!1;d=T();for(c in a)if("$"!==c.charAt(0)&&!E(a[c])){if(!pa(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&x(b[c])&&!E(b[c]))return!1;return!0}return!1}function $a(a,b,d){return a.concat(za.call(b,
1360 1360 d))}function tc(a,b){var d=2<arguments.length?za.call(arguments,2):[];return!E(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,$a(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function be(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:Va(b)?d="$WINDOW":b&&v.document===b?d="$DOCUMENT":Ya(b)&&(d="$SCOPE");return d}function ab(a,b){if(!y(a))return Q(b)||(b=b?2:null),JSON.stringify(a,be,
1361 1361 b)}function uc(a){return F(a)?JSON.parse(a):a}function vc(a,b){a=a.replace(ce,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6E4;return isNaN(d)?b:d}function Qb(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=vc(b,c);d*=b-c;a=new Date(a.getTime());a.setMinutes(a.getMinutes()+d);return a}function wa(a){a=B(a).clone();try{a.empty()}catch(b){}var d=B("<div>").append(a).html();try{return a[0].nodeType===Ma?P(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+P(b)})}catch(c){return P(d)}}
1362 1362 function wc(a){try{return decodeURIComponent(a)}catch(b){}}function xc(a){var b={};q((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=wc(e),x(e)&&(f=x(f)?wc(f):!0,ua.call(b,e)?K(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Rb(a){var b=[];q(a,function(a,c){K(a)?q(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""}
1363 1363 function ob(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function de(a,b){var d,c,e=Na.length;for(c=0;c<e;++c)if(d=Na[c]+b,F(d=a.getAttribute(d)))return d;return null}function ee(a,b){var d,c,e={};q(Na,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});
1364 1364 q(Na,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=e,c=e.getAttribute(b))});d&&(e.strictDi=null!==de(d,"strict-di"),b(d,c?[c]:[],e))}function yc(a,b,d){G(d)||(d={});d=R({strictDi:!1},d);var c=function(){a=B(a);if(a.injector()){var c=a[0]===v.document?"document":wa(a);throw Aa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);
1365 1365 b.unshift("ng");c=bb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;v&&e.test(v.name)&&(d.debugInfoEnabled=!0,v.name=v.name.replace(e,""));if(v&&!f.test(v.name))return c();v.name=v.name.replace(f,"");ea.resumeBootstrap=function(a){q(a,function(a){b.push(a)});return c()};E(ea.resumeDeferredBootstrap)&&ea.resumeDeferredBootstrap()}function fe(){v.name=
1366 1366 "NG_ENABLE_DEBUG_INFO!"+v.name;v.location.reload()}function ge(a){a=ea.element(a).injector();if(!a)throw Aa("test");return a.get("$$testability")}function zc(a,b){b=b||"_";return a.replace(he,function(a,c){return(c?b:"")+a.toLowerCase()})}function ie(){var a;if(!Ac){var b=pb();(Z=y(b)?v.jQuery:b?v[b]:void 0)&&Z.fn.on?(B=Z,R(Z.fn,{scope:Oa.scope,isolateScope:Oa.isolateScope,controller:Oa.controller,injector:Oa.injector,inheritedData:Oa.inheritedData}),a=Z.cleanData,Z.cleanData=function(b){for(var c,
1367 1367 e=0,f;null!=(f=b[e]);e++)(c=Z._data(f,"events"))&&c.$destroy&&Z(f).triggerHandler("$destroy");a(b)}):B=U;ea.element=B;Ac=!0}}function qb(a,b,d){if(!a)throw Aa("areq",b||"?",d||"required");return a}function Pa(a,b,d){d&&K(a)&&(a=a[a.length-1]);qb(E(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Qa(a,b){if("hasOwnProperty"===a)throw Aa("badname",b);}function Bc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=
1368 1368 b[g],a&&(a=(e=a)[c]);return!d&&E(a)?tc(e,a):a}function rb(a){for(var b=a[0],d=a[a.length-1],c,e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=B(za.call(a,0,e))),c.push(b);return c||a}function T(){return Object.create(null)}function je(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=O("$injector"),c=O("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||O;return b(a,"module",function(){var a={};return function(f,g,h){if("hasOwnProperty"===f)throw c("badname","module");g&&a.hasOwnProperty(f)&&
1369 1369 (a[f]=null);return b(a,f,function(){function a(b,d,e,f){f||(f=c);return function(){f[e||"push"]([b,d,arguments]);return M}}function b(a,d){return function(b,e){e&&E(e)&&(e.$$moduleName=f);c.push([a,d,arguments]);return M}}if(!g)throw d("nomod",f);var c=[],e=[],r=[],N=a("$injector","invoke","push",e),M={_invokeQueue:c,_configBlocks:e,_runBlocks:r,requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide",
1370 1370 "constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:N,run:function(a){r.push(a);return this}};h&&N(h);return M})}})}function ke(a){R(a,{bootstrap:yc,copy:qa,extend:R,merge:Yd,equals:pa,element:B,forEach:q,injector:bb,noop:C,bind:tc,toJson:ab,fromJson:uc,identity:Xa,isUndefined:y,
1371 1371 isDefined:x,isString:F,isFunction:E,isObject:G,isNumber:Q,isElement:Ob,isArray:K,version:le,isDate:fa,lowercase:P,uppercase:sb,callbacks:{counter:0},getTestability:ge,$$minErr:O,$$csp:Ea,reloadWithDebugInfo:fe});Sb=je(v);Sb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:me});a.provider("$compile",Cc).directive({a:ne,input:Dc,textarea:Dc,form:oe,script:pe,select:qe,style:re,option:se,ngBind:te,ngBindHtml:ue,ngBindTemplate:ve,ngClass:we,ngClassEven:xe,ngClassOdd:ye,ngCloak:ze,ngController:Ae,
1372 1372 ngForm:Be,ngHide:Ce,ngIf:De,ngInclude:Ee,ngInit:Fe,ngNonBindable:Ge,ngPluralize:He,ngRepeat:Ie,ngShow:Je,ngStyle:Ke,ngSwitch:Le,ngSwitchWhen:Me,ngSwitchDefault:Ne,ngOptions:Oe,ngTransclude:Pe,ngModel:Qe,ngList:Re,ngChange:Se,pattern:Ec,ngPattern:Ec,required:Fc,ngRequired:Fc,minlength:Gc,ngMinlength:Gc,maxlength:Hc,ngMaxlength:Hc,ngValue:Te,ngModelOptions:Ue}).directive({ngInclude:Ve}).directive(tb).directive(Ic);a.provider({$anchorScroll:We,$animate:Xe,$animateCss:Ye,$$animateJs:Ze,$$animateQueue:$e,
1373 1373 $$AnimateRunner:af,$$animateAsyncRun:bf,$browser:cf,$cacheFactory:df,$controller:ef,$document:ff,$exceptionHandler:gf,$filter:Jc,$$forceReflow:hf,$interpolate:jf,$interval:kf,$http:lf,$httpParamSerializer:mf,$httpParamSerializerJQLike:nf,$httpBackend:of,$xhrFactory:pf,$location:qf,$log:rf,$parse:sf,$rootScope:tf,$q:uf,$$q:vf,$sce:wf,$sceDelegate:xf,$sniffer:yf,$templateCache:zf,$templateRequest:Af,$$testability:Bf,$timeout:Cf,$window:Df,$$rAF:Ef,$$jqLite:Ff,$$HashMap:Gf,$$cookieReader:Hf})}])}function cb(a){return a.replace(If,
1374 1374 function(a,d,c,e){return e?c.toUpperCase():c}).replace(Jf,"Moz$1")}function Kc(a){a=a.nodeType;return 1===a||!a||9===a}function Lc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Tb.test(a)){d=d||e.appendChild(b.createElement("div"));c=(Kf.exec(a)||["",""])[1].toLowerCase();c=ia[c]||ia._default;d.innerHTML=c[1]+a.replace(Lf,"<$1></$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;f=$a(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";q(f,function(a){e.appendChild(a)});
1375 1375 return e}function Mc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function U(a){if(a instanceof U)return a;var b;F(a)&&(a=V(a),b=!0);if(!(this instanceof U)){if(b&&"<"!=a.charAt(0))throw Ub("nosel");return new U(a)}if(b){b=v.document;var d;a=(d=Mf.exec(a))?[b.createElement(d[1])]:(d=Lc(a,b))?d.childNodes:[]}Nc(this,a)}function Vb(a){return a.cloneNode(!0)}function ub(a,b){b||db(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c<e;c++)db(d[c])}function Oc(a,
1376 1376 b,d,c){if(x(c))throw Ub("offargs");var e=(c=vb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];x(d)&&Za(c||[],d);x(d)&&c&&0<c.length||(a.removeEventListener(b,f,!1),delete e[b])};q(b.split(" "),function(a){g(a);wb[a]&&g(wb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function db(a,b){var d=a.ng339,c=d&&eb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Oc(a)),delete eb[d],a.ng339=void 0))}function vb(a,b){var d=
1377 1377 a.ng339,d=d&&eb[d];b&&!d&&(a.ng339=d=++Nf,d=eb[d]={events:{},data:{},handle:void 0});return d}function Wb(a,b,d){if(Kc(a)){var c=x(d),e=!c&&b&&!G(b),f=!b;a=(a=vb(a,!e))&&a.data;if(c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];R(a,b)}}}function xb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function yb(a,b){b&&a.setAttribute&&q(b.split(" "),function(b){a.setAttribute("class",V((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g,
1378 1378 " ").replace(" "+V(b)+" "," ")))})}function zb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(b.split(" "),function(a){a=V(a);-1===d.indexOf(" "+a+" ")&&(d+=a+" ")});a.setAttribute("class",V(d))}}function Nc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Pc(a,b){return Ab(a,"$"+(b||"ngController")+"Controller")}function Ab(a,
1379 1379 b,d){9==a.nodeType&&(a=a.documentElement);for(b=K(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(x(d=B.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function Qc(a){for(ub(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Bb(a,b){b||ub(a);var d=a.parentNode;d&&d.removeChild(a)}function Of(a,b){b=b||v;if("complete"===b.document.readyState)b.setTimeout(a);else B(b).on("load",a)}function Rc(a,b){var d=Cb[b.toLowerCase()];return d&&Sc[va(a)]&&d}function Pf(a,b){var d=function(c,
1380 1380 d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(y(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||Qf;1<g&&(f=ha(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};d.elem=
1381 1381 a;return d}function Qf(a,b,d){d.call(a,b)}function Rf(a,b,d){var c=b.relatedTarget;c&&(c===a||Sf.call(a,c))||d.call(a,b)}function Ff(){this.$get=function(){return R(U,{hasClass:function(a,b){a.attr&&(a=a[0]);return xb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return zb(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return yb(a,b)}})}}function Fa(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"==d||"object"==d&&null!==a?a.$$hashKey=
1382 1382 d+":"+(b||Xd)():d+":"+a}function Ra(a,b){if(b){var d=0;this.nextUid=function(){return++d}}q(a,this.put,this)}function Tc(a){a=Function.prototype.toString.call(a).replace(Tf,"");return a.match(Uf)||a.match(Vf)}function Wf(a){return(a=Tc(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function bb(a,b){function d(a){return function(b,c){if(G(b))q(b,qc(a));else return a(b,c)}}function c(a,b){Qa(a,"service");if(E(b)||K(b))b=r.instantiate(b);if(!b.$get)throw Ga("pget",a);return m[a+"Provider"]=
1383 1383 b}function e(a,b){return function(){var c=w.invoke(b,this);if(y(c))throw Ga("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){qb(y(a)||K(a),"modulesToLoad","not an array");var b=[],c;q(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=r.get(e[0]);f[e[1]].apply(f,e[2])}}if(!n.get(a)){n.put(a,!0);try{F(a)?(c=Sb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):E(a)?b.push(r.invoke(a)):K(a)?b.push(r.invoke(a)):
1384 1384 Pa(a,"module")}catch(e){throw K(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ga("modulerr",a,e.stack||e.message||e);}}});return b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===k)throw Ga("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f){var g=[];a=bb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];
1385 1385 if("string"!==typeof l)throw Ga("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:d(l,f))}return g}return{invoke:function(a,b,c,d){"string"===typeof c&&(d=c,c=null);c=e(a,c,d);K(a)&&(a=a[a.length-1]);d=11>=Ca?!1:"function"===typeof a&&/^(?:class\s|constructor\()/.test(Function.prototype.toString.call(a));return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=K(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,
1386 1386 a))},get:d,annotate:bb.$$annotate,has:function(b){return m.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],n=new Ra([],!0),m={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,da(b),!1)}),constant:d(function(a,b){Qa(a,"constant");m[a]=b;N[a]=b}),decorator:function(a,b){var c=r.get(a+"Provider"),d=c.$get;c.$get=function(){var a=w.invoke(d,c);return w.invoke(b,null,
1387 1387 {$delegate:a})}}}},r=m.$injector=h(m,function(a,b){ea.isString(b)&&l.push(b);throw Ga("unpr",l.join(" <- "));}),N={},M=h(N,function(a,b){var c=r.get(a+"Provider",b);return w.invoke(c.$get,c,void 0,a)}),w=M;m.$injectorProvider={$get:da(M)};var p=g(a),w=M.get("$injector");w.strictDi=b;q(p,function(a){a&&w.invoke(a)});return w}function We(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,
1388 1388 function(a){if("a"===va(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;E(c)?c=c():Ob(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):Q(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=F(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===
1389 1389 b&&""===a||Of(function(){c.$evalAsync(g)})});return g}]}function fb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;K(a)&&(a=a.join(" "));K(b)&&(b=b.join(" "));return a+" "+b}function Xf(a){F(a)&&(a=a.split(" "));var b=T();q(a,function(a){a.length&&(b[a]=!0)});return b}function Ha(a){return G(a)?a:{}}function Yf(a,b,d,c){function e(a){try{a.apply(null,za.call(arguments,1))}finally{if(M--,0===M)for(;w.length;)try{w.pop()()}catch(b){d.error(b)}}}function f(){u=null;g();h()}function g(){p=I();
1390 1390 p=y(p)?null:p;pa(p,L)&&(p=L);L=p}function h(){if(t!==k.url()||H!==p)t=k.url(),H=p,q(J,function(a){a(k.url(),p)})}var k=this,l=a.location,n=a.history,m=a.setTimeout,r=a.clearTimeout,N={};k.isMock=!1;var M=0,w=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){M++};k.notifyWhenNoOutstandingRequests=function(a){0===M?a():w.push(a)};var p,H,t=l.href,z=b.find("base"),u=null,I=c.history?function(){try{return n.state}catch(a){}}:C;g();H=p;k.url=function(b,d,e){y(e)&&(e=null);l!==
1391 1391 a.location&&(l=a.location);n!==a.history&&(n=a.history);if(b){var f=H===e;if(t===b&&(!c.history||f))return k;var h=t&&Ia(t)===Ia(b);t=b;H=e;if(!c.history||h&&f){if(!h||u)u=b;d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b;l.href!==b&&(u=b)}else n[d?"replaceState":"pushState"](e,"",b),g(),H=p;return k}return u||l.href.replace(/%27/g,"'")};k.state=function(){return p};var J=[],D=!1,L=null;k.onUrlChange=function(b){if(!D){if(c.history)B(a).on("popstate",f);B(a).on("hashchange",
1392 1392 f);D=!0}J.push(b);return b};k.$$applicationDestroyed=function(){B(a).off("hashchange popstate",f)};k.$$checkUrlChange=h;k.baseHref=function(){var a=z.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};k.defer=function(a,b){var c;M++;c=m(function(){delete N[c];e(a)},b||0);N[c]=!0;return c};k.defer.cancel=function(a){return N[a]?(delete N[a],r(a),e(C),!0):!1}}function cf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new Yf(a,c,b,d)}]}function df(){this.$get=
1393 1393 function(){function a(a,c){function e(a){a!=m&&(r?r==a&&(r=a.n):r=a,f(a.n,a.p),f(a,m),m=a,m.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw O("$cacheFactory")("iid",a);var g=0,h=R({},c,{id:a}),k=T(),l=c&&c.capacity||Number.MAX_VALUE,n=T(),m=null,r=null;return b[a]={put:function(a,b){if(!y(b)){if(l<Number.MAX_VALUE){var c=n[a]||(n[a]={key:a});e(c)}a in k||g++;k[a]=b;g>l&&this.remove(r.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=n[a];if(!b)return;e(b)}return k[a]},
1394 1394 remove:function(a){if(l<Number.MAX_VALUE){var b=n[a];if(!b)return;b==m&&(m=b.p);b==r&&(r=b.n);f(b.n,b.p);delete n[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=T();g=0;n=T();m=r=null},destroy:function(){n=h=k=null;delete b[a]},info:function(){return R({},h,{size:g})}}}var b={};a.info=function(){var a={};q(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function zf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Cc(a,b){function d(a,
1395 1395 b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,e=T();q(a,function(a,f){if(a in n)e[f]=n[a];else{var g=a.match(d);if(!g)throw ga("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f};g[4]&&(n[a]=e[f])}});return e}function c(a){var b=a.charAt(0);if(!b||b!==P(b))throw ga("baddir",a);if(a!==a.trim())throw ga("baddir",a);}var e={},f=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,g=/(([\w\-]+)(?:\:([^;]+))?;?)/,
1396 1396 h=ae("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,l=/^(on[a-z]+|formaction)$/,n=T();this.directive=function M(b,d){Qa(b,"directive");F(b)?(c(b),qb(d,"directiveFactory"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];q(e[b],function(e,f){try{var g=a.invoke(e);E(g)?g={compile:da(g)}:!g.compile&&g.link&&(g.compile=da(g.link));g.priority=g.priority||0;g.index=f;g.name=g.name||b;g.require=g.require||g.controller&&g.name;g.restrict=
1397 1397 g.restrict||"EA";g.$$moduleName=e.$$moduleName;d.push(g)}catch(h){c(h)}});return d}])),e[b].push(d)):q(b,qc(M));return this};this.component=function(a,b){function c(a){function e(b){return E(b)||K(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:Uc(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",
1398 1398 require:b.require};q(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)});return g}var d=b.controller||function(){};q(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,E(d)&&(d[b]=a))});c.$inject=["$injector"];return this.directive(a,c)};this.aHrefSanitizationWhitelist=function(a){return x(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var m=!0;this.debugInfoEnabled=
1399 1399 function(a){return x(a)?(m=a,this):m};var r=10;this.onChangesTtl=function(a){return arguments.length?(r=a,this):r};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,n,t,z,u,I,J,D){function L(){try{if(!--qa)throw Z=void 0,ga("infchng",r);u.$apply(function(){for(var a=0,b=Z.length;a<b;++a)Z[a]();Z=void 0})}finally{qa++}}function S(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<
1400 1400 e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a}function $(a,b,c){na.innerHTML="<span "+b+">";b=na.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function A(a,b){try{a.addClass(b)}catch(c){}}function ba(a,b,c,d,e){a instanceof B||(a=B(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===Ma&&k.nodeValue.match(f)&&Mc(k,a[g]=v.document.createElement("span"))}var l=s(a,b,a,c,d,e);ba.$$addScopeClass(a);var m=null;return function(b,
1401 1401 c,d){qb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;d=d.futureParentElement;f&&f.$$boundTransclude&&(f=f.$$boundTransclude);m||(m=(d=d&&d[0])?"foreignobject"!==va(d)&&ma.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==m?B(ca(m,B("<div>").append(a).html())):c?Oa.clone.call(a):a;if(g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);ba.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function s(a,b,c,d,e,f){function g(a,
1402 1402 c,d,e){var f,k,l,m,n,t,p;if(r)for(p=Array(c.length),m=0;m<h.length;m+=3)f=h[m],p[f]=c[f];else p=c;m=0;for(n=h.length;m<n;)k=p[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),ba.$$addScopeInfo(B(k),l)):l=a,t=c.transcludeOnThisElement?ka(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?ka(a,b):null,c(f,l,k,d,t)):f&&f(a,k.childNodes,void 0,e)}for(var h=[],k,l,m,n,r,t=0;t<a.length;t++){k=new S;l=x(a[t],[],k,0===t?d:void 0,e);(f=l.length?Ba(l,a[t],k,b,c,null,[],[],f):null)&&f.scope&&ba.$$addScopeClass(k.$$element);
1403 1403 k=f&&f.terminal||!(m=a[t].childNodes)||!m.length?null:s(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(t,f,k),n=!0,r=r||f;f=null}return n?g:null}function ka(a,b,c){function d(e,f,g,h,k){e||(e=a.$new(!1,k),e.$$transcluded=!0);return b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var e=d.$$slots=T(),f;for(f in b.$$slots)e[f]=b.$$slots[f]?ka(a,b.$$slots[f],c):null;return d}function x(a,b,c,d,e){var h=c.$attr,k;switch(a.nodeType){case 1:la(b,
1404 1404 xa(va(a)),"E",d,e);for(var l,m,n,t=a.attributes,r=0,p=t&&t.length;r<p;r++){var I=!1,D=!1;l=t[r];k=l.name;m=V(l.value);l=xa(k);if(n=ya.test(l))k=k.replace(Vc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()});(l=l.match(Aa))&&Q(l[1])&&(I=k,D=k.substr(0,k.length-5)+"end",k=k.substr(0,k.length-6));l=xa(k.toLowerCase());h[l]=k;if(n||!c.hasOwnProperty(l))c[l]=m,Rc(a,l)&&(c[l]=!0);fa(a,b,m,l,n);la(b,l,"A",d,e,I,D)}a=a.className;G(a)&&(a=a.animVal);if(F(a)&&""!==a)for(;k=g.exec(a);)l=xa(k[2]),
1405 1405 la(b,l,"C",d,e)&&(c[l]=V(k[3])),a=a.substr(k.index+k[0].length);break;case Ma:if(11===Ca)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Ma;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);X(b,a.nodeValue);break;case 8:try{if(k=f.exec(a.nodeValue))l=xa(k[1]),la(b,l,"M",d,e)&&(c[l]=V(k[2]))}catch(J){}}b.sort(Y);return b}function Wc(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ga("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&
1406 1406 e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return B(d)}function Xc(a,b,c){return function(d,e,f,g,h){e=Wc(e[0],b,c);return a(d,e,f,g,h)}}function Yb(a,b,c,d,e,f){var g;return a?ba(b,c,d,e,f):function(){g||(g=ba(b,c,d,e,f),b=c=f=null);return g.apply(this,arguments)}}function Ba(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){if(a){c&&(a=Xc(a,c,d));a.require=A.require;a.directiveName=M;if(D===A||A.$$isolateScope)a=ha(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=Xc(b,c,d));
1407 1407 b.require=A.require;b.directiveName=M;if(D===A||A.$$isolateScope)b=ha(b,{isolateScope:!0});k.push(b)}}function n(a,c,e,f,g){function l(a,b,c,d){var e;Ya(a)||(d=c,c=b,b=a,a=void 0);H&&(e=u);c||(c=H?z.parent():z);if(d){var f=g.$$slots[d];if(f)return f(a,b,e,c,$);if(y(f))throw ga("noslot",d,wa(z));}else return g(a,b,e,c,$)}var m,t,p,A,w,u,L,z;b===e?(f=d,z=d.$$element):(z=B(e),f=new S(z,d));w=c;D?A=c.$new(!0):r&&(w=c.$parent);g&&(L=l,L.$$boundTransclude=g,L.isSlotFilled=function(a){return!!g.$$slots[a]});
1408 1408 I&&(u=O(z,f,L,I,A,c,D));D&&(ba.$$addScopeInfo(z,A,!0,!(J&&(J===D||J===D.$$originalDirective))),ba.$$addScopeClass(z,!0),A.$$isolateBindings=D.$$isolateBindings,t=ia(c,f,A,A.$$isolateBindings,D),t.removeWatches&&A.$on("$destroy",t.removeWatches));for(m in u){t=I[m];p=u[m];var Xb=t.$$bindings.bindToController;p.bindingInfo=p.identifier&&Xb?ia(w,f,p.instance,Xb,t):{};var M=p();M!==p.instance&&(p.instance=M,z.data("$"+t.name+"Controller",M),p.bindingInfo.removeWatches&&p.bindingInfo.removeWatches(),p.bindingInfo=
1409 1409 ia(w,f,p.instance,Xb,t))}q(I,function(a,b){var c=a.require;a.bindToController&&!K(c)&&G(c)&&R(u[b].instance,gb(b,c,z,u))});q(u,function(a){var b=a.instance;E(b.$onChanges)&&b.$onChanges(a.bindingInfo.initialChanges);E(b.$onInit)&&b.$onInit();E(b.$onDestroy)&&w.$on("$destroy",function(){b.$onDestroy()})});m=0;for(t=h.length;m<t;m++)p=h[m],ja(p,p.isolateScope?A:c,z,f,p.require&&gb(p.directiveName,p.require,z,u),L);var $=c;D&&(D.template||null===D.templateUrl)&&($=A);a&&a($,e.childNodes,void 0,g);for(m=
1410 1410 k.length-1;0<=m;m--)p=k[m],ja(p,p.isolateScope?A:c,z,f,p.require&&gb(p.directiveName,p.require,z,u),L);q(u,function(a){a=a.instance;E(a.$postLink)&&a.$postLink()})}l=l||{};for(var t=-Number.MAX_VALUE,r=l.newScopeDirective,I=l.controllerDirectives,D=l.newIsolateScopeDirective,J=l.templateDirective,w=l.nonTlbTranscludeDirective,u=!1,L=!1,H=l.hasElementTranscludeDirective,z=d.$$element=B(b),A,M,$,s=e,Sa,ka=!1,C=!1,v,F=0,Ba=a.length;F<Ba;F++){A=a[F];var P=A.$$start,Q=A.$$end;P&&(z=Wc(b,P,Q));$=void 0;
1411 1411 if(t>A.priority)break;if(v=A.scope)A.templateUrl||(G(v)?(W("new/isolated scope",D||r,A,z),D=A):W("new/isolated scope",D,A,z)),r=r||A;M=A.name;if(!ka&&(A.replace&&(A.templateUrl||A.template)||A.transclude&&!A.$$tlb)){for(v=F+1;ka=a[v++];)if(ka.transclude&&!ka.$$tlb||ka.replace&&(ka.templateUrl||ka.template)){C=!0;break}ka=!0}!A.templateUrl&&A.controller&&(v=A.controller,I=I||T(),W("'"+M+"' controller",I[M],A,z),I[M]=A);if(v=A.transclude)if(u=!0,A.$$tlb||(W("transclusion",w,A,z),w=A),"element"==v)H=
1412 1412 !0,t=A.priority,$=z,z=d.$$element=B(ba.$$createComment(M,d[M])),b=z[0],da(f,za.call($,0),b),$[0].$$parentNode=$[0].parentNode,s=Yb(C,$,e,t,g&&g.name,{nonTlbTranscludeDirective:w});else{var la=T();$=B(Vb(b)).contents();if(G(v)){$=[];var Y=T(),X=T();q(v,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Y[a]=b;la[b]=null;X[b]=c});q(z.contents(),function(a){var b=Y[xa(va(a))];b?(X[b]=!0,la[b]=la[b]||[],la[b].push(a)):$.push(a)});q(X,function(a,b){if(!a)throw ga("reqslot",b);});for(var Z in la)la[Z]&&
1413 1413 (la[Z]=Yb(C,la[Z],e))}z.empty();s=Yb(C,$,e,void 0,void 0,{needsNewScope:A.$$isolateScope||A.$$newScope});s.$$slots=la}if(A.template)if(L=!0,W("template",J,A,z),J=A,v=E(A.template)?A.template(z,d):A.template,v=ta(v),A.replace){g=A;$=Tb.test(v)?Yc(ca(A.templateNamespace,V(v))):[];b=$[0];if(1!=$.length||1!==b.nodeType)throw ga("tplrt",M,"");da(f,z,b);Ba={$attr:{}};v=x(b,[],Ba);var ea=a.splice(F+1,a.length-(F+1));(D||r)&&Zc(v,D,r);a=a.concat(v).concat(ea);U(d,Ba);Ba=a.length}else z.html(v);if(A.templateUrl)L=
1414 1414 !0,W("template",J,A,z),J=A,A.replace&&(g=A),n=aa(a.splice(F,a.length-F),z,d,f,u&&s,h,k,{controllerDirectives:I,newScopeDirective:r!==A&&r,newIsolateScopeDirective:D,templateDirective:J,nonTlbTranscludeDirective:w}),Ba=a.length;else if(A.compile)try{Sa=A.compile(z,d,s),E(Sa)?m(null,Sa,P,Q):Sa&&m(Sa.pre,Sa.post,P,Q)}catch(fa){c(fa,wa(z))}A.terminal&&(n.terminal=!0,t=Math.max(t,A.priority))}n.scope=r&&!0===r.scope;n.transcludeOnThisElement=u;n.templateOnThisElement=L;n.transclude=s;l.hasElementTranscludeDirective=
1415 1415 H;return n}function gb(a,b,c,d){var e;if(F(b)){var f=b.match(k);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ga("ctreq",b,a);}else if(K(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=gb(a,b[g],c,d);else G(b)&&(e={},q(b,function(b,f){e[f]=gb(a,b,c,d)}));return e||null}function O(a,b,c,d,e,f,g){var h=T(),k;for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f,
1416 1416 $element:a,$attrs:b,$transclude:c},n=l.controller;"@"==n&&(n=b[l.name]);m=z(n,m,!0,l.controllerAs);h[l.name]=m;a.data("$"+l.name+"Controller",m.instance)}return h}function Zc(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Pb(a[d],{$$isolateScope:b,$$newScope:c})}function la(b,f,g,h,k,l,m){if(f===k)return null;k=null;if(e.hasOwnProperty(f)){var n;f=a.get(f+"Directive");for(var t=0,r=f.length;t<r;t++)try{if(n=f[t],(y(h)||h>n.priority)&&-1!=n.restrict.indexOf(g)){l&&(n=Pb(n,{$$start:l,$$end:m}));if(!n.$$bindings){var I=
1417 1417 n,D=n,A=n.name,J={isolateScope:null,bindToController:null};G(D.scope)&&(!0===D.bindToController?(J.bindToController=d(D.scope,A,!0),J.isolateScope={}):J.isolateScope=d(D.scope,A,!1));G(D.bindToController)&&(J.bindToController=d(D.bindToController,A,!0));if(G(J.bindToController)){var w=D.controller,z=D.controllerAs;if(!w)throw ga("noctrl",A);if(!Uc(w,z))throw ga("noident",A);}var u=I.$$bindings=J;G(u.isolateScope)&&(n.$$isolateBindings=u.isolateScope)}b.push(n);k=n}}catch(L){c(L)}}return k}function Q(b){if(e.hasOwnProperty(b))for(var c=
1418 1418 a.get(b+"Directive"),d=0,f=c.length;d<f;d++)if(b=c[d],b.multiElement)return!0;return!1}function U(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,f){"class"==f?(A(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function aa(a,b,c,d,e,f,
1419 1419 g,h){var k=[],l,m,t=b[0],p=a.shift(),r=Pb(p,{templateUrl:null,transclude:null,replace:null,$$originalDirective:p}),I=E(p.templateUrl)?p.templateUrl(b,c):p.templateUrl,D=p.templateNamespace;b.empty();n(I).then(function(n){var J,w;n=ta(n);if(p.replace){n=Tb.test(n)?Yc(ca(D,V(n))):[];J=n[0];if(1!=n.length||1!==J.nodeType)throw ga("tplrt",p.name,I);n={$attr:{}};da(d,b,J);var z=x(J,[],n);G(p.scope)&&Zc(z,!0);a=z.concat(a);U(c,n)}else J=t,b.html(n);a.unshift(r);l=Ba(a,J,c,e,b,p,f,g,h);q(d,function(a,c){a==
1420 1420 J&&(d[c]=b[0])});for(m=s(b[0].childNodes,e);k.length;){n=k.shift();w=k.shift();var u=k.shift(),L=k.shift(),z=b[0];if(!n.$$destroyed){if(w!==t){var S=w.className;h.hasElementTranscludeDirective&&p.replace||(z=Vb(J));da(u,B(w),z);A(B(z),S)}w=l.transcludeOnThisElement?ka(n,l.transclude,L):L;l(m,n,z,d,w)}}k=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(k?k.push(b,c,d,a):(l.transcludeOnThisElement&&(a=ka(b,l.transclude,e)),l(m,b,c,d,a)))}}function Y(a,b){var c=b.priority-a.priority;return 0!==
1421 1421 c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function W(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ga("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,wa(d));}function X(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&ba.$$addBindingClass(a);return function(a,c){var e=c.parent();b||ba.$$addBindingClass(e);ba.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function ca(a,b){a=
1422 1422 P(a||"html");switch(a){case "svg":case "math":var c=v.document.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function ea(a,b){if("srcdoc"==b)return I.HTML;var c=va(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return I.RESOURCE_URL}function fa(a,c,d,e,f){var g=ea(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if("multiple"===e&&"select"===va(a))throw ga("selmulti",wa(a));c.push({priority:100,compile:function(){return{pre:function(a,
1423 1423 c,h){c=h.$$observers||(h.$$observers=T());if(l.test(e))throw ga("nodomevents");var m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function da(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=
1424 1424 c);break}f&&f.replaceChild(c,d);a=v.document.createDocumentFragment();for(g=0;g<e;g++)a.appendChild(b[g]);B.hasData(d)&&(B.data(c,B.data(d)),B(d).off("$destroy"));B.cleanData(a.querySelectorAll("*"));for(g=1;g<e;g++)delete b[g];b[0]=c;b.length=1}function ha(a,b){return R(function(){return a.apply(null,arguments)},a,b)}function ja(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,wa(d))}}function ia(a,c,d,e,f){function g(b,c,e){E(d.$onChanges)&&c!==e&&(Z||(a.$$postDigest(L),Z=[]),m||(m={},Z.push(h)),m[b]&&
1425 1425 (e=m[b].previousValue),m[b]=new Db(e,c))}function h(){d.$onChanges(m);m=void 0}var k=[],l={},m;q(e,function(e,h){var m=e.attrName,n=e.optional,p,r,I,D;switch(e.mode){case "@":n||ua.call(c,m)||(d[h]=c[m]=void 0);c.$observe(m,function(a){if(F(a)||Da(a))g(h,a,d[h]),d[h]=a});c.$$observers[m].$$scope=a;p=c[m];F(p)?d[h]=b(p)(a):Da(p)&&(d[h]=p);l[h]=new Db(Zb,d[h]);break;case "=":if(!ua.call(c,m)){if(n)break;c[m]=void 0}if(n&&!c[m])break;r=t(c[m]);D=r.literal?pa:function(a,b){return a===b||a!==a&&b!==b};
1426 1426 I=r.assign||function(){p=d[h]=r(a);throw ga("nonassign",c[m],m,f.name);};p=d[h]=r(a);n=function(b){D(b,d[h])||(D(b,p)?I(a,b=d[h]):d[h]=b);return p=b};n.$stateful=!0;n=e.collection?a.$watchCollection(c[m],n):a.$watch(t(c[m],n),null,r.literal);k.push(n);break;case "<":if(!ua.call(c,m)){if(n)break;c[m]=void 0}if(n&&!c[m])break;r=t(c[m]);d[h]=r(a);l[h]=new Db(Zb,d[h]);n=a.$watch(r,function(a,b){a===b&&(b=d[h]);g(h,a,b);d[h]=a},r.literal);k.push(n);break;case "&":r=c.hasOwnProperty(m)?t(c[m]):C;if(r===
1427 1427 C&&n)break;d[h]=function(b){return r(a,b)}}});return{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var oa=/^\w/,na=v.document.createElement("div"),qa=r,Z;S.prototype={$normalize:xa,$addClass:function(a){a&&0<a.length&&J.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&J.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=$c(a,b);c&&c.length&&J.addClass(this.$$element,c);(c=$c(b,a))&&c.length&&J.removeClass(this.$$element,
1428 1428 c)},$set:function(a,b,d,e){var f=Rc(this.$$element[0],a),g=ad[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=zc(a,"-"));f=va(this.$$element);if("a"===f&&("href"===a||"xlinkHref"===a)||"img"===f&&"src"===a)this[a]=b=D(b,"src"===a);else if("img"===f&&"srcset"===a){for(var f="",g=V(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<k;l++)var m=2*l,f=f+D(V(g[m]),!0),f=
1429 1429 f+(" "+V(g[m+1]));g=V(g[2*l]).split(/\s/);f+=D(V(g[0]),!0);2===g.length&&(f+=" "+V(g[1]));this[a]=b=f}!1!==d&&(null===b||y(b)?this.$$element.removeAttr(e):oa.test(e)?this.$$element.attr(e,b):$(this.$$element[0],e,b));(a=this.$$observers)&&q(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=T()),e=d[a]||(d[a]=[]);e.push(b);u.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||y(c[a])||b(c[a])});return function(){Za(e,b)}}};var ra=b.startSymbol(),
1430 1430 sa=b.endSymbol(),ta="{{"==ra&&"}}"==sa?Xa:function(a){return a.replace(/\{\{/g,ra).replace(/}}/g,sa)},ya=/^ngAttr[A-Z]/,Aa=/^(.+)Start$/;ba.$$addBindingInfo=m?function(a,b){var c=a.data("$binding")||[];K(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:C;ba.$$addBindingClass=m?function(a){A(a,"ng-binding")}:C;ba.$$addScopeInfo=m?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:C;ba.$$addScopeClass=m?function(a,b){A(a,b?"ng-isolate-scope":"ng-scope")}:C;ba.$$createComment=
1431 1431 function(a,b){var c="";m&&(c=" "+(a||"")+": "+(b||"")+" ");return v.document.createComment(c)};return ba}]}function Db(a,b){this.previousValue=a;this.currentValue=b}function xa(a){return cb(a.replace(Vc,""))}function $c(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?" ":"")+g}return d}function Yc(a){a=B(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&Zf.call(a,b,1);return a}function Uc(a,
1432 1432 b){if(b&&F(b))return b;if(F(a)){var d=bd.exec(a);if(d)return d[3]}}function ef(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Qa(b,"controller");G(b)?R(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!G(a.$scope))throw O("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,n,m;h=!0===h;k&&F(k)&&(m=k);if(F(f)){k=f.match(bd);if(!k)throw $f("ctrlfmt",f);n=k[1];m=
1433 1433 m||k[3];f=a.hasOwnProperty(n)?a[n]:Bc(g.$scope,n,!0)||(b?Bc(c,n,!0):void 0);Pa(f,n,!0)}if(h)return h=(K(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),m&&e(g,m,l,n||f.name),R(function(){var a=d.invoke(f,l,g,n);a!==l&&(G(a)||E(a))&&(l=a,m&&e(g,m,l,n||f.name));return l},{instance:l,identifier:m});l=d.instantiate(f,g,n);m&&e(g,m,l,n||f.name);return l}}]}function ff(){this.$get=["$window",function(a){return B(a.document)}]}function gf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,
1434 1434 arguments)}}]}function $b(a){return G(a)?fa(a)?a.toISOString():ab(a):a}function mf(){this.$get=function(){return function(a){if(!a)return"";var b=[];pc(a,function(a,c){null===a||y(a)||(K(a)?q(a,function(a){b.push(ja(c)+"="+ja($b(a)))}):b.push(ja(c)+"="+ja($b(a))))});return b.join("&")}}}function nf(){this.$get=function(){return function(a){function b(a,e,f){null===a||y(a)||(K(a)?q(a,function(a,c){b(a,e+"["+(G(a)?c:"")+"]")}):G(a)&&!fa(a)?pc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ja(e)+
1435 1435 "="+ja($b(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function ac(a,b){if(F(a)){var d=a.replace(ag,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(cd))||(c=(c=d.match(bg))&&cg[c[0]].test(d));c&&(a=uc(d))}}return a}function dd(a){var b=T(),d;F(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var e=P(V(a.substr(0,d)));a=V(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):G(a)&&q(a,function(a,d){var f=P(d),g=V(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function ed(a){var b;
1436 1436 return function(d){b||(b=dd(a));return d?(d=b[P(d)],void 0===d&&(d=null),d):b}}function fd(a,b,d,c){if(E(c))return c(a,b,d);q(c,function(c){a=c(a,b,d)});return a}function lf(){var a=this.defaults={transformResponse:[ac],transformRequest:[function(a){return G(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?ab(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ha(bc),put:ha(bc),patch:ha(bc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",
1437 1437 paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return x(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return x(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function n(b){function c(a){var b=R({},a);b.data=fd(a.data,a.headers,a.status,f.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};q(a,function(a,
1438 1438 e){E(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!G(b))throw O("$http")("badreq",b);if(!F(b.url))throw O("$http")("badreq",b.url);var f=R({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c=a.headers,d=R({},b.headers),f,g,h,c=R({},c.common,c[P(b.method)]);a:for(f in c){g=P(f);for(h in d)if(P(h)===g)continue a;d[f]=c[f]}return e(d,ha(b))}(b);f.method=sb(f.method);f.paramSerializer=F(f.paramSerializer)?
1439 1439 l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=fd(b.data,ed(d),void 0,b.transformRequest);y(e)&&q(d,function(a,b){"content-type"===P(b)&&delete d[b]});y(b.withCredentials)&&!y(a.withCredentials)&&(b.withCredentials=a.withCredentials);return m(b,e).then(c,c)},void 0],h=k.when(f);for(q(M,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=g.shift();var n=g.shift(),
1440 1440 h=h.then(b,n)}d?(h.success=function(a){Pa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Pa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=gd("success"),h.error=gd("error"));return h}function m(c,d){function g(a){if(a){var c={};q(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function l(a,c,d,e){function f(){m(c,a,d,e)}L&&(200<=a&&300>a?L.put(A,[a,c,dd(d),
1441 1441 e]):L.remove(A));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function m(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?J.resolve:J.reject)({data:a,status:b,headers:ed(d),config:c,statusText:e})}function u(a){m(a.data,a.status,ha(a.headers()),a.statusText)}function I(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var J=k.defer(),D=J.promise,L,S,M=c.headers,A=r(c.url,c.paramSerializer(c.params));n.pendingRequests.push(c);D.then(I,I);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&
1442 1442 "JSONP"!==c.method||(L=G(c.cache)?c.cache:G(a.cache)?a.cache:N);L&&(S=L.get(A),x(S)?S&&E(S.then)?S.then(u,u):K(S)?m(S[1],S[0],ha(S[2]),S[3]):m(S,200,{},"OK"):L.put(A,D));y(S)&&((S=hd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(M[c.xsrfHeaderName||a.xsrfHeaderName]=S),e(c.method,A,d,l,M,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers)));return D}function r(a,b){0<b.length&&(a+=(-1==a.indexOf("?")?"?":"&")+b);return a}var N=g("$http");a.paramSerializer=
1443 1443 F(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var M=[];q(c,function(a){M.unshift(F(a)?l.get(a):l.invoke(a))});n.pendingRequests=[];(function(a){q(arguments,function(a){n[a]=function(b,c){return n(R({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){n[a]=function(b,c,d){return n(R({},d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=a;return n}]}function pf(){this.$get=function(){return function(){return new v.XMLHttpRequest}}}
1444 1444 function of(){this.$get=["$browser","$window","$document","$xhrFactory",function(a,b,d,c){return dg(a,c,a.defer,b.angular.callbacks,d[0])}]}function dg(a,b,d,c,e){function f(a,b,d){var f=e.createElement("script"),n=null;f.type="text/javascript";f.src=a;f.async=!0;n=function(a){f.removeEventListener("load",n,!1);f.removeEventListener("error",n,!1);e.body.removeChild(f);f=null;var g=-1,N="unknown";a&&("load"!==a.type||c[b].called||(a={type:"error"}),N=a.type,g="error"===a.type?404:200);d&&d(g,N)};f.addEventListener("load",
1445 1445 n,!1);f.addEventListener("error",n,!1);e.body.appendChild(f);return n}return function(e,h,k,l,n,m,r,N,M,w){function p(){z&&z();u&&u.abort()}function H(b,c,e,f,g){x(J)&&d.cancel(J);z=u=null;b(c,e,f,g);a.$$completeOutstandingRequest(C)}a.$$incOutstandingRequestCount();h=h||a.url();if("jsonp"==P(e)){var t="_"+(c.counter++).toString(36);c[t]=function(a){c[t].data=a;c[t].called=!0};var z=f(h.replace("JSON_CALLBACK","angular.callbacks."+t),t,function(a,b){H(l,a,c[t].data,"",b);c[t]=C})}else{var u=b(e,h);
1446 1446 u.open(e,h,!0);q(n,function(a,b){x(a)&&u.setRequestHeader(b,a)});u.onload=function(){var a=u.statusText||"",b="response"in u?u.response:u.responseText,c=1223===u.status?204:u.status;0===c&&(c=b?200:"file"==ra(h).protocol?404:0);H(l,c,b,u.getAllResponseHeaders(),a)};e=function(){H(l,-1,null,null,"")};u.onerror=e;u.onabort=e;q(M,function(a,b){u.addEventListener(b,a)});q(w,function(a,b){u.upload.addEventListener(b,a)});r&&(u.withCredentials=!0);if(N)try{u.responseType=N}catch(I){if("json"!==N)throw I;
1447 1447 }u.send(y(k)?null:k)}if(0<m)var J=d(p,m);else m&&E(m.then)&&m.then(p)}}function jf(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a};this.endSymbol=function(a){return a?(b=a,this):b};this.$get=["$parse","$exceptionHandler","$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(m,a).replace(r,b)}function h(a,b,c,d){var e;return e=a.$watch(function(a){e();return d(a)},b,c)}function k(f,k,m,r){function H(a){try{var b=a;a=m?e.getTrusted(m,b):e.valueOf(b);
1448 1448 var d;if(r&&!x(a))d=a;else if(null==a)d="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=ab(a)}d=a}return d}catch(g){c(Ja.interr(f,g))}}if(!f.length||-1===f.indexOf(a)){var t;k||(k=g(f),t=da(k),t.exp=f,t.expressions=[],t.$$watchDelegate=h);return t}r=!!r;var z,u,I=0,J=[],D=[];t=f.length;for(var L=[],S=[];I<t;)if(-1!=(z=f.indexOf(a,I))&&-1!=(u=f.indexOf(b,z+l)))I!==z&&L.push(g(f.substring(I,z))),I=f.substring(z+l,u),J.push(I),D.push(d(I,H)),I=u+n,S.push(L.length),L.push("");
1449 1449 else{I!==t&&L.push(g(f.substring(I)));break}m&&1<L.length&&Ja.throwNoconcat(f);if(!k||J.length){var q=function(a){for(var b=0,c=J.length;b<c;b++){if(r&&y(a[b]))return;L[S[b]]=a[b]}return L.join("")};return R(function(a){var b=0,d=J.length,e=Array(d);try{for(;b<d;b++)e[b]=D[b](a);return q(e)}catch(g){c(Ja.interr(f,g))}},{exp:f,expressions:J,$$watchDelegate:function(a,b){var c;return a.$watchGroup(D,function(d,e){var f=q(d);E(b)&&b.call(this,f,d!==e?c:f,a);c=f})}})}}var l=a.length,n=b.length,m=new RegExp(a.replace(/./g,
1450 1450 f),"g"),r=new RegExp(b.replace(/./g,f),"g");k.startSymbol=function(){return a};k.endSymbol=function(){return b};return k}]}function kf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,e){function f(f,k,l,n){function m(){r?f.apply(null,N):f(p)}var r=4<arguments.length,N=r?za.call(arguments,4):[],q=b.setInterval,w=b.clearInterval,p=0,H=x(n)&&!n,t=(H?c:d).defer(),z=t.promise;l=x(l)?l:0;z.$$intervalId=q(function(){H?e.defer(m):a.$evalAsync(m);t.notify(p++);0<l&&p>=l&&(t.resolve(p),
1451 1451 w(z.$$intervalId),delete g[z.$$intervalId]);H||a.$apply()},k);g[z.$$intervalId]=t;return z}var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return f}]}function cc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=ob(a[b]);return a.join("/")}function id(a,b){var d=ra(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=X(d.port)||eg[d.protocol]||null}function jd(a,b){var d="/"!==a.charAt(0);
1452 1452 d&&(a="/"+a);var c=ra(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=xc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function na(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Ia(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function hb(a){return a.replace(/(#.+)|#$/,"$1")}function dc(a,b,d){this.$$html5=!0;d=d||"";id(a,this);this.$$parse=function(a){var d=na(b,
1453 1453 a);if(!F(d))throw Eb("ipthprfx",a,b);jd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Rb(this.$$search),d=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;x(f=na(a,c))?(g=f,g=x(f=na(d,f))?b+(na("/",f)||f):a+g):x(f=na(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function ec(a,b,d){id(a,this);
1454 1454 this.$$parse=function(c){var e=na(a,c)||na(b,c),f;y(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",y(e)&&(a=c,this.replace())):(f=na(d,e),y(f)&&(f=e));jd(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Rb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=
1455 1455 function(b,d){return Ia(a)==Ia(b)?(this.$$parse(b),!0):!1}}function kd(a,b,d){this.$$html5=!0;ec.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Ia(c)?f=c:(g=na(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Rb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Fb(a){return function(){return this[a]}}function ld(a,
1456 1456 b){return function(d){if(y(d))return this[a];this[a]=b(d);this.$$compose();return this}}function qf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return x(b)?(a=b,this):a};this.html5Mode=function(a){return Da(a)?(b.enabled=a,this):G(a)?(Da(a.enabled)&&(b.enabled=a.enabled),Da(a.requireBase)&&(b.requireBase=a.requireBase),Da(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,
1457 1457 c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,n;n=c.baseHref();var m=c.url(),r;if(b.enabled){if(!n&&b.requireBase)throw Eb("nobase");r=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(n||"/");n=e.history?dc:kd}else r=Ia(m),n=ec;var N=r.substr(0,Ia(r).lastIndexOf("/")+1);l=new n(r,N,"#"+a);l.$$parseLinkUrl(m,m);l.$$state=c.state();
1458 1458 var q=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=B(a.target);"a"!==va(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");G(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=ra(h.animVal).href);q.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=
1459 1459 !0))}});hb(l.absUrl())!=hb(m)&&c.url(l.absUrl(),!0);var w=!0;c.onUrlChange(function(a,b){y(na(N,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=hb(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(w=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=hb(c.url()),b=hb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(w||
1460 1460 m)w=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function rf(){var a=!0,b=this;this.debugEnabled=function(b){return x(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&
1461 1461 (a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||C;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];q(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Ta(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===
1462 1462 a||"__proto__"===a)throw ca("isecfld",b);return a}function fg(a){return a+""}function sa(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a.window===a)throw ca("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ca("isecdom",b);if(a===Object)throw ca("isecobj",b);}return a}function md(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a===gg||a===hg||a===ig)throw ca("isecff",b);}}function Gb(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||
1463 1463 a==={}.constructor||a===[].constructor||a===Function.constructor))throw ca("isecaf",b);}function jg(a,b){return"undefined"!==typeof a?a:b}function nd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function aa(a,b){var d,c;switch(a.type){case s.Program:d=!0;q(a.body,function(a){aa(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case s.Literal:a.constant=!0;a.toWatch=[];break;case s.UnaryExpression:aa(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;
1464 1464 break;case s.BinaryExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:aa(a.test,b);aa(a.alternate,b);aa(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=
1465 1465 !1;a.toWatch=[a];break;case s.MemberExpression:aa(a.object,b);a.computed&&aa(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case s.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];q(a.arguments,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;
1466 1466 a.toWatch=[a];break;case s.ArrayExpression:d=!0;c=[];q(a.elements,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case s.ObjectExpression:d=!0;c=[];q(a.properties,function(a){aa(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case s.ThisExpression:a.constant=!1;a.toWatch=[];break;case s.LocalsExpression:a.constant=!1,a.toWatch=[]}}function od(a){if(1==a.length){a=a[0].expression;
1467 1467 var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function pd(a){return a.type===s.Identifier||a.type===s.MemberExpression}function qd(a){if(1===a.body.length&&pd(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function rd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function sd(a,
1468 1468 b){this.astBuilder=a;this.$filter=b}function td(a,b){this.astBuilder=a;this.$filter=b}function Hb(a){return"constructor"==a}function fc(a){return E(a.valueOf)?a.valueOf():kg.call(a)}function sf(){var a=T(),b=T(),d={"true":!0,"false":!1,"null":null,undefined:void 0},c,e;this.addLiteral=function(a,b){d[a]=b};this.setIdentifierFns=function(a,b){c=a;e=b;return this};this.$get=["$filter",function(f){function g(c,d,e){var g,k,D;e=e||H;switch(typeof c){case "string":D=c=c.trim();var q=e?b:a;g=q[D];if(!g){":"===
1469 1469 c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2));g=e?p:w;var S=new gc(g);g=(new hc(S,f,g)).parse(c);g.constant?g.$$watchDelegate=r:k?g.$$watchDelegate=g.literal?m:n:g.inputs&&(g.$$watchDelegate=l);e&&(g=h(g));q[D]=g}return N(g,d);case "function":return N(c,d);default:return N(C,d)}}function h(a){function b(c,d,e,f){var g=H;H=!0;try{return a(c,d,e,f)}finally{H=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate;b.assign=h(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&
1470 1470 c<a.inputs.length;++c)a.inputs[c]=h(a.inputs[c]);b.inputs=a.inputs;return b}function k(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=fc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function l(a,b,c,d,e){var f=d.inputs,g;if(1===f.length){var h=k,f=f[0];return a.$watch(function(a){var b=f(a);k(b,h)||(g=d(a,void 0,void 0,[b]),h=b&&fc(b));return g},b,c,e)}for(var l=[],m=[],n=0,r=f.length;n<r;n++)l[n]=k,m[n]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var h=f[c](a);
1471 1471 if(b||(b=!k(h,l[c])))m[c]=h,l[c]=h&&fc(h)}b&&(g=d(a,void 0,void 0,m));return g},b,c,e)}function n(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;E(b)&&b.apply(this,arguments);x(a)&&d.$$postDigest(function(){x(f)&&e()})},c)}function m(a,b,c,d){function e(a){var b=!0;q(a,function(a){x(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;E(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function r(a,b,c,d){var e;
1472 1472 return e=a.$watch(function(a){e();return d(a)},b,c)}function N(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==m&&c!==n?function(c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,c,e)}:function(c,d,e,f){e=a(c,d,e,f);c=b(e,c,d);return x(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==l?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=l,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]);return c}var M=Ea().noUnsafeEval,w={csp:M,expensiveChecks:!1,literals:qa(d),isIdentifierStart:E(c)&&c,
1473 1473 isIdentifierContinue:E(e)&&e},p={csp:M,expensiveChecks:!0,literals:qa(d),isIdentifierStart:E(c)&&c,isIdentifierContinue:E(e)&&e},H=!1;g.$$runningExpensiveChecks=function(){return H};return g}]}function uf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return ud(function(b){a.$evalAsync(b)},b)}]}function vf(){this.$get=["$browser","$exceptionHandler",function(a,b){return ud(function(b){a.defer(b)},b)}]}function ud(a,b){function d(){this.$$state={status:0}}function c(a,b){return function(c){b.call(a,
1474 1474 c)}}function e(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,d,e;e=c.pending;c.processScheduled=!1;c.pending=void 0;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{E(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function f(){this.promise=new d}var g=O("$q",TypeError);R(d.prototype,{then:function(a,b,c){if(y(a)&&y(b)&&y(c))return this;var d=new f;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,
1475 1475 a,b,c]);0<this.$$state.status&&e(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return k(b,!0,a)},function(b){return k(b,!1,a)},b)}});R(f.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(g("qcycle",a)):this.$$resolve(a))},$$resolve:function(a){function d(a){k||(k=!0,h.$$resolve(a))}function f(a){k||(k=!0,h.$$reject(a))}var g,h=this,k=!1;try{if(G(a)||E(a))g=a&&a.then;E(g)?
1476 1476 (this.promise.$$state.status=-1,g.call(a,d,f,c(this,this.notify))):(this.promise.$$state.value=a,this.promise.$$state.status=1,e(this.promise.$$state))}catch(l){f(l),b(l)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;e(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f<g;f++){e=d[f][0];
1477 1477 a=d[f][3];try{e.notify(E(a)?a(c):c)}catch(h){b(h)}}})}});var h=function(a,b){var c=new f;b?c.resolve(a):c.reject(a);return c.promise},k=function(a,b,c){var d=null;try{E(c)&&(d=c())}catch(e){return h(e,!1)}return d&&E(d.then)?d.then(function(){return h(a,b)},function(a){return h(a,!1)}):h(a,b)},l=function(a,b,c,d){var e=new f;e.resolve(a);return e.promise.then(b,c,d)},n=function(a){if(!E(a))throw g("norslvr",a);var b=new f;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};n.prototype=
1478 1478 d.prototype;n.defer=function(){var a=new f;a.resolve=c(a,a.resolve);a.reject=c(a,a.reject);a.notify=c(a,a.notify);return a};n.reject=function(a){var b=new f;b.reject(a);return b.promise};n.when=l;n.resolve=l;n.all=function(a){var b=new f,c=0,d=K(a)?[]:{};q(a,function(a,e){c++;l(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return n}function Ef(){this.$get=["$window","$timeout",function(a,
1479 1479 b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function tf(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++nb;this.$$ChildScope=
1480 1480 null}b.prototype=a;return b}var b=10,d=O("$rootScope"),c=null,e=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(f,g,h){function k(a){a.currentScope.$$destroyed=!0}function l(a){9===Ca&&(a.$$childHead&&l(a.$$childHead),a.$$nextSibling&&l(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function n(){this.$id=++nb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=
1481 1481 this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function m(a){if(H.$$phase)throw d("inprog",H.$$phase);H.$$phase=a}function r(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function N(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function s(){}function w(){for(;u.length;)try{u.shift()()}catch(a){f(a)}e=
1482 1482 null}function p(){null===e&&(e=h.defer(function(){H.$apply(w)}))}n.prototype={constructor:n,$new:function(b,c){var d;c=c||this;b?(d=new n,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!=this)&&d.$on("$destroy",k);return d},$watch:function(a,b,d,e){var f=g(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,f,
1483 1483 a);var h=this,k=h.$$watchers,l={fn:b,last:s,get:f,exp:e||a,eq:!!d};c=null;E(b)||(l.fn=C);k||(k=h.$$watchers=[]);k.unshift(l);r(this,1);return function(){0<=Za(k,l)&&r(h,-1);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});q(a,function(a,
1484 1484 b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!y(e)){if(G(e))if(ya(e))for(f!==m&&(f=m,t=f.length=0,l++),a=e.length,t!==a&&(l++,f.length=t=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==r&&(f=r={},t=0,l++);a=0;for(b in e)ua.call(e,b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(t++,f[b]=g,l++));if(t>
1485 1485 a)for(b in l++,f)ua.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,n=g(a,c),m=[],r={},p=!0,t=0;return this.$watch(n,function(){p?(p=!1,b(e,e,d)):b(e,h,d);if(k)if(G(e))if(ya(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)ua.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,k,l,n,r,p,q,N=b,u,x=[],y,v;m("$digest");h.$$checkUrlChange();this===H&&null!==e&&(h.defer.cancel(e),w());c=null;do{q=!1;
1486 1486 for(u=this;t.length;){try{v=t.shift(),v.scope.$eval(v.expression,v.locals)}catch(C){f(C)}c=null}a:do{if(r=u.$$watchers)for(p=r.length;p--;)try{if(a=r[p])if(n=a.get,(g=n(u))!==(k=a.last)&&!(a.eq?pa(g,k):"number"===typeof g&&"number"===typeof k&&isNaN(g)&&isNaN(k)))q=!0,c=a,a.last=a.eq?qa(g,null):g,l=a.fn,l(g,k===s?g:k,u),5>N&&(y=4-N,x[y]||(x[y]=[]),x[y].push({msg:E(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:k}));else if(a===c){q=!1;break a}}catch(F){f(F)}if(!(r=u.$$watchersCount&&
1487 1487 u.$$childHead||u!==this&&u.$$nextSibling))for(;u!==this&&!(r=u.$$nextSibling);)u=u.$parent}while(u=r);if((q||t.length)&&!N--)throw H.$$phase=null,d("infdig",b,x);}while(q||t.length);for(H.$$phase=null;z.length;)try{z.shift()()}catch(B){f(B)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===H&&h.$$applicationDestroyed();r(this,-this.$$watchersCount);for(var b in this.$$listenerCount)N(this,this.$$listenerCount[b],b);a&&a.$$childHead==
1488 1488 this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=C;this.$on=this.$watch=this.$watchGroup=function(){return C};this.$$listeners={};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){H.$$phase||
1489 1489 t.length||h.defer(function(){t.length&&H.$digest()});t.push({scope:this,expression:g(a),locals:b})},$$postDigest:function(a){z.push(a)},$apply:function(a){try{m("$apply");try{return this.$eval(a)}finally{H.$$phase=null}}catch(b){f(b)}finally{try{H.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&u.push(b);a=g(a);p()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=
1490 1490 0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,N(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=$a([h],arguments,1),l,n;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(n=d.length;l<n;l++)if(d[l])try{d[l].apply(null,k)}catch(m){f(m)}else d.splice(l,1),l--,n--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);
1491 1491 h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=$a([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=
1492 1492 null;return e}};var H=new n,t=H.$$asyncQueue=[],z=H.$$postDigestQueue=[],u=H.$$applyAsyncQueue=[];return H}]}function me(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return x(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=c?b:a,f;f=ra(d).href;return""===f||f.match(e)?d:"unsafe:"+f}}}function lg(a){if("self"===a)return a;
1493 1493 if(F(a)){if(-1<a.indexOf("***"))throw ta("iwcard",a);a=vd(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+a+"$")}if(Wa(a))return new RegExp("^"+a.source+"$");throw ta("imatcher");}function wd(a){var b=[];x(a)&&q(a,function(a){b.push(lg(a))});return b}function xf(){this.SCE_CONTEXTS=oa;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&(a=wd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=wd(a));return b};this.$get=["$injector",
1494 1494 function(d){function c(a,b){return"self"===a?hd(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw ta("unsafe");};d.has("$sanitize")&&(f=d.get("$sanitize"));var g=e(),h={};h[oa.HTML]=e(g);h[oa.CSS]=e(g);h[oa.URL]=e(g);h[oa.JS]=e(g);h[oa.RESOURCE_URL]=
1495 1495 e(h[oa.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw ta("icontext",a,b);if(null===b||y(b)||""===b)return b;if("string"!==typeof b)throw ta("itype",a);return new c(b)},getTrusted:function(d,e){if(null===e||y(e)||""===e)return e;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(d===oa.RESOURCE_URL){var g=ra(e.toString()),m,r,q=!1;m=0;for(r=a.length;m<r;m++)if(c(a[m],g)){q=!0;break}if(q)for(m=0,r=b.length;m<r;m++)if(c(b[m],
1496 1496 g)){q=!1;break}if(q)return e;throw ta("insecurl",e.toString());}if(d===oa.HTML)return f(e);throw ta("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function wf(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>Ca)throw ta("iequirks");var c=ha(oa);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},
1497 1497 c.valueOf=Xa);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;q(oa,function(a,b){var d=P(b);c[cb("parse_as_"+d)]=function(b){return e(a,b)};c[cb("get_trusted_"+d)]=function(b){return f(a,b)};c[cb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function yf(){this.$get=["$window","$document",function(a,b){var d={},c=!(a.chrome&&a.chrome.app&&a.chrome.app.runtime)&&a.history&&a.history.pushState,
1498 1498 e=X((/android (\d+)/.exec(P((a.navigator||{}).userAgent))||[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h,k=/^(Moz|webkit|ms)(?=[A-Z])/,l=g.body&&g.body.style,n=!1,m=!1;if(l){for(var r in l)if(n=k.exec(r)){h=n[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");n=!!("transition"in l||h+"Transition"in l);m=!!("animation"in l||h+"Animation"in l);!e||n&&m||(n=F(l.webkitTransition),m=F(l.webkitAnimation))}return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===
1499 1499 a&&11>=Ca)return!1;if(y(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ea(),vendorPrefix:h,transitions:n,animations:m,android:e}}]}function Af(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,e){function f(g,h){f.totalPendingRequests++;F(g)&&b.get(g)||(g=e.getTrustedResourceUrl(g));var k=d.defaults&&d.defaults.transformResponse;K(k)?k=k.filter(function(a){return a!==ac}):k===ac&&(k=null);return d.get(g,
1500 1500 R({cache:b,transformResponse:k},a))["finally"](function(){f.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw mg("tpload",g,a.status,a.statusText);return c.reject(a)})}f.totalPendingRequests=0;return f}]}function Bf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];q(a,function(a){var c=ea.element(a).data("$binding");c&&q(c,function(c){d?(new RegExp("(^|\\s)"+
1501 1501 vd(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var k=a.querySelectorAll("["+g[h]+"model"+(d?"=":"*=")+'"'+b+'"]');if(k.length)return k}},getLocation:function(){return d.url()},setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function Cf(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",
1502 1502 function(a,b,d,c,e){function f(f,k,l){E(f)||(l=k,k=f,f=C);var n=za.call(arguments,3),m=x(l)&&!l,r=(m?c:d).defer(),q=r.promise,s;s=b.defer(function(){try{r.resolve(f.apply(null,n))}catch(b){r.reject(b),e(b)}finally{delete g[q.$$timeoutId]}m||a.$apply()},k);q.$$timeoutId=s;g[s]=r;return q}var g={};f.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].reject("canceled"),delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1};return f}]}function ra(a){Ca&&(Y.setAttribute("href",a),a=
1503 1503 Y.href);Y.setAttribute("href",a);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,""):"",host:Y.host,search:Y.search?Y.search.replace(/^\?/,""):"",hash:Y.hash?Y.hash.replace(/^#/,""):"",hostname:Y.hostname,port:Y.port,pathname:"/"===Y.pathname.charAt(0)?Y.pathname:"/"+Y.pathname}}function hd(a){a=F(a)?ra(a):a;return a.protocol===xd.protocol&&a.host===xd.host}function Df(){this.$get=da(v)}function yd(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{},
1504 1504 c={},e="";return function(){var a,g,h,k,l;a=d.cookie||"";if(a!==e)for(e=a,a=e.split("; "),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf("="),0<k&&(l=b(g.substring(0,k)),y(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function Hf(){this.$get=yd}function Jc(a){function b(d,c){if(G(d)){var e={};q(d,function(a,c){e[c]=b(c,a)});return e}return a.factory(d+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",zd);b("date",Ad);b("filter",ng);
1505 1505 b("json",og);b("limitTo",pg);b("lowercase",qg);b("number",Bd);b("orderBy",Cd);b("uppercase",rg)}function ng(){return function(a,b,d){if(!ya(a)){if(null==a)return a;throw O("filter")("notarray",a);}var c;switch(ic(b)){case "function":break;case "boolean":case "null":case "number":case "string":c=!0;case "object":b=sg(b,d,c);break;default:return a}return Array.prototype.filter.call(a,b)}}function sg(a,b,d){var c=G(a)&&"$"in a;!0===b?b=pa:E(b)||(b=function(a,b){if(y(a))return!1;if(null===a||null===b)return a===
1506 1506 b;if(G(b)||G(a)&&!rc(a))return!1;a=P(""+a);b=P(""+b);return-1!==a.indexOf(b)});return function(e){return c&&!G(e)?Ka(e,a.$,b,!1):Ka(e,a,b,d)}}function Ka(a,b,d,c,e){var f=ic(a),g=ic(b);if("string"===g&&"!"===b.charAt(0))return!Ka(a,b.substring(1),d,c);if(K(a))return a.some(function(a){return Ka(a,b,d,c)});switch(f){case "object":var h;if(c){for(h in a)if("$"!==h.charAt(0)&&Ka(a[h],b,d,!0))return!0;return e?!1:Ka(a,b,d,!1)}if("object"===g){for(h in b)if(e=b[h],!E(e)&&!y(e)&&(f="$"===h,!Ka(f?a:a[h],
1507 1507 e,d,f,f)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function ic(a){return null===a?"null":typeof a}function zd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){y(c)&&(c=b.CURRENCY_SYM);y(e)&&(e=b.PATTERNS[1].maxFrac);return null==a?a:Dd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,e).replace(/\u00A4/g,c)}}function Bd(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Dd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function tg(a){var b=0,d,c,e,f,g;-1<
1508 1508 (c=a.indexOf(Ed))&&(a=a.replace(Ed,""));0<(e=a.search(/e/i))?(0>c&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)==jc;e++);if(e==(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)==jc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Fd&&(d=d.splice(0,Fd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function ug(a,b,d,c){var e=a.d,f=e.length-a.i;b=y(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0<d){e.splice(Math.max(a.i,d));for(var g=d;g<e.length;g++)e[g]=0}else for(f=
1509 1509 Math.max(0,f),a.i=1,e.length=Math.max(1,d=b+1),e[0]=0,g=1;g<d;g++)e[g]=0;if(5<=c)if(0>d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;f<Math.max(0,b);f++)e.push(0);if(b=e.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))e.unshift(b),a.i++}function Dd(a,b,d,c,e){if(!F(a)&&!Q(a)||isNaN(a))return"";var f=!isFinite(a),g=!1,h=Math.abs(a)+"",k="";if(f)k="\u221e";else{g=tg(h);ug(g,e,b.minFrac,b.maxFrac);k=g.d;h=g.i;e=g.e;f=[];for(g=k.reduce(function(a,
1510 1510 b){return a&&!b},!0);0>h;)k.unshift(0),h++;0<h?f=k.splice(h):(f=k,k=[0]);h=[];for(k.length>=b.lgSize&&h.unshift(k.splice(-b.lgSize).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);f.length&&(k+=c+f.join(""));e&&(k+="e+"+e)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Ib(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length<b;)a=jc+a;d&&(a=a.substr(a.length-b));return e+a}function W(a,b,d,c,e){d=
1511 1511 d||0;return function(f){f=f["get"+a]();if(0<d||f>-d)f+=d;0===f&&-12==d&&(f=12);return Ib(f,b,c,e)}}function ib(a,b,d){return function(c,e){var f=c["get"+a](),g=sb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Gd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Hd(a){return function(b){var d=Gd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Ib(b,a)}}function kc(a,b){return 0>=a.getFullYear()?
1512 1512 b.ERAS[0]:b.ERAS[1]}function Ad(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=X(b[9]+b[10]),g=X(b[9]+b[11]));h.call(a,X(b[1]),X(b[2])-1,X(b[3]));f=X(b[4]||0)-f;g=X(b[5]||0)-g;h=X(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",h=
1513 1513 [],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;F(c)&&(c=vg.test(c)?X(c):b(c));Q(c)&&(c=new Date(c));if(!fa(c)||!isFinite(c.getTime()))return c;for(;d;)(l=wg.exec(d))?(h=$a(h,l,1),d=h.pop()):(h.push(d),d=null);var n=c.getTimezoneOffset();f&&(n=vc(f,n),c=Qb(c,f,!0));q(h,function(b){k=xg[b];g+=k?k(c,a.DATETIME_FORMATS,n):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function og(){return function(a,b){y(b)&&(b=2);return ab(a,b)}}function pg(){return function(a,b,d){b=Infinity===
1514 1514 Math.abs(Number(b))?Number(b):X(b);if(isNaN(b))return a;Q(a)&&(a=a.toString());if(!K(a)&&!F(a))return a;d=!d||isNaN(d)?0:X(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),d)}}function Cd(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=Xa;if(E(b))h=b;else if(F(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h,
1515 1515 descending:c*d}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(a,e,f){if(null==a)return a;if(!ya(a))throw O("orderBy")("notarray",a);K(e)||(e=[e]);0===e.length&&(e=["+"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("string"===c)e=e.toLowerCase();else if("object"===
1516 1516 c)a:{if("function"===typeof e.valueOf&&(e=e.valueOf(),d(e)))break a;if(rc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;d<e;++d){var c=a.predicateValues[d],f=b.predicateValues[d],q=0;c.type===f.type?c.value!==f.value&&(q=c.value<f.value?-1:1):q=c.type<f.type?-1:1;if(c=q*g[d].descending)break}return c});return a=a.map(function(a){return a.value})}}function La(a){E(a)&&(a={link:a});a.restrict=a.restrict||"AC";return da(a)}function Id(a,
1517 1517 b,d,c,e){var f=this,g=[];f.$error={};f.$$success={};f.$pending=void 0;f.$name=e(b.name||b.ngForm||"")(d);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;f.$$parentForm=Jb;f.$rollbackViewValue=function(){q(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){q(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Qa(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a);a.$$parentForm=f};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c];
1518 1518 f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];q(f.$pending,function(b,c){f.$setValidity(c,null,a)});q(f.$error,function(b,c){f.$setValidity(c,null,a)});q(f.$$success,function(b,c){f.$setValidity(c,null,a)});Za(g,a);a.$$parentForm=Jb};Jd({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Za(d,c),0===d.length&&delete a[b])},$animate:c});f.$setDirty=function(){c.removeClass(a,Ua);
1519 1519 c.addClass(a,Kb);f.$dirty=!0;f.$pristine=!1;f.$$parentForm.$setDirty()};f.$setPristine=function(){c.setClass(a,Ua,Kb+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;q(g,function(a){a.$setPristine()})};f.$setUntouched=function(){q(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){c.addClass(a,"ng-submitted");f.$submitted=!0;f.$$parentForm.$setSubmitted()}}function lc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function jb(a,b,d,c,e,f){var g=P(b[0].type);
1520 1520 if(!e.android){var h=!1;b.on("compositionstart",function(){h=!0});b.on("compositionend",function(){h=!1;l()})}var k,l=function(a){k&&(f.defer.cancel(k),k=null);if(!h){var e=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||(e=V(e));(c.$viewValue!==e||""===e&&c.$$hasNativeValidators)&&c.$setViewValue(e,a)}};if(e.hasEvent("input"))b.on("input",l);else{var n=function(a,b,c){k||(k=f.defer(function(){k=null;b&&b.value===c||l(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15<
1521 1521 b&&19>b||37<=b&&40>=b||n(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",n)}b.on("change",l);if(Kd[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=this.validity,c=b.badInput,d=b.typeMismatch;k=f.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Lb(a,b){return function(d,c){var e,f;if(fa(d))return d;if(F(d)){'"'==d.charAt(0)&&
1522 1522 '"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(yg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},q(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function kb(a,b,d,c){return function(e,f,g,h,k,l,n){function m(a){return a&&
1523 1523 !(a.getTime&&a.getTime()!==a.getTime())}function r(a){return x(a)&&!fa(a)?d(a)||void 0:a}Ld(e,f,g,h);jb(e,f,g,h,k,l);var q=h&&h.$options&&h.$options.timezone,s;h.$$parserName=a;h.$parsers.push(function(a){if(h.$isEmpty(a))return null;if(b.test(a))return a=d(a,s),q&&(a=Qb(a,q)),a});h.$formatters.push(function(a){if(a&&!fa(a))throw lb("datefmt",a);if(m(a))return(s=a)&&q&&(s=Qb(s,q,!0)),n("date")(a,c,q);s=null;return""});if(x(g.min)||g.ngMin){var w;h.$validators.min=function(a){return!m(a)||y(w)||d(a)>=
1524 1524 w};g.$observe("min",function(a){w=r(a);h.$validate()})}if(x(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!m(a)||y(p)||d(a)<=p};g.$observe("max",function(a){p=r(a);h.$validate()})}}}function Ld(a,b,d,c){(c.$$hasNativeValidators=G(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?void 0:a})}function Md(a,b,d,c,e){if(x(c)){a=a(c);if(!a.constant)throw lb("constexpr",d,c);return a(b)}return e}function mc(a,b){a="ngClass"+a;return["$animate",
1525 1525 function(d){function c(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],n=0;n<b.length;n++)if(e==b[n])continue a;c.push(e)}return c}function e(a){var b=[];return K(a)?(q(a,function(a){b=b.concat(e(a))}),b):F(a)?a.split(" "):G(a)?(q(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b):a}return{restrict:"AC",link:function(f,g,h){function k(a){a=l(a,1);h.$addClass(a)}function l(a,b){var c=g.data("$classCounts")||T(),d=[];q(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",
1526 1526 c);return d.join(" ")}function n(a,b){var e=c(b,a),f=c(a,b),e=l(e,1),f=l(f,-1);e&&e.length&&d.addClass(g,e);f&&f.length&&d.removeClass(g,f)}function m(a){if(!0===b||f.$index%2===b){var c=e(a||[]);if(!r)k(c);else if(!pa(a,r)){var d=e(r);n(d,c)}}r=K(a)?a.map(function(a){return ha(a)}):ha(a)}var r;f.$watch(h[a],m,!0);h.$observe("class",function(b){m(f.$eval(h[a]))});"ngClass"!==a&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var m=e(f.$eval(h[a]));g===b?k(m):(g=l(m,-1),h.$removeClass(g))}})}}}]}
1527 1527 function Jd(a){function b(a,b){b&&!f[a]?(k.addClass(e,a),f[a]=!0):!b&&f[a]&&(k.removeClass(e,a),f[a]=!1)}function d(a,c){a=a?"-"+zc(a,"-"):"";b(mb+a,!0===c);b(Nd+a,!1===c)}var c=a.ctrl,e=a.$element,f={},g=a.set,h=a.unset,k=a.$animate;f[Nd]=!(f[mb]=e.hasClass(mb));c.$setValidity=function(a,e,f){y(e)?(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&h(c.$pending,a,f),Od(c.$pending)&&(c.$pending=void 0));Da(e)?e?(h(c.$error,a,f),g(c.$$success,a,f)):(g(c.$error,a,f),h(c.$$success,a,f)):(h(c.$error,
1528 1528 a,f),h(c.$$success,a,f));c.$pending?(b(Pd,!0),c.$valid=c.$invalid=void 0,d("",null)):(b(Pd,!1),c.$valid=Od(c.$error),c.$invalid=!c.$valid,d("",c.$valid));e=c.$pending&&c.$pending[a]?void 0:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function Od(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}var zg=/^\/(.+)\/([a-z]*)$/,ua=Object.prototype.hasOwnProperty,P=function(a){return F(a)?a.toLowerCase():a},sb=function(a){return F(a)?a.toUpperCase():a},Ca,
1529 1529 B,Z,za=[].slice,Zf=[].splice,Ag=[].push,ma=Object.prototype.toString,sc=Object.getPrototypeOf,Aa=O("ng"),ea=v.angular||(v.angular={}),Sb,nb=0;Ca=v.document.documentMode;C.$inject=[];Xa.$inject=[];var K=Array.isArray,$d=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,V=function(a){return F(a)?a.trim():a},vd=function(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},Ea=function(){if(!x(Ea.rules)){var a=v.document.querySelector("[ng-csp]")||
1530 1530 v.document.querySelector("[data-ng-csp]");if(a){var b=a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");Ea.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=Ea;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ea.rules},pb=function(){if(x(pb.name_))return pb.name_;var a,b,d=Na.length,c,e;for(b=0;b<d;++b)if(c=Na[b],a=v.document.querySelector("["+c.replace(":","\\:")+"jq]")){e=a.getAttribute(c+
1531 1531 "jq");break}return pb.name_=e},ce=/:/g,Na=["ng-","data-ng-","ng:","x-ng-"],he=/[A-Z]/g,Ac=!1,Ma=3,le={full:"1.5.5",major:1,minor:5,dot:5,codeName:"material-conspiration"};U.expando="ng339";var eb=U.cache={},Nf=1;U._data=function(a){return this.cache[a[this.expando]]||{}};var If=/([\:\-\_]+(.))/g,Jf=/^moz([A-Z])/,wb={mouseleave:"mouseout",mouseenter:"mouseover"},Ub=O("jqLite"),Mf=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Tb=/<|&#?\w+;/,Kf=/<([\w:-]+)/,Lf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
1532 1532 ia={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option;ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead;ia.th=ia.td;var Sf=v.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Oa=U.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===
1533 1533 v.document.readyState?v.setTimeout(b):(this.on("DOMContentLoaded",b),U(v).on("load",b))},toString:function(){var a=[];q(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?B(this[a]):B(this[this.length+a])},length:0,push:Ag,sort:[].sort,splice:[].splice},Cb={};q("multiple selected checked disabled readOnly required open".split(" "),function(a){Cb[P(a)]=a});var Sc={};q("input select option textarea button form details".split(" "),function(a){Sc[a]=!0});var ad={ngMinlength:"minlength",
1534 1534 ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};q({data:Wb,removeData:db,hasData:function(a){for(var b in eb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b<d;b++)db(a[b])}},function(a,b){U[b]=a});q({data:Wb,inheritedData:Ab,scope:function(a){return B.data(a,"$scope")||Ab(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return B.data(a,"$isolateScope")||B.data(a,"$isolateScopeNoTemplate")},controller:Pc,injector:function(a){return Ab(a,
1535 1535 "$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:xb,css:function(a,b,d){b=cb(b);if(x(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Ma&&2!==c&&8!==c)if(c=P(b),Cb[c])if(x(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||C).specified?c:void 0;else if(x(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?void 0:a},prop:function(a,b,d){if(x(d))a[b]=
1536 1536 d;else return a[b]},text:function(){function a(a,d){if(y(d)){var c=a.nodeType;return 1===c||c===Ma?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(y(b)){if(a.multiple&&"select"===va(a)){var d=[];q(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(y(b))return a.innerHTML;ub(a,!0);a.innerHTML=b},empty:Qc},function(a,b){U.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==Qc&&y(2==a.length&&
1537 1537 a!==xb&&a!==Pc?b:c)){if(G(b)){for(e=0;e<g;e++)if(a===Wb)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}e=a.$dv;g=y(e)?Math.min(g,1):g;for(f=0;f<g;f++){var h=a(this[f],b,c);e=e?e+h:h}return e}for(e=0;e<g;e++)a(this[e],b,c);return this}});q({removeData:db,on:function(a,b,d,c){if(x(c))throw Ub("onargs");if(Kc(a)){c=vb(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=Pf(a,e));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,h=function(b,c,g){var h=e[b];h||(h=e[b]=[],h.specialHandlerWrapper=
1538 1538 c,"$destroy"===b||g||a.addEventListener(b,f,!1));h.push(d)};g--;)b=c[g],wb[b]?(h(wb[b],Rf),h(b,void 0,!0)):h(b)}},off:Oc,one:function(a,b,d){a=B(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;ub(a);q(new U(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];q(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,
1539 1539 b){var d=a.nodeType;if(1===d||11===d){b=new U(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;q(new U(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){Mc(a,B(b).eq(0).clone()[0])},remove:Bb,detach:function(a){Bb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;b=new U(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}},addClass:zb,removeClass:yb,toggleClass:function(a,b,d){b&&q(b.split(" "),
1540 1540 function(b){var e=d;y(e)&&(e=!xb(a,b));(e?zb:yb)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Vb,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=vb(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=
1541 1541 !0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:C,type:f,target:a},b.type&&(c=R(c,b)),b=ha(g),e=d?[c].concat(d):[c],q(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,e)})}},function(a,b){U.prototype[b]=function(b,c,e){for(var f,g=0,h=this.length;g<h;g++)y(f)?(f=a(this[g],b,c,e),x(f)&&(f=B(f))):Nc(f,a(this[g],b,c,e));return x(f)?f:this};U.prototype.bind=U.prototype.on;U.prototype.unbind=U.prototype.off});Ra.prototype={put:function(a,
1542 1542 b){this[Fa(a,this.nextUid)]=b},get:function(a){return this[Fa(a,this.nextUid)]},remove:function(a){var b=this[a=Fa(a,this.nextUid)];delete this[a];return b}};var Gf=[function(){this.$get=[function(){return Ra}]}],Uf=/^([^\(]+?)=>/,Vf=/^[^\(]*\(\s*([^\)]*)\)/m,Bg=/,/,Cg=/^\s*(_?)(\S+?)\1\s*$/,Tf=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ga=O("$injector");bb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw F(d)&&d||(d=a.name||Wf(a)),Ga("strictdi",d);
1543 1543 b=Tc(a);q(b[1].split(Bg),function(a){a.replace(Cg,function(a,b,d){c.push(d)})})}a.$inject=c}}else K(a)?(b=a.length-1,Pa(a[b],"fn"),c=a.slice(0,b)):Pa(a,"fn",!0);return c};var Qd=O("$animate"),Ze=function(){this.$get=C},$e=function(){var a=new Ra,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=F(b)?b.split(" "):K(b)?b:[],q(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){q(b,function(b){var c=a.get(b);if(c){var d=Xf(b.attr("class")),e="",f="";q(c,
1544 1544 function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});q(b,function(a){e&&zb(a,e);f&&yb(a,f)});a.remove(b)}});b.length=0}return{enabled:C,on:C,off:C,pin:C,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Xe=["$provide",function(a){var b=this;this.$$registeredAnimations=
1545 1545 Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw Qd("notcsel",d);var e=d+"-animation";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw Qd("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h<d.length;h++){var k=
1546 1546 d[h];if(1===k.nodeType){h=k;break a}}h=void 0}!h||h.parentNode||h.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"enter",Ha(h))},move:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"move",Ha(h))},leave:function(b,c){return a.push(b,"leave",Ha(c),function(){b.remove()})},addClass:function(b,
1547 1547 c,g){g=Ha(g);g.addClass=fb(g.addclass,c);return a.push(b,"addClass",g)},removeClass:function(b,c,g){g=Ha(g);g.removeClass=fb(g.removeClass,c);return a.push(b,"removeClass",g)},setClass:function(b,c,g,h){h=Ha(h);h.addClass=fb(h.addClass,c);h.removeClass=fb(h.removeClass,g);return a.push(b,"setClass",h)},animate:function(b,c,g,h,k){k=Ha(k);k.from=k.from?R(k.from,c):c;k.to=k.to?R(k.to,g):g;k.tempClasses=fb(k.tempClasses,h||"ng-inline-animate");return a.push(b,"animate",k)}}}]}],bf=function(){this.$get=
1548 1548 ["$$rAF",function(a){function b(b){d.push(b);1<d.length||a(function(){for(var a=0;a<d.length;a++)d[a]();d=[]})}var d=[];return function(){var a=!1;b(function(){a=!0});return function(d){a?d():b(d)}}}]},af=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$document","$timeout",function(a,b,d,c,e){function f(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){var d=c[0];d&&d.hidden?e(a,0,!1):b(a)};this._state=0}f.chain=function(a,b){function c(){if(d===a.length)b(!0);
1549 1549 else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};f.all=function(a,b){function c(f){e=e&&f;++d===a.length&&b(e)}var d=0,e=!0;q(a,function(a){a.done(c)})};f.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:C,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},
1550 1550 "finally":function(a){return this.getPromise()["finally"](a)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._tick(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(q(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=
1551 1551 0,this._state=2)}};return f}]},Ye=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(a,b,d){return function(b,e){function f(){a(function(){g.addClass&&(b.addClass(g.addClass),g.addClass=null);g.removeClass&&(b.removeClass(g.removeClass),g.removeClass=null);g.to&&(b.css(g.to),g.to=null);h||k.complete();h=!0});return k}var g=e||{};g.$$prepared||(g=qa(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var h,k=new d;return{start:f,end:f}}}]},ga=O("$compile"),Zb=new function(){};
1552 1552 Cc.$inject=["$provide","$$sanitizeUriProvider"];Db.prototype.isFirstChange=function(){return this.previousValue===Zb};var Vc=/^((?:x|data)[\:\-_])/i,$f=O("$controller"),bd=/^(\S+)(\s+as\s+([\w$]+))?$/,hf=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof B&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},cd="application/json",bc={"Content-Type":cd+";charset=utf-8"},bg=/^\[|^\{(?!\{)/,cg={"[":/]$/,"{":/}$/},ag=/^\)\]\}',?\n/,Dg=O("$http"),gd=function(a){return function(){throw Dg("legacy",
1553 1553 a);}},Ja=ea.$interpolateMinErr=O("$interpolate");Ja.throwNoconcat=function(a){throw Ja("noconcat",a);};Ja.interr=function(a,b){return Ja("interr",a,b.toString())};var Eg=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,eg={http:80,https:443,ftp:21},Eb=O("$location"),Fg={$$html5:!1,$$replace:!1,absUrl:Fb("$$absUrl"),url:function(a){if(y(a))return this.$$url;var b=Eg.exec(a);(b[1]||""===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||"");this.hash(b[5]||"");return this},protocol:Fb("$$protocol"),
1554 1554 host:Fb("$$host"),port:Fb("$$port"),path:ld("$$path",function(a){a=null!==a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(F(a)||Q(a))a=a.toString(),this.$$search=xc(a);else if(G(a))a=qa(a,{}),q(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw Eb("isrcharg");break;default:y(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:ld("$$hash",function(a){return null!==
1555 1555 a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};q([kd,ec,dc],function(a){a.prototype=Object.create(Fg);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==dc||!this.$$html5)throw Eb("nostate");this.$$state=y(b)?null:b;return this}});var ca=O("$parse"),gg=Function.prototype.call,hg=Function.prototype.apply,ig=Function.prototype.bind,Mb=T();q("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(a){Mb[a]=!0});var Gg={n:"\n",f:"\f",r:"\r",
1556 1556 t:"\t",v:"\v","'":"'",'"':'"'},gc=function(a){this.options=a};gc.prototype={constructor:gc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;
1557 1557 else{var b=a+this.peek(),d=b+this.peek(2),c=Mb[b],e=Mb[d];Mb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||
1558 1558 "\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)},isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,
1559 1559 b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=x(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ca("lexerr",
1560 1560 a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=P(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var c=this.peek();if("e"==d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,text:a,constant:!0,value:Number(a)})},
1561 1561 readIdent:function(){var a=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var b=this.peekMultichar();if(!this.isIdentifierContinue(b))break;this.index+=b.length}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index),c=c+f;if(e)"u"===f?(e=this.text.substring(this.index+1,this.index+5),e.match(/[\da-f]{4}/i)||
1562 1562 this.throwError("Invalid unicode escape [\\u"+e+"]"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=Gg[f]||f,e=!1;else if("\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=f}this.index++}this.throwError("Unterminated quote",b)}};var s=function(a,b){this.lexer=a;this.options=b};s.Program="Program";s.ExpressionStatement="ExpressionStatement";s.AssignmentExpression="AssignmentExpression";s.ConditionalExpression="ConditionalExpression";
1563 1563 s.LogicalExpression="LogicalExpression";s.BinaryExpression="BinaryExpression";s.UnaryExpression="UnaryExpression";s.CallExpression="CallExpression";s.MemberExpression="MemberExpression";s.Identifier="Identifier";s.Literal="Literal";s.ArrayExpression="ArrayExpression";s.Property="Property";s.ObjectExpression="ObjectExpression";s.ThisExpression="ThisExpression";s.LocalsExpression="LocalsExpression";s.NGValueParameter="NGValueParameter";s.prototype={ast:function(a){this.text=a;this.tokens=this.lexer.lex(a);
1564 1564 a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:s.Program,body:a}},expressionStatement:function(){return{type:s.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},expression:function(){return this.assignment()},
1565 1565 assignment:function(){var a=this.ternary();this.expect("=")&&(a={type:s.AssignmentExpression,left:a,right:this.assignment(),operator:"="});return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?(d=this.expression(),{type:s.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:s.LogicalExpression,operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=
1566 1566 this.equality();this.expect("&&");)a={type:s.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),
1567 1567 b;b=this.expect("+","-");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):
1568 1568 this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=qa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:s.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:s.CallExpression,
1569 1569 callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:s.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==
1570 1570 this.peekToken().text){do a.push(this.expression());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:s.ArrayExpression,elements:a}},
1571 1571 object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:s.Property,kind:"init"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");b.value=this.expression();a.push(b)}while(this.expect(","))}this.consume("}");return{type:s.ObjectExpression,properties:a}},throwError:function(a,b){throw ca("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===
1572 1572 this.tokens.length)throw ca("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ca("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?
1573 1573 (this.tokens.shift(),a):!1},selfReferential:{"this":{type:s.ThisExpression},$locals:{type:s.LocalsExpression}}};sd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};aa(c,d.$filter);var e="",f;this.stage="assign";if(f=qd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),e="fn.assign="+this.generateFunction("assign","s,v,l");f=od(c.body);
1574 1574 d.stage="inputs";q(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext",
1575 1575 "ifDefined","plus","text",e))(this.$filter,Ta,sa,md,fg,Gb,jg,nd,a);this.state=this.stage=void 0;e.literal=rd(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;q(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;q(this.state.filters,
1576 1576 function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,h,k=this,l,n;c=c||C;if(!f&&x(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case s.Program:q(a.body,function(b,c){k.recurse(b.expression,
1577 1577 void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case s.Literal:n=this.escape(a.value);this.assign(b,n);c(n);break;case s.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});n=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,n);c(n);break;case s.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){h=a});n="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,
1578 1578 0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,n);c(n);break;case s.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case s.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case s.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",
1579 1579 a.name)+"?l:s"),d.computed=!1,d.name=a.name);Ta(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Hb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case s.MemberExpression:g=d&&(d.context=this.nextId())||
1580 1580 this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){e&&1!==e&&k.addEnsureSafeAssignContext(g);if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),n=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,n),d&&(d.computed=!0,d.name=h);else{Ta(a.property.name);e&&1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),
1581 1581 k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));n=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Hb(a.property.name))n=k.ensureSafeObject(n);k.assign(b,n);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case s.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],q(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),n=h+"("+l.join(",")+")",k.assign(b,n),c(b)):(h=k.nextId(),g={},l=
1582 1582 [],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);q(a.arguments,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),n=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):n=h+"("+l.join(",")+")";n=k.ensureSafeObject(n);k.assign(b,n)},function(){k.assign(b,"undefined")});c(b)}));break;case s.AssignmentExpression:h=this.nextId();g={};if(!pd(a.left))throw ca("lval");
1583 1583 this.recurse(a.left,void 0,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);n=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,n);c(b||n)})},1);break;case s.ArrayExpression:l=[];q(a.elements,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(a)})});n="["+l.join(",")+"]";this.assign(b,n);c(n);break;case s.ObjectExpression:l=[];q(a.properties,function(a){k.recurse(a.value,
1584 1584 k.nextId(),void 0,function(b){l.push(k.escape(a.key.type===s.Identifier?a.key.name:""+a.key.value)+":"+b)})});n="{"+l.join(",")+"}";this.assign(b,n);c(n);break;case s.ThisExpression:this.assign(b,"s");c("s");break;case s.LocalsExpression:this.assign(b,"l");c("l");break;case s.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,
1585 1585 "=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+
1586 1586 "!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/[$_a-zA-Z][$_a-zA-Z0-9]*/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),
1587 1587 ";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g=
1588 1588 this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(F(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(Q(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ca("esc");},nextId:function(a,
1589 1589 b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};td.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;aa(c,d.$filter);var e,f;if(e=qd(c))f=this.recurse(e);e=od(c.body);var g;e&&(g=[],q(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];q(c.body,function(a){h.push(d.recurse(a.expression))});e=0===c.body.length?C:1===
1590 1590 c.body.length?h[0]:function(a,b){var c;q(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=rd(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,b);case s.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case s.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right),
1591 1591 this["binary"+a.operator](c,e,b);case s.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case s.Identifier:return Ta(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Hb(a.name),b,d,f.expression);case s.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Ta(a.property.name,f.expression),
1592 1592 e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case s.CallExpression:return g=[],q(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var m=[],r=0;r<g.length;++r)m.push(g[r](a,c,d,f));a=e.apply(void 0,m,f);return b?{context:void 0,name:void 0,value:a}:a}:function(a,
1593 1593 c,d,n){var m=e(a,c,d,n),r;if(null!=m.value){sa(m.context,f.expression);md(m.value,f.expression);r=[];for(var q=0;q<g.length;++q)r.push(sa(g[q](a,c,d,n),f.expression));r=sa(m.value.apply(m.context,r),f.expression)}return b?{value:r}:r};case s.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,g,n){var m=c(a,d,g,n);a=e(a,d,g,n);sa(m.value,f.expression);Gb(m.context);m.context[m.name]=a;return b?{value:a}:a};case s.ArrayExpression:return g=[],q(a.elements,function(a){g.push(f.recurse(a))}),
1594 1594 function(a,c,d,e){for(var f=[],r=0;r<g.length;++r)f.push(g[r](a,c,d,e));return b?{value:f}:f};case s.ObjectExpression:return g=[],q(a.properties,function(a){g.push({key:a.key.type===s.Identifier?a.key.name:""+a.key.value,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},r=0;r<g.length;++r)f[g[r].key]=g[r].value(a,c,d,e);return b?{value:f}:f};case s.ThisExpression:return function(a){return b?{value:a}:a};case s.LocalsExpression:return function(a,c){return b?{value:c}:c};case s.NGValueParameter:return function(a,
1595 1595 c,d){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=x(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=x(d)?-d:0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=nd(h,c);return d?{value:h}:h}},"binary-":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);
1596 1596 h=(x(h)?h:0)-(x(c)?c:0);return d?{value:h}:h}},"binary*":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,e,f,g){c=a(c,
1597 1597 e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,
1598 1598 g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,
1599 1599 name:void 0,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f=g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:void 0;b&&sa(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),n,m;null!=l&&(n=b(f,g,h,k),n+="",Ta(n,e),c&&1!==c&&(Gb(l),l&&!l[n]&&(l[n]={})),m=l[n],sa(m,e));return d?{context:l,name:n,value:m}:m}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&(Gb(g),
1600 1600 g&&!g[b]&&(g[b]={}));h=null!=g?g[b]:void 0;(d||Hb(b))&&sa(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var hc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new s(a,d);this.astCompiler=d.csp?new td(this.ast,b):new sd(this.ast,b)};hc.prototype={constructor:hc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var kg=Object.prototype.valueOf,ta=O("$sce"),oa={HTML:"html",CSS:"css",
1601 1601 URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},mg=O("$compile"),Y=v.document.createElement("a"),xd=ra(v.location.href);yd.$inject=["$document"];Jc.$inject=["$provide"];var Fd=22,Ed=".",jc="0";zd.$inject=["$locale"];Bd.$inject=["$locale"];var xg={yyyy:W("FullYear",4,0,!1,!0),yy:W("FullYear",2,0,!0,!0),y:W("FullYear",1,0,!1,!0),MMMM:ib("Month"),MMM:ib("Month",!0),MM:W("Month",2,1),M:W("Month",1,1),LLLL:ib("Month",!1,!0),dd:W("Date",2),d:W("Date",1),HH:W("Hours",2),H:W("Hours",1),hh:W("Hours",2,-12),
1602 1602 h:W("Hours",1,-12),mm:W("Minutes",2),m:W("Minutes",1),ss:W("Seconds",2),s:W("Seconds",1),sss:W("Milliseconds",3),EEEE:ib("Day"),EEE:ib("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Ib(Math[0<a?"floor":"ceil"](a/60),2)+Ib(Math.abs(a%60),2))},ww:Hd(2),w:Hd(1),G:kc,GG:kc,GGG:kc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},wg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,
1603 1603 vg=/^\-?\d+$/;Ad.$inject=["$locale"];var qg=da(P),rg=da(sb);Cd.$inject=["$parse"];var ne=da({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ma.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),tb={};q(Cb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a,
1604 1604 b,e){e.ngModel!==e[c]&&d(a,b,e)});tb[c]=function(){return{restrict:"A",priority:100,link:e}}}});q(ad,function(a,b){tb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(zg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});q(["src","srcset","href"],function(a){var b=xa("ng-"+a);tb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===
1605 1605 ma.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ca&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Jb={$addControl:C,$$renameControl:function(a,b){a.$name=b},$removeControl:C,$setValidity:C,$setDirty:C,$setPristine:C,$setSubmitted:C};Id.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Rd=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||C}return{name:"form",
1606 1606 restrict:a?"EAC":"E",require:["form","^^?form"],controller:Id,compile:function(d,f){d.addClass(Ua).addClass(mb);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var m=f[0];if(!("action"in e)){var r=function(b){a.$apply(function(){m.$commitViewValue();m.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",r,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",r,!1)},0,!1)})}(f[1]||m.$$parentForm).$addControl(m);var q=g?c(m.$name):C;g&&
1607 1607 (q(a,m),e.$observe(g,function(b){m.$name!==b&&(q(a,void 0),m.$$parentForm.$$renameControl(m,b),q=c(m.$name),q(a,m))}));d.on("$destroy",function(){m.$$parentForm.$removeControl(m);q(a,void 0);R(m,Jb)})}}}}}]},oe=Rd(),Be=Rd(!0),yg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,Hg=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Ig=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,
1608 1608 Jg=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Sd=/^(\d{4,})-(\d{2})-(\d{2})$/,Td=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,nc=/^(\d{4,})-W(\d\d)$/,Ud=/^(\d{4,})-(\d\d)$/,Vd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Kd=T();q(["date","datetime-local","month","time","week"],function(a){Kd[a]=!0});var Wd={text:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c)},date:kb("date",Sd,Lb(Sd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":kb("datetimelocal",Td,Lb(Td,"yyyy MM dd HH mm ss sss".split(" ")),
1609 1609 "yyyy-MM-ddTHH:mm:ss.sss"),time:kb("time",Vd,Lb(Vd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:kb("week",nc,function(a,b){if(fa(a))return a;if(F(a)){nc.lastIndex=0;var d=nc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Gd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:kb("month",Ud,Lb(Ud,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Ld(a,b,d,c);jb(a,b,d,c,e,f);c.$$parserName=
1610 1610 "number";c.$parsers.push(function(a){if(c.$isEmpty(a))return null;if(Jg.test(a))return parseFloat(a)});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!Q(a))throw lb("numfmt",a);a=a.toString()}return a});if(x(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||y(g)||a>=g};d.$observe("min",function(a){x(a)&&!Q(a)&&(a=parseFloat(a,10));g=Q(a)&&!isNaN(a)?a:void 0;c.$validate()})}if(x(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||y(h)||a<=h};d.$observe("max",
1611 1611 function(a){x(a)&&!Q(a)&&(a=parseFloat(a,10));h=Q(a)&&!isNaN(a)?a:void 0;c.$validate()})}},url:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||Hg.test(d)}},email:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||Ig.test(d)}},radio:function(a,b,d,c){y(d.name)&&b.attr("name",++nb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value,
1612 1612 a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Md(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Md(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return pa(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:C,button:C,submit:C,reset:C,
1613 1613 file:C},Dc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Wd[P(g.type)]||Wd.text)(e,f,g,h[0],b,a,d,c)}}}}],Kg=/^(true|false|\d+)$/,Te=function(){return{restrict:"A",priority:100,compile:function(a,b){return Kg.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},te=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);
1614 1614 return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=y(a)?"":a})}}}}],ve=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=y(a)?"":a})}}}}],ue=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=
1615 1615 b(e.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||"")})}}}}],Se=da({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),we=mc("",!0),ye=mc("Odd",0),xe=mc("Even",1),ze=La({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Ae=[function(){return{restrict:"A",scope:!0,controller:"@",
1616 1616 priority:500}}],Ic={},Lg={blur:!0,focus:!0};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);Ic[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};Lg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var De=["$animate","$compile",function(a,
1617 1617 b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var h,k,l;d.$watch(e.ngIf,function(d){d?k||g(function(d,f){k=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=rb(h.clone),a.leave(l).then(function(){l=null}),h=null))})}}}],Ee=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,
1618 1618 transclude:"element",controller:ea.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,n,m,r){var q=0,s,w,p,y=function(){w&&(w.remove(),w=null);s&&(s.$destroy(),s=null);p&&(d.leave(p).then(function(){w=null}),w=p,p=null)};c.$watch(f,function(f){var n=function(){!x(h)||h&&!c.$eval(h)||b()},u=++q;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&u===q){var b=c.$new();m.template=a;a=r(b,function(a){y();d.enter(a,null,e).then(n)});s=b;p=a;s.$emit("$includeContentLoaded",
1619 1619 f);c.$eval(g)}},function(){c.$$destroyed||u!==q||(y(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(y(),m.template=null)})}}}}],Ve=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){ma.call(d[0]).match(/SVG/)?(d.empty(),a(Lc(e.template,v.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],Fe=La({priority:450,compile:function(){return{pre:function(a,
1620 1620 b,d){a.$eval(d.ngInit)}}}}),Re=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?V(e):e;c.$parsers.push(function(a){if(!y(a)){var b=[];a&&q(a.split(g),function(a){a&&b.push(f?V(a):a)});return b}});c.$formatters.push(function(a){if(K(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},mb="ng-valid",Nd="ng-invalid",Ua="ng-pristine",Kb="ng-dirty",Pd="ng-pending",lb=O("ngModel"),Mg=["$scope",
1621 1621 "$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=l(d.name||"",!1)(a);
1622 1622 this.$$parentForm=Jb;var n=e(d.ngModel),m=n.assign,r=n,s=m,v=null,w,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");r=function(a){var c=n(a);E(c)&&(c=b(a));return c};s=function(a,b){E(n(a))?f(a,{$$$p:b}):m(a,b)}}else if(!n.assign)throw lb("nonassign",d.ngModel,wa(c));};this.$render=C;this.$isEmpty=function(a){return y(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){p.$isEmpty(a)?(f.removeClass(c,"ng-not-empty"),
1623 1623 f.addClass(c,"ng-empty")):(f.removeClass(c,"ng-empty"),f.addClass(c,"ng-not-empty"))};var H=0;Jd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;f.removeClass(c,Kb);f.addClass(c,Ua)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;f.removeClass(c,Ua);f.addClass(c,Kb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")};
1624 1624 this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(v);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!Q(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:void 0,p.$modelValue!==c&&p.$$writeModelToScope())})}};
1625 1625 this.$$runValidators=function(a,b,c){function d(){var c=!0;q(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(q(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;q(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!E(h.then))throw lb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},C):g(!0)}function f(a,b){h===H&&p.$setValidity(a,b)}function g(a){h===H&&c(a)}H++;var h=
1626 1626 H;(function(){var a=p.$$parserName||"parse";if(y(w))f(a,null);else return w||(q(p.$validators,function(a,b){f(b,null)}),q(p.$asyncValidators,function(a,b){f(b,null)})),f(a,w),w;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(v);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$updateEmptyClasses(a),p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;
1627 1627 if(w=y(b)?void 0:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),y(b)){w=!1;break}Q(p.$modelValue)&&isNaN(p.$modelValue)&&(p.$modelValue=r(a));var d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$rawModelValue=b;e&&(p.$modelValue=b,p.$modelValue!==d&&p.$$writeModelToScope());p.$$runValidators(b,p.$$lastCommittedViewValue,function(a){e||(p.$modelValue=a?b:void 0,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){s(a,p.$modelValue);q(p.$viewChangeListeners,
1628 1628 function(a){try{a()}catch(c){b(c)}})};this.$setViewValue=function(a,b){p.$viewValue=a;p.$options&&!p.$options.updateOnDefault||p.$$debounceViewValueCommit(b)};this.$$debounceViewValueCommit=function(b){var c=0,d=p.$options;d&&x(d.debounce)&&(d=d.debounce,Q(d)?c=d:Q(d[b])?c=d[b]:Q(d["default"])&&(c=d["default"]));g.cancel(v);c?v=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=r(a);if(b!==p.$modelValue&&(p.$modelValue===
1629 1629 p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;w=void 0;for(var c=p.$formatters,d=c.length,e=b;d--;)e=c[d](e);p.$viewValue!==e&&(p.$$updateEmptyClasses(e),p.$viewValue=p.$$lastCommittedViewValue=e,p.$render(),p.$$runValidators(b,e,C))}return b})}],Qe=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Mg,priority:1,compile:function(b){b.addClass(Ua).addClass("ng-untouched").addClass(mb);return{pre:function(a,b,e,f){var g=f[0];b=f[1]||
1630 1630 g.$$parentForm;g.$$setOptions(f[2]&&f[2].$options);b.$addControl(g);e.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)c.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],Ng=/(\s+|^)default(\s+|$)/,Ue=function(){return{restrict:"A",
1631 1631 controller:["$scope","$attrs",function(a,b){var d=this;this.$options=qa(a.$eval(b.ngModelOptions));x(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=V(this.$options.updateOn.replace(Ng,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Ge=La({terminal:!0,priority:1E3}),Og=O("ngOptions"),Pg=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,
1632 1632 Oe=["$compile","$document","$parse",function(a,b,d){function c(a,b,c){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function f(a){var b;if(!q&&ya(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var m=a.match(Pg);if(!m)throw Og("iexp",a,wa(b));var r=m[5]||m[7],q=m[6];a=/ as /.test(m[0])&&m[1];var s=m[9];b=d(m[2]?m[1]:r);var w=a&&d(a)||b,p=s&&d(s),v=s?function(a,b){return p(c,b)}:function(a){return Fa(a)},
1633 1633 t=function(a,b){return v(a,L(a,b))},z=d(m[2]||m[1]),u=d(m[3]||""),y=d(m[4]||""),x=d(m[8]),D={},L=q?function(a,b){D[q]=b;D[r]=a;return D}:function(a){D[r]=a;return D};return{trackBy:s,getTrackByValue:t,getWatchables:d(x,function(a){var b=[];a=a||[];for(var d=f(a),e=d.length,g=0;g<e;g++){var h=a===d?g:d[g],l=a[h],h=L(l,h),l=v(l,h);b.push(l);if(m[2]||m[1])l=z(c,h),b.push(l);m[4]&&(h=y(c,h),b.push(h))}return b}),getOptions:function(){for(var a=[],b={},d=x(c)||[],g=f(d),h=g.length,m=0;m<h;m++){var p=d===
1634 1634 g?m:g[m],q=L(d[p],p),r=w(c,q),p=v(r,q),D=z(c,q),N=u(c,q),q=y(c,q),r=new e(p,r,D,N,q);a.push(r);b[p]=r}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[t(a)]},getViewValueFromOption:function(a){return s?ea.copy(a.viewValue):a.viewValue}}}}}var e=v.document.createElement("option"),f=v.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=C},post:function(d,h,k,l){function n(a,b){a.element=
1635 1635 b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);a.value!==b.value&&(b.value=a.selectValue)}function m(){var a=u&&r.readValue();if(u)for(var b=u.items.length-1;0<=b;b--){var c=u.items[b];c.group?Bb(c.element.parentNode):Bb(c.element)}u=I.getOptions();var d={};t&&h.prepend(w);u.items.forEach(function(a){var b;if(x(a.group)){b=d[a.group];b||(b=f.cloneNode(!1),E.appendChild(b),b.label=a.group,d[a.group]=b);var c=e.cloneNode(!1)}else b=E,c=e.cloneNode(!1);b.appendChild(c);
1636 1636 n(a,c)});h[0].appendChild(E);s.$render();s.$isEmpty(a)||(b=r.readValue(),(I.trackBy||v?pa(a,b):a===b)||(s.$setViewValue(b),s.$render()))}var r=l[0],s=l[1],v=k.multiple,w;l=0;for(var p=h.children(),y=p.length;l<y;l++)if(""===p[l].value){w=p.eq(l);break}var t=!!w,z=B(e.cloneNode(!1));z.val("?");var u,I=c(k.ngOptions,h,d),E=b[0].createDocumentFragment();v?(s.$isEmpty=function(a){return!a||0===a.length},r.writeValue=function(a){u.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){if(a=
1637 1637 u.getOptionFromViewValue(a))a.element.selected=!0})},r.readValue=function(){var a=h.val()||[],b=[];q(a,function(a){(a=u.selectValueMap[a])&&!a.disabled&&b.push(u.getViewValueFromOption(a))});return b},I.trackBy&&d.$watchCollection(function(){if(K(s.$viewValue))return s.$viewValue.map(function(a){return I.getTrackByValue(a)})},function(){s.$render()})):(r.writeValue=function(a){var b=u.getOptionFromViewValue(a);b?(h[0].value!==b.selectValue&&(z.remove(),t||w.remove(),h[0].value=b.selectValue,b.element.selected=
1638 1638 !0),b.element.setAttribute("selected","selected")):null===a||t?(z.remove(),t||h.prepend(w),h.val(""),w.prop("selected",!0),w.attr("selected",!0)):(t||w.remove(),h.prepend(z),h.val("?"),z.prop("selected",!0),z.attr("selected",!0))},r.readValue=function(){var a=u.selectValueMap[h.val()];return a&&!a.disabled?(t||w.remove(),z.remove(),u.getViewValueFromOption(a)):null},I.trackBy&&d.$watch(function(){return I.getTrackByValue(s.$viewValue)},function(){s.$render()}));t?(w.remove(),a(w)(d),w.removeClass("ng-scope")):
1639 1639 w=B(e.cloneNode(!1));h.empty();m();d.$watchCollection(I.getWatchables,m)}}}}],He=["$locale","$interpolate","$log",function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,g,h){function k(a){g.text(a||"")}var l=h.count,n=h.$attr.when&&g.attr(h.$attr.when),m=h.offset||0,r=f.$eval(n)||{},s={},v=b.startSymbol(),w=b.endSymbol(),p=v+l+"-"+m+w,x=ea.noop,t;q(h,function(a,b){var c=e.exec(b);c&&(c=(c[1]?"-":"")+P(c[2]),r[c]=g.attr(h.$attr[b]))});q(r,function(a,d){s[d]=b(a.replace(c,p))});f.$watch(l,
1640 1640 function(b){var c=parseFloat(b),e=isNaN(c);e||c in r||(c=a.pluralCat(c-m));c===t||e&&Q(t)&&isNaN(t)||(x(),e=s[c],y(e)?(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+n),x=C,k()):x=f.$watch(e,k),t=c)})}}}],Ie=["$parse","$animate","$compile",function(a,b,d){var c=O("ngRepeat"),e=function(a,b,c,d,e,n,m){a[c]=d;e&&(a[e]=n);a.$index=b;a.$first=0===b;a.$last=b===m-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,
1641 1641 terminal:!0,$$tlb:!0,compile:function(f,g){var h=g.ngRepeat,k=d.$$createComment("end ngRepeat",h),l=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw c("iexp",h);var n=l[1],m=l[2],r=l[3],s=l[4],l=n.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);if(!l)throw c("iidexp",n);var v=l[3]||l[1],w=l[2];if(r&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(r)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(r)))throw c("badident",
1642 1642 r);var p,y,t,z,u={$id:Fa};s?p=a(s):(t=function(a,b){return Fa(b)},z=function(a){return a});return function(a,d,f,g,l){p&&(y=function(b,c,d){w&&(u[w]=b);u[v]=c;u.$index=d;return p(a,u)});var n=T();a.$watchCollection(m,function(f){var g,m,p=d[0],s,u=T(),x,D,E,C,F,B,G;r&&(a[r]=f);if(ya(f))F=f,m=y||t;else for(G in m=y||z,F=[],f)ua.call(f,G)&&"$"!==G.charAt(0)&&F.push(G);x=F.length;G=Array(x);for(g=0;g<x;g++)if(D=f===F?g:F[g],E=f[D],C=m(D,E,g),n[C])B=n[C],delete n[C],u[C]=B,G[g]=B;else{if(u[C])throw q(G,
1643 1643 function(a){a&&a.scope&&(n[a.id]=a)}),c("dupes",h,C,E);G[g]={id:C,scope:void 0,clone:void 0};u[C]=!0}for(s in n){B=n[s];C=rb(B.clone);b.leave(C);if(C[0].parentNode)for(g=0,m=C.length;g<m;g++)C[g].$$NG_REMOVED=!0;B.scope.$destroy()}for(g=0;g<x;g++)if(D=f===F?g:F[g],E=f[D],B=G[g],B.scope){s=p;do s=s.nextSibling;while(s&&s.$$NG_REMOVED);B.clone[0]!=s&&b.move(rb(B.clone),null,p);p=B.clone[B.clone.length-1];e(B.scope,g,v,E,w,D,x)}else l(function(a,c){B.scope=c;var d=k.cloneNode(!1);a[a.length++]=d;b.enter(a,
1644 1644 null,p);p=d;B.clone=a;u[B.id]=B;e(B.scope,g,v,E,w,D,x)});n=u})}}}}],Je=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ce=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ke=La(function(a,b,d){a.$watch(d.ngStyle,function(a,
1645 1645 d){d&&a!==d&&q(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),Le=["$animate","$compile",function(a,b){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(d,c,e,f){var g=[],h=[],k=[],l=[],n=function(a,b){return function(){a.splice(b,1)}};d.$watch(e.ngSwitch||e.on,function(c){var d,e;d=0;for(e=k.length;d<e;++d)a.cancel(k[d]);d=k.length=0;for(e=l.length;d<e;++d){var s=rb(h[d].clone);l[d].$destroy();(k[d]=a.leave(s)).then(n(k,d))}h.length=0;l.length=0;(g=f.cases["!"+
1646 1646 c]||f.cases["?"])&&q(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.$$createComment("end ngSwitchWhen");h.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],Me=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["!"+d.ngSwitchWhen]=c.cases["!"+d.ngSwitchWhen]||[];c.cases["!"+d.ngSwitchWhen].push({transclude:e,element:b})}}),Ne=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,
1647 1647 b,d,c,e){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:e,element:b})}}),Qg=O("ngTransclude"),Pe=La({restrict:"EAC",link:function(a,b,d,c,e){d.ngTransclude===d.$attr.ngTransclude&&(d.ngTransclude="");if(!e)throw Qg("orphan",wa(b));e(function(a){a.length&&(b.empty(),b.append(a))},null,d.ngTransclude||d.ngTranscludeSlot)}}),pe=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"==d.type&&a.put(d.id,b[0].text)}}}],Rg={$setViewValue:C,$render:C},
1648 1648 Sg=["$element","$scope",function(a,b){var d=this,c=new Ra;d.ngModelCtrl=Rg;d.unknownOption=B(v.document.createElement("option"));d.renderUnknownOption=function(b){b="? "+Fa(b)+" ?";d.unknownOption.val(b);a.prepend(d.unknownOption);a.val(b)};b.$on("$destroy",function(){d.renderUnknownOption=C});d.removeUnknownOption=function(){d.unknownOption.parent()&&d.unknownOption.remove()};d.readValue=function(){d.removeUnknownOption();return a.val()};d.writeValue=function(b){d.hasOption(b)?(d.removeUnknownOption(),
1649 1649 a.val(b),""===b&&d.emptyOption.prop("selected",!0)):null==b&&d.emptyOption?(d.removeUnknownOption(),a.val("")):d.renderUnknownOption(b)};d.addOption=function(a,b){if(8!==b[0].nodeType){Qa(a,'"option value"');""===a&&(d.emptyOption=b);var g=c.get(a)||0;c.put(a,g+1);d.ngModelCtrl.$render();b[0].hasAttribute("selected")&&(b[0].selected=!0)}};d.removeOption=function(a){var b=c.get(a);b&&(1===b?(c.remove(a),""===a&&(d.emptyOption=void 0)):c.put(a,b-1))};d.hasOption=function(a){return!!c.get(a)};d.registerOption=
1650 1650 function(a,b,c,h,k){if(h){var l;c.$observe("value",function(a){x(l)&&d.removeOption(l);l=a;d.addOption(a,b)})}else k?a.$watch(k,function(a,e){c.$set("value",a);e!==a&&d.removeOption(e);d.addOption(a,b)}):d.addOption(c.value,b);b.on("$destroy",function(){d.removeOption(c.value);d.ngModelCtrl.$render()})}}],qe=function(){return{restrict:"E",require:["select","?ngModel"],controller:Sg,priority:1,link:{pre:function(a,b,d,c){var e=c[1];if(e){var f=c[0];f.ngModelCtrl=e;b.on("change",function(){a.$apply(function(){e.$setViewValue(f.readValue())})});
1651 1651 if(d.multiple){f.readValue=function(){var a=[];q(b.find("option"),function(b){b.selected&&a.push(b.value)});return a};f.writeValue=function(a){var c=new Ra(a);q(b.find("option"),function(a){a.selected=x(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==e.$viewValue||pa(g,e.$viewValue)||(g=ha(e.$viewValue),e.$render());h=e.$viewValue});e.$isEmpty=function(a){return!a||0===a.length}}}},post:function(a,b,d,c){var e=c[1];if(e){var f=c[0];e.$render=function(){f.writeValue(e.$viewValue)}}}}}},se=["$interpolate",
1652 1652 function(a){return{restrict:"E",priority:100,compile:function(b,d){if(x(d.value))var c=a(d.value,!0);else{var e=a(b.text(),!0);e||d.$set("value",b.text())}return function(a,b,d){var k=b.parent();(k=k.data("$selectController")||k.parent().data("$selectController"))&&k.registerOption(a,b,d,c,e)}}}}],re=da({restrict:"E",terminal:!1}),Fc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe("required",
1653 1653 function(){c.$validate()}))}}},Ec=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e,f=d.ngPattern||d.pattern;d.$observe("pattern",function(a){F(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw O("ngPattern")("noregexp",f,a,wa(b));e=a||void 0;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||y(e)||e.test(b)}}}}},Hc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=-1;d.$observe("maxlength",function(a){a=
1654 1654 X(a);e=isNaN(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>e||c.$isEmpty(b)||b.length<=e}}}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=X(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};v.angular.bootstrap?v.console&&console.log("WARNING: Tried to load angular more than once."):(ie(),ke(ea),ea.module("ngLocale",[],["$provide",function(a){function b(a){a+=
1655 1655 "";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),
1656 1656 WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,
1657 1657 c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),B(v.document).ready(function(){ee(v.document,yc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
1658 1658 //# sourceMappingURL=angular.min.js.map
1659 1659
1660 1660 ;/*
1661 1661 AngularJS v1.5.5
1662 1662 (c) 2010-2016 Google, Inc. http://angularjs.org
1663 1663 License: MIT
1664 1664 */
1665 1665 (function(n,c){'use strict';function l(b,a,g){var d=g.baseHref(),k=b[0];return function(b,e,f){var g,h;f=f||{};h=f.expires;g=c.isDefined(f.path)?f.path:d;c.isUndefined(e)&&(h="Thu, 01 Jan 1970 00:00:00 GMT",e="");c.isString(h)&&(h=new Date(h));e=encodeURIComponent(b)+"="+encodeURIComponent(e);e=e+(g?";path="+g:"")+(f.domain?";domain="+f.domain:"");e+=h?";expires="+h.toUTCString():"";e+=f.secure?";secure":"";f=e.length+1;4096<f&&a.warn("Cookie '"+b+"' possibly not set or overflowed because it was too large ("+
1666 1666 f+" > 4096 bytes)!");k.cookie=e}}c.module("ngCookies",["ng"]).provider("$cookies",[function(){var b=this.defaults={};this.$get=["$$cookieReader","$$cookieWriter",function(a,g){return{get:function(d){return a()[d]},getObject:function(d){return(d=this.get(d))?c.fromJson(d):d},getAll:function(){return a()},put:function(d,a,m){g(d,a,m?c.extend({},b,m):b)},putObject:function(d,b,a){this.put(d,c.toJson(b),a)},remove:function(a,k){g(a,void 0,k?c.extend({},b,k):b)}}}]}]);c.module("ngCookies").factory("$cookieStore",
1667 1667 ["$cookies",function(b){return{get:function(a){return b.getObject(a)},put:function(a,c){b.putObject(a,c)},remove:function(a){b.remove(a)}}}]);l.$inject=["$document","$log","$browser"];c.module("ngCookies").provider("$$cookieWriter",function(){this.$get=l})})(window,window.angular);
1668 1668 //# sourceMappingURL=angular-cookies.min.js.map
1669 1669
1670 1670 ;/*
1671 1671 AngularJS v1.5.5
1672 1672 (c) 2010-2016 Google, Inc. http://angularjs.org
1673 1673 License: MIT
1674 1674 */
1675 1675 (function(C,d){'use strict';function z(r,h,g){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,y){function k(){n&&(g.cancel(n),n=null);l&&(l.$destroy(),l=null);m&&(n=g.leave(m),n.then(function(){n=null}),m=null)}function x(){var b=r.current&&r.current.locals;if(d.isDefined(b&&b.$template)){var b=a.$new(),f=r.current;m=y(b,function(b){g.enter(b,null,m||c).then(function(){!d.isDefined(t)||t&&!a.$eval(t)||h()});k()});l=f.scope=b;l.$emit("$viewContentLoaded");
1676 1676 l.$eval(u)}else k()}var l,m,n,t=b.autoscroll,u=b.onload||"";a.$on("$routeChangeSuccess",x);x()}}}function A(d,h,g){return{restrict:"ECA",priority:-400,link:function(a,c){var b=g.current,f=b.locals;c.html(f.$template);var y=d(c.contents());if(b.controller){f.$scope=a;var k=h(b.controller,f);b.controllerAs&&(a[b.controllerAs]=k);c.data("$ngControllerController",k);c.children().data("$ngControllerController",k)}a[b.resolveAs||"$resolve"]=f;y(a)}}}var w=d.module("ngRoute",["ng"]).provider("$route",function(){function r(a,
1677 1677 c){return d.extend(Object.create(a),c)}function h(a,d){var b=d.caseInsensitiveMatch,f={originalPath:a,regexp:a},g=f.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)(\*\?|[\?\*])?/g,function(a,d,b,c){a="?"===c||"*?"===c?"?":null;c="*"===c||"*?"===c?"*":null;g.push({name:b,optional:!!a});d=d||"";return""+(a?"":d)+"(?:"+(a?d:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");f.regexp=new RegExp("^"+a+"$",b?"i":"");return f}var g={};this.when=function(a,c){var b=
1678 1678 d.copy(c);d.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0);d.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);g[a]=d.extend(b,a&&h(a,b));if(a){var f="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";g[f]=d.extend({redirectTo:a},h(f,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest",
1679 1679 "$sce",function(a,c,b,f,h,k,x){function l(b){var e=s.current;(w=(p=n())&&e&&p.$$route===e.$$route&&d.equals(p.pathParams,e.pathParams)&&!p.reloadOnSearch&&!u)||!e&&!p||a.$broadcast("$routeChangeStart",p,e).defaultPrevented&&b&&b.preventDefault()}function m(){var v=s.current,e=p;if(w)v.params=e.params,d.copy(v.params,b),a.$broadcast("$routeUpdate",v);else if(e||v)u=!1,(s.current=e)&&e.redirectTo&&(d.isString(e.redirectTo)?c.path(t(e.redirectTo,e.params)).search(e.params).replace():c.url(e.redirectTo(e.pathParams,
1680 1680 c.path(),c.search())).replace()),f.when(e).then(function(){if(e){var a=d.extend({},e.resolve),b,c;d.forEach(a,function(b,e){a[e]=d.isString(b)?h.get(b):h.invoke(b,null,null,e)});d.isDefined(b=e.template)?d.isFunction(b)&&(b=b(e.params)):d.isDefined(c=e.templateUrl)&&(d.isFunction(c)&&(c=c(e.params)),d.isDefined(c)&&(e.loadedTemplateUrl=x.valueOf(c),b=k(c)));d.isDefined(b)&&(a.$template=b);return f.all(a)}}).then(function(c){e==s.current&&(e&&(e.locals=c,d.copy(e.params,b)),a.$broadcast("$routeChangeSuccess",
1681 1681 e,v))},function(b){e==s.current&&a.$broadcast("$routeChangeError",e,v,b)})}function n(){var a,b;d.forEach(g,function(f,g){var q;if(q=!b){var h=c.path();q=f.keys;var l={};if(f.regexp)if(h=f.regexp.exec(h)){for(var k=1,n=h.length;k<n;++k){var m=q[k-1],p=h[k];m&&p&&(l[m.name]=p)}q=l}else q=null;else q=null;q=a=q}q&&(b=r(f,{params:d.extend({},c.search(),a),pathParams:a}),b.$$route=f)});return b||g[null]&&r(g[null],{params:{},pathParams:{}})}function t(a,b){var c=[];d.forEach((a||"").split(":"),function(a,
1682 1682 d){if(0===d)c.push(a);else{var f=a.match(/(\w+)(?:[?*])?(.*)/),g=f[1];c.push(b[g]);c.push(f[2]||"");delete b[g]}});return c.join("")}var u=!1,p,w,s={routes:g,reload:function(){u=!0;var b={defaultPrevented:!1,preventDefault:function(){this.defaultPrevented=!0;u=!1}};a.$evalAsync(function(){l(b);b.defaultPrevented||m()})},updateParams:function(a){if(this.current&&this.current.$$route)a=d.extend({},this.current.params,a),c.path(t(this.current.$$route.originalPath,a)),c.search(a);else throw B("norout");
1683 1683 }};a.$on("$locationChangeStart",l);a.$on("$locationChangeSuccess",m);return s}]}),B=d.$$minErr("ngRoute");w.provider("$routeParams",function(){this.$get=function(){return{}}});w.directive("ngView",z);w.directive("ngView",A);z.$inject=["$route","$anchorScroll","$animate"];A.$inject=["$compile","$controller","$route"]})(window,window.angular);
1684 1684 //# sourceMappingURL=angular-route.min.js.map
1685 1685
1686 1686 ;/*
1687 1687 AngularJS v1.5.5
1688 1688 (c) 2010-2016 Google, Inc. http://angularjs.org
1689 1689 License: MIT
1690 1690 */
1691 1691 (function(P,d){'use strict';function G(t,g){g=g||{};d.forEach(g,function(d,q){delete g[q]});for(var q in t)!t.hasOwnProperty(q)||"$"===q.charAt(0)&&"$"===q.charAt(1)||(g[q]=t[q]);return g}var z=d.$$minErr("$resource"),M=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var t=/^https?:\/\/[^\/]*/,g=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}};
1692 1692 this.$get=["$http","$log","$q","$timeout",function(q,L,H,I){function A(d,h){return encodeURIComponent(d).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,h?"%20":"+")}function B(d,h){this.template=d;this.defaults=v({},g.defaults,h);this.urlParams={}}function J(e,h,n,k){function c(a,b){var c={};b=v({},h,b);u(b,function(b,h){x(b)&&(b=b());var f;if(b&&b.charAt&&"@"==b.charAt(0)){f=a;var l=b.substr(1);if(null==l||""===l||"hasOwnProperty"===l||!M.test("."+
1693 1693 l))throw z("badmember",l);for(var l=l.split("."),m=0,k=l.length;m<k&&d.isDefined(f);m++){var r=l[m];f=null!==f?f[r]:void 0}}else f=b;c[h]=f});return c}function N(a){return a.resource}function m(a){G(a||{},this)}var t=new B(e,k);n=v({},g.defaults.actions,n);m.prototype.toJSON=function(){var a=v({},this);delete a.$promise;delete a.$resolved;return a};u(n,function(a,b){var h=/^(POST|PUT|PATCH)$/i.test(a.method),e=a.timeout,E=d.isDefined(a.cancellable)?a.cancellable:k&&d.isDefined(k.cancellable)?k.cancellable:
1694 1694 g.defaults.cancellable;e&&!d.isNumber(e)&&(L.debug("ngResource:\n Only numeric values are allowed as `timeout`.\n Promises are not supported in $resource, because the same value would be used for multiple requests. If you are looking for a way to cancel requests, you should use the `cancellable` option."),delete a.timeout,e=null);m[b]=function(f,l,k,g){var r={},n,w,C;switch(arguments.length){case 4:C=g,w=k;case 3:case 2:if(x(l)){if(x(f)){w=f;C=l;break}w=l;C=k}else{r=f;n=l;w=k;break}case 1:x(f)?
1695 1695 w=f:h?n=f:r=f;break;case 0:break;default:throw z("badargs",arguments.length);}var D=this instanceof m,p=D?n:a.isArray?[]:new m(n),s={},A=a.interceptor&&a.interceptor.response||N,B=a.interceptor&&a.interceptor.responseError||void 0,y,F;u(a,function(a,b){switch(b){default:s[b]=O(a);case "params":case "isArray":case "interceptor":case "cancellable":}});!D&&E&&(y=H.defer(),s.timeout=y.promise,e&&(F=I(y.resolve,e)));h&&(s.data=n);t.setUrlParams(s,v({},c(n,a.params||{}),r),a.url);r=q(s).then(function(f){var c=
1696 1696 f.data;if(c){if(d.isArray(c)!==!!a.isArray)throw z("badcfg",b,a.isArray?"array":"object",d.isArray(c)?"array":"object",s.method,s.url);if(a.isArray)p.length=0,u(c,function(b){"object"===typeof b?p.push(new m(b)):p.push(b)});else{var l=p.$promise;G(c,p);p.$promise=l}}f.resource=p;return f},function(b){(C||K)(b);return H.reject(b)});r["finally"](function(){p.$resolved=!0;!D&&E&&(p.$cancelRequest=d.noop,I.cancel(F),y=F=s.timeout=null)});r=r.then(function(b){var a=A(b);(w||K)(a,b.headers);return a},B);
1697 1697 return D?r:(p.$promise=r,p.$resolved=!1,E&&(p.$cancelRequest=y.resolve),p)};m.prototype["$"+b]=function(a,c,d){x(a)&&(d=c,c=a,a={});a=m[b].call(this,a,this,c,d);return a.$promise||a}});m.bind=function(a){return J(e,v({},h,a),n)};return m}var K=d.noop,u=d.forEach,v=d.extend,O=d.copy,x=d.isFunction;B.prototype={setUrlParams:function(e,h,n){var k=this,c=n||k.template,g,m,q="",a=k.urlParams={};u(c.split(/\W/),function(b){if("hasOwnProperty"===b)throw z("badname");!/^\d+$/.test(b)&&b&&(new RegExp("(^|[^\\\\]):"+
1698 1698 b+"(\\W|$)")).test(c)&&(a[b]={isQueryParamValue:(new RegExp("\\?.*=:"+b+"(?:\\W|$)")).test(c)})});c=c.replace(/\\:/g,":");c=c.replace(t,function(a){q=a;return""});h=h||{};u(k.urlParams,function(a,e){g=h.hasOwnProperty(e)?h[e]:k.defaults[e];d.isDefined(g)&&null!==g?(m=a.isQueryParamValue?A(g,!0):A(g,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),c=c.replace(new RegExp(":"+e+"(\\W|$)","g"),function(a,b){return m+b})):c=c.replace(new RegExp("(/?):"+e+"(\\W|$)","g"),function(a,b,c){return"/"==
1699 1699 c.charAt(0)?c:b+c})});k.defaults.stripTrailingSlashes&&(c=c.replace(/\/+$/,"")||"/");c=c.replace(/\/\.(?=\w+($|\?))/,".");e.url=q+c.replace(/\/\\\./,"/.");u(h,function(a,c){k.urlParams[c]||(e.params=e.params||{},e.params[c]=a)})}};return J}]})})(window,window.angular);
1700 1700 //# sourceMappingURL=angular-resource.min.js.map
1701 1701
1702 1702 ;/*
1703 1703 AngularJS v1.5.5
1704 1704 (c) 2010-2016 Google, Inc. http://angularjs.org
1705 1705 License: MIT
1706 1706 */
1707 1707 (function(S,q){'use strict';function Aa(a,b,c){if(!a)throw Ma("areq",b||"?",c||"required");return a}function Ba(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;ba(a)&&(a=a.join(" "));ba(b)&&(b=b.join(" "));return a+" "+b}function Na(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function X(a,b,c){var d="";a=ba(a)?a:a&&P(a)&&a.length?a.split(/\s+/):[];r(a,function(a,f){a&&0<a.length&&(d+=0<f?" ":"",d+=c?b+a:a+b)});return d}function Oa(a){if(a instanceof G)switch(a.length){case 0:return[];
1708 1708 case 1:if(1===a[0].nodeType)return a;break;default:return G(ca(a))}if(1===a.nodeType)return G(a)}function ca(a){if(!a[0])return a;for(var b=0;b<a.length;b++){var c=a[b];if(1==c.nodeType)return c}}function Pa(a,b,c){r(b,function(b){a.addClass(b,c)})}function Qa(a,b,c){r(b,function(b){a.removeClass(b,c)})}function U(a){return function(b,c){c.addClass&&(Pa(a,b,c.addClass),c.addClass=null);c.removeClass&&(Qa(a,b,c.removeClass),c.removeClass=null)}}function pa(a){a=a||{};if(!a.$$prepared){var b=a.domOperation||
1709 1709 Q;a.domOperation=function(){a.$$domOperationFired=!0;b();b=Q};a.$$prepared=!0}return a}function ga(a,b){Ca(a,b);Da(a,b)}function Ca(a,b){b.from&&(a.css(b.from),b.from=null)}function Da(a,b){b.to&&(a.css(b.to),b.to=null)}function V(a,b,c){var d=b.options||{};c=c.options||{};var e=(d.addClass||"")+" "+(c.addClass||""),f=(d.removeClass||"")+" "+(c.removeClass||"");a=Ra(a.attr("class"),e,f);c.preparationClasses&&(d.preparationClasses=Y(c.preparationClasses,d.preparationClasses),delete c.preparationClasses);
1710 1710 e=d.domOperation!==Q?d.domOperation:null;Ea(d,c);e&&(d.domOperation=e);d.addClass=a.addClass?a.addClass:null;d.removeClass=a.removeClass?a.removeClass:null;b.addClass=d.addClass;b.removeClass=d.removeClass;return d}function Ra(a,b,c){function d(a){P(a)&&(a=a.split(" "));var b={};r(a,function(a){a.length&&(b[a]=!0)});return b}var e={};a=d(a);b=d(b);r(b,function(a,b){e[b]=1});c=d(c);r(c,function(a,b){e[b]=1===e[b]?null:-1});var f={addClass:"",removeClass:""};r(e,function(b,c){var d,e;1===b?(d="addClass",
1711 1711 e=!a[c]):-1===b&&(d="removeClass",e=a[c]);e&&(f[d].length&&(f[d]+=" "),f[d]+=c)});return f}function D(a){return a instanceof q.element?a[0]:a}function Sa(a,b,c){var d="";b&&(d=X(b,"ng-",!0));c.addClass&&(d=Y(d,X(c.addClass,"-add")));c.removeClass&&(d=Y(d,X(c.removeClass,"-remove")));d.length&&(c.preparationClasses=d,a.addClass(d))}function qa(a,b){var c=b?"-"+b+"s":"";la(a,[ma,c]);return[ma,c]}function ta(a,b){var c=b?"paused":"",d=Z+"PlayState";la(a,[d,c]);return[d,c]}function la(a,b){a.style[b[0]]=
1712 1712 b[1]}function Y(a,b){return a?b?a+" "+b:a:b}function Fa(a,b,c){var d=Object.create(null),e=a.getComputedStyle(b)||{};r(c,function(a,b){var c=e[a];if(c){var s=c.charAt(0);if("-"===s||"+"===s||0<=s)c=Ta(c);0===c&&(c=null);d[b]=c}});return d}function Ta(a){var b=0;a=a.split(/\s*,\s*/);r(a,function(a){"s"==a.charAt(a.length-1)&&(a=a.substring(0,a.length-1));a=parseFloat(a)||0;b=b?Math.max(a,b):a});return b}function ua(a){return 0===a||null!=a}function Ga(a,b){var c=T,d=a+"s";b?c+="Duration":d+=" linear all";
1713 1713 return[c,d]}function Ha(){var a=Object.create(null);return{flush:function(){a=Object.create(null)},count:function(b){return(b=a[b])?b.total:0},get:function(b){return(b=a[b])&&b.value},put:function(b,c){a[b]?a[b].total++:a[b]={total:1,value:c}}}}function Ia(a,b,c){r(c,function(c){a[c]=da(a[c])?a[c]:b.style.getPropertyValue(c)})}var Q=q.noop,Ja=q.copy,Ea=q.extend,G=q.element,r=q.forEach,ba=q.isArray,P=q.isString,va=q.isObject,C=q.isUndefined,da=q.isDefined,Ka=q.isFunction,wa=q.isElement,T,xa,Z,ya;C(S.ontransitionend)&&
1714 1714 da(S.onwebkittransitionend)?(T="WebkitTransition",xa="webkitTransitionEnd transitionend"):(T="transition",xa="transitionend");C(S.onanimationend)&&da(S.onwebkitanimationend)?(Z="WebkitAnimation",ya="webkitAnimationEnd animationend"):(Z="animation",ya="animationend");var ra=Z+"Delay",za=Z+"Duration",ma=T+"Delay",La=T+"Duration",Ma=q.$$minErr("ng"),Ua={transitionDuration:La,transitionDelay:ma,transitionProperty:T+"Property",animationDuration:za,animationDelay:ra,animationIterationCount:Z+"IterationCount"},
1715 1715 Va={transitionDuration:La,transitionDelay:ma,animationDuration:za,animationDelay:ra};q.module("ngAnimate",[]).directive("ngAnimateSwap",["$animate","$rootScope",function(a,b){return{restrict:"A",transclude:"element",terminal:!0,priority:600,link:function(b,d,e,f,z){var B,s;b.$watchCollection(e.ngAnimateSwap||e["for"],function(e){B&&a.leave(B);s&&(s.$destroy(),s=null);if(e||0===e)s=b.$new(),z(s,function(b){B=b;a.enter(b,null,d)})})}}}]).directive("ngAnimateChildren",["$interpolate",function(a){return{link:function(b,
1716 1716 c,d){function e(a){c.data("$$ngAnimateChildren","on"===a||"true"===a)}var f=d.ngAnimateChildren;q.isString(f)&&0===f.length?c.data("$$ngAnimateChildren",!0):(e(a(f)(b)),d.$observe("ngAnimateChildren",e))}}}]).factory("$$rAFScheduler",["$$rAF",function(a){function b(a){d=d.concat(a);c()}function c(){if(d.length){for(var b=d.shift(),z=0;z<b.length;z++)b[z]();e||a(function(){e||c()})}}var d,e;d=b.queue=[];b.waitUntilQuiet=function(b){e&&e();e=a(function(){e=null;b();c()})};return b}]).provider("$$animateQueue",
1717 1717 ["$animateProvider",function(a){function b(a){if(!a)return null;a=a.split(" ");var b=Object.create(null);r(a,function(a){b[a]=!0});return b}function c(a,c){if(a&&c){var d=b(c);return a.split(" ").some(function(a){return d[a]})}}function d(a,b,c,d){return f[a].some(function(a){return a(b,c,d)})}function e(a,b){var c=0<(a.addClass||"").length,d=0<(a.removeClass||"").length;return b?c&&d:c||d}var f=this.rules={skip:[],cancel:[],join:[]};f.join.push(function(a,b,c){return!b.structural&&e(b)});f.skip.push(function(a,
1718 1718 b,c){return!b.structural&&!e(b)});f.skip.push(function(a,b,c){return"leave"==c.event&&b.structural});f.skip.push(function(a,b,c){return c.structural&&2===c.state&&!b.structural});f.cancel.push(function(a,b,c){return c.structural&&b.structural});f.cancel.push(function(a,b,c){return 2===c.state&&b.structural});f.cancel.push(function(a,b,d){if(d.structural)return!1;a=b.addClass;b=b.removeClass;var e=d.addClass;d=d.removeClass;return C(a)&&C(b)||C(e)&&C(d)?!1:c(a,d)||c(b,e)});this.$get=["$$rAF","$rootScope",
1719 1719 "$rootElement","$document","$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow",function(b,c,f,v,I,Wa,u,sa,w,x){function R(){var a=!1;return function(b){a?b():c.$$postDigest(function(){a=!0;b()})}}function J(a,b,c){var g=D(b),d=D(a),k=[];(a=h[c])&&r(a,function(a){ia.call(a.node,g)?k.push(a.callback):"leave"===c&&ia.call(a.node,d)&&k.push(a.callback)});return k}function k(a,b,c){var g=ca(b);return a.filter(function(a){return!(a.node===g&&(!c||a.callback===c))})}
1720 1720 function p(a,k,h){function l(c,g,d,h){f(function(){var c=J(oa,a,g);c.length?b(function(){r(c,function(b){b(a,d,h)});"close"!==d||a[0].parentNode||N.off(a)}):"close"!==d||a[0].parentNode||N.off(a)});c.progress(g,d,h)}function A(b){var c=a,g=m;g.preparationClasses&&(c.removeClass(g.preparationClasses),g.preparationClasses=null);g.activeClasses&&(c.removeClass(g.activeClasses),g.activeClasses=null);F(a,m);ga(a,m);m.domOperation();p.complete(!b)}var m=Ja(h),x,oa;if(a=Oa(a))x=D(a),oa=a.parent();var m=
1721 1721 pa(m),p=new u,f=R();ba(m.addClass)&&(m.addClass=m.addClass.join(" "));m.addClass&&!P(m.addClass)&&(m.addClass=null);ba(m.removeClass)&&(m.removeClass=m.removeClass.join(" "));m.removeClass&&!P(m.removeClass)&&(m.removeClass=null);m.from&&!va(m.from)&&(m.from=null);m.to&&!va(m.to)&&(m.to=null);if(!x)return A(),p;h=[x.className,m.addClass,m.removeClass].join(" ");if(!Xa(h))return A(),p;var s=0<=["enter","move","leave"].indexOf(k),t=v[0].hidden,w=!g||t||H.get(x);h=!w&&y.get(x)||{};var I=!!h.state;w||
1722 1722 I&&1==h.state||(w=!K(a,oa,k));if(w)return t&&l(p,k,"start"),A(),t&&l(p,k,"close"),p;s&&L(a);t={structural:s,element:a,event:k,addClass:m.addClass,removeClass:m.removeClass,close:A,options:m,runner:p};if(I){if(d("skip",a,t,h)){if(2===h.state)return A(),p;V(a,h,t);return h.runner}if(d("cancel",a,t,h))if(2===h.state)h.runner.end();else if(h.structural)h.close();else return V(a,h,t),h.runner;else if(d("join",a,t,h))if(2===h.state)V(a,t,{});else return Sa(a,s?k:null,m),k=t.event=h.event,m=V(a,h,t),h.runner}else V(a,
1723 1723 t,{});(I=t.structural)||(I="animate"===t.event&&0<Object.keys(t.options.to||{}).length||e(t));if(!I)return A(),O(a),p;var ia=(h.counter||0)+1;t.counter=ia;M(a,1,t);c.$$postDigest(function(){var b=y.get(x),c=!b,b=b||{},g=0<(a.parent()||[]).length&&("animate"===b.event||b.structural||e(b));if(c||b.counter!==ia||!g){c&&(F(a,m),ga(a,m));if(c||s&&b.event!==k)m.domOperation(),p.end();g||O(a)}else k=!b.structural&&e(b,!0)?"setClass":b.event,M(a,2),b=Wa(a,k,b.options),p.setHost(b),l(p,k,"start",{}),b.done(function(b){A(!b);
1724 1724 (b=y.get(x))&&b.counter===ia&&O(D(a));l(p,k,"close",{})})});return p}function L(a){a=D(a).querySelectorAll("[data-ng-animate]");r(a,function(a){var b=parseInt(a.getAttribute("data-ng-animate")),c=y.get(a);if(c)switch(b){case 2:c.runner.end();case 1:y.remove(a)}})}function O(a){a=D(a);a.removeAttribute("data-ng-animate");y.remove(a)}function l(a,b){return D(a)===D(b)}function K(a,b,c){c=G(v[0].body);var g=l(a,c)||"HTML"===a[0].nodeName,d=l(a,f),h=!1,k,e=H.get(D(a));(a=G.data(a[0],"$ngAnimatePin"))&&
1725 1725 (b=a);for(b=D(b);b;){d||(d=l(b,f));if(1!==b.nodeType)break;a=y.get(b)||{};if(!h){var p=H.get(b);if(!0===p&&!1!==e){e=!0;break}else!1===p&&(e=!1);h=a.structural}if(C(k)||!0===k)a=G.data(b,"$$ngAnimateChildren"),da(a)&&(k=a);if(h&&!1===k)break;g||(g=l(b,c));if(g&&d)break;if(!d&&(a=G.data(b,"$ngAnimatePin"))){b=D(a);continue}b=b.parentNode}return(!h||k)&&!0!==e&&d&&g}function M(a,b,c){c=c||{};c.state=b;a=D(a);a.setAttribute("data-ng-animate",b);c=(b=y.get(a))?Ea(b,c):c;y.put(a,c)}var y=new I,H=new I,
1726 1726 g=null,oa=c.$watch(function(){return 0===sa.totalPendingRequests},function(a){a&&(oa(),c.$$postDigest(function(){c.$$postDigest(function(){null===g&&(g=!0)})}))}),h={},A=a.classNameFilter(),Xa=A?function(a){return A.test(a)}:function(){return!0},F=U(w),ia=S.Node.prototype.contains||function(a){return this===a||!!(this.compareDocumentPosition(a)&16)},N={on:function(a,b,c){var g=ca(b);h[a]=h[a]||[];h[a].push({node:g,callback:c});G(b).on("$destroy",function(){y.get(g)||N.off(a,b,c)})},off:function(a,
1727 1727 b,c){if(1!==arguments.length||q.isString(arguments[0])){var g=h[a];g&&(h[a]=1===arguments.length?null:k(g,b,c))}else for(g in b=arguments[0],h)h[g]=k(h[g],b)},pin:function(a,b){Aa(wa(a),"element","not an element");Aa(wa(b),"parentElement","not an element");a.data("$ngAnimatePin",b)},push:function(a,b,c,g){c=c||{};c.domOperation=g;return p(a,b,c)},enabled:function(a,b){var c=arguments.length;if(0===c)b=!!g;else if(wa(a)){var d=D(a),h=H.get(d);1===c?b=!h:H.put(d,!b)}else b=g=!!a;return b}};return N}]}]).provider("$$animation",
1728 1728 ["$animateProvider",function(a){function b(a){return a.data("$$animationRunner")}var c=this.drivers=[];this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$HashMap","$$rAFScheduler",function(a,e,f,z,B,s){function v(a){function b(a){if(a.processed)return a;a.processed=!0;var d=a.domNode,L=d.parentNode;e.put(d,a);for(var f;L;){if(f=e.get(L)){f.processed||(f=b(f));break}L=L.parentNode}(f||c).children.push(a);return a}var c={children:[]},d,e=new B;for(d=0;d<a.length;d++){var f=a[d];e.put(f.domNode,
1729 1729 a[d]={domNode:f.domNode,fn:f.fn,children:[]})}for(d=0;d<a.length;d++)b(a[d]);return function(a){var b=[],c=[],d;for(d=0;d<a.children.length;d++)c.push(a.children[d]);a=c.length;var e=0,f=[];for(d=0;d<c.length;d++){var x=c[d];0>=a&&(a=e,e=0,b.push(f),f=[]);f.push(x.fn);x.children.forEach(function(a){e++;c.push(a)});a--}f.length&&b.push(f);return b}(c)}var I=[],q=U(a);return function(u,B,w){function x(a){a=a.hasAttribute("ng-animate-ref")?[a]:a.querySelectorAll("[ng-animate-ref]");var b=[];r(a,function(a){var c=
1730 1730 a.getAttribute("ng-animate-ref");c&&c.length&&b.push(a)});return b}function R(a){var b=[],c={};r(a,function(a,g){var d=D(a.element),e=0<=["enter","move"].indexOf(a.event),d=a.structural?x(d):[];if(d.length){var k=e?"to":"from";r(d,function(a){var b=a.getAttribute("ng-animate-ref");c[b]=c[b]||{};c[b][k]={animationID:g,element:G(a)}})}else b.push(a)});var d={},e={};r(c,function(c,h){var k=c.from,f=c.to;if(k&&f){var p=a[k.animationID],y=a[f.animationID],l=k.animationID.toString();if(!e[l]){var x=e[l]=
1731 1731 {structural:!0,beforeStart:function(){p.beforeStart();y.beforeStart()},close:function(){p.close();y.close()},classes:J(p.classes,y.classes),from:p,to:y,anchors:[]};x.classes.length?b.push(x):(b.push(p),b.push(y))}e[l].anchors.push({out:k.element,"in":f.element})}else k=k?k.animationID:f.animationID,f=k.toString(),d[f]||(d[f]=!0,b.push(a[k]))});return b}function J(a,b){a=a.split(" ");b=b.split(" ");for(var c=[],d=0;d<a.length;d++){var k=a[d];if("ng-"!==k.substring(0,3))for(var e=0;e<b.length;e++)if(k===
1732 1732 b[e]){c.push(k);break}}return c.join(" ")}function k(a){for(var b=c.length-1;0<=b;b--){var d=c[b];if(f.has(d)&&(d=f.get(d)(a)))return d}}function p(a,c){a.from&&a.to?(b(a.from.element).setHost(c),b(a.to.element).setHost(c)):b(a.element).setHost(c)}function L(){var a=b(u);!a||"leave"===B&&w.$$domOperationFired||a.end()}function O(b){u.off("$destroy",L);u.removeData("$$animationRunner");q(u,w);ga(u,w);w.domOperation();y&&a.removeClass(u,y);u.removeClass("ng-animate");K.complete(!b)}w=pa(w);var l=0<=
1733 1733 ["enter","move","leave"].indexOf(B),K=new z({end:function(){O()},cancel:function(){O(!0)}});if(!c.length)return O(),K;u.data("$$animationRunner",K);var M=Ba(u.attr("class"),Ba(w.addClass,w.removeClass)),y=w.tempClasses;y&&(M+=" "+y,w.tempClasses=null);var H;l&&(H="ng-"+B+"-prepare",a.addClass(u,H));I.push({element:u,classes:M,event:B,structural:l,options:w,beforeStart:function(){u.addClass("ng-animate");y&&a.addClass(u,y);H&&(a.removeClass(u,H),H=null)},close:O});u.on("$destroy",L);if(1<I.length)return K;
1734 1734 e.$$postDigest(function(){var a=[];r(I,function(c){b(c.element)?a.push(c):c.close()});I.length=0;var c=R(a),d=[];r(c,function(a){d.push({domNode:D(a.from?a.from.element:a.element),fn:function(){a.beforeStart();var c,d=a.close;if(b(a.anchors?a.from.element||a.to.element:a.element)){var g=k(a);g&&(c=g.start)}c?(c=c(),c.done(function(a){d(!a)}),p(a,c)):d()}})});s(v(d))});return K}}]}]).provider("$animateCss",["$animateProvider",function(a){var b=Ha(),c=Ha();this.$get=["$window","$$jqLite","$$AnimateRunner",
1735 1735 "$timeout","$$forceReflow","$sniffer","$$rAFScheduler","$$animateQueue",function(a,e,f,z,B,s,v,I){function q(a,b){var c=a.parentNode;return(c.$$ngAnimateParentKey||(c.$$ngAnimateParentKey=++R))+"-"+a.getAttribute("class")+"-"+b}function u(k,f,x,s){var l;0<b.count(x)&&(l=c.get(x),l||(f=X(f,"-stagger"),e.addClass(k,f),l=Fa(a,k,s),l.animationDuration=Math.max(l.animationDuration,0),l.transitionDuration=Math.max(l.transitionDuration,0),e.removeClass(k,f),c.put(x,l)));return l||{}}function sa(a){J.push(a);
1736 1736 v.waitUntilQuiet(function(){b.flush();c.flush();for(var a=B(),d=0;d<J.length;d++)J[d](a);J.length=0})}function w(c,e,f){e=b.get(f);e||(e=Fa(a,c,Ua),"infinite"===e.animationIterationCount&&(e.animationIterationCount=1));b.put(f,e);c=e;f=c.animationDelay;e=c.transitionDelay;c.maxDelay=f&&e?Math.max(f,e):f||e;c.maxDuration=Math.max(c.animationDuration*c.animationIterationCount,c.transitionDuration);return c}var x=U(e),R=0,J=[];return function(a,c){function d(){l()}function v(){l(!0)}function l(b){if(!(R||
1737 1737 G&&N)){R=!0;N=!1;g.$$skipPreparationClasses||e.removeClass(a,fa);e.removeClass(a,da);ta(h,!1);qa(h,!1);r(A,function(a){h.style[a[0]]=""});x(a,g);ga(a,g);Object.keys(J).length&&r(J,function(a,b){a?h.style.setProperty(b,a):h.style.removeProperty(b)});if(g.onDone)g.onDone();ea&&ea.length&&a.off(ea.join(" "),y);var c=a.data("$$animateCss");c&&(z.cancel(c[0].timer),a.removeData("$$animateCss"));C&&C.complete(!b)}}function K(a){n.blockTransition&&qa(h,a);n.blockKeyframeAnimation&&ta(h,!!a)}function M(){C=
1738 1738 new f({end:d,cancel:v});sa(Q);l();return{$$willAnimate:!1,start:function(){return C},end:d}}function y(a){a.stopPropagation();var b=a.originalEvent||a;a=b.$manualTimeStamp||Date.now();b=parseFloat(b.elapsedTime.toFixed(3));Math.max(a-V,0)>=S&&b>=m&&(G=!0,l())}function H(){function b(){if(!R){K(!1);r(A,function(a){h.style[a[0]]=a[1]});x(a,g);e.addClass(a,da);if(n.recalculateTimingStyles){na=h.className+" "+fa;ja=q(h,na);E=w(h,na,ja);$=E.maxDelay;ha=Math.max($,0);m=E.maxDuration;if(0===m){l();return}n.hasTransitions=
1739 1739 0<E.transitionDuration;n.hasAnimations=0<E.animationDuration}n.applyAnimationDelay&&($="boolean"!==typeof g.delay&&ua(g.delay)?parseFloat(g.delay):$,ha=Math.max($,0),E.animationDelay=$,aa=[ra,$+"s"],A.push(aa),h.style[aa[0]]=aa[1]);S=1E3*ha;U=1E3*m;if(g.easing){var d,f=g.easing;n.hasTransitions&&(d=T+"TimingFunction",A.push([d,f]),h.style[d]=f);n.hasAnimations&&(d=Z+"TimingFunction",A.push([d,f]),h.style[d]=f)}E.transitionDuration&&ea.push(xa);E.animationDuration&&ea.push(ya);V=Date.now();var H=S+
1740 1740 1.5*U;d=V+H;var f=a.data("$$animateCss")||[],s=!0;if(f.length){var p=f[0];(s=d>p.expectedEndTime)?z.cancel(p.timer):f.push(l)}s&&(H=z(c,H,!1),f[0]={timer:H,expectedEndTime:d},f.push(l),a.data("$$animateCss",f));if(ea.length)a.on(ea.join(" "),y);g.to&&(g.cleanupStyles&&Ia(J,h,Object.keys(g.to)),Da(a,g))}}function c(){var b=a.data("$$animateCss");if(b){for(var d=1;d<b.length;d++)b[d]();a.removeData("$$animateCss")}}if(!R)if(h.parentNode){var d=function(a){if(G)N&&a&&(N=!1,l());else if(N=!a,E.animationDuration)if(a=
1741 1741 ta(h,N),N)A.push(a);else{var b=A,c=b.indexOf(a);0<=a&&b.splice(c,1)}},f=0<ca&&(E.transitionDuration&&0===W.transitionDuration||E.animationDuration&&0===W.animationDuration)&&Math.max(W.animationDelay,W.transitionDelay);f?z(b,Math.floor(f*ca*1E3),!1):b();P.resume=function(){d(!0)};P.pause=function(){d(!1)}}else l()}var g=c||{};g.$$prepared||(g=pa(Ja(g)));var J={},h=D(a);if(!h||!h.parentNode||!I.enabled())return M();var A=[],B=a.attr("class"),F=Na(g),R,N,G,C,P,ha,S,m,U,V,ea=[];if(0===g.duration||!s.animations&&
1742 1742 !s.transitions)return M();var ka=g.event&&ba(g.event)?g.event.join(" "):g.event,Y="",t="";ka&&g.structural?Y=X(ka,"ng-",!0):ka&&(Y=ka);g.addClass&&(t+=X(g.addClass,"-add"));g.removeClass&&(t.length&&(t+=" "),t+=X(g.removeClass,"-remove"));g.applyClassesEarly&&t.length&&x(a,g);var fa=[Y,t].join(" ").trim(),na=B+" "+fa,da=X(fa,"-active"),B=F.to&&0<Object.keys(F.to).length;if(!(0<(g.keyframeStyle||"").length||B||fa))return M();var ja,W;0<g.stagger?(F=parseFloat(g.stagger),W={transitionDelay:F,animationDelay:F,
1743 1743 transitionDuration:0,animationDuration:0}):(ja=q(h,na),W=u(h,fa,ja,Va));g.$$skipPreparationClasses||e.addClass(a,fa);g.transitionStyle&&(F=[T,g.transitionStyle],la(h,F),A.push(F));0<=g.duration&&(F=0<h.style[T].length,F=Ga(g.duration,F),la(h,F),A.push(F));g.keyframeStyle&&(F=[Z,g.keyframeStyle],la(h,F),A.push(F));var ca=W?0<=g.staggerIndex?g.staggerIndex:b.count(ja):0;(ka=0===ca)&&!g.skipBlocking&&qa(h,9999);var E=w(h,na,ja),$=E.maxDelay;ha=Math.max($,0);m=E.maxDuration;var n={};n.hasTransitions=
1744 1744 0<E.transitionDuration;n.hasAnimations=0<E.animationDuration;n.hasTransitionAll=n.hasTransitions&&"all"==E.transitionProperty;n.applyTransitionDuration=B&&(n.hasTransitions&&!n.hasTransitionAll||n.hasAnimations&&!n.hasTransitions);n.applyAnimationDuration=g.duration&&n.hasAnimations;n.applyTransitionDelay=ua(g.delay)&&(n.applyTransitionDuration||n.hasTransitions);n.applyAnimationDelay=ua(g.delay)&&n.hasAnimations;n.recalculateTimingStyles=0<t.length;if(n.applyTransitionDuration||n.applyAnimationDuration)m=
1745 1745 g.duration?parseFloat(g.duration):m,n.applyTransitionDuration&&(n.hasTransitions=!0,E.transitionDuration=m,F=0<h.style[T+"Property"].length,A.push(Ga(m,F))),n.applyAnimationDuration&&(n.hasAnimations=!0,E.animationDuration=m,A.push([za,m+"s"]));if(0===m&&!n.recalculateTimingStyles)return M();if(null!=g.delay){var aa;"boolean"!==typeof g.delay&&(aa=parseFloat(g.delay),ha=Math.max(aa,0));n.applyTransitionDelay&&A.push([ma,aa+"s"]);n.applyAnimationDelay&&A.push([ra,aa+"s"])}null==g.duration&&0<E.transitionDuration&&
1746 1746 (n.recalculateTimingStyles=n.recalculateTimingStyles||ka);S=1E3*ha;U=1E3*m;g.skipBlocking||(n.blockTransition=0<E.transitionDuration,n.blockKeyframeAnimation=0<E.animationDuration&&0<W.animationDelay&&0===W.animationDuration);g.from&&(g.cleanupStyles&&Ia(J,h,Object.keys(g.from)),Ca(a,g));n.blockTransition||n.blockKeyframeAnimation?K(m):g.skipBlocking||qa(h,!1);return{$$willAnimate:!0,end:d,start:function(){if(!R)return P={end:d,cancel:v,resume:null,pause:null},C=new f(P),sa(H),C}}}}]}]).provider("$$animateCssDriver",
1747 1747 ["$$animationProvider",function(a){a.drivers.push("$$animateCssDriver");this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function(a,c,d,e,f,z,B){function s(a){return a.replace(/\bng-\S+\b/g,"")}function v(a,b){P(a)&&(a=a.split(" "));P(b)&&(b=b.split(" "));return a.filter(function(a){return-1===b.indexOf(a)}).join(" ")}function I(c,e,f){function k(a){var b={},c=D(a).getBoundingClientRect();r(["width","height","top","left"],function(a){var d=c[a];
1748 1748 switch(a){case "top":d+=C.scrollTop;break;case "left":d+=C.scrollLeft}b[a]=Math.floor(d)+"px"});return b}function p(){var c=s(f.attr("class")||""),d=v(c,l),c=v(l,c),d=a(z,{to:k(f),addClass:"ng-anchor-in "+d,removeClass:"ng-anchor-out "+c,delay:!0});return d.$$willAnimate?d:null}function B(){z.remove();e.removeClass("ng-animate-shim");f.removeClass("ng-animate-shim")}var z=G(D(e).cloneNode(!0)),l=s(z.attr("class")||"");e.addClass("ng-animate-shim");f.addClass("ng-animate-shim");z.addClass("ng-anchor");
1749 1749 w.append(z);var K;c=function(){var c=a(z,{addClass:"ng-anchor-out",delay:!0,from:k(e)});return c.$$willAnimate?c:null}();if(!c&&(K=p(),!K))return B();var M=c||K;return{start:function(){function a(){c&&c.end()}var b,c=M.start();c.done(function(){c=null;if(!K&&(K=p()))return c=K.start(),c.done(function(){c=null;B();b.complete()}),c;B();b.complete()});return b=new d({end:a,cancel:a})}}}function q(a,b,c,e){var f=u(a,Q),s=u(b,Q),z=[];r(e,function(a){(a=I(c,a.out,a["in"]))&&z.push(a)});if(f||s||0!==z.length)return{start:function(){function a(){r(b,
1750 1750 function(a){a.end()})}var b=[];f&&b.push(f.start());s&&b.push(s.start());r(z,function(a){b.push(a.start())});var c=new d({end:a,cancel:a});d.all(b,function(a){c.complete(a)});return c}}}function u(c){var d=c.element,e=c.options||{};c.structural&&(e.event=c.event,e.structural=!0,e.applyClassesEarly=!0,"leave"===c.event&&(e.onDone=e.domOperation));e.preparationClasses&&(e.event=Y(e.event,e.preparationClasses));c=a(d,e);return c.$$willAnimate?c:null}if(!f.animations&&!f.transitions)return Q;var C=B[0].body;
1751 1751 c=D(e);var w=G(c.parentNode&&11===c.parentNode.nodeType||C.contains(c)?c:C);U(z);return function(a){return a.from&&a.to?q(a.from,a.to,a.classes,a.anchors):u(a)}}]}]).provider("$$animateJs",["$animateProvider",function(a){this.$get=["$injector","$$AnimateRunner","$$jqLite",function(b,c,d){function e(c){c=ba(c)?c:c.split(" ");for(var d=[],e={},f=0;f<c.length;f++){var r=c[f],q=a.$$registeredAnimations[r];q&&!e[r]&&(d.push(b.get(q)),e[r]=!0)}return d}var f=U(d);return function(a,b,d,v){function q(){v.domOperation();
1752 1752 f(a,v)}function D(a,b,d,e,g){switch(d){case "animate":b=[b,e.from,e.to,g];break;case "setClass":b=[b,x,G,g];break;case "addClass":b=[b,x,g];break;case "removeClass":b=[b,G,g];break;default:b=[b,g]}b.push(e);if(a=a.apply(a,b))if(Ka(a.start)&&(a=a.start()),a instanceof c)a.done(g);else if(Ka(a))return a;return Q}function u(a,b,d,e,g){var f=[];r(e,function(e){var k=e[g];k&&f.push(function(){var e,g,f=!1,h=function(a){f||(f=!0,(g||Q)(a),e.complete(!a))};e=new c({end:function(){h()},cancel:function(){h(!0)}});
1753 1753 g=D(k,a,b,d,function(a){h(!1===a)});return e})});return f}function C(a,b,d,e,g){var f=u(a,b,d,e,g);if(0===f.length){var h,k;"beforeSetClass"===g?(h=u(a,"removeClass",d,e,"beforeRemoveClass"),k=u(a,"addClass",d,e,"beforeAddClass")):"setClass"===g&&(h=u(a,"removeClass",d,e,"removeClass"),k=u(a,"addClass",d,e,"addClass"));h&&(f=f.concat(h));k&&(f=f.concat(k))}if(0!==f.length)return function(a){var b=[];f.length&&r(f,function(a){b.push(a())});b.length?c.all(b,a):a();return function(a){r(b,function(b){a?
1754 1754 b.cancel():b.end()})}}}var w=!1;3===arguments.length&&va(d)&&(v=d,d=null);v=pa(v);d||(d=a.attr("class")||"",v.addClass&&(d+=" "+v.addClass),v.removeClass&&(d+=" "+v.removeClass));var x=v.addClass,G=v.removeClass,J=e(d),k,p;if(J.length){var L,O;"leave"==b?(O="leave",L="afterLeave"):(O="before"+b.charAt(0).toUpperCase()+b.substr(1),L=b);"enter"!==b&&"move"!==b&&(k=C(a,b,v,J,O));p=C(a,b,v,J,L)}if(k||p){var l;return{$$willAnimate:!0,end:function(){l?l.end():(w=!0,q(),ga(a,v),l=new c,l.complete(!0));return l},
1755 1755 start:function(){function b(c){w=!0;q();ga(a,v);l.complete(c)}if(l)return l;l=new c;var d,e=[];k&&e.push(function(a){d=k(a)});e.length?e.push(function(a){q();a(!0)}):q();p&&e.push(function(a){d=p(a)});l.setHost({end:function(){w||((d||Q)(void 0),b(void 0))},cancel:function(){w||((d||Q)(!0),b(!0))}});c.chain(e,b);return l}}}}}]}]).provider("$$animateJsDriver",["$$animationProvider",function(a){a.drivers.push("$$animateJsDriver");this.$get=["$$animateJs","$$AnimateRunner",function(a,c){function d(c){return a(c.element,
1756 1756 c.event,c.classes,c.options)}return function(a){if(a.from&&a.to){var b=d(a.from),q=d(a.to);if(b||q)return{start:function(){function a(){return function(){r(d,function(a){a.end()})}}var d=[];b&&d.push(b.start());q&&d.push(q.start());c.all(d,function(a){e.complete(a)});var e=new c({end:a(),cancel:a()});return e}}}else return d(a)}}]}])})(window,window.angular);
1757 1757 //# sourceMappingURL=angular-animate.min.js.map
1758 1758
1759 1759 ;/*
1760 1760 * angular-ui-bootstrap
1761 1761 * http://angular-ui.github.io/bootstrap/
1762 1762
1763 1763 * Version: 1.3.2 - 2016-04-14
1764 1764 * License: MIT
1765 1765 */angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.isClass","ui.bootstrap.datepicker","ui.bootstrap.position","ui.bootstrap.datepickerPopup","ui.bootstrap.debounce","ui.bootstrap.dropdown","ui.bootstrap.stackedMap","ui.bootstrap.modal","ui.bootstrap.paging","ui.bootstrap.pager","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["uib/template/accordion/accordion-group.html","uib/template/accordion/accordion.html","uib/template/alert/alert.html","uib/template/carousel/carousel.html","uib/template/carousel/slide.html","uib/template/datepicker/datepicker.html","uib/template/datepicker/day.html","uib/template/datepicker/month.html","uib/template/datepicker/year.html","uib/template/datepickerPopup/popup.html","uib/template/modal/backdrop.html","uib/template/modal/window.html","uib/template/pager/pager.html","uib/template/pagination/pagination.html","uib/template/tooltip/tooltip-html-popup.html","uib/template/tooltip/tooltip-popup.html","uib/template/tooltip/tooltip-template-popup.html","uib/template/popover/popover-html.html","uib/template/popover/popover-template.html","uib/template/popover/popover.html","uib/template/progressbar/bar.html","uib/template/progressbar/progress.html","uib/template/progressbar/progressbar.html","uib/template/rating/rating.html","uib/template/tabs/tab.html","uib/template/tabs/tabset.html","uib/template/timepicker/timepicker.html","uib/template/typeahead/typeahead-match.html","uib/template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("uibCollapse",["$animate","$q","$parse","$injector",function(a,b,c,d){var e=d.has("$animateCss")?d.get("$animateCss"):null;return{link:function(d,f,g){function h(){f.hasClass("collapse")&&f.hasClass("in")||b.resolve(l(d)).then(function(){f.removeClass("collapse").addClass("collapsing").attr("aria-expanded",!0).attr("aria-hidden",!1),e?e(f,{addClass:"in",easing:"ease",to:{height:f[0].scrollHeight+"px"}}).start()["finally"](i):a.addClass(f,"in",{to:{height:f[0].scrollHeight+"px"}}).then(i)})}function i(){f.removeClass("collapsing").addClass("collapse").css({height:"auto"}),m(d)}function j(){return f.hasClass("collapse")||f.hasClass("in")?void b.resolve(n(d)).then(function(){f.css({height:f[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing").attr("aria-expanded",!1).attr("aria-hidden",!0),e?e(f,{removeClass:"in",to:{height:"0"}}).start()["finally"](k):a.removeClass(f,"in",{to:{height:"0"}}).then(k)}):k()}function k(){f.css({height:"0"}),f.removeClass("collapsing").addClass("collapse"),o(d)}var l=c(g.expanding),m=c(g.expanded),n=c(g.collapsing),o=c(g.collapsed);d.$eval(g.uibCollapse)||f.addClass("in").addClass("collapse").attr("aria-expanded",!0).attr("aria-hidden",!1).css({height:"auto"}),d.$watch(g.uibCollapse,function(a){a?j():h()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("uibAccordionConfig",{closeOthers:!0}).controller("UibAccordionController",["$scope","$attrs","uibAccordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(c){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("uibAccordion",function(){return{controller:"UibAccordionController",controllerAs:"accordion",transclude:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/accordion/accordion.html"}}}).directive("uibAccordionGroup",function(){return{require:"^uibAccordion",transclude:!0,replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/accordion/accordion-group.html"},scope:{heading:"@",panelClass:"@?",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.openClass=c.openClass||"panel-open",a.panelClass=c.panelClass||"panel-default",a.$watch("isOpen",function(c){b.toggleClass(a.openClass,!!c),c&&d.closeOthers(a)}),a.toggleOpen=function(b){a.isDisabled||b&&32!==b.which||(a.isOpen=!a.isOpen)};var e="accordiongroup-"+a.$id+"-"+Math.floor(1e4*Math.random());a.headingId=e+"-tab",a.panelId=e+"-panel"}}}).directive("uibAccordionHeading",function(){return{transclude:!0,template:"",replace:!0,require:"^uibAccordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("uibAccordionTransclude",function(){return{require:"^uibAccordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.uibAccordionTransclude]},function(a){if(a){var c=angular.element(b[0].querySelector("[uib-accordion-header]"));c.html(""),c.append(a)}})}}}),angular.module("ui.bootstrap.alert",[]).controller("UibAlertController",["$scope","$attrs","$interpolate","$timeout",function(a,b,c,d){a.closeable=!!b.close;var e=angular.isDefined(b.dismissOnTimeout)?c(b.dismissOnTimeout)(a.$parent):null;e&&d(function(){a.close()},parseInt(e,10))}]).directive("uibAlert",function(){return{controller:"UibAlertController",controllerAs:"alert",templateUrl:function(a,b){return b.templateUrl||"uib/template/alert/alert.html"},transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}),angular.module("ui.bootstrap.buttons",[]).constant("uibButtonConfig",{activeClass:"active",toggleEvent:"click"}).controller("UibButtonsController",["uibButtonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("uibBtnRadio",["$parse",function(a){return{require:["uibBtnRadio","ngModel"],controller:"UibButtonsController",controllerAs:"buttons",link:function(b,c,d,e){var f=e[0],g=e[1],h=a(d.uibUncheckable);c.find("input").css({display:"none"}),g.$render=function(){c.toggleClass(f.activeClass,angular.equals(g.$modelValue,b.$eval(d.uibBtnRadio)))},c.on(f.toggleEvent,function(){if(!d.disabled){var a=c.hasClass(f.activeClass);a&&!angular.isDefined(d.uncheckable)||b.$apply(function(){g.$setViewValue(a?null:b.$eval(d.uibBtnRadio)),g.$render()})}}),d.uibUncheckable&&b.$watch(h,function(a){d.$set("uncheckable",a?"":void 0)})}}}]).directive("uibBtnCheckbox",function(){return{require:["uibBtnCheckbox","ngModel"],controller:"UibButtonsController",controllerAs:"button",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){return angular.isDefined(b)?a.$eval(b):c}var h=d[0],i=d[1];b.find("input").css({display:"none"}),i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.on(h.toggleEvent,function(){c.disabled||a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("UibCarouselController",["$scope","$element","$interval","$timeout","$animate",function(a,b,c,d,e){function f(){for(;t.length;)t.shift()}function g(a){for(var b=0;b<q.length;b++)q[b].slide.active=b===a}function h(c,d,i){if(!u){if(angular.extend(c,{direction:i}),angular.extend(q[s].slide||{},{direction:i}),e.enabled(b)&&!a.$currentTransition&&q[d].element&&p.slides.length>1){q[d].element.data(r,c.direction);var j=p.getCurrentIndex();angular.isNumber(j)&&q[j].element&&q[j].element.data(r,c.direction),a.$currentTransition=!0,e.on("addClass",q[d].element,function(b,c){if("close"===c&&(a.$currentTransition=null,e.off("addClass",b),t.length)){var d=t.pop().slide,g=d.index,i=g>p.getCurrentIndex()?"next":"prev";f(),h(d,g,i)}})}a.active=c.index,s=c.index,g(d),l()}}function i(a){for(var b=0;b<q.length;b++)if(q[b].slide===a)return b}function j(){n&&(c.cancel(n),n=null)}function k(b){b.length||(a.$currentTransition=null,f())}function l(){j();var b=+a.interval;!isNaN(b)&&b>0&&(n=c(m,b))}function m(){var b=+a.interval;o&&!isNaN(b)&&b>0&&q.length?a.next():a.pause()}var n,o,p=this,q=p.slides=a.slides=[],r="uib-slideDirection",s=a.active,t=[],u=!1;p.addSlide=function(b,c){q.push({slide:b,element:c}),q.sort(function(a,b){return+a.slide.index-+b.slide.index}),(b.index===a.active||1===q.length&&!angular.isNumber(a.active))&&(a.$currentTransition&&(a.$currentTransition=null),s=b.index,a.active=b.index,g(s),p.select(q[i(b)]),1===q.length&&a.play())},p.getCurrentIndex=function(){for(var a=0;a<q.length;a++)if(q[a].slide.index===s)return a},p.next=a.next=function(){var b=(p.getCurrentIndex()+1)%q.length;return 0===b&&a.noWrap()?void a.pause():p.select(q[b],"next")},p.prev=a.prev=function(){var b=p.getCurrentIndex()-1<0?q.length-1:p.getCurrentIndex()-1;return a.noWrap()&&b===q.length-1?void a.pause():p.select(q[b],"prev")},p.removeSlide=function(b){var c=i(b),d=t.indexOf(q[c]);-1!==d&&t.splice(d,1),q.splice(c,1),q.length>0&&s===c?c>=q.length?(s=q.length-1,a.active=s,g(s),p.select(q[q.length-1])):(s=c,a.active=s,g(s),p.select(q[c])):s>c&&(s--,a.active=s),0===q.length&&(s=null,a.active=null,f())},p.select=a.select=function(b,c){var d=i(b.slide);void 0===c&&(c=d>p.getCurrentIndex()?"next":"prev"),b.slide.index===s||a.$currentTransition?b&&b.slide.index!==s&&a.$currentTransition&&t.push(q[d]):h(b.slide,d,c)},a.indexOfSlide=function(a){return+a.slide.index},a.isActive=function(b){return a.active===b.slide.index},a.isPrevDisabled=function(){return 0===a.active&&a.noWrap()},a.isNextDisabled=function(){return a.active===q.length-1&&a.noWrap()},a.pause=function(){a.noPause||(o=!1,j())},a.play=function(){o||(o=!0,l())},a.$on("$destroy",function(){u=!0,j()}),a.$watch("noTransition",function(a){e.enabled(b,!a)}),a.$watch("interval",l),a.$watchCollection("slides",k),a.$watch("active",function(a){if(angular.isNumber(a)&&s!==a){for(var b=0;b<q.length;b++)if(q[b].slide.index===a){a=b;break}var c=q[a];c&&(g(a),p.select(q[a]),s=a)}})}]).directive("uibCarousel",function(){return{transclude:!0,replace:!0,controller:"UibCarouselController",controllerAs:"carousel",templateUrl:function(a,b){return b.templateUrl||"uib/template/carousel/carousel.html"},scope:{active:"=",interval:"=",noTransition:"=",noPause:"=",noWrap:"&"}}}).directive("uibSlide",function(){return{require:"^uibCarousel",transclude:!0,replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/carousel/slide.html"},scope:{actual:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)})}}}).animation(".item",["$animateCss",function(a){function b(a,b,c){a.removeClass(b),c&&c()}var c="uib-slideDirection";return{beforeAddClass:function(d,e,f){if("active"===e){var g=!1,h=d.data(c),i="next"===h?"left":"right",j=b.bind(this,d,i+" "+h,f);return d.addClass(h),a(d,{addClass:i}).start().done(j),function(){g=!0}}f()},beforeRemoveClass:function(d,e,f){if("active"===e){var g=!1,h=d.data(c),i="next"===h?"left":"right",j=b.bind(this,d,i,f);return a(d,{addClass:i}).start().done(j),function(){g=!0}}f()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("uibDateParser",["$log","$locale","dateFilter","orderByFilter",function(a,b,c,d){function e(a,b){var c=[],e=a.split(""),f=a.indexOf("'");if(f>-1){var g=!1;a=a.split("");for(var h=f;h<a.length;h++)g?("'"===a[h]&&(h+1<a.length&&"'"===a[h+1]?(a[h+1]="$",e[h+1]=""):(e[h]="",g=!1)),a[h]="$"):"'"===a[h]&&(a[h]="$",e[h]="",g=!0);a=a.join("")}return angular.forEach(n,function(d){var f=a.indexOf(d.key);if(f>-1){a=a.split(""),e[f]="("+d.regex+")",a[f]="$";for(var g=f+1,h=f+d.key.length;h>g;g++)e[g]="",a[g]="$";a=a.join(""),c.push({index:f,key:d.key,apply:d[b],matcher:d.regex})}}),{regex:new RegExp("^"+e.join("")+"$"),map:d(c,"index")}}function f(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}function g(a){return parseInt(a,10)}function h(a,b){return a&&b?l(a,b):a}function i(a,b){return a&&b?l(a,b,!0):a}function j(a,b){var c=Date.parse("Jan 01, 1970 00:00:00 "+a)/6e4;return isNaN(c)?b:c}function k(a,b){return a=new Date(a.getTime()),a.setMinutes(a.getMinutes()+b),a}function l(a,b,c){c=c?-1:1;var d=j(b,a.getTimezoneOffset());return k(a,c*(d-a.getTimezoneOffset()))}var m,n,o=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.init=function(){m=b.id,this.parsers={},this.formatters={},n=[{key:"yyyy",regex:"\\d{4}",apply:function(a){this.year=+a},formatter:function(a){var b=new Date;return b.setFullYear(Math.abs(a.getFullYear())),c(b,"yyyy")}},{key:"yy",regex:"\\d{2}",apply:function(a){a=+a,this.year=69>a?a+2e3:a+1900},formatter:function(a){var b=new Date;return b.setFullYear(Math.abs(a.getFullYear())),c(b,"yy")}},{key:"y",regex:"\\d{1,4}",apply:function(a){this.year=+a},formatter:function(a){var b=new Date;return b.setFullYear(Math.abs(a.getFullYear())),c(b,"y")}},{key:"M!",regex:"0?[1-9]|1[0-2]",apply:function(a){this.month=a-1},formatter:function(a){var b=a.getMonth();return/^[0-9]$/.test(b)?c(a,"MM"):c(a,"M")}},{key:"MMMM",regex:b.DATETIME_FORMATS.MONTH.join("|"),apply:function(a){this.month=b.DATETIME_FORMATS.MONTH.indexOf(a)},formatter:function(a){return c(a,"MMMM")}},{key:"MMM",regex:b.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(a){this.month=b.DATETIME_FORMATS.SHORTMONTH.indexOf(a)},formatter:function(a){return c(a,"MMM")}},{key:"MM",regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1},formatter:function(a){return c(a,"MM")}},{key:"M",regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1},formatter:function(a){return c(a,"M")}},{key:"d!",regex:"[0-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a},formatter:function(a){var b=a.getDate();return/^[1-9]$/.test(b)?c(a,"dd"):c(a,"d")}},{key:"dd",regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a},formatter:function(a){return c(a,"dd")}},{key:"d",regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a},formatter:function(a){return c(a,"d")}},{key:"EEEE",regex:b.DATETIME_FORMATS.DAY.join("|"),formatter:function(a){return c(a,"EEEE")}},{key:"EEE",regex:b.DATETIME_FORMATS.SHORTDAY.join("|"),formatter:function(a){return c(a,"EEE")}},{key:"HH",regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"HH")}},{key:"hh",regex:"0[0-9]|1[0-2]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"hh")}},{key:"H",regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"H")}},{key:"h",regex:"[0-9]|1[0-2]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"h")}},{key:"mm",regex:"[0-5][0-9]",apply:function(a){this.minutes=+a},formatter:function(a){return c(a,"mm")}},{key:"m",regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a},formatter:function(a){return c(a,"m")}},{key:"sss",regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a},formatter:function(a){return c(a,"sss")}},{key:"ss",regex:"[0-5][0-9]",apply:function(a){this.seconds=+a},formatter:function(a){return c(a,"ss")}},{key:"s",regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a},formatter:function(a){return c(a,"s")}},{key:"a",regex:b.DATETIME_FORMATS.AMPMS.join("|"),apply:function(a){12===this.hours&&(this.hours=0),"PM"===a&&(this.hours+=12)},formatter:function(a){return c(a,"a")}},{key:"Z",regex:"[+-]\\d{4}",apply:function(a){var b=a.match(/([+-])(\d{2})(\d{2})/),c=b[1],d=b[2],e=b[3];this.hours+=g(c+d),this.minutes+=g(c+e)},formatter:function(a){return c(a,"Z")}},{key:"ww",regex:"[0-4][0-9]|5[0-3]",formatter:function(a){return c(a,"ww")}},{key:"w",regex:"[0-9]|[1-4][0-9]|5[0-3]",formatter:function(a){return c(a,"w")}},{key:"GGGG",regex:b.DATETIME_FORMATS.ERANAMES.join("|").replace(/\s/g,"\\s"),formatter:function(a){return c(a,"GGGG")}},{key:"GGG",regex:b.DATETIME_FORMATS.ERAS.join("|"),formatter:function(a){return c(a,"GGG")}},{key:"GG",regex:b.DATETIME_FORMATS.ERAS.join("|"),formatter:function(a){return c(a,"GG")}},{key:"G",regex:b.DATETIME_FORMATS.ERAS.join("|"),formatter:function(a){return c(a,"G")}}]},this.init(),this.filter=function(a,c){if(!angular.isDate(a)||isNaN(a)||!c)return"";c=b.DATETIME_FORMATS[c]||c,b.id!==m&&this.init(),this.formatters[c]||(this.formatters[c]=e(c,"formatter"));var d=this.formatters[c],f=d.map,g=c;return f.reduce(function(b,c,d){var e=g.match(new RegExp("(.*)"+c.key));e&&angular.isString(e[1])&&(b+=e[1],g=g.replace(e[1]+c.key,""));var h=d===f.length-1?g:"";return c.apply?b+c.apply.call(null,a)+h:b+h},"")},this.parse=function(c,d,g){if(!angular.isString(c)||!d)return c;d=b.DATETIME_FORMATS[d]||d,d=d.replace(o,"\\$&"),b.id!==m&&this.init(),this.parsers[d]||(this.parsers[d]=e(d,"apply"));var h=this.parsers[d],i=h.regex,j=h.map,k=c.match(i),l=!1;if(k&&k.length){var n,p;angular.isDate(g)&&!isNaN(g.getTime())?n={year:g.getFullYear(),month:g.getMonth(),date:g.getDate(),hours:g.getHours(),minutes:g.getMinutes(),seconds:g.getSeconds(),milliseconds:g.getMilliseconds()}:(g&&a.warn("dateparser:","baseDate is not a valid date"),n={year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0});for(var q=1,r=k.length;r>q;q++){var s=j[q-1];"Z"===s.matcher&&(l=!0),s.apply&&s.apply.call(n,k[q])}var t=l?Date.prototype.setUTCFullYear:Date.prototype.setFullYear,u=l?Date.prototype.setUTCHours:Date.prototype.setHours;return f(n.year,n.month,n.date)&&(!angular.isDate(g)||isNaN(g.getTime())||l?(p=new Date(0),t.call(p,n.year,n.month,n.date),u.call(p,n.hours||0,n.minutes||0,n.seconds||0,n.milliseconds||0)):(p=new Date(g),t.call(p,n.year,n.month,n.date),u.call(p,n.hours,n.minutes,n.seconds,n.milliseconds))),p}},this.toTimezone=h,this.fromTimezone=i,this.timezoneToOffset=j,this.addDateMinutes=k,this.convertTimezoneToLocal=l}]),angular.module("ui.bootstrap.isClass",[]).directive("uibIsClass",["$animate",function(a){var b=/^\s*([\s\S]+?)\s+on\s+([\s\S]+?)\s*$/,c=/^\s*([\s\S]+?)\s+for\s+([\s\S]+?)\s*$/;return{restrict:"A",compile:function(d,e){function f(a,b,c){i.push(a),j.push({scope:a,element:b}),o.forEach(function(b,c){g(b,a)}),a.$on("$destroy",h)}function g(b,d){var e=b.match(c),f=d.$eval(e[1]),g=e[2],h=k[b];if(!h){var i=function(b){var c=null;j.some(function(a){var d=a.scope.$eval(m);return d===b?(c=a,!0):void 0}),h.lastActivated!==c&&(h.lastActivated&&a.removeClass(h.lastActivated.element,f),c&&a.addClass(c.element,f),h.lastActivated=c)};k[b]=h={lastActivated:null,scope:d,watchFn:i,compareWithExp:g,watcher:d.$watch(g,i)}}h.watchFn(d.$eval(g))}function h(a){var b=a.targetScope,c=i.indexOf(b);if(i.splice(c,1),j.splice(c,1),i.length){var d=i[0];angular.forEach(k,function(a){a.scope===b&&(a.watcher=d.$watch(a.compareWithExp,a.watchFn),a.scope=d)})}else k={}}var i=[],j=[],k={},l=e.uibIsClass.match(b),m=l[2],n=l[1],o=n.split(",");return f}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.isClass"]).value("$datepickerSuppressError",!1).value("$datepickerLiteralWarning",!0).constant("uibDatepickerConfig",{datepickerMode:"day",formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",maxDate:null,maxMode:"year",minDate:null,minMode:"day",ngModelOptions:{},shortcutPropagation:!1,showWeeks:!0,yearColumns:5,yearRows:4}).controller("UibDatepickerController",["$scope","$attrs","$parse","$interpolate","$locale","$log","dateFilter","uibDatepickerConfig","$datepickerLiteralWarning","$datepickerSuppressError","uibDateParser",function(a,b,c,d,e,f,g,h,i,j,k){function l(b){a.datepickerMode=b,a.datepickerOptions.datepickerMode=b}var m=this,n={$setViewValue:angular.noop},o={},p=[];!!b.datepickerOptions;a.datepickerOptions||(a.datepickerOptions={}),this.modes=["day","month","year"],["customClass","dateDisabled","datepickerMode","formatDay","formatDayHeader","formatDayTitle","formatMonth","formatMonthTitle","formatYear","maxDate","maxMode","minDate","minMode","showWeeks","shortcutPropagation","startingDay","yearColumns","yearRows"].forEach(function(b){switch(b){case"customClass":case"dateDisabled":a[b]=a.datepickerOptions[b]||angular.noop;break;case"datepickerMode":a.datepickerMode=angular.isDefined(a.datepickerOptions.datepickerMode)?a.datepickerOptions.datepickerMode:h.datepickerMode;break;case"formatDay":case"formatDayHeader":case"formatDayTitle":case"formatMonth":case"formatMonthTitle":case"formatYear":m[b]=angular.isDefined(a.datepickerOptions[b])?d(a.datepickerOptions[b])(a.$parent):h[b];break;case"showWeeks":case"shortcutPropagation":case"yearColumns":case"yearRows":m[b]=angular.isDefined(a.datepickerOptions[b])?a.datepickerOptions[b]:h[b];break;case"startingDay":angular.isDefined(a.datepickerOptions.startingDay)?m.startingDay=a.datepickerOptions.startingDay:angular.isNumber(h.startingDay)?m.startingDay=h.startingDay:m.startingDay=(e.DATETIME_FORMATS.FIRSTDAYOFWEEK+8)%7;break;case"maxDate":case"minDate":a.$watch("datepickerOptions."+b,function(a){a?angular.isDate(a)?m[b]=k.fromTimezone(new Date(a),o.timezone):(i&&f.warn("Literal date support has been deprecated, please switch to date object usage"),m[b]=new Date(g(a,"medium"))):m[b]=h[b]?k.fromTimezone(new Date(h[b]),o.timezone):null,m.refreshView()});break;case"maxMode":case"minMode":a.datepickerOptions[b]?a.$watch(function(){return a.datepickerOptions[b]},function(c){m[b]=a[b]=angular.isDefined(c)?c:datepickerOptions[b],("minMode"===b&&m.modes.indexOf(a.datepickerOptions.datepickerMode)<m.modes.indexOf(m[b])||"maxMode"===b&&m.modes.indexOf(a.datepickerOptions.datepickerMode)>m.modes.indexOf(m[b]))&&(a.datepickerMode=m[b],a.datepickerOptions.datepickerMode=m[b])}):m[b]=a[b]=h[b]||null}}),a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),a.disabled=angular.isDefined(b.disabled)||!1,angular.isDefined(b.ngDisabled)&&p.push(a.$parent.$watch(b.ngDisabled,function(b){a.disabled=b,m.refreshView()})),a.isActive=function(b){return 0===m.compare(b.date,m.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(b){n=b,o=b.$options||h.ngModelOptions,a.datepickerOptions.initDate?(m.activeDate=k.fromTimezone(a.datepickerOptions.initDate,o.timezone)||new Date,a.$watch("datepickerOptions.initDate",function(a){a&&(n.$isEmpty(n.$modelValue)||n.$invalid)&&(m.activeDate=k.fromTimezone(a,o.timezone),m.refreshView())})):m.activeDate=new Date,this.activeDate=n.$modelValue?k.fromTimezone(new Date(n.$modelValue),o.timezone):k.fromTimezone(new Date,o.timezone),n.$render=function(){m.render()}},this.render=function(){if(n.$viewValue){var a=new Date(n.$viewValue),b=!isNaN(a);b?this.activeDate=k.fromTimezone(a,o.timezone):j||f.error('Datepicker directive: "ng-model" value must be a Date object')}this.refreshView()},this.refreshView=function(){if(this.element){a.selectedDt=null,this._refreshView(),a.activeDt&&(a.activeDateId=a.activeDt.uid);var b=n.$viewValue?new Date(n.$viewValue):null;b=k.fromTimezone(b,o.timezone),n.$setValidity("dateDisabled",!b||this.element&&!this.isDisabled(b))}},this.createDateObject=function(b,c){var d=n.$viewValue?new Date(n.$viewValue):null;d=k.fromTimezone(d,o.timezone);var e=new Date;e=k.fromTimezone(e,o.timezone);var f=this.compare(b,e),g={date:b,label:k.filter(b,c),selected:d&&0===this.compare(b,d),disabled:this.isDisabled(b),past:0>f,current:0===f,future:f>0,customClass:this.customClass(b)||null};return d&&0===this.compare(b,d)&&(a.selectedDt=g),m.activeDate&&0===this.compare(g.date,m.activeDate)&&(a.activeDt=g),g},this.isDisabled=function(b){return a.disabled||this.minDate&&this.compare(b,this.minDate)<0||this.maxDate&&this.compare(b,this.maxDate)>0||a.dateDisabled&&a.dateDisabled({date:b,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===m.minMode){var c=n.$viewValue?k.fromTimezone(new Date(n.$viewValue),o.timezone):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),c=k.toTimezone(c,o.timezone),n.$setViewValue(c),n.$render()}else m.activeDate=b,l(m.modes[m.modes.indexOf(a.datepickerMode)-1]),a.$emit("uib:datepicker.mode");a.$broadcast("uib:datepicker.focus")},a.move=function(a){var b=m.activeDate.getFullYear()+a*(m.step.years||0),c=m.activeDate.getMonth()+a*(m.step.months||0);m.activeDate.setFullYear(b,c,1),m.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===m.maxMode&&1===b||a.datepickerMode===m.minMode&&-1===b||(l(m.modes[m.modes.indexOf(a.datepickerMode)+b]),a.$emit("uib:datepicker.mode"))},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var q=function(){m.element[0].focus()};a.$on("uib:datepicker.focus",q),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey&&!a.disabled)if(b.preventDefault(),m.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(m.isDisabled(m.activeDate))return;a.select(m.activeDate)}else!b.ctrlKey||"up"!==c&&"down"!==c?(m.handleKeyDown(c,b),m.refreshView()):a.toggleMode("up"===c?1:-1)},a.$on("$destroy",function(){for(;p.length;)p.shift()()})}]).controller("UibDaypickerController",["$scope","$element","dateFilter",function(a,b,c){function d(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?f[b]:29}function e(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}var f=[31,28,31,30,31,30,31,31,30,31,30,31];this.step={months:1},this.element=b,this.init=function(b){angular.extend(b,this),a.showWeeks=b.showWeeks,b.refreshView()},this.getDates=function(a,b){for(var c,d=new Array(b),e=new Date(a),f=0;b>f;)c=new Date(e),d[f++]=c,e.setDate(e.getDate()+1);return d},this._refreshView=function(){var b=this.activeDate.getFullYear(),d=this.activeDate.getMonth(),f=new Date(this.activeDate);f.setFullYear(b,d,1);var g=this.startingDay-f.getDay(),h=g>0?7-g:-g,i=new Date(f);h>0&&i.setDate(-h+1);for(var j=this.getDates(i,42),k=0;42>k;k++)j[k]=angular.extend(this.createDateObject(j[k],this.formatDay),{secondary:j[k].getMonth()!==d,uid:a.uniqueId+"-"+k});a.labels=new Array(7);for(var l=0;7>l;l++)a.labels[l]={abbr:c(j[l].date,this.formatDayHeader),full:c(j[l].date,"EEEE")};if(a.title=c(this.activeDate,this.formatDayTitle),a.rows=this.split(j,7),a.showWeeks){a.weekNumbers=[];for(var m=(11-this.startingDay)%7,n=a.rows.length,o=0;n>o;o++)a.weekNumbers.push(e(a.rows[o][m].date))}},this.compare=function(a,b){var c=new Date(a.getFullYear(),a.getMonth(),a.getDate()),d=new Date(b.getFullYear(),b.getMonth(),b.getDate());return c.setFullYear(a.getFullYear()),d.setFullYear(b.getFullYear()),c-d},this.handleKeyDown=function(a,b){var c=this.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var e=this.activeDate.getMonth()+("pageup"===a?-1:1);this.activeDate.setMonth(e,1),c=Math.min(d(this.activeDate.getFullYear(),this.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=d(this.activeDate.getFullYear(),this.activeDate.getMonth()));this.activeDate.setDate(c)}}]).controller("UibMonthpickerController",["$scope","$element","dateFilter",function(a,b,c){this.step={years:1},this.element=b,this.init=function(a){angular.extend(a,this),a.refreshView()},this._refreshView=function(){for(var b,d=new Array(12),e=this.activeDate.getFullYear(),f=0;12>f;f++)b=new Date(this.activeDate),b.setFullYear(e,f,1),d[f]=angular.extend(this.createDateObject(b,this.formatMonth),{uid:a.uniqueId+"-"+f});a.title=c(this.activeDate,this.formatMonthTitle),a.rows=this.split(d,3)},this.compare=function(a,b){var c=new Date(a.getFullYear(),a.getMonth()),d=new Date(b.getFullYear(),b.getMonth());return c.setFullYear(a.getFullYear()),d.setFullYear(b.getFullYear()),c-d},this.handleKeyDown=function(a,b){var c=this.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=this.activeDate.getFullYear()+("pageup"===a?-1:1);this.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);this.activeDate.setMonth(c)}}]).controller("UibYearpickerController",["$scope","$element","dateFilter",function(a,b,c){function d(a){return parseInt((a-1)/f,10)*f+1}var e,f;this.element=b,this.yearpickerInit=function(){e=this.yearColumns,f=this.yearRows*e,this.step={years:f}},this._refreshView=function(){for(var b,c=new Array(f),g=0,h=d(this.activeDate.getFullYear());f>g;g++)b=new Date(this.activeDate),b.setFullYear(h+g,0,1),c[g]=angular.extend(this.createDateObject(b,this.formatYear),{uid:a.uniqueId+"-"+g});a.title=[c[0].label,c[f-1].label].join(" - "),a.rows=this.split(c,e),a.columns=e},this.compare=function(a,b){return a.getFullYear()-b.getFullYear()},this.handleKeyDown=function(a,b){var c=this.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=e:"right"===a?c+=1:"down"===a?c+=e:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*f:"home"===a?c=d(this.activeDate.getFullYear()):"end"===a&&(c=d(this.activeDate.getFullYear())+f-1),this.activeDate.setFullYear(c)}}]).directive("uibDatepicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/datepicker.html"},scope:{datepickerOptions:"=?"},require:["uibDatepicker","^ngModel"],controller:"UibDatepickerController",controllerAs:"datepicker",link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}).directive("uibDaypicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/day.html"},require:["^uibDatepicker","uibDaypicker"],controller:"UibDaypickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f.init(e)}}}).directive("uibMonthpicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/month.html"},require:["^uibDatepicker","uibMonthpicker"],controller:"UibMonthpickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f.init(e)}}}).directive("uibYearpicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/year.html"},require:["^uibDatepicker","uibYearpicker"],controller:"UibYearpickerController",link:function(a,b,c,d){var e=d[0];angular.extend(e,d[1]),e.yearpickerInit(),e.refreshView()}}}),angular.module("ui.bootstrap.position",[]).factory("$uibPosition",["$document","$window",function(a,b){var c,d,e={normal:/(auto|scroll)/,hidden:/(auto|scroll|hidden)/},f={auto:/\s?auto?\s?/i,primary:/^(top|bottom|left|right)$/,secondary:/^(top|bottom|left|right|center)$/,vertical:/^(top|bottom)$/},g=/(HTML|BODY)/;return{getRawNode:function(a){return a.nodeName?a:a[0]||a},parseStyle:function(a){return a=parseFloat(a),isFinite(a)?a:0},offsetParent:function(c){function d(a){return"static"===(b.getComputedStyle(a).position||"static")}c=this.getRawNode(c);for(var e=c.offsetParent||a[0].documentElement;e&&e!==a[0].documentElement&&d(e);)e=e.offsetParent;return e||a[0].documentElement},scrollbarWidth:function(e){if(e){if(angular.isUndefined(d)){var f=a.find("body");f.addClass("uib-position-body-scrollbar-measure"),d=b.innerWidth-f[0].clientWidth,d=isFinite(d)?d:0,f.removeClass("uib-position-body-scrollbar-measure")}return d}if(angular.isUndefined(c)){var g=angular.element('<div class="uib-position-scrollbar-measure"></div>');a.find("body").append(g),c=g[0].offsetWidth-g[0].clientWidth,c=isFinite(c)?c:0,g.remove()}return c},scrollbarPadding:function(a){a=this.getRawNode(a);var c=b.getComputedStyle(a),d=this.parseStyle(c.paddingRight),e=this.parseStyle(c.paddingBottom),f=this.scrollParent(a,!1,!0),h=this.scrollbarWidth(f,g.test(f.tagName));return{scrollbarWidth:h,widthOverflow:f.scrollWidth>f.clientWidth,right:d+h,originalRight:d,heightOverflow:f.scrollHeight>f.clientHeight,bottom:e+h,originalBottom:e}},isScrollable:function(a,c){a=this.getRawNode(a);var d=c?e.hidden:e.normal,f=b.getComputedStyle(a);return d.test(f.overflow+f.overflowY+f.overflowX);
1766 1766 },scrollParent:function(c,d,f){c=this.getRawNode(c);var g=d?e.hidden:e.normal,h=a[0].documentElement,i=b.getComputedStyle(c);if(f&&g.test(i.overflow+i.overflowY+i.overflowX))return c;var j="absolute"===i.position,k=c.parentElement||h;if(k===h||"fixed"===i.position)return h;for(;k.parentElement&&k!==h;){var l=b.getComputedStyle(k);if(j&&"static"!==l.position&&(j=!1),!j&&g.test(l.overflow+l.overflowY+l.overflowX))break;k=k.parentElement}return k},position:function(c,d){c=this.getRawNode(c);var e=this.offset(c);if(d){var f=b.getComputedStyle(c);e.top-=this.parseStyle(f.marginTop),e.left-=this.parseStyle(f.marginLeft)}var g=this.offsetParent(c),h={top:0,left:0};return g!==a[0].documentElement&&(h=this.offset(g),h.top+=g.clientTop-g.scrollTop,h.left+=g.clientLeft-g.scrollLeft),{width:Math.round(angular.isNumber(e.width)?e.width:c.offsetWidth),height:Math.round(angular.isNumber(e.height)?e.height:c.offsetHeight),top:Math.round(e.top-h.top),left:Math.round(e.left-h.left)}},offset:function(c){c=this.getRawNode(c);var d=c.getBoundingClientRect();return{width:Math.round(angular.isNumber(d.width)?d.width:c.offsetWidth),height:Math.round(angular.isNumber(d.height)?d.height:c.offsetHeight),top:Math.round(d.top+(b.pageYOffset||a[0].documentElement.scrollTop)),left:Math.round(d.left+(b.pageXOffset||a[0].documentElement.scrollLeft))}},viewportOffset:function(c,d,e){c=this.getRawNode(c),e=e!==!1;var f=c.getBoundingClientRect(),g={top:0,left:0,bottom:0,right:0},h=d?a[0].documentElement:this.scrollParent(c),i=h.getBoundingClientRect();if(g.top=i.top+h.clientTop,g.left=i.left+h.clientLeft,h===a[0].documentElement&&(g.top+=b.pageYOffset,g.left+=b.pageXOffset),g.bottom=g.top+h.clientHeight,g.right=g.left+h.clientWidth,e){var j=b.getComputedStyle(h);g.top+=this.parseStyle(j.paddingTop),g.bottom-=this.parseStyle(j.paddingBottom),g.left+=this.parseStyle(j.paddingLeft),g.right-=this.parseStyle(j.paddingRight)}return{top:Math.round(f.top-g.top),bottom:Math.round(g.bottom-f.bottom),left:Math.round(f.left-g.left),right:Math.round(g.right-f.right)}},parsePlacement:function(a){var b=f.auto.test(a);return b&&(a=a.replace(f.auto,"")),a=a.split("-"),a[0]=a[0]||"top",f.primary.test(a[0])||(a[0]="top"),a[1]=a[1]||"center",f.secondary.test(a[1])||(a[1]="center"),b?a[2]=!0:a[2]=!1,a},positionElements:function(a,c,d,e){a=this.getRawNode(a),c=this.getRawNode(c);var g=angular.isDefined(c.offsetWidth)?c.offsetWidth:c.prop("offsetWidth"),h=angular.isDefined(c.offsetHeight)?c.offsetHeight:c.prop("offsetHeight");d=this.parsePlacement(d);var i=e?this.offset(a):this.position(a),j={top:0,left:0,placement:""};if(d[2]){var k=this.viewportOffset(a,e),l=b.getComputedStyle(c),m={width:g+Math.round(Math.abs(this.parseStyle(l.marginLeft)+this.parseStyle(l.marginRight))),height:h+Math.round(Math.abs(this.parseStyle(l.marginTop)+this.parseStyle(l.marginBottom)))};if(d[0]="top"===d[0]&&m.height>k.top&&m.height<=k.bottom?"bottom":"bottom"===d[0]&&m.height>k.bottom&&m.height<=k.top?"top":"left"===d[0]&&m.width>k.left&&m.width<=k.right?"right":"right"===d[0]&&m.width>k.right&&m.width<=k.left?"left":d[0],d[1]="top"===d[1]&&m.height-i.height>k.bottom&&m.height-i.height<=k.top?"bottom":"bottom"===d[1]&&m.height-i.height>k.top&&m.height-i.height<=k.bottom?"top":"left"===d[1]&&m.width-i.width>k.right&&m.width-i.width<=k.left?"right":"right"===d[1]&&m.width-i.width>k.left&&m.width-i.width<=k.right?"left":d[1],"center"===d[1])if(f.vertical.test(d[0])){var n=i.width/2-g/2;k.left+n<0&&m.width-i.width<=k.right?d[1]="left":k.right+n<0&&m.width-i.width<=k.left&&(d[1]="right")}else{var o=i.height/2-m.height/2;k.top+o<0&&m.height-i.height<=k.bottom?d[1]="top":k.bottom+o<0&&m.height-i.height<=k.top&&(d[1]="bottom")}}switch(d[0]){case"top":j.top=i.top-h;break;case"bottom":j.top=i.top+i.height;break;case"left":j.left=i.left-g;break;case"right":j.left=i.left+i.width}switch(d[1]){case"top":j.top=i.top;break;case"bottom":j.top=i.top+i.height-h;break;case"left":j.left=i.left;break;case"right":j.left=i.left+i.width-g;break;case"center":f.vertical.test(d[0])?j.left=i.left+i.width/2-g/2:j.top=i.top+i.height/2-h/2}return j.top=Math.round(j.top),j.left=Math.round(j.left),j.placement="center"===d[1]?d[0]:d[0]+"-"+d[1],j},positionArrow:function(a,c){a=this.getRawNode(a);var d=a.querySelector(".tooltip-inner, .popover-inner");if(d){var e=angular.element(d).hasClass("tooltip-inner"),g=e?a.querySelector(".tooltip-arrow"):a.querySelector(".arrow");if(g){var h={top:"",bottom:"",left:"",right:""};if(c=this.parsePlacement(c),"center"===c[1])return void angular.element(g).css(h);var i="border-"+c[0]+"-width",j=b.getComputedStyle(g)[i],k="border-";k+=f.vertical.test(c[0])?c[0]+"-"+c[1]:c[1]+"-"+c[0],k+="-radius";var l=b.getComputedStyle(e?d:a)[k];switch(c[0]){case"top":h.bottom=e?"0":"-"+j;break;case"bottom":h.top=e?"0":"-"+j;break;case"left":h.right=e?"0":"-"+j;break;case"right":h.left=e?"0":"-"+j}h[c[1]]=l,angular.element(g).css(h)}}}}}]),angular.module("ui.bootstrap.datepickerPopup",["ui.bootstrap.datepicker","ui.bootstrap.position"]).value("$datepickerPopupLiteralWarning",!0).constant("uibDatepickerPopupConfig",{altInputFormats:[],appendToBody:!1,clearText:"Clear",closeOnDateSelection:!0,closeText:"Done",currentText:"Today",datepickerPopup:"yyyy-MM-dd",datepickerPopupTemplateUrl:"uib/template/datepickerPopup/popup.html",datepickerTemplateUrl:"uib/template/datepicker/datepicker.html",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},onOpenFocus:!0,showButtonBar:!0,placement:"auto bottom-left"}).controller("UibDatepickerPopupController",["$scope","$element","$attrs","$compile","$log","$parse","$window","$document","$rootScope","$uibPosition","dateFilter","uibDateParser","uibDatepickerPopupConfig","$timeout","uibDatepickerConfig","$datepickerPopupLiteralWarning",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){function q(b){var c=l.parse(b,w,a.date);if(isNaN(c))for(var d=0;d<I.length;d++)if(c=l.parse(b,I[d],a.date),!isNaN(c))return c;return c}function r(a){if(angular.isNumber(a)&&(a=new Date(a)),!a)return null;if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=q(a);if(!isNaN(b))return l.toTimezone(b,J)}return F.$options&&F.$options.allowInvalid?a:void 0}function s(a,b){var d=a||b;return c.ngRequired||d?(angular.isNumber(d)&&(d=new Date(d)),d?angular.isDate(d)&&!isNaN(d)?!0:angular.isString(d)?!isNaN(q(b)):!1:!0):!0}function t(c){if(a.isOpen||!a.disabled){var d=H[0],e=b[0].contains(c.target),f=void 0!==d.contains&&d.contains(c.target);!a.isOpen||e||f||a.$apply(function(){a.isOpen=!1})}}function u(c){27===c.which&&a.isOpen?(c.preventDefault(),c.stopPropagation(),a.$apply(function(){a.isOpen=!1}),b[0].focus()):40!==c.which||a.isOpen||(c.preventDefault(),c.stopPropagation(),a.$apply(function(){a.isOpen=!0}))}function v(){if(a.isOpen){var d=angular.element(H[0].querySelector(".uib-datepicker-popup")),e=c.popupPlacement?c.popupPlacement:m.placement,f=j.positionElements(b,d,e,y);d.css({top:f.top+"px",left:f.left+"px"}),d.hasClass("uib-position-measure")&&d.removeClass("uib-position-measure")}}var w,x,y,z,A,B,C,D,E,F,G,H,I,J,K=!1,L=[];this.init=function(e){if(F=e,G=e.$options,x=angular.isDefined(c.closeOnDateSelection)?a.$parent.$eval(c.closeOnDateSelection):m.closeOnDateSelection,y=angular.isDefined(c.datepickerAppendToBody)?a.$parent.$eval(c.datepickerAppendToBody):m.appendToBody,z=angular.isDefined(c.onOpenFocus)?a.$parent.$eval(c.onOpenFocus):m.onOpenFocus,A=angular.isDefined(c.datepickerPopupTemplateUrl)?c.datepickerPopupTemplateUrl:m.datepickerPopupTemplateUrl,B=angular.isDefined(c.datepickerTemplateUrl)?c.datepickerTemplateUrl:m.datepickerTemplateUrl,I=angular.isDefined(c.altInputFormats)?a.$parent.$eval(c.altInputFormats):m.altInputFormats,a.showButtonBar=angular.isDefined(c.showButtonBar)?a.$parent.$eval(c.showButtonBar):m.showButtonBar,m.html5Types[c.type]?(w=m.html5Types[c.type],K=!0):(w=c.uibDatepickerPopup||m.datepickerPopup,c.$observe("uibDatepickerPopup",function(a,b){var c=a||m.datepickerPopup;if(c!==w&&(w=c,F.$modelValue=null,!w))throw new Error("uibDatepickerPopup must have a date format specified.")})),!w)throw new Error("uibDatepickerPopup must have a date format specified.");if(K&&c.uibDatepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");C=angular.element("<div uib-datepicker-popup-wrap><div uib-datepicker></div></div>"),G?(J=G.timezone,a.ngModelOptions=angular.copy(G),a.ngModelOptions.timezone=null,a.ngModelOptions.updateOnDefault===!0&&(a.ngModelOptions.updateOn=a.ngModelOptions.updateOn?a.ngModelOptions.updateOn+" default":"default"),C.attr("ng-model-options","ngModelOptions")):J=null,C.attr({"ng-model":"date","ng-change":"dateSelection(date)","template-url":A}),D=angular.element(C.children()[0]),D.attr("template-url",B),a.datepickerOptions||(a.datepickerOptions={}),K&&"month"===c.type&&(a.datepickerOptions.datepickerMode="month",a.datepickerOptions.minMode="month"),D.attr("datepicker-options","datepickerOptions"),K?F.$formatters.push(function(b){return a.date=l.fromTimezone(b,J),b}):(F.$$parserName="date",F.$validators.date=s,F.$parsers.unshift(r),F.$formatters.push(function(b){return F.$isEmpty(b)?(a.date=b,b):(a.date=l.fromTimezone(b,J),angular.isNumber(a.date)&&(a.date=new Date(a.date)),l.filter(a.date,w))})),F.$viewChangeListeners.push(function(){a.date=q(F.$viewValue)}),b.on("keydown",u),H=d(C)(a),C.remove(),y?h.find("body").append(H):b.after(H),a.$on("$destroy",function(){for(a.isOpen===!0&&(i.$$phase||a.$apply(function(){a.isOpen=!1})),H.remove(),b.off("keydown",u),h.off("click",t),E&&E.off("scroll",v),angular.element(g).off("resize",v);L.length;)L.shift()()})},a.getText=function(b){return a[b+"Text"]||m[b+"Text"]},a.isDisabled=function(b){"today"===b&&(b=l.fromTimezone(new Date,J));var c={};return angular.forEach(["minDate","maxDate"],function(b){a.datepickerOptions[b]?angular.isDate(a.datepickerOptions[b])?c[b]=l.fromTimezone(new Date(a.datepickerOptions[b]),J):(p&&e.warn("Literal date support has been deprecated, please switch to date object usage"),c[b]=new Date(k(a.datepickerOptions[b],"medium"))):c[b]=null}),a.datepickerOptions&&c.minDate&&a.compare(b,c.minDate)<0||c.maxDate&&a.compare(b,c.maxDate)>0},a.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},a.dateSelection=function(c){angular.isDefined(c)&&(a.date=c);var d=a.date?l.filter(a.date,w):null;b.val(d),F.$setViewValue(d),x&&(a.isOpen=!1,b[0].focus())},a.keydown=function(c){27===c.which&&(c.stopPropagation(),a.isOpen=!1,b[0].focus())},a.select=function(b,c){if(c.stopPropagation(),"today"===b){var d=new Date;angular.isDate(a.date)?(b=new Date(a.date),b.setFullYear(d.getFullYear(),d.getMonth(),d.getDate())):b=new Date(d.setHours(0,0,0,0))}a.dateSelection(b)},a.close=function(c){c.stopPropagation(),a.isOpen=!1,b[0].focus()},a.disabled=angular.isDefined(c.disabled)||!1,c.ngDisabled&&L.push(a.$parent.$watch(f(c.ngDisabled),function(b){a.disabled=b})),a.$watch("isOpen",function(d){d?a.disabled?a.isOpen=!1:n(function(){v(),z&&a.$broadcast("uib:datepicker.focus"),h.on("click",t);var d=c.popupPlacement?c.popupPlacement:m.placement;y||j.parsePlacement(d)[2]?(E=E||angular.element(j.scrollParent(b)),E&&E.on("scroll",v)):E=null,angular.element(g).on("resize",v)},0,!1):(h.off("click",t),E&&E.off("scroll",v),angular.element(g).off("resize",v))}),a.$on("uib:datepicker.mode",function(){n(v,0,!1)})}]).directive("uibDatepickerPopup",function(){return{require:["ngModel","uibDatepickerPopup"],controller:"UibDatepickerPopupController",scope:{datepickerOptions:"=?",isOpen:"=?",currentText:"@",clearText:"@",closeText:"@"},link:function(a,b,c,d){var e=d[0],f=d[1];f.init(e)}}}).directive("uibDatepickerPopupWrap",function(){return{replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepickerPopup/popup.html"}}}),angular.module("ui.bootstrap.debounce",[]).factory("$$debounce",["$timeout",function(a){return function(b,c){var d;return function(){var e=this,f=Array.prototype.slice.call(arguments);d&&a.cancel(d),d=a(function(){b.apply(e,f)},c)}}}]),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("uibDropdownConfig",{appendToOpenClass:"uib-dropdown-open",openClass:"open"}).service("uibDropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b,f){c||(a.on("click",d),f.on("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b,f){c===b&&(c=null,a.off("click",d),f.off("keydown",e))};var d=function(a){if(c&&!(a&&"disabled"===c.getAutoClose()||a&&3===a.which)){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getDropdownElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which?(a.stopPropagation(),c.focusToggleElement(),d()):c.isKeynavEnabled()&&-1!==[38,40].indexOf(a.which)&&c.isOpen&&(a.preventDefault(),a.stopPropagation(),c.focusDropdownEntry(a.which))}}]).controller("UibDropdownController",["$scope","$element","$attrs","$parse","uibDropdownConfig","uibDropdownService","$animate","$uibPosition","$document","$compile","$templateRequest",function(a,b,c,d,e,f,g,h,i,j,k){var l,m,n=this,o=a.$new(),p=e.appendToOpenClass,q=e.openClass,r=angular.noop,s=c.onToggle?d(c.onToggle):angular.noop,t=!1,u=null,v=!1,w=i.find("body");b.addClass("dropdown"),this.init=function(){if(c.isOpen&&(m=d(c.isOpen),r=m.assign,a.$watch(m,function(a){o.isOpen=!!a})),angular.isDefined(c.dropdownAppendTo)){var e=d(c.dropdownAppendTo)(o);e&&(u=angular.element(e))}t=angular.isDefined(c.dropdownAppendToBody),v=angular.isDefined(c.keyboardNav),t&&!u&&(u=w),u&&n.dropdownMenu&&(u.append(n.dropdownMenu),b.on("$destroy",function(){n.dropdownMenu.remove()}))},this.toggle=function(a){return o.isOpen=arguments.length?!!a:!o.isOpen,angular.isFunction(r)&&r(o,o.isOpen),o.isOpen},this.isOpen=function(){return o.isOpen},o.getToggleElement=function(){return n.toggleElement},o.getAutoClose=function(){return c.autoClose||"always"},o.getElement=function(){return b},o.isKeynavEnabled=function(){return v},o.focusDropdownEntry=function(a){var c=n.dropdownMenu?angular.element(n.dropdownMenu).find("a"):b.find("ul").eq(0).find("a");switch(a){case 40:angular.isNumber(n.selectedOption)?n.selectedOption=n.selectedOption===c.length-1?n.selectedOption:n.selectedOption+1:n.selectedOption=0;break;case 38:angular.isNumber(n.selectedOption)?n.selectedOption=0===n.selectedOption?0:n.selectedOption-1:n.selectedOption=c.length-1}c[n.selectedOption].focus()},o.getDropdownElement=function(){return n.dropdownMenu},o.focusToggleElement=function(){n.toggleElement&&n.toggleElement[0].focus()},o.$watch("isOpen",function(c,d){if(u&&n.dropdownMenu){var e,i,m=h.positionElements(b,n.dropdownMenu,"bottom-left",!0);if(e={top:m.top+"px",display:c?"block":"none"},i=n.dropdownMenu.hasClass("dropdown-menu-right"),i?(e.left="auto",e.right=window.innerWidth-(m.left+b.prop("offsetWidth"))+"px"):(e.left=m.left+"px",e.right="auto"),!t){var v=h.offset(u);e.top=m.top-v.top+"px",i?e.right=window.innerWidth-(m.left-v.left+b.prop("offsetWidth"))+"px":e.left=m.left-v.left+"px"}n.dropdownMenu.css(e)}var w=u?u:b,x=w.hasClass(u?p:q);if(x===!c&&g[c?"addClass":"removeClass"](w,u?p:q).then(function(){angular.isDefined(c)&&c!==d&&s(a,{open:!!c})}),c)n.dropdownMenuTemplateUrl&&k(n.dropdownMenuTemplateUrl).then(function(a){l=o.$new(),j(a.trim())(l,function(a){var b=a;n.dropdownMenu.replaceWith(b),n.dropdownMenu=b})}),o.focusToggleElement(),f.open(o,b);else{if(n.dropdownMenuTemplateUrl){l&&l.$destroy();var y=angular.element('<ul class="dropdown-menu"></ul>');n.dropdownMenu.replaceWith(y),n.dropdownMenu=y}f.close(o,b),n.selectedOption=null}angular.isFunction(r)&&r(a,c)})}]).directive("uibDropdown",function(){return{controller:"UibDropdownController",link:function(a,b,c,d){d.init()}}}).directive("uibDropdownMenu",function(){return{restrict:"A",require:"?^uibDropdown",link:function(a,b,c,d){if(d&&!angular.isDefined(c.dropdownNested)){b.addClass("dropdown-menu");var e=c.templateUrl;e&&(d.dropdownMenuTemplateUrl=e),d.dropdownMenu||(d.dropdownMenu=b)}}}}).directive("uibDropdownToggle",function(){return{require:"?^uibDropdown",link:function(a,b,c,d){if(d){b.addClass("dropdown-toggle"),d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.stackedMap",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c<a.length;c++)if(b===a[c].key)return a[c]},keys:function(){for(var b=[],c=0;c<a.length;c++)b.push(a[c].key);return b},top:function(){return a[a.length-1]},remove:function(b){for(var c=-1,d=0;d<a.length;d++)if(b===a[d].key){c=d;break}return a.splice(c,1)[0]},removeTop:function(){return a.splice(a.length-1,1)[0]},length:function(){return a.length}}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.stackedMap","ui.bootstrap.position"]).factory("$$multiMap",function(){return{createNew:function(){var a={};return{entries:function(){return Object.keys(a).map(function(b){return{key:b,value:a[b]}})},get:function(b){return a[b]},hasKey:function(b){return!!a[b]},keys:function(){return Object.keys(a)},put:function(b,c){a[b]||(a[b]=[]),a[b].push(c)},remove:function(b,c){var d=a[b];if(d){var e=d.indexOf(c);-1!==e&&d.splice(e,1),d.length||delete a[b]}}}}}}).provider("$uibResolve",function(){var a=this;this.resolver=null,this.setResolver=function(a){this.resolver=a},this.$get=["$injector","$q",function(b,c){var d=a.resolver?b.get(a.resolver):null;return{resolve:function(a,e,f,g){if(d)return d.resolve(a,e,f,g);var h=[];return angular.forEach(a,function(a){angular.isFunction(a)||angular.isArray(a)?h.push(c.resolve(b.invoke(a))):angular.isString(a)?h.push(c.resolve(b.get(a))):h.push(c.resolve(a))}),c.all(h).then(function(b){var c={},d=0;return angular.forEach(a,function(a,e){c[e]=b[d++]}),c})}}}]}).directive("uibModalBackdrop",["$animate","$injector","$uibModalStack",function(a,b,c){function d(b,d,e){e.modalInClass&&(a.addClass(d,e.modalInClass),b.$on(c.NOW_CLOSING_EVENT,function(c,f){var g=f();b.modalOptions.animation?a.removeClass(d,e.modalInClass).then(g):g()}))}return{replace:!0,templateUrl:"uib/template/modal/backdrop.html",compile:function(a,b){return a.addClass(b.backdropClass),d}}}]).directive("uibModalWindow",["$uibModalStack","$q","$animateCss","$document",function(a,b,c,d){return{scope:{index:"@"},replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/modal/window.html"},link:function(e,f,g){f.addClass(g.windowClass||""),f.addClass(g.windowTopClass||""),e.size=g.size,e.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!==c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault(),b.stopPropagation(),a.dismiss(c.key,"backdrop click"))},f.on("click",e.close),e.$isRendered=!0;var h=b.defer();g.$observe("modalRender",function(a){"true"===a&&h.resolve()}),h.promise.then(function(){var h=null;g.modalInClass&&(h=c(f,{addClass:g.modalInClass}).start(),e.$on(a.NOW_CLOSING_EVENT,function(a,b){var d=b();c(f,{removeClass:g.modalInClass}).start().then(d)})),b.when(h).then(function(){var b=a.getTop();if(b&&a.modalRendered(b.key),!d[0].activeElement||!f[0].contains(d[0].activeElement)){var c=f[0].querySelector("[autofocus]");c?c.focus():f[0].focus()}})})}}}]).directive("uibModalAnimationClass",function(){return{compile:function(a,b){b.modalAnimation&&a.addClass(b.uibModalAnimationClass)}}}).directive("uibModalTransclude",function(){return{link:function(a,b,c,d,e){e(a.$parent,function(a){b.empty(),b.append(a)})}}}).factory("$uibModalStack",["$animate","$animateCss","$document","$compile","$rootScope","$q","$$multiMap","$$stackedMap","$uibPosition",function(a,b,c,d,e,f,g,h,i){function j(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)}function k(){for(var a=-1,b=v.keys(),c=0;c<b.length;c++)v.get(b[c]).value.backdrop&&(a=c);return a>-1&&y>a&&(a=y),a}function l(a,b){var c=v.get(a).value,d=c.appendTo;v.remove(a),z=v.top(),z&&(y=parseInt(z.value.modalDomEl.attr("index"),10)),o(c.modalDomEl,c.modalScope,function(){var b=c.openedClass||u;w.remove(b,a);var e=w.hasKey(b);d.toggleClass(b,e),!e&&t&&t.heightOverflow&&t.scrollbarWidth&&(t.originalRight?d.css({paddingRight:t.originalRight+"px"}):d.css({paddingRight:""}),t=null),m(!0)},c.closedDeferred),n(),b&&b.focus?b.focus():d.focus&&d.focus()}function m(a){var b;v.length()>0&&(b=v.top().value,b.modalDomEl.toggleClass(b.windowTopClass||"",a))}function n(){if(r&&-1===k()){var a=s;o(r,s,function(){a=null}),r=void 0,s=void 0}}function o(b,c,d,e){function g(){g.done||(g.done=!0,a.leave(b).then(function(){b.remove(),e&&e.resolve()}),c.$destroy(),d&&d())}var h,i=null,j=function(){return h||(h=f.defer(),i=h.promise),function(){h.resolve()}};return c.$broadcast(x.NOW_CLOSING_EVENT,j),f.when(i).then(g)}function p(a){if(a.isDefaultPrevented())return a;var b=v.top();if(b)switch(a.which){case 27:b.value.keyboard&&(a.preventDefault(),e.$apply(function(){x.dismiss(b.key,"escape key press")}));break;case 9:var c=x.loadFocusElementList(b),d=!1;a.shiftKey?(x.isFocusInFirstItem(a,c)||x.isModalFocused(a,b))&&(d=x.focusLastFocusableElement(c)):x.isFocusInLastItem(a,c)&&(d=x.focusFirstFocusableElement(c)),d&&(a.preventDefault(),a.stopPropagation())}}function q(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var r,s,t,u="modal-open",v=h.createNew(),w=g.createNew(),x={NOW_CLOSING_EVENT:"modal.stack.now-closing"},y=0,z=null,A="a[href], area[href], input:not([disabled]), button:not([disabled]),select:not([disabled]), textarea:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable=true]";return e.$watch(k,function(a){s&&(s.index=a)}),c.on("keydown",p),e.$on("$destroy",function(){c.off("keydown",p)}),x.open=function(b,f){var g=c[0].activeElement,h=f.openedClass||u;m(!1),z=v.top(),v.add(b,{deferred:f.deferred,renderDeferred:f.renderDeferred,closedDeferred:f.closedDeferred,modalScope:f.scope,backdrop:f.backdrop,keyboard:f.keyboard,openedClass:f.openedClass,windowTopClass:f.windowTopClass,animation:f.animation,appendTo:f.appendTo}),w.put(h,b);var j=f.appendTo,l=k();if(!j.length)throw new Error("appendTo element not found. Make sure that the element passed is in DOM.");l>=0&&!r&&(s=e.$new(!0),s.modalOptions=f,s.index=l,r=angular.element('<div uib-modal-backdrop="modal-backdrop"></div>'),r.attr("backdrop-class",f.backdropClass),f.animation&&r.attr("modal-animation","true"),d(r)(s),a.enter(r,j),t=i.scrollbarPadding(j),t.heightOverflow&&t.scrollbarWidth&&j.css({paddingRight:t.right+"px"})),y=z?parseInt(z.value.modalDomEl.attr("index"),10)+1:0;var n=angular.element('<div uib-modal-window="modal-window"></div>');n.attr({"template-url":f.windowTemplateUrl,"window-class":f.windowClass,"window-top-class":f.windowTopClass,size:f.size,index:y,animate:"animate"}).html(f.content),f.animation&&n.attr("modal-animation","true"),j.addClass(h),a.enter(d(n)(f.scope),j),v.top().value.modalDomEl=n,v.top().value.modalOpener=g},x.close=function(a,b){var c=v.get(a);return c&&q(c,b,!0)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.resolve(b),l(a,c.value.modalOpener),!0):!c},x.dismiss=function(a,b){var c=v.get(a);return c&&q(c,b,!1)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.reject(b),l(a,c.value.modalOpener),!0):!c},x.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},x.getTop=function(){return v.top()},x.modalRendered=function(a){var b=v.get(a);b&&b.value.renderDeferred.resolve()},x.focusFirstFocusableElement=function(a){return a.length>0?(a[0].focus(),!0):!1},x.focusLastFocusableElement=function(a){return a.length>0?(a[a.length-1].focus(),!0):!1},x.isModalFocused=function(a,b){if(a&&b){var c=b.value.modalDomEl;if(c&&c.length)return(a.target||a.srcElement)===c[0]}return!1},x.isFocusInFirstItem=function(a,b){return b.length>0?(a.target||a.srcElement)===b[0]:!1},x.isFocusInLastItem=function(a,b){return b.length>0?(a.target||a.srcElement)===b[b.length-1]:!1},x.loadFocusElementList=function(a){if(a){var b=a.value.modalDomEl;if(b&&b.length){var c=b[0].querySelectorAll(A);return c?Array.prototype.filter.call(c,function(a){return j(a)}):c}}},x}]).provider("$uibModal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$rootScope","$q","$document","$templateRequest","$controller","$uibResolve","$uibModalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?c.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}var j={},k=null;return j.getPromiseChain=function(){return k},j.open=function(e){function j(){return r}var l=c.defer(),m=c.defer(),n=c.defer(),o=c.defer(),p={result:l.promise,opened:m.promise,closed:n.promise,rendered:o.promise,close:function(a){return h.close(p,a)},dismiss:function(a){return h.dismiss(p,a)}};if(e=angular.extend({},a.options,e),e.resolve=e.resolve||{},e.appendTo=e.appendTo||d.find("body").eq(0),!e.template&&!e.templateUrl)throw new Error("One of template or templateUrl options is required.");var q,r=c.all([i(e),g.resolve(e.resolve,{},null,null)]);return q=k=c.all([k]).then(j,j).then(function(a){var c=e.scope||b,d=c.$new();d.$close=p.close,d.$dismiss=p.dismiss,d.$on("$destroy",function(){d.$$uibDestructionScheduled||d.$dismiss("$uibUnscheduledDestruction")});var g,i,j={};e.controller&&(j.$scope=d,j.$uibModalInstance=p,angular.forEach(a[1],function(a,b){j[b]=a}),i=f(e.controller,j,!0),e.controllerAs?(g=i.instance,e.bindToController&&(g.$close=d.$close,g.$dismiss=d.$dismiss,angular.extend(g,c)),g=i(),d[e.controllerAs]=g):g=i(),angular.isFunction(g.$onInit)&&g.$onInit()),h.open(p,{scope:d,deferred:l,renderDeferred:o,closedDeferred:n,content:a[0],animation:e.animation,backdrop:e.backdrop,keyboard:e.keyboard,backdropClass:e.backdropClass,windowTopClass:e.windowTopClass,windowClass:e.windowClass,windowTemplateUrl:e.windowTemplateUrl,size:e.size,openedClass:e.openedClass,appendTo:e.appendTo}),m.resolve(!0)},function(a){m.reject(a),l.reject(a)})["finally"](function(){k===q&&(k=null)}),p},j}]};return a}),angular.module("ui.bootstrap.paging",[]).factory("uibPaging",["$parse",function(a){return{create:function(b,c,d){b.setNumPages=d.numPages?a(d.numPages).assign:angular.noop,b.ngModelCtrl={$setViewValue:angular.noop},b._watchers=[],b.init=function(a,e){b.ngModelCtrl=a,b.config=e,a.$render=function(){b.render()},d.itemsPerPage?b._watchers.push(c.$parent.$watch(d.itemsPerPage,function(a){b.itemsPerPage=parseInt(a,10),c.totalPages=b.calculateTotalPages(),b.updatePage()})):b.itemsPerPage=e.itemsPerPage,c.$watch("totalItems",function(a,d){(angular.isDefined(a)||a!==d)&&(c.totalPages=b.calculateTotalPages(),b.updatePage())})},b.calculateTotalPages=function(){var a=b.itemsPerPage<1?1:Math.ceil(c.totalItems/b.itemsPerPage);return Math.max(a||0,1)},b.render=function(){c.page=parseInt(b.ngModelCtrl.$viewValue,10)||1},c.selectPage=function(a,d){d&&d.preventDefault();var e=!c.ngDisabled||!d;e&&c.page!==a&&a>0&&a<=c.totalPages&&(d&&d.target&&d.target.blur(),b.ngModelCtrl.$setViewValue(a),b.ngModelCtrl.$render())},c.getText=function(a){return c[a+"Text"]||b.config[a+"Text"]},c.noPrevious=function(){return 1===c.page},c.noNext=function(){return c.page===c.totalPages},b.updatePage=function(){b.setNumPages(c.$parent,c.totalPages),c.page>c.totalPages?c.selectPage(c.totalPages):b.ngModelCtrl.$render()},c.$on("$destroy",function(){for(;b._watchers.length;)b._watchers.shift()()})}}}]),angular.module("ui.bootstrap.pager",["ui.bootstrap.paging"]).controller("UibPagerController",["$scope","$attrs","uibPaging","uibPagerConfig",function(a,b,c,d){a.align=angular.isDefined(b.align)?a.$parent.$eval(b.align):d.align,c.create(this,a,b)}]).constant("uibPagerConfig",{itemsPerPage:10,previousText:"Β« Previous",nextText:"Next Β»",align:!0}).directive("uibPager",["uibPagerConfig",function(a){return{scope:{totalItems:"=",previousText:"@",nextText:"@",ngDisabled:"="},require:["uibPager","?ngModel"],controller:"UibPagerController",controllerAs:"pager",templateUrl:function(a,b){return b.templateUrl||"uib/template/pager/pager.html"},replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&f.init(g,a)}}}]),angular.module("ui.bootstrap.pagination",["ui.bootstrap.paging"]).controller("UibPaginationController",["$scope","$attrs","$parse","uibPaging","uibPaginationConfig",function(a,b,c,d,e){function f(a,b,c){return{number:a,text:b,active:c}}function g(a,b){var c=[],d=1,e=b,g=angular.isDefined(i)&&b>i;g&&(j?(d=Math.max(a-Math.floor(i/2),1),e=d+i-1,e>b&&(e=b,d=e-i+1)):(d=(Math.ceil(a/i)-1)*i+1,e=Math.min(d+i-1,b)));for(var h=d;e>=h;h++){var n=f(h,m(h),h===a);c.push(n)}if(g&&i>0&&(!j||k||l)){if(d>1){if(!l||d>3){var o=f(d-1,"...",!1);c.unshift(o)}if(l){if(3===d){var p=f(2,"2",!1);c.unshift(p)}var q=f(1,"1",!1);c.unshift(q)}}if(b>e){if(!l||b-2>e){var r=f(e+1,"...",!1);c.push(r)}if(l){if(e===b-2){var s=f(b-1,b-1,!1);c.push(s)}var t=f(b,b,!1);c.push(t)}}}return c}var h=this,i=angular.isDefined(b.maxSize)?a.$parent.$eval(b.maxSize):e.maxSize,j=angular.isDefined(b.rotate)?a.$parent.$eval(b.rotate):e.rotate,k=angular.isDefined(b.forceEllipses)?a.$parent.$eval(b.forceEllipses):e.forceEllipses,l=angular.isDefined(b.boundaryLinkNumbers)?a.$parent.$eval(b.boundaryLinkNumbers):e.boundaryLinkNumbers,m=angular.isDefined(b.pageLabel)?function(c){return a.$parent.$eval(b.pageLabel,{$page:c})}:angular.identity;a.boundaryLinks=angular.isDefined(b.boundaryLinks)?a.$parent.$eval(b.boundaryLinks):e.boundaryLinks,a.directionLinks=angular.isDefined(b.directionLinks)?a.$parent.$eval(b.directionLinks):e.directionLinks,d.create(this,a,b),b.maxSize&&h._watchers.push(a.$parent.$watch(c(b.maxSize),function(a){i=parseInt(a,10),h.render()}));var n=this.render;this.render=function(){n(),a.page>0&&a.page<=a.totalPages&&(a.pages=g(a.page,a.totalPages))}}]).constant("uibPaginationConfig",{itemsPerPage:10,boundaryLinks:!1,boundaryLinkNumbers:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0,forceEllipses:!1}).directive("uibPagination",["$parse","uibPaginationConfig",function(a,b){return{scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@",ngDisabled:"="},require:["uibPagination","?ngModel"],controller:"UibPaginationController",controllerAs:"pagination",templateUrl:function(a,b){return b.templateUrl||"uib/template/pagination/pagination.html"},replace:!0,link:function(a,c,d,e){var f=e[0],g=e[1];g&&f.init(g,b)}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.stackedMap"]).provider("$uibTooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",placementClassPrefix:"",animation:!0,popupDelay:0,popupCloseDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",outsideClick:"outsideClick",focus:"blur",none:""},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$uibPosition","$interpolate","$rootScope","$parse","$$stackedMap",function(e,f,g,h,i,j,k,l,m){function n(a){if(27===a.which){var b=o.top();b&&(b.value.close(),o.removeTop(),b=null)}}var o=m.createNew();return h.on("keypress",n),k.$on("$destroy",function(){h.off("keypress",n)}),function(e,k,m,n){function p(a){var b=(a||n.trigger||m).split(" "),d=b.map(function(a){return c[a]||a});return{show:b,hide:d}}n=angular.extend({},b,d,n);var q=a(e),r=j.startSymbol(),s=j.endSymbol(),t="<div "+q+'-popup uib-title="'+r+"title"+s+'" '+(n.useContentExp?'content-exp="contentExp()" ':'content="'+r+"content"+s+'" ')+'placement="'+r+"placement"+s+'" popup-class="'+r+"popupClass"+s+'" animation="animation" is-open="isOpen" origin-scope="origScope" class="uib-position-measure"></div>';
1767 1767 return{compile:function(a,b){var c=f(t);return function(a,b,d,f){function j(){N.isOpen?q():m()}function m(){M&&!a.$eval(d[k+"Enable"])||(u(),x(),N.popupDelay?G||(G=g(r,N.popupDelay,!1)):r())}function q(){s(),N.popupCloseDelay?H||(H=g(t,N.popupCloseDelay,!1)):t()}function r(){return s(),u(),N.content?(v(),void N.$evalAsync(function(){N.isOpen=!0,y(!0),S()})):angular.noop}function s(){G&&(g.cancel(G),G=null),I&&(g.cancel(I),I=null)}function t(){N&&N.$evalAsync(function(){N&&(N.isOpen=!1,y(!1),N.animation?F||(F=g(w,150,!1)):w())})}function u(){H&&(g.cancel(H),H=null),F&&(g.cancel(F),F=null)}function v(){D||(E=N.$new(),D=c(E,function(a){K?h.find("body").append(a):b.after(a)}),z())}function w(){s(),u(),A(),D&&(D.remove(),D=null),E&&(E.$destroy(),E=null)}function x(){N.title=d[k+"Title"],Q?N.content=Q(a):N.content=d[e],N.popupClass=d[k+"Class"],N.placement=angular.isDefined(d[k+"Placement"])?d[k+"Placement"]:n.placement;var b=i.parsePlacement(N.placement);J=b[1]?b[0]+"-"+b[1]:b[0];var c=parseInt(d[k+"PopupDelay"],10),f=parseInt(d[k+"PopupCloseDelay"],10);N.popupDelay=isNaN(c)?n.popupDelay:c,N.popupCloseDelay=isNaN(f)?n.popupCloseDelay:f}function y(b){P&&angular.isFunction(P.assign)&&P.assign(a,b)}function z(){R.length=0,Q?(R.push(a.$watch(Q,function(a){N.content=a,!a&&N.isOpen&&t()})),R.push(E.$watch(function(){O||(O=!0,E.$$postDigest(function(){O=!1,N&&N.isOpen&&S()}))}))):R.push(d.$observe(e,function(a){N.content=a,!a&&N.isOpen?t():S()})),R.push(d.$observe(k+"Title",function(a){N.title=a,N.isOpen&&S()})),R.push(d.$observe(k+"Placement",function(a){N.placement=a?a:n.placement,N.isOpen&&S()}))}function A(){R.length&&(angular.forEach(R,function(a){a()}),R.length=0)}function B(a){N&&N.isOpen&&D&&(b[0].contains(a.target)||D[0].contains(a.target)||q())}function C(){var a=d[k+"Trigger"];T(),L=p(a),"none"!==L.show&&L.show.forEach(function(a,c){"outsideClick"===a?(b.on("click",j),h.on("click",B)):a===L.hide[c]?b.on(a,j):a&&(b.on(a,m),b.on(L.hide[c],q)),b.on("keypress",function(a){27===a.which&&q()})})}var D,E,F,G,H,I,J,K=angular.isDefined(n.appendToBody)?n.appendToBody:!1,L=p(void 0),M=angular.isDefined(d[k+"Enable"]),N=a.$new(!0),O=!1,P=angular.isDefined(d[k+"IsOpen"])?l(d[k+"IsOpen"]):!1,Q=n.useContentExp?l(d[e]):!1,R=[],S=function(){D&&D.html()&&(I||(I=g(function(){var a=i.positionElements(b,D,N.placement,K);D.css({top:a.top+"px",left:a.left+"px"}),D.hasClass(a.placement.split("-")[0])||(D.removeClass(J.split("-")[0]),D.addClass(a.placement.split("-")[0])),D.hasClass(n.placementClassPrefix+a.placement)||(D.removeClass(n.placementClassPrefix+J),D.addClass(n.placementClassPrefix+a.placement)),D.hasClass("uib-position-measure")?(i.positionArrow(D,a.placement),D.removeClass("uib-position-measure")):J!==a.placement&&i.positionArrow(D,a.placement),J=a.placement,I=null},0,!1)))};N.origScope=a,N.isOpen=!1,o.add(N,{close:t}),N.contentExp=function(){return N.content},d.$observe("disabled",function(a){a&&s(),a&&N.isOpen&&t()}),P&&a.$watch(P,function(a){N&&!a===N.isOpen&&j()});var T=function(){L.show.forEach(function(a){"outsideClick"===a?b.off("click",j):(b.off(a,m),b.off(a,j))}),L.hide.forEach(function(a){"outsideClick"===a?h.off("click",B):b.off(a,q)})};C();var U=a.$eval(d[k+"Animation"]);N.animation=angular.isDefined(U)?!!U:n.animation;var V,W=k+"AppendToBody";V=W in d&&void 0===d[W]?!0:a.$eval(d[W]),K=angular.isDefined(V)?V:K,a.$on("$destroy",function(){T(),w(),o.remove(N),N=null})}}}}}]}).directive("uibTooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.uibTooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("uibTooltipClasses",["$uibPosition",function(a){return{restrict:"A",link:function(b,c,d){if(b.placement){var e=a.parsePlacement(b.placement);c.addClass(e[0])}b.popupClass&&c.addClass(b.popupClass),b.animation()&&c.addClass(d.tooltipAnimationClass)}}}]).directive("uibTooltipPopup",function(){return{replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/tooltip/tooltip-popup.html"}}).directive("uibTooltip",["$uibTooltip",function(a){return a("uibTooltip","tooltip","mouseenter")}]).directive("uibTooltipTemplatePopup",function(){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"uib/template/tooltip/tooltip-template-popup.html"}}).directive("uibTooltipTemplate",["$uibTooltip",function(a){return a("uibTooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("uibTooltipHtmlPopup",function(){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/tooltip/tooltip-html-popup.html"}}).directive("uibTooltipHtml",["$uibTooltip",function(a){return a("uibTooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("uibPopoverTemplatePopup",function(){return{replace:!0,scope:{uibTitle:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"uib/template/popover/popover-template.html"}}).directive("uibPopoverTemplate",["$uibTooltip",function(a){return a("uibPopoverTemplate","popover","click",{useContentExp:!0})}]).directive("uibPopoverHtmlPopup",function(){return{replace:!0,scope:{contentExp:"&",uibTitle:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/popover/popover-html.html"}}).directive("uibPopoverHtml",["$uibTooltip",function(a){return a("uibPopoverHtml","popover","click",{useContentExp:!0})}]).directive("uibPopoverPopup",function(){return{replace:!0,scope:{uibTitle:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/popover/popover.html"}}).directive("uibPopover",["$uibTooltip",function(a){return a("uibPopover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("uibProgressConfig",{animate:!0,max:100}).controller("UibProgressController",["$scope","$attrs","uibProgressConfig",function(a,b,c){function d(){return angular.isDefined(a.maxParam)?a.maxParam:c.max}var e=this,f=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=d(),this.addBar=function(a,b,c){f||b.css({transition:"none"}),this.bars.push(a),a.max=d(),a.title=c&&angular.isDefined(c.title)?c.title:"progressbar",a.$watch("value",function(b){a.recalculatePercentage()}),a.recalculatePercentage=function(){var b=e.bars.reduce(function(a,b){return b.percent=+(100*b.value/b.max).toFixed(2),a+b.percent},0);b>100&&(a.percent-=b-100)},a.$on("$destroy",function(){b=null,e.removeBar(a)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1),this.bars.forEach(function(a){a.recalculatePercentage()})},a.$watch("maxParam",function(a){e.bars.forEach(function(a){a.max=d(),a.recalculatePercentage()})})}]).directive("uibProgress",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",require:"uibProgress",scope:{maxParam:"=?max"},templateUrl:"uib/template/progressbar/progress.html"}}).directive("uibBar",function(){return{replace:!0,transclude:!0,require:"^uibProgress",scope:{value:"=",type:"@"},templateUrl:"uib/template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b,c)}}}).directive("uibProgressbar",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",scope:{value:"=",maxParam:"=?max",type:"@"},templateUrl:"uib/template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]),{title:c.title})}}}),angular.module("ui.bootstrap.rating",[]).constant("uibRatingConfig",{max:5,stateOn:null,stateOff:null,enableReset:!0,titles:["one","two","three","four","five"]}).controller("UibRatingController",["$scope","$attrs","uibRatingConfig",function(a,b,c){var d={$setViewValue:angular.noop},e=this;this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff,this.enableReset=angular.isDefined(b.enableReset)?a.$parent.$eval(b.enableReset):c.enableReset;var f=angular.isDefined(b.titles)?a.$parent.$eval(b.titles):c.titles;this.titles=angular.isArray(f)&&f.length>0?f:c.titles;var g=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(g)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff,title:this.getTitle(b)},a[b]);return a},this.getTitle=function(a){return a>=this.titles.length?a+1:this.titles[a]},a.rate=function(b){if(!a.readonly&&b>=0&&b<=a.range.length){var c=e.enableReset&&d.$viewValue===b?0:b;d.$setViewValue(c),d.$render()}},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue,a.title=e.getTitle(a.value-1)}}]).directive("uibRating",function(){return{require:["uibRating","ngModel"],scope:{readonly:"=?readOnly",onHover:"&",onLeave:"&"},controller:"UibRatingController",templateUrl:"uib/template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("UibTabsetController",["$scope",function(a){function b(a){for(var b=0;b<d.tabs.length;b++)if(d.tabs[b].index===a)return b}var c,d=this;d.tabs=[],d.select=function(a,f){if(!e){var g=b(c),h=d.tabs[g];if(h){if(h.tab.onDeselect({$event:f}),f&&f.isDefaultPrevented())return;h.tab.active=!1}var i=d.tabs[a];i?(i.tab.onSelect({$event:f}),i.tab.active=!0,d.active=i.index,c=i.index):!i&&angular.isNumber(c)&&(d.active=null,c=null)}},d.addTab=function(a){if(d.tabs.push({tab:a,index:a.index}),d.tabs.sort(function(a,b){return a.index>b.index?1:a.index<b.index?-1:0}),a.index===d.active||!angular.isNumber(d.active)&&1===d.tabs.length){var c=b(a.index);d.select(c)}},d.removeTab=function(a){for(var b,c=0;c<d.tabs.length;c++)if(d.tabs[c].tab===a){b=c;break}if(d.tabs[b].index===d.active){var e=b===d.tabs.length-1?b-1:b+1%d.tabs.length;d.select(e)}d.tabs.splice(b,1)},a.$watch("tabset.active",function(a){angular.isNumber(a)&&a!==c&&d.select(b(a))});var e;a.$on("$destroy",function(){e=!0})}]).directive("uibTabset",function(){return{transclude:!0,replace:!0,scope:{},bindToController:{active:"=?",type:"@"},controller:"UibTabsetController",controllerAs:"tabset",templateUrl:function(a,b){return b.templateUrl||"uib/template/tabs/tabset.html"},link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1,angular.isUndefined(c.active)&&(a.active=0)}}}).directive("uibTab",["$parse",function(a){return{require:"^uibTabset",replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/tabs/tab.html"},transclude:!0,scope:{heading:"@",index:"=?",classes:"@?",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},controllerAs:"tab",link:function(b,c,d,e,f){b.disabled=!1,d.disable&&b.$parent.$watch(a(d.disable),function(a){b.disabled=!!a}),angular.isUndefined(d.index)&&(e.tabs&&e.tabs.length?b.index=Math.max.apply(null,e.tabs.map(function(a){return a.index}))+1:b.index=0),angular.isUndefined(d.classes)&&(b.classes=""),b.select=function(a){if(!b.disabled){for(var c,d=0;d<e.tabs.length;d++)if(e.tabs[d].tab===b){c=d;break}e.select(c,a)}},e.addTab(b),b.$on("$destroy",function(){e.removeTab(b)}),b.$transcludeFn=f}}}]).directive("uibTabHeadingTransclude",function(){return{restrict:"A",require:"^uibTab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}).directive("uibTabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("uib-tab-heading")||a.hasAttribute("data-uib-tab-heading")||a.hasAttribute("x-uib-tab-heading")||"uib-tab-heading"===a.tagName.toLowerCase()||"data-uib-tab-heading"===a.tagName.toLowerCase()||"x-uib-tab-heading"===a.tagName.toLowerCase()||"uib:tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^uibTabset",link:function(b,c,d){var e=b.$eval(d.uibTabContentTransclude).tab;e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("uibTimepickerConfig",{hourStep:1,minuteStep:1,secondStep:1,showMeridian:!0,showSeconds:!1,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0,showSpinners:!0,templateUrl:"uib/template/timepicker/timepicker.html"}).controller("UibTimepickerController",["$scope","$element","$attrs","$parse","$log","$locale","uibTimepickerConfig",function(a,b,c,d,e,f,g){function h(){var b=+a.hours,c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c&&""!==a.hours?(a.showMeridian&&(12===b&&(b=0),a.meridian===v[1]&&(b+=12)),b):void 0}function i(){var b=+a.minutes,c=b>=0&&60>b;return c&&""!==a.minutes?b:void 0}function j(){var b=+a.seconds;return b>=0&&60>b?b:void 0}function k(a,b){return null===a?"":angular.isDefined(a)&&a.toString().length<2&&!b?"0"+a:a.toString()}function l(a){m(),u.$setViewValue(new Date(s)),n(a)}function m(){u.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1,a.invalidSeconds=!1}function n(b){if(u.$modelValue){var c=s.getHours(),d=s.getMinutes(),e=s.getSeconds();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:k(c,!w),"m"!==b&&(a.minutes=k(d)),a.meridian=s.getHours()<12?v[0]:v[1],"s"!==b&&(a.seconds=k(e)),a.meridian=s.getHours()<12?v[0]:v[1]}else a.hours=null,a.minutes=null,a.seconds=null,a.meridian=v[0]}function o(a){s=q(s,a),l()}function p(a,b){return q(a,60*b)}function q(a,b){var c=new Date(a.getTime()+1e3*b),d=new Date(a);return d.setHours(c.getHours(),c.getMinutes(),c.getSeconds()),d}function r(){return(null===a.hours||""===a.hours)&&(null===a.minutes||""===a.minutes)&&(!a.showSeconds||a.showSeconds&&(null===a.seconds||""===a.seconds))}var s=new Date,t=[],u={$setViewValue:angular.noop},v=angular.isDefined(c.meridians)?a.$parent.$eval(c.meridians):g.meridians||f.DATETIME_FORMATS.AMPMS,w=angular.isDefined(c.padHours)?a.$parent.$eval(c.padHours):!0;a.tabindex=angular.isDefined(c.tabindex)?c.tabindex:0,b.removeAttr("tabindex"),this.init=function(b,d){u=b,u.$render=this.render,u.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),f=d.eq(1),h=d.eq(2),i=angular.isDefined(c.mousewheel)?a.$parent.$eval(c.mousewheel):g.mousewheel;i&&this.setupMousewheelEvents(e,f,h);var j=angular.isDefined(c.arrowkeys)?a.$parent.$eval(c.arrowkeys):g.arrowkeys;j&&this.setupArrowkeyEvents(e,f,h),a.readonlyInput=angular.isDefined(c.readonlyInput)?a.$parent.$eval(c.readonlyInput):g.readonlyInput,this.setupInputEvents(e,f,h)};var x=g.hourStep;c.hourStep&&t.push(a.$parent.$watch(d(c.hourStep),function(a){x=+a}));var y=g.minuteStep;c.minuteStep&&t.push(a.$parent.$watch(d(c.minuteStep),function(a){y=+a}));var z;t.push(a.$parent.$watch(d(c.min),function(a){var b=new Date(a);z=isNaN(b)?void 0:b}));var A;t.push(a.$parent.$watch(d(c.max),function(a){var b=new Date(a);A=isNaN(b)?void 0:b}));var B=!1;c.ngDisabled&&t.push(a.$parent.$watch(d(c.ngDisabled),function(a){B=a})),a.noIncrementHours=function(){var a=p(s,60*x);return B||a>A||s>a&&z>a},a.noDecrementHours=function(){var a=p(s,60*-x);return B||z>a||a>s&&a>A},a.noIncrementMinutes=function(){var a=p(s,y);return B||a>A||s>a&&z>a},a.noDecrementMinutes=function(){var a=p(s,-y);return B||z>a||a>s&&a>A},a.noIncrementSeconds=function(){var a=q(s,C);return B||a>A||s>a&&z>a},a.noDecrementSeconds=function(){var a=q(s,-C);return B||z>a||a>s&&a>A},a.noToggleMeridian=function(){return s.getHours()<12?B||p(s,720)>A:B||p(s,-720)<z};var C=g.secondStep;c.secondStep&&t.push(a.$parent.$watch(d(c.secondStep),function(a){C=+a})),a.showSeconds=g.showSeconds,c.showSeconds&&t.push(a.$parent.$watch(d(c.showSeconds),function(b){a.showSeconds=!!b})),a.showMeridian=g.showMeridian,c.showMeridian&&t.push(a.$parent.$watch(d(c.showMeridian),function(b){if(a.showMeridian=!!b,u.$error.time){var c=h(),d=i();angular.isDefined(c)&&angular.isDefined(d)&&(s.setHours(c),l())}else n()})),this.setupMousewheelEvents=function(b,c,d){var e=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){B||a.$apply(e(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){B||a.$apply(e(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()}),d.bind("mousewheel wheel",function(b){B||a.$apply(e(b)?a.incrementSeconds():a.decrementSeconds()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c,d){b.bind("keydown",function(b){B||(38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply()))}),c.bind("keydown",function(b){B||(38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply()))}),d.bind("keydown",function(b){B||(38===b.which?(b.preventDefault(),a.incrementSeconds(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementSeconds(),a.$apply()))})},this.setupInputEvents=function(b,c,d){if(a.readonlyInput)return a.updateHours=angular.noop,a.updateMinutes=angular.noop,void(a.updateSeconds=angular.noop);var e=function(b,c,d){u.$setViewValue(null),u.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c),angular.isDefined(d)&&(a.invalidSeconds=d)};a.updateHours=function(){var a=h(),b=i();u.$setDirty(),angular.isDefined(a)&&angular.isDefined(b)?(s.setHours(a),s.setMinutes(b),z>s||s>A?e(!0):l("h")):e(!0)},b.bind("blur",function(b){u.$setTouched(),r()?m():null===a.hours||""===a.hours?e(!0):!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=k(a.hours,!w)})}),a.updateMinutes=function(){var a=i(),b=h();u.$setDirty(),angular.isDefined(a)&&angular.isDefined(b)?(s.setHours(b),s.setMinutes(a),z>s||s>A?e(void 0,!0):l("m")):e(void 0,!0)},c.bind("blur",function(b){u.$setTouched(),r()?m():null===a.minutes?e(void 0,!0):!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=k(a.minutes)})}),a.updateSeconds=function(){var a=j();u.$setDirty(),angular.isDefined(a)?(s.setSeconds(a),l("s")):e(void 0,void 0,!0)},d.bind("blur",function(b){r()?m():!a.invalidSeconds&&a.seconds<10&&a.$apply(function(){a.seconds=k(a.seconds)})})},this.render=function(){var b=u.$viewValue;isNaN(b)?(u.$setValidity("time",!1),e.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(b&&(s=b),z>s||s>A?(u.$setValidity("time",!1),a.invalidHours=!0,a.invalidMinutes=!0):m(),n())},a.showSpinners=angular.isDefined(c.showSpinners)?a.$parent.$eval(c.showSpinners):g.showSpinners,a.incrementHours=function(){a.noIncrementHours()||o(60*x*60)},a.decrementHours=function(){a.noDecrementHours()||o(60*-x*60)},a.incrementMinutes=function(){a.noIncrementMinutes()||o(60*y)},a.decrementMinutes=function(){a.noDecrementMinutes()||o(60*-y)},a.incrementSeconds=function(){a.noIncrementSeconds()||o(C)},a.decrementSeconds=function(){a.noDecrementSeconds()||o(-C)},a.toggleMeridian=function(){var b=i(),c=h();a.noToggleMeridian()||(angular.isDefined(b)&&angular.isDefined(c)?o(720*(s.getHours()<12?60:-60)):a.meridian=a.meridian===v[0]?v[1]:v[0])},a.blur=function(){u.$setTouched()},a.$on("$destroy",function(){for(;t.length;)t.shift()()})}]).directive("uibTimepicker",["uibTimepickerConfig",function(a){return{require:["uibTimepicker","?^ngModel"],controller:"UibTimepickerController",controllerAs:"timepicker",replace:!0,scope:{},templateUrl:function(b,c){return c.templateUrl||a.templateUrl},link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.debounce","ui.bootstrap.position"]).factory("uibTypeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).controller("UibTypeaheadController",["$scope","$element","$attrs","$compile","$parse","$q","$timeout","$document","$window","$rootScope","$$debounce","$uibPosition","uibTypeaheadParser",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){N.moveInProgress||(N.moveInProgress=!0,N.$digest()),Y()}function o(){N.position=D?l.offset(b):l.position(b),N.position.top+=b.prop("offsetHeight")}var p,q,r=[9,13,27,38,40],s=200,t=a.$eval(c.typeaheadMinLength);t||0===t||(t=1),a.$watch(c.typeaheadMinLength,function(a){t=a||0===a?a:1});var u=a.$eval(c.typeaheadWaitMs)||0,v=a.$eval(c.typeaheadEditable)!==!1;a.$watch(c.typeaheadEditable,function(a){v=a!==!1});var w,x,y=e(c.typeaheadLoading).assign||angular.noop,z=e(c.typeaheadOnSelect),A=angular.isDefined(c.typeaheadSelectOnBlur)?a.$eval(c.typeaheadSelectOnBlur):!1,B=e(c.typeaheadNoResults).assign||angular.noop,C=c.typeaheadInputFormatter?e(c.typeaheadInputFormatter):void 0,D=c.typeaheadAppendToBody?a.$eval(c.typeaheadAppendToBody):!1,E=c.typeaheadAppendTo?a.$eval(c.typeaheadAppendTo):null,F=a.$eval(c.typeaheadFocusFirst)!==!1,G=c.typeaheadSelectOnExact?a.$eval(c.typeaheadSelectOnExact):!1,H=e(c.typeaheadIsOpen).assign||angular.noop,I=a.$eval(c.typeaheadShowHint)||!1,J=e(c.ngModel),K=e(c.ngModel+"($$$p)"),L=function(b,c){return angular.isFunction(J(a))&&q&&q.$options&&q.$options.getterSetter?K(b,{$$$p:c}):J.assign(b,c)},M=m.parse(c.uibTypeahead),N=a.$new(),O=a.$on("$destroy",function(){N.$destroy()});N.$on("$destroy",O);var P="typeahead-"+N.$id+"-"+Math.floor(1e4*Math.random());b.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":P});var Q,R;I&&(Q=angular.element("<div></div>"),Q.css("position","relative"),b.after(Q),R=b.clone(),R.attr("placeholder",""),R.attr("tabindex","-1"),R.val(""),R.css({position:"absolute",top:"0px",left:"0px","border-color":"transparent","box-shadow":"none",opacity:1,background:"none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)",color:"#999"}),b.css({position:"relative","vertical-align":"top","background-color":"transparent"}),Q.append(R),R.after(b));var S=angular.element("<div uib-typeahead-popup></div>");S.attr({id:P,matches:"matches",active:"activeIdx",select:"select(activeIdx, evt)","move-in-progress":"moveInProgress",query:"query",position:"position","assign-is-open":"assignIsOpen(isOpen)",debounce:"debounceUpdate"}),angular.isDefined(c.typeaheadTemplateUrl)&&S.attr("template-url",c.typeaheadTemplateUrl),angular.isDefined(c.typeaheadPopupTemplateUrl)&&S.attr("popup-template-url",c.typeaheadPopupTemplateUrl);var T=function(){I&&R.val("")},U=function(){N.matches=[],N.activeIdx=-1,b.attr("aria-expanded",!1),T()},V=function(a){return P+"-option-"+a};N.$watch("activeIdx",function(a){0>a?b.removeAttr("aria-activedescendant"):b.attr("aria-activedescendant",V(a))});var W=function(a,b){return N.matches.length>b&&a?a.toUpperCase()===N.matches[b].label.toUpperCase():!1},X=function(c,d){var e={$viewValue:c};y(a,!0),B(a,!1),f.when(M.source(a,e)).then(function(f){var g=c===p.$viewValue;if(g&&w)if(f&&f.length>0){N.activeIdx=F?0:-1,B(a,!1),N.matches.length=0;for(var h=0;h<f.length;h++)e[M.itemName]=f[h],N.matches.push({id:V(h),label:M.viewMapper(N,e),model:f[h]});if(N.query=c,o(),b.attr("aria-expanded",!0),G&&1===N.matches.length&&W(c,0)&&(angular.isNumber(N.debounceUpdate)||angular.isObject(N.debounceUpdate)?k(function(){N.select(0,d)},angular.isNumber(N.debounceUpdate)?N.debounceUpdate:N.debounceUpdate["default"]):N.select(0,d)),I){var i=N.matches[0].label;angular.isString(c)&&c.length>0&&i.slice(0,c.length).toUpperCase()===c.toUpperCase()?R.val(c+i.slice(c.length)):R.val("")}}else U(),B(a,!0);g&&y(a,!1)},function(){U(),y(a,!1),B(a,!0)})};D&&(angular.element(i).on("resize",n),h.find("body").on("scroll",n));var Y=k(function(){N.matches.length&&o(),N.moveInProgress=!1},s);N.moveInProgress=!1,N.query=void 0;var Z,$=function(a){Z=g(function(){X(a)},u)},_=function(){Z&&g.cancel(Z)};U(),N.assignIsOpen=function(b){H(a,b)},N.select=function(d,e){var f,h,i={};x=!0,i[M.itemName]=h=N.matches[d].model,f=M.modelMapper(a,i),L(a,f),p.$setValidity("editable",!0),p.$setValidity("parse",!0),z(a,{$item:h,$model:f,$label:M.viewMapper(a,i),$event:e}),U(),N.$eval(c.typeaheadFocusOnSelect)!==!1&&g(function(){b[0].focus()},0,!1)},b.on("keydown",function(b){if(0!==N.matches.length&&-1!==r.indexOf(b.which)){if(-1===N.activeIdx&&(9===b.which||13===b.which)||9===b.which&&b.shiftKey)return U(),void N.$digest();b.preventDefault();var c;switch(b.which){case 9:case 13:N.$apply(function(){angular.isNumber(N.debounceUpdate)||angular.isObject(N.debounceUpdate)?k(function(){N.select(N.activeIdx,b)},angular.isNumber(N.debounceUpdate)?N.debounceUpdate:N.debounceUpdate["default"]):N.select(N.activeIdx,b)});break;case 27:b.stopPropagation(),U(),a.$digest();break;case 38:N.activeIdx=(N.activeIdx>0?N.activeIdx:N.matches.length)-1,N.$digest(),c=S.find("li")[N.activeIdx],c.parentNode.scrollTop=c.offsetTop;break;case 40:N.activeIdx=(N.activeIdx+1)%N.matches.length,N.$digest(),c=S.find("li")[N.activeIdx],c.parentNode.scrollTop=c.offsetTop}}}),b.bind("focus",function(a){w=!0,0!==t||p.$viewValue||g(function(){X(p.$viewValue,a)},0)}),b.bind("blur",function(a){A&&N.matches.length&&-1!==N.activeIdx&&!x&&(x=!0,N.$apply(function(){angular.isObject(N.debounceUpdate)&&angular.isNumber(N.debounceUpdate.blur)?k(function(){N.select(N.activeIdx,a)},N.debounceUpdate.blur):N.select(N.activeIdx,a)})),!v&&p.$error.editable&&(p.$setViewValue(),p.$setValidity("editable",!0),p.$setValidity("parse",!0),b.val("")),w=!1,x=!1});var aa=function(c){b[0]!==c.target&&3!==c.which&&0!==N.matches.length&&(U(),j.$$phase||a.$digest())};h.on("click",aa),a.$on("$destroy",function(){h.off("click",aa),(D||E)&&ba.remove(),D&&(angular.element(i).off("resize",n),h.find("body").off("scroll",n)),S.remove(),I&&Q.remove()});var ba=d(S)(N);D?h.find("body").append(ba):E?angular.element(E).eq(0).append(ba):b.after(ba),this.init=function(b,c){p=b,q=c,N.debounceUpdate=p.$options&&e(p.$options.debounce)(a),p.$parsers.unshift(function(b){return w=!0,0===t||b&&b.length>=t?u>0?(_(),$(b)):X(b):(y(a,!1),_(),U()),v?b:b?void p.$setValidity("editable",!1):(p.$setValidity("editable",!0),null)}),p.$formatters.push(function(b){var c,d,e={};return v||p.$setValidity("editable",!0),C?(e.$model=b,C(a,e)):(e[M.itemName]=b,c=M.viewMapper(a,e),e[M.itemName]=void 0,d=M.viewMapper(a,e),c!==d?c:b)})}}]).directive("uibTypeahead",function(){return{controller:"UibTypeaheadController",require:["ngModel","^?ngModelOptions","uibTypeahead"],link:function(a,b,c,d){d[2].init(d[0],d[1])}}}).directive("uibTypeaheadPopup",["$$debounce",function(a){return{scope:{matches:"=",query:"=",active:"=",position:"&",moveInProgress:"=",select:"&",assignIsOpen:"&",debounce:"&"},replace:!0,templateUrl:function(a,b){return b.popupTemplateUrl||"uib/template/typeahead/typeahead-popup.html"},link:function(b,c,d){b.templateUrl=d.templateUrl,b.isOpen=function(){var a=b.matches.length>0;return b.assignIsOpen({isOpen:a}),a},b.isActive=function(a){return b.active===a},b.selectActive=function(a){b.active=a},b.selectMatch=function(c,d){var e=b.debounce();angular.isNumber(e)||angular.isObject(e)?a(function(){b.select({activeIdx:c,evt:d})},angular.isNumber(e)?e:e["default"]):b.select({activeIdx:c,evt:d})}}}}]).directive("uibTypeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"uib/template/typeahead/typeahead-match.html";a(g).then(function(a){var c=angular.element(a.trim());e.replaceWith(c),b(c)(d)})}}}]).filter("uibTypeaheadHighlight",["$sce","$injector","$log",function(a,b,c){function d(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function e(a){return/<.*>/g.test(a)}var f;return f=b.has("$sanitize"),function(b,g){return!f&&e(b)&&c.warn("Unsafe use of typeahead please use ngSanitize"),b=g?(""+b).replace(new RegExp(d(g),"gi"),"<strong>$&</strong>"):b,f||(b=a.trustAsHtml(b)),b}}]),angular.module("uib/template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("uib/template/accordion/accordion-group.html",'<div class="panel" ng-class="panelClass || \'panel-default\'">\n <div role="tab" id="{{::headingId}}" aria-selected="{{isOpen}}" class="panel-heading" ng-keypress="toggleOpen($event)">\n <h4 class="panel-title">\n <a role="button" data-toggle="collapse" href aria-expanded="{{isOpen}}" aria-controls="{{::panelId}}" tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading"><span uib-accordion-header ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n </h4>\n </div>\n <div id="{{::panelId}}" aria-labelledby="{{::headingId}}" aria-hidden="{{!isOpen}}" role="tabpanel" class="panel-collapse collapse" uib-collapse="!isOpen">\n <div class="panel-body" ng-transclude></div>\n </div>\n</div>\n')}]),angular.module("uib/template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("uib/template/accordion/accordion.html",'<div role="tablist" class="panel-group" ng-transclude></div>')}]),angular.module("uib/template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("uib/template/alert/alert.html",'<div class="alert" ng-class="[\'alert-\' + (type || \'warning\'), closeable ? \'alert-dismissible\' : null]" role="alert">\n <button ng-show="closeable" type="button" class="close" ng-click="close({$event: $event})">\n <span aria-hidden="true">&times;</span>\n <span class="sr-only">Close</span>\n </button>\n <div ng-transclude></div>\n</div>\n')}]),angular.module("uib/template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("uib/template/carousel/carousel.html",'<div ng-mouseenter="pause()" ng-mouseleave="play()" class="carousel" ng-swipe-right="prev()" ng-swipe-left="next()">\n <div class="carousel-inner" ng-transclude></div>\n <a role="button" href class="left carousel-control" ng-click="prev()" ng-class="{ disabled: isPrevDisabled() }" ng-show="slides.length > 1">\n <span aria-hidden="true" class="glyphicon glyphicon-chevron-left"></span>\n <span class="sr-only">previous</span>\n </a>\n <a role="button" href class="right carousel-control" ng-click="next()" ng-class="{ disabled: isNextDisabled() }" ng-show="slides.length > 1">\n <span aria-hidden="true" class="glyphicon glyphicon-chevron-right"></span>\n <span class="sr-only">next</span>\n </a>\n <ol class="carousel-indicators" ng-show="slides.length > 1">\n <li ng-repeat="slide in slides | orderBy:indexOfSlide track by $index" ng-class="{ active: isActive(slide) }" ng-click="select(slide)">\n <span class="sr-only">slide {{ $index + 1 }} of {{ slides.length }}<span ng-if="isActive(slide)">, currently active</span></span>\n </li>\n </ol>\n</div>\n');
1768 1768 }]),angular.module("uib/template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("uib/template/carousel/slide.html",'<div ng-class="{\n \'active\': active\n }" class="item text-center" ng-transclude></div>\n')}]),angular.module("uib/template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/datepicker.html",'<div class="uib-datepicker" ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n <uib-daypicker ng-switch-when="day" tabindex="0"></uib-daypicker>\n <uib-monthpicker ng-switch-when="month" tabindex="0"></uib-monthpicker>\n <uib-yearpicker ng-switch-when="year" tabindex="0"></uib-yearpicker>\n</div>\n')}]),angular.module("uib/template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/day.html",'<table class="uib-daypicker" role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="{{::5 + showWeeks}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n <tr>\n <th ng-if="showWeeks" class="text-center"></th>\n <th ng-repeat="label in ::labels track by $index" class="text-center"><small aria-label="{{::label.full}}">{{::label.abbr}}</small></th>\n </tr>\n </thead>\n <tbody>\n <tr class="uib-weeks" ng-repeat="row in rows track by $index">\n <td ng-if="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n <td ng-repeat="dt in row" class="uib-day text-center" role="gridcell"\n id="{{::dt.uid}}"\n ng-class="::dt.customClass">\n <button type="button" class="btn btn-default btn-sm"\n uib-is-class="\n \'btn-info\' for selectedDt,\n \'active\' for activeDt\n on dt"\n ng-click="select(dt.date)"\n ng-disabled="::dt.disabled"\n tabindex="-1"><span ng-class="::{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("uib/template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/month.html",'<table class="uib-monthpicker" role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr class="uib-months" ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row" class="uib-month text-center" role="gridcell"\n id="{{::dt.uid}}"\n ng-class="::dt.customClass">\n <button type="button" class="btn btn-default"\n uib-is-class="\n \'btn-info\' for selectedDt,\n \'active\' for activeDt\n on dt"\n ng-click="select(dt.date)"\n ng-disabled="::dt.disabled"\n tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("uib/template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/year.html",'<table class="uib-yearpicker" role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="{{::columns - 2}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr class="uib-years" ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row" class="uib-year text-center" role="gridcell"\n id="{{::dt.uid}}"\n ng-class="::dt.customClass">\n <button type="button" class="btn btn-default"\n uib-is-class="\n \'btn-info\' for selectedDt,\n \'active\' for activeDt\n on dt"\n ng-click="select(dt.date)"\n ng-disabled="::dt.disabled"\n tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("uib/template/datepickerPopup/popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepickerPopup/popup.html",'<div>\n <ul class="uib-datepicker-popup dropdown-menu uib-position-measure" dropdown-nested ng-if="isOpen" ng-keydown="keydown($event)" ng-click="$event.stopPropagation()">\n <li ng-transclude></li>\n <li ng-if="showButtonBar" class="uib-button-bar">\n <span class="btn-group pull-left">\n <button type="button" class="btn btn-sm btn-info uib-datepicker-current" ng-click="select(\'today\', $event)" ng-disabled="isDisabled(\'today\')">{{ getText(\'current\') }}</button>\n <button type="button" class="btn btn-sm btn-danger uib-clear" ng-click="select(null, $event)">{{ getText(\'clear\') }}</button>\n </span>\n <button type="button" class="btn btn-sm btn-success pull-right uib-close" ng-click="close($event)">{{ getText(\'close\') }}</button>\n </li>\n </ul>\n</div>\n')}]),angular.module("uib/template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("uib/template/modal/backdrop.html",'<div class="modal-backdrop"\n uib-modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("uib/template/modal/window.html",[]).run(["$templateCache",function(a){a.put("uib/template/modal/window.html",'<div modal-render="{{$isRendered}}" tabindex="-1" role="dialog" class="modal"\n uib-modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}">\n <div class="modal-dialog {{size ? \'modal-\' + size : \'\'}}"><div class="modal-content" uib-modal-transclude></div></div>\n</div>\n')}]),angular.module("uib/template/pager/pager.html",[]).run(["$templateCache",function(a){a.put("uib/template/pager/pager.html",'<ul class="pager">\n <li ng-class="{disabled: noPrevious()||ngDisabled, previous: align}"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-class="{disabled: noNext()||ngDisabled, next: align}"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n</ul>\n')}]),angular.module("uib/template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("uib/template/pagination/pagination.html",'<ul class="pagination">\n <li ng-if="::boundaryLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-first"><a href ng-click="selectPage(1, $event)">{{::getText(\'first\')}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-prev"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-repeat="page in pages track by $index" ng-class="{active: page.active,disabled: ngDisabled&&!page.active}" class="pagination-page"><a href ng-click="selectPage(page.number, $event)">{{page.text}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n <li ng-if="::boundaryLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-last"><a href ng-click="selectPage(totalPages, $event)">{{::getText(\'last\')}}</a></li>\n</ul>\n')}]),angular.module("uib/template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/tooltip/tooltip-html-popup.html",'<div class="tooltip"\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind-html="contentExp()"></div>\n</div>\n')}]),angular.module("uib/template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/tooltip/tooltip-popup.html",'<div class="tooltip"\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("uib/template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/tooltip/tooltip-template-popup.html",'<div class="tooltip"\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner"\n uib-tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n</div>\n')}]),angular.module("uib/template/popover/popover-html.html",[]).run(["$templateCache",function(a){a.put("uib/template/popover/popover-html.html",'<div class="popover"\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="uibTitle" ng-if="uibTitle"></h3>\n <div class="popover-content" ng-bind-html="contentExp()"></div>\n </div>\n</div>\n')}]),angular.module("uib/template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("uib/template/popover/popover-template.html",'<div class="popover"\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="uibTitle" ng-if="uibTitle"></h3>\n <div class="popover-content"\n uib-tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n </div>\n</div>\n')}]),angular.module("uib/template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("uib/template/popover/popover.html",'<div class="popover"\n tooltip-animation-class="fade"\n uib-tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="uibTitle" ng-if="uibTitle"></h3>\n <div class="popover-content" ng-bind="content"></div>\n </div>\n</div>\n')}]),angular.module("uib/template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("uib/template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" ng-transclude></div>\n')}]),angular.module("uib/template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("uib/template/progressbar/progress.html",'<div class="progress" ng-transclude aria-labelledby="{{::title}}"></div>')}]),angular.module("uib/template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("uib/template/progressbar/progressbar.html",'<div class="progress">\n <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" ng-transclude></div>\n</div>\n')}]),angular.module("uib/template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("uib/template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}" aria-valuetext="{{title}}">\n <span ng-repeat-start="r in range track by $index" class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n <i ng-repeat-end ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')" ng-attr-title="{{r.title}}"></i>\n</span>\n')}]),angular.module("uib/template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("uib/template/tabs/tab.html",'<li ng-class="[{active: active, disabled: disabled}, classes]" class="uib-tab nav-item">\n <a href ng-click="select($event)" class="nav-link" uib-tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("uib/template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("uib/template/tabs/tabset.html",'<div>\n <ul class="nav nav-{{tabset.type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n <div class="tab-content">\n <div class="tab-pane"\n ng-repeat="tab in tabset.tabs"\n ng-class="{active: tabset.active === tab.index}"\n uib-tab-content-transclude="tab">\n </div>\n </div>\n</div>\n')}]),angular.module("uib/template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("uib/template/timepicker/timepicker.html",'<table class="uib-timepicker">\n <tbody>\n <tr class="text-center" ng-show="::showSpinners">\n <td class="uib-increment hours"><a ng-click="incrementHours()" ng-class="{disabled: noIncrementHours()}" class="btn btn-link" ng-disabled="noIncrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td>&nbsp;</td>\n <td class="uib-increment minutes"><a ng-click="incrementMinutes()" ng-class="{disabled: noIncrementMinutes()}" class="btn btn-link" ng-disabled="noIncrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td ng-show="showSeconds">&nbsp;</td>\n <td ng-show="showSeconds" class="uib-increment seconds"><a ng-click="incrementSeconds()" ng-class="{disabled: noIncrementSeconds()}" class="btn btn-link" ng-disabled="noIncrementSeconds()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n <tr>\n <td class="form-group uib-time hours" ng-class="{\'has-error\': invalidHours}">\n <input type="text" placeholder="HH" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementHours()" ng-blur="blur()">\n </td>\n <td class="uib-separator">:</td>\n <td class="form-group uib-time minutes" ng-class="{\'has-error\': invalidMinutes}">\n <input type="text" placeholder="MM" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementMinutes()" ng-blur="blur()">\n </td>\n <td ng-show="showSeconds" class="uib-separator">:</td>\n <td class="form-group uib-time seconds" ng-class="{\'has-error\': invalidSeconds}" ng-show="showSeconds">\n <input type="text" placeholder="SS" ng-model="seconds" ng-change="updateSeconds()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementSeconds()" ng-blur="blur()">\n </td>\n <td ng-show="showMeridian" class="uib-time am-pm"><button type="button" ng-class="{disabled: noToggleMeridian()}" class="btn btn-default text-center" ng-click="toggleMeridian()" ng-disabled="noToggleMeridian()" tabindex="{{::tabindex}}">{{meridian}}</button></td>\n </tr>\n <tr class="text-center" ng-show="::showSpinners">\n <td class="uib-decrement hours"><a ng-click="decrementHours()" ng-class="{disabled: noDecrementHours()}" class="btn btn-link" ng-disabled="noDecrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td>&nbsp;</td>\n <td class="uib-decrement minutes"><a ng-click="decrementMinutes()" ng-class="{disabled: noDecrementMinutes()}" class="btn btn-link" ng-disabled="noDecrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td ng-show="showSeconds">&nbsp;</td>\n <td ng-show="showSeconds" class="uib-decrement seconds"><a ng-click="decrementSeconds()" ng-class="{disabled: noDecrementSeconds()}" class="btn btn-link" ng-disabled="noDecrementSeconds()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("uib/template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("uib/template/typeahead/typeahead-match.html",'<a href\n tabindex="-1"\n ng-bind-html="match.label | uibTypeaheadHighlight:query"\n ng-attr-title="{{match.label}}"></a>\n')}]),angular.module("uib/template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-show="isOpen() && !moveInProgress" ng-style="{top: position().top+\'px\', left: position().left+\'px\'}" role="listbox" aria-hidden="{{!isOpen()}}">\n <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index, $event)" role="option" id="{{::match.id}}">\n <div uib-typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n </li>\n</ul>\n')}]),angular.module("ui.bootstrap.carousel").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibCarouselCss&&angular.element(document).find("head").prepend('<style type="text/css">.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}</style>'),angular.$$uibCarouselCss=!0}),angular.module("ui.bootstrap.datepicker").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibDatepickerCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-datepicker .uib-title{width:100%;}.uib-day button,.uib-month button,.uib-year button{min-width:100%;}.uib-left,.uib-right{width:100%}</style>'),angular.$$uibDatepickerCss=!0}),angular.module("ui.bootstrap.position").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibPositionCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-position-measure{display:block !important;visibility:hidden !important;position:absolute !important;top:-9999px !important;left:-9999px !important;}.uib-position-scrollbar-measure{position:absolute !important;top:-9999px !important;width:50px !important;height:50px !important;overflow:scroll !important;}.uib-position-body-scrollbar-measure{overflow:scroll !important;}</style>'),angular.$$uibPositionCss=!0}),angular.module("ui.bootstrap.datepickerPopup").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibDatepickerpopupCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-datepicker-popup.dropdown-menu{display:block;float:none;margin:0;}.uib-button-bar{padding:10px 9px 2px;}</style>'),angular.$$uibDatepickerpopupCss=!0}),angular.module("ui.bootstrap.tooltip").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibTooltipCss&&angular.element(document).find("head").prepend('<style type="text/css">[uib-tooltip-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-bottom > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-bottom > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-bottom > .tooltip-arrow,[uib-popover-popup].popover.top-left > .arrow,[uib-popover-popup].popover.top-right > .arrow,[uib-popover-popup].popover.bottom-left > .arrow,[uib-popover-popup].popover.bottom-right > .arrow,[uib-popover-popup].popover.left-top > .arrow,[uib-popover-popup].popover.left-bottom > .arrow,[uib-popover-popup].popover.right-top > .arrow,[uib-popover-popup].popover.right-bottom > .arrow,[uib-popover-html-popup].popover.top-left > .arrow,[uib-popover-html-popup].popover.top-right > .arrow,[uib-popover-html-popup].popover.bottom-left > .arrow,[uib-popover-html-popup].popover.bottom-right > .arrow,[uib-popover-html-popup].popover.left-top > .arrow,[uib-popover-html-popup].popover.left-bottom > .arrow,[uib-popover-html-popup].popover.right-top > .arrow,[uib-popover-html-popup].popover.right-bottom > .arrow,[uib-popover-template-popup].popover.top-left > .arrow,[uib-popover-template-popup].popover.top-right > .arrow,[uib-popover-template-popup].popover.bottom-left > .arrow,[uib-popover-template-popup].popover.bottom-right > .arrow,[uib-popover-template-popup].popover.left-top > .arrow,[uib-popover-template-popup].popover.left-bottom > .arrow,[uib-popover-template-popup].popover.right-top > .arrow,[uib-popover-template-popup].popover.right-bottom > .arrow{top:auto;bottom:auto;left:auto;right:auto;margin:0;}[uib-popover-popup].popover,[uib-popover-html-popup].popover,[uib-popover-template-popup].popover{display:block !important;}</style>'),angular.$$uibTooltipCss=!0}),angular.module("ui.bootstrap.timepicker").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibTimepickerCss&&angular.element(document).find("head").prepend('<style type="text/css">.uib-time input{width:50px;}</style>'),angular.$$uibTimepickerCss=!0}),angular.module("ui.bootstrap.typeahead").run(function(){!angular.$$csp().noInlineStyle&&!angular.$$uibTypeaheadCss&&angular.element(document).find("head").prepend('<style type="text/css">[uib-typeahead-popup].dropdown-menu{display:block;}</style>'),angular.$$uibTypeaheadCss=!0});
1769 1769 ;/*!
1770 1770 * State-based routing for AngularJS
1771 1771 * @version v1.0.0-beta.3
1772 1772 * @link https://ui-router.github.io
1773 1773 * @license MIT License, http://www.opensource.org/licenses/MIT
1774 1774 */
1775 1775 !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("angular")):"function"==typeof define&&define.amd?define("angular-ui-router",["angular"],e):"object"==typeof exports?exports["angular-ui-router"]=e(require("angular")):t["angular-ui-router"]=e(t.angular)}(this,function(t){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(1)),n(r(53)),n(r(55)),n(r(58)),r(60),r(61),r(62),r(63),Object.defineProperty(e,"__esModule",{value:!0}),e["default"]="ui.router"},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(2)),n(r(46)),n(r(47)),n(r(48)),n(r(49)),n(r(50)),n(r(51)),n(r(52)),n(r(44));var i=r(25);e.UIRouter=i.UIRouter},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(3)),n(r(6)),n(r(7)),n(r(5)),n(r(4)),n(r(8)),n(r(9)),n(r(12))},function(t,e,r){"use strict";function n(t,e,r,n){return void 0===n&&(n=Object.keys(t)),n.filter(function(e){return"function"==typeof t[e]}).forEach(function(n){return e[n]=t[n].bind(r)})}function i(t){void 0===t&&(t={});for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];var i=o.apply(null,[{}].concat(r));return e.extend({},i,c(t||{},Object.keys(i)))}function o(t){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];return e.forEach(r,function(r){e.forEach(r,function(e,r){t.hasOwnProperty(r)||(t[r]=e)})}),t}function a(t,e){var r=[];for(var n in t.path){if(t.path[n]!==e.path[n])break;r.push(t.path[n])}return r}function s(t,e,r){void 0===r&&(r=Object.keys(t));for(var n=0;n<r.length;n++){var i=r[n];if(t[i]!=e[i])return!1}return!0}function u(t,e){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];var i={};for(var o in e)t(r,o)&&(i[o]=e[o]);return i}function c(t){return u.apply(null,[e.inArray].concat(T(arguments)))}function f(t){var r=function(t,r){return!e.inArray(t,r)};return u.apply(null,[r].concat(T(arguments)))}function l(t,e){return v(t,P.prop(e))}function p(t,r){var n=k.isArray(t),i=n?[]:{},o=n?function(t){return i.push(t)}:function(t,e){return i[e]=t};return e.forEach(t,function(t,e){r(t,e)&&o(t,e)}),i}function h(t,r){var n;return e.forEach(t,function(t,e){n||r(t,e)&&(n=t)}),n}function v(t,r){var n=k.isArray(t)?[]:{};return e.forEach(t,function(t,e){return n[e]=r(t,e)}),n}function d(t,e){return t.push(e),t}function m(t,e){return void 0===e&&(e="assert failure"),function(r){if(!t(r))throw new Error(k.isFunction(e)?e(r):e);return!0}}function g(){for(var t=[],e=0;e<arguments.length;e++)t[e-0]=arguments[e];if(0===t.length)return[];var r=t.reduce(function(t,e){return Math.min(e.length,t)},9007199254740991);return Array.apply(null,Array(r)).map(function(e,r){return t.map(function(t){return t[r]})})}function y(t,e){var r,n;if(k.isArray(e)&&(r=e[0],n=e[1]),!k.isString(r))throw new Error("invalid parameters to applyPairs");return t[r]=n,t}function w(t){return t.length&&t[t.length-1]||void 0}function b(t,r){return r&&Object.keys(r).forEach(function(t){return delete r[t]}),r||(r={}),e.extend(r,t)}function $(t,e,r){return k.isArray(t)?t.forEach(e,r):void Object.keys(t).forEach(function(r){return e(t[r],r)})}function R(t,e){return Object.keys(e).forEach(function(r){return t[r]=e[r]}),t}function S(t){return T(arguments,1).filter(e.identity).reduce(R,t)}function E(t,e){if(t===e)return!0;if(null===t||null===e)return!1;if(t!==t&&e!==e)return!0;var r=typeof t,n=typeof e;if(r!==n||"object"!==r)return!1;var i=[t,e];if(P.all(k.isArray)(i))return x(t,e);if(P.all(k.isDate)(i))return t.getTime()===e.getTime();if(P.all(k.isRegExp)(i))return t.toString()===e.toString();if(P.all(k.isFunction)(i))return!0;var o=[k.isFunction,k.isArray,k.isDate,k.isRegExp];if(o.map(P.any).reduce(function(t,e){return t||!!e(i)},!1))return!1;var a,s={};for(a in t){if(!E(t[a],e[a]))return!1;s[a]=!0}for(a in e)if(!s[a])return!1;return!0}function x(t,e){return t.length===e.length&&g(t,e).reduce(function(t,e){return t&&E(e[0],e[1])},!0)}var k=r(4),P=r(5),_=r(6),C="undefined"==typeof window?{}:window,O=C.angular||{};e.fromJson=O.fromJson||JSON.parse.bind(JSON),e.toJson=O.toJson||JSON.stringify.bind(JSON),e.copy=O.copy||b,e.forEach=O.forEach||$,e.extend=O.extend||S,e.equals=O.equals||E,e.identity=function(t){return t},e.noop=function(){},e.bindFunctions=n,e.inherit=function(t,r){return e.extend(new(e.extend(function(){},{prototype:t})),r)};var T=function(t,e){return void 0===e&&(e=0),Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(t,e))};e.inArray=function(t,e){return t.indexOf(e)!==-1},e.removeFrom=P.curry(function(t,e){var r=t.indexOf(e);return r>=0&&t.splice(r,1),t}),e.defaults=i,e.merge=o,e.mergeR=function(t,r){return e.extend(t,r)},e.ancestors=a,e.equalForKeys=s,e.pick=c,e.omit=f,e.pluck=l,e.filter=p,e.find=h,e.mapObj=v,e.map=v,e.values=function(t){return Object.keys(t).map(function(e){return t[e]})},e.allTrueR=function(t,e){return t&&e},e.anyTrueR=function(t,e){return t||e},e.unnestR=function(t,e){return t.concat(e)},e.flattenR=function(t,r){return k.isArray(r)?t.concat(r.reduce(e.flattenR,[])):d(t,r)},e.pushR=d,e.uniqR=function(t,r){return e.inArray(t,r)?t:d(t,r)},e.unnest=function(t){return t.reduce(e.unnestR,[])},e.flatten=function(t){return t.reduce(e.flattenR,[])},e.assertPredicate=m,e.pairs=function(t){return Object.keys(t).map(function(e){return[e,t[e]]})},e.arrayTuples=g,e.applyPairs=y,e.tail=w,e.silenceUncaughtInPromise=function(t){return t["catch"](function(t){return 0})&&t},e.silentRejection=function(t){return e.silenceUncaughtInPromise(_.services.$q.reject(t))}},function(t,e,r){"use strict";function n(t){if(e.isArray(t)&&t.length){var r=t.slice(0,-1),n=t.slice(-1);return!(r.filter(i.not(e.isString)).length||n.filter(i.not(e.isFunction)).length)}return e.isFunction(t)}var i=r(5),o=Object.prototype.toString,a=function(t){return function(e){return typeof e===t}};e.isUndefined=a("undefined"),e.isDefined=i.not(e.isUndefined),e.isNull=function(t){return null===t},e.isFunction=a("function"),e.isNumber=a("number"),e.isString=a("string"),e.isObject=function(t){return null!==t&&"object"==typeof t},e.isArray=Array.isArray,e.isDate=function(t){return"[object Date]"===o.call(t)},e.isRegExp=function(t){return"[object RegExp]"===o.call(t)},e.isInjectable=n,e.isPromise=i.and(e.isObject,i.pipe(i.prop("then"),e.isFunction))},function(t,e){"use strict";function r(t){function e(r){return r.length>=n?t.apply(null,r):function(){return e(r.concat([].slice.apply(arguments)))}}var r=[].slice.apply(arguments,[1]),n=t.length;return e(r)}function n(){var t=arguments,e=t.length-1;return function(){for(var r=e,n=t[e].apply(this,arguments);r--;)n=t[r].call(this,n);return n}}function i(){for(var t=[],e=0;e<arguments.length;e++)t[e-0]=arguments[e];return n.apply(null,[].slice.call(arguments).reverse())}function o(t,e){return function(){for(var r=[],n=0;n<arguments.length;n++)r[n-0]=arguments[n];return t.apply(null,r)&&e.apply(null,r)}}function a(t,e){return function(){for(var r=[],n=0;n<arguments.length;n++)r[n-0]=arguments[n];return t.apply(null,r)||e.apply(null,r)}}function s(t,e){return function(r){return r[t].apply(r,e)}}function u(t){return function(e){for(var r=0;r<t.length;r++)if(t[r][0](e))return t[r][1](e)}}e.curry=r,e.compose=n,e.pipe=i,e.prop=function(t){return function(e){return e&&e[t]}},e.propEq=r(function(t,e,r){return r&&r[t]===e}),e.parse=function(t){return i.apply(null,t.split(".").map(e.prop))},e.not=function(t){return function(){for(var e=[],r=0;r<arguments.length;r++)e[r-0]=arguments[r];return!t.apply(null,e)}},e.and=o,e.or=a,e.all=function(t){return function(e){return e.reduce(function(e,r){return e&&!!t(r)},!0)}},e.any=function(t){return function(e){return e.reduce(function(e,r){return e||!!t(r)},!1)}},e.is=function(t){return function(e){return null!=e&&e.constructor===t||e instanceof t}},e.eq=function(t){return function(e){return t===e}},e.val=function(t){return function(){return t}},e.invoke=s,e.pattern=u},function(t,e){"use strict";var r=function(t){return function(){throw new Error(t+"(): No coreservices implementation for UI-Router is loaded. You should include one of: ['angular1.js']")}},n={$q:void 0,$injector:void 0,location:{},locationConfig:{},template:{}};e.services=n,["setUrl","path","search","hash","onChange"].forEach(function(t){return n.location[t]=r(t)}),["port","protocol","host","baseHref","html5Mode","hashPrefix"].forEach(function(t){return n.locationConfig[t]=r(t)})},function(t,e){"use strict";var r=function(){function t(t){this.text=t,this.glob=t.split(".");var e=this.text.split(".").map(function(t){return"**"===t?"(?:|(?:\\.[^.]*)*)":"*"===t?"\\.[^.]*":"\\."+t}).join("");this.regexp=new RegExp("^"+e+"$")}return t.prototype.matches=function(t){return this.regexp.test("."+t)},t.is=function(t){return t.indexOf("*")>-1},t.fromString=function(e){return this.is(e)?new t(e):null},t}();e.Glob=r},function(t,e){"use strict";var r=function(){function t(t,e){void 0===t&&(t=[]),void 0===e&&(e=null),this._items=t,this._limit=e}return t.prototype.enqueue=function(t){var e=this._items;return e.push(t),this._limit&&e.length>this._limit&&e.shift(),t},t.prototype.dequeue=function(){if(this.size())return this._items.splice(0,1)[0]},t.prototype.clear=function(){var t=this._items;return this._items=[],t},t.prototype.size=function(){return this._items.length},t.prototype.remove=function(t){var e=this._items.indexOf(t);return e>-1&&this._items.splice(e,1)[0]},t.prototype.peekTail=function(){return this._items[this._items.length-1]},t.prototype.peekHead=function(){if(this.size())return this._items[0]},t}();e.Queue=r},function(t,e,r){"use strict";function n(t,e){return e.length<=t?e:e.substr(0,t-3)+"..."}function i(t,e){for(;e.length<t;)e+=" ";return e}function o(t){return t.replace(/^([A-Z])/,function(t){return t.toLowerCase()}).replace(/([A-Z])/g,function(t){return"-"+t.toLowerCase()})}function a(t){var e=s(t),r=e.match(/^(function [^ ]+\([^)]*\))/),n=r?r[1]:e,i=t.name||"";return i&&n.match(/function \(/)?"function "+i+n.substr(9):n}function s(t){var e=c.isArray(t)?t.slice(-1)[0]:t;return e&&e.toString()||"undefined"}function u(t){function e(t){if(c.isObject(t)){if(r.indexOf(t)!==-1)return"[circular ref]";r.push(t)}return m(t)}var r=[];return JSON.stringify(t,function(t,r){return e(r)}).replace(/\\"/g,'"')}var c=r(4),f=r(10),l=r(3),p=r(5),h=r(11),v=r(19);e.maxLength=n,e.padString=i,e.kebobString=o,e.functionToString=a,e.fnToString=s;var d=null,m=function(t){var e=f.Rejection.isTransitionRejectionPromise;return(d=d||p.pattern([[p.not(c.isDefined),p.val("undefined")],[c.isNull,p.val("null")],[c.isPromise,p.val("[Promise]")],[e,function(t){return t._transitionRejection.toString()}],[p.is(f.Rejection),p.invoke("toString")],[p.is(h.Transition),p.invoke("toString")],[p.is(v.Resolvable),p.invoke("toString")],[c.isInjectable,a],[p.val(!0),l.identity]]))(t)};e.stringify=u,e.beforeAfterSubstr=function(t){return function(e){if(!e)return["",""];var r=e.indexOf(t);return r===-1?[e,""]:[e.substr(0,r),e.substr(r+1)]}}},function(t,e,r){"use strict";var n=r(3),i=r(9);!function(t){t[t.SUPERSEDED=2]="SUPERSEDED",t[t.ABORTED=3]="ABORTED",t[t.INVALID=4]="INVALID",t[t.IGNORED=5]="IGNORED",t[t.ERROR=6]="ERROR"}(e.RejectType||(e.RejectType={}));var o=e.RejectType,a=function(){function t(t,e,r){this.type=t,this.message=e,this.detail=r}return t.prototype.toString=function(){var t=function(t){return t&&t.toString!==Object.prototype.toString?t.toString():i.stringify(t)},e=this.type,r=this.message,n=t(this.detail);return"TransitionRejection(type: "+e+", message: "+r+", detail: "+n+")"},t.prototype.toPromise=function(){return n.extend(n.silentRejection(this),{_transitionRejection:this})},t.isTransitionRejectionPromise=function(e){return e&&"function"==typeof e.then&&e._transitionRejection instanceof t},t.superseded=function(e,r){var n="The transition has been superseded by a different transition",i=new t(o.SUPERSEDED,n,e);return r&&r.redirected&&(i.redirected=!0),i},t.redirected=function(e){return t.superseded(e,{redirected:!0})},t.invalid=function(e){var r="This transition is invalid";return new t(o.INVALID,r,e)},t.ignored=function(e){var r="The transition was ignored";return new t(o.IGNORED,r,e)},t.aborted=function(e){var r="The transition has been aborted";return new t(o.ABORTED,r,e)},t.errored=function(e){var r="The transition errored";return new t(o.ERROR,r,e)},t}();e.Rejection=a},function(t,e,r){"use strict";var n=r(9),i=r(12),o=r(6),a=r(3),s=r(4),u=r(5),c=r(13),f=r(15),l=r(16),p=r(21),h=r(20),v=r(14),d=r(22),m=r(19),g=r(10),y=r(17),w=r(25),b=0,$=u.prop("self"),R=function(){function t(e,r,n){var i=this;if(this._deferred=o.services.$q.defer(),this.promise=this._deferred.promise,this.treeChanges=function(){return i._treeChanges},this.isActive=function(){return i===i._options.current()},this.router=n,this._targetState=r,!r.valid())throw new Error(r.error());f.HookRegistry.mixin(new f.HookRegistry,this),this._options=a.extend({current:u.val(this)},r.options()),this.$id=b++;var s=h.PathFactory.buildToPath(e,r);this._treeChanges=h.PathFactory.treeChanges(e,s,this._options.reloadState);var c=this._treeChanges.entering.map(function(t){return t.state});h.PathFactory.applyViewConfigs(n.transitionService.$view,this._treeChanges.to,c);var l=[new m.Resolvable(w.UIRouter,function(){return n},[],(void 0),n),new m.Resolvable(t,function(){return i},[],(void 0),this),new m.Resolvable("$transition$",function(){return i},[],(void 0),this),new m.Resolvable("$stateParams",function(){return i.params()},[],(void 0),this.params())],p=this._treeChanges.to[0],v=new y.ResolveContext(this._treeChanges.to);v.addResolvables(l,p.state)}return t.prototype.onBefore=function(t,e,r){throw""},t.prototype.onStart=function(t,e,r){throw""},t.prototype.onExit=function(t,e,r){throw""},t.prototype.onRetain=function(t,e,r){throw""},t.prototype.onEnter=function(t,e,r){throw""},t.prototype.onFinish=function(t,e,r){throw""},t.prototype.onSuccess=function(t,e,r){throw""},t.prototype.onError=function(t,e,r){throw""},t.prototype.$from=function(){return a.tail(this._treeChanges.from).state},t.prototype.$to=function(){return a.tail(this._treeChanges.to).state},t.prototype.from=function(){return this.$from().self},t.prototype.to=function(){return this.$to().self},t.prototype.targetState=function(){return this._targetState},t.prototype.is=function(e){return e instanceof t?this.is({to:e.$to().name,from:e.$from().name}):!(e.to&&!f.matchState(this.$to(),e.to)||e.from&&!f.matchState(this.$from(),e.from))},t.prototype.params=function(t){return void 0===t&&(t="to"),this._treeChanges[t].map(u.prop("paramValues")).reduce(a.mergeR,{})},t.prototype.injector=function(t){var e=this.treeChanges().to;return t&&(e=h.PathFactory.subPath(e,function(e){return e.state===t||e.state.name===t})),new y.ResolveContext(e).injector()},t.prototype.getResolveTokens=function(){return new y.ResolveContext(this._treeChanges.to).getTokens()},t.prototype.getResolveValue=function(t){var e=new y.ResolveContext(this._treeChanges.to),r=function(t){var r=e.getResolvable(t);if(void 0===r)throw new Error("Dependency Injection token not found: "+n.stringify(t));return r.data};return s.isArray(t)?t.map(r):r(t)},t.prototype.getResolvable=function(t){return new y.ResolveContext(this._treeChanges.to).getResolvable(t)},t.prototype.addResolvable=function(t,e){void 0===e&&(e="");var r="string"==typeof e?e:e.name,n=this._treeChanges.to,i=a.find(n,function(t){return t.state.name===r}),o=new y.ResolveContext(n);o.addResolvables([t],i.state)},t.prototype.redirectedFrom=function(){return this._options.redirectedFrom||null},t.prototype.options=function(){return this._options},t.prototype.entering=function(){return a.map(this._treeChanges.entering,u.prop("state")).map($)},t.prototype.exiting=function(){return a.map(this._treeChanges.exiting,u.prop("state")).map($).reverse()},t.prototype.retained=function(){return a.map(this._treeChanges.retained,u.prop("state")).map($)},t.prototype.views=function(t,e){void 0===t&&(t="entering");var r=this._treeChanges[t];return r=e?r.filter(u.propEq("state",e)):r,r.map(u.prop("views")).filter(a.identity).reduce(a.unnestR,[])},t.prototype.redirect=function(t){var e=a.extend({},this.options(),t.options(),{redirectedFrom:this,source:"redirect"});t=new v.TargetState(t.identifier(),t.$state(),t.params(),e);var r=this.router.transitionService.create(this._treeChanges.from,t),n=this.treeChanges().entering,i=r.treeChanges().entering,o=function(t){return function(e){return t&&e.state.includes[t.name]}},s=p.PathNode.matching(i,n).filter(u.not(o(t.options().reloadState)));return s.forEach(function(t,e){t.resolvables=n[e].resolvables}),r},t.prototype._changedParams=function(){var t=this._treeChanges,e=t.to,r=t.from;if(!this._options.reload&&a.tail(e).state===a.tail(r).state){var n=e.map(function(t){return t.paramSchema}),i=[e,r].map(function(t){return t.map(function(t){return t.paramValues})}),o=i[0],s=i[1],u=a.arrayTuples(n,o,s);return u.map(function(t){var e=t[0],r=t[1],n=t[2];return d.Param.changed(e,r,n)}).reduce(a.unnestR,[])}},t.prototype.dynamic=function(){var t=this._changedParams();return!!t&&t.map(function(t){return t.dynamic}).reduce(a.anyTrueR,!1)},t.prototype.ignored=function(){var t=this._changedParams();return!!t&&0===t.length},t.prototype.hookBuilder=function(){return new l.HookBuilder(this.router.transitionService,this,{transition:this,current:this._options.current})},t.prototype.run=function(){var t=this,e=c.TransitionHook.runSynchronousHooks,r=this.hookBuilder(),n=this.router.globals;n.transitionHistory.enqueue(this);var o=e(r.getOnBeforeHooks());if(g.Rejection.isTransitionRejectionPromise(o)){o["catch"](function(){return 0});var a=o._transitionRejection;return this._deferred.reject(a),this.promise}if(!this.valid()){var s=new Error(this.error());return this._deferred.reject(s),this.promise}if(this.ignored())return i.trace.traceTransitionIgnored(this),this._deferred.reject(g.Rejection.ignored()),this.promise;var u=function(){i.trace.traceSuccess(t.$to(),t),t.success=!0,t._deferred.resolve(t.to()),e(r.getOnSuccessHooks(),!0)},f=function(n){i.trace.traceError(n,t),t.success=!1,t._deferred.reject(n),t._error=n,e(r.getOnErrorHooks(),!0)};i.trace.traceTransitionStart(this);var l=function(t,e){return t.then(function(){return e.invokeHook()})};return r.asyncHooks().reduce(l,o).then(u,f),this.promise},t.prototype.valid=function(){return!this.error()||void 0!==this.success},t.prototype.error=function(){for(var t=this.$to(),e=0,r=this;null!=(r=r.redirectedFrom());)if(++e>20)return"Too many Transition redirects (20+)";return t.self["abstract"]?"Cannot transition to abstract state '"+t.name+"'":d.Param.validates(t.parameters(),this.params())?this.success===!1?this._error:void 0:"Param values not valid for state '"+t.name+"'"},t.prototype.toString=function(){var t=this.from(),e=this.to(),r=function(t){return null!==t["#"]&&void 0!==t["#"]?t:a.omit(t,"#")},n=this.$id,i=s.isObject(t)?t.name:t,o=a.toJson(r(this._treeChanges.from.map(u.prop("paramValues")).reduce(a.mergeR,{}))),c=this.valid()?"":"(X) ",f=s.isObject(e)?e.name:e,l=a.toJson(r(this.params()));return"Transition#"+n+"( '"+i+"'"+o+" -> "+c+"'"+f+"'"+l+" )"},t.diToken=t,t}();e.Transition=R},function(t,e,r){"use strict";function n(t){return t?"[ui-view#"+t.id+" tag "+("in template from '"+(t.creationContext&&t.creationContext.name||"(root)")+"' state]: ")+("fqn: '"+t.fqn+"', ")+("name: '"+t.name+"@"+t.creationContext+"')"):"ui-view (defunct)"}function i(t){return a.isNumber(t)?c[t]:c[c[t]]}var o=r(5),a=r(4),s=r(9),u=function(t){return"[ViewConfig#"+t.$id+" from '"+(t.viewDecl.$context.name||"(root)")+"' state]: target ui-view: '"+t.viewDecl.$uiViewName+"@"+t.viewDecl.$uiViewContextAnchor+"'"};!function(t){t[t.RESOLVE=0]="RESOLVE",t[t.TRANSITION=1]="TRANSITION",t[t.HOOK=2]="HOOK",t[t.UIVIEW=3]="UIVIEW",t[t.VIEWCONFIG=4]="VIEWCONFIG"}(e.Category||(e.Category={}));var c=e.Category,f=function(){function t(){this._enabled={},this.approximateDigests=0}return t.prototype._set=function(t,e){var r=this;e.length||(e=Object.keys(c).map(function(t){return parseInt(t,10)}).filter(function(t){return!isNaN(t)}).map(function(t){return c[t]})),e.map(i).forEach(function(e){return r._enabled[e]=t})},t.prototype.enable=function(){for(var t=[],e=0;e<arguments.length;e++)t[e-0]=arguments[e];this._set(!0,t)},t.prototype.disable=function(){for(var t=[],e=0;e<arguments.length;e++)t[e-0]=arguments[e];this._set(!1,t)},t.prototype.enabled=function(t){return!!this._enabled[i(t)]},t.prototype.traceTransitionStart=function(t){if(this.enabled(c.TRANSITION)){var e=t.$id,r=this.approximateDigests,n=s.stringify(t);console.log("Transition #"+e+" Digest #"+r+": Started -> "+n)}},t.prototype.traceTransitionIgnored=function(t){if(this.enabled(c.TRANSITION)){var e=t&&t.$id,r=this.approximateDigests,n=s.stringify(t);console.log("Transition #"+e+" Digest #"+r+": Ignored <> "+n)}},t.prototype.traceHookInvocation=function(t,e){if(this.enabled(c.HOOK)){var r=o.parse("transition.$id")(e),n=this.approximateDigests,i=o.parse("traceData.hookType")(e)||"internal",a=o.parse("traceData.context.state.name")(e)||o.parse("traceData.context")(e)||"unknown",u=s.functionToString(t.eventHook.callback);console.log("Transition #"+r+" Digest #"+n+": Hook -> "+i+" context: "+a+", "+s.maxLength(200,u))}},t.prototype.traceHookResult=function(t,e){if(this.enabled(c.HOOK)){var r=o.parse("transition.$id")(e),n=this.approximateDigests,i=s.stringify(t);console.log("Transition #"+r+" Digest #"+n+": <- Hook returned: "+s.maxLength(200,i))}},t.prototype.traceResolvePath=function(t,e,r){if(this.enabled(c.RESOLVE)){var n=r&&r.$id,i=this.approximateDigests,o=t&&t.toString();console.log("Transition #"+n+" Digest #"+i+": Resolving "+o+" ("+e+")")}},t.prototype.traceResolvableResolved=function(t,e){if(this.enabled(c.RESOLVE)){var r=e&&e.$id,n=this.approximateDigests,i=t&&t.toString(),o=s.stringify(t.data);console.log("Transition #"+r+" Digest #"+n+": <- Resolved "+i+" to: "+s.maxLength(200,o))}},t.prototype.traceError=function(t,e){if(this.enabled(c.TRANSITION)){var r=e&&e.$id,n=this.approximateDigests,i=s.stringify(e);console.log("Transition #"+r+" Digest #"+n+": <- Rejected "+i+", reason: "+t)}},t.prototype.traceSuccess=function(t,e){if(this.enabled(c.TRANSITION)){var r=e&&e.$id,n=this.approximateDigests,i=t.name,o=s.stringify(e);console.log("Transition #"+r+" Digest #"+n+": <- Success "+o+", final state: "+i)}},t.prototype.traceUIViewEvent=function(t,e,r){void 0===r&&(r=""),this.enabled(c.UIVIEW)&&console.log("ui-view: "+s.padString(30,t)+" "+n(e)+r)},t.prototype.traceUIViewConfigUpdated=function(t,e){this.enabled(c.UIVIEW)&&this.traceUIViewEvent("Updating",t," with ViewConfig from context='"+e+"'")},t.prototype.traceUIViewFill=function(t,e){this.enabled(c.UIVIEW)&&this.traceUIViewEvent("Fill",t," with: "+s.maxLength(200,e))},t.prototype.traceViewServiceEvent=function(t,e){this.enabled(c.VIEWCONFIG)&&console.log("VIEWCONFIG: "+t+" "+u(e))},t.prototype.traceViewServiceUIViewEvent=function(t,e){this.enabled(c.VIEWCONFIG)&&console.log("VIEWCONFIG: "+t+" "+n(e))},t}();e.Trace=f;var l=new f;e.trace=l},function(t,e,r){"use strict";var n=r(3),i=r(9),o=r(4),a=r(5),s=r(12),u=r(6),c=r(10),f=r(14),l={async:!0,rejectIfSuperseded:!0,current:n.noop,transition:null,traceData:{},bind:null},p=function(){function t(t,e,r,i){var o=this;this.transition=t,this.stateContext=e,this.eventHook=r,this.options=i,this.isSuperseded=function(){return o.options.current()!==o.options.transition},this.options=n.defaults(i,l)}return t.prototype.invokeHook=function(){var t=this,e=t.options,r=t.eventHook;if(s.trace.traceHookInvocation(this,e),e.rejectIfSuperseded&&this.isSuperseded())return c.Rejection.superseded(e.current()).toPromise();var n=r._deregistered?void 0:r.callback.call(e.bind,this.transition,this.stateContext);return this.handleHookResult(n)},t.prototype.handleHookResult=function(t){if(this.isSuperseded())return c.Rejection.superseded(this.options.current()).toPromise();if(o.isPromise(t))return t.then(this.handleHookResult.bind(this));if(s.trace.traceHookResult(t,this.options),t===!1)return c.Rejection.aborted("Hook aborted transition").toPromise();var e=a.is(f.TargetState);return e(t)?c.Rejection.redirected(t).toPromise():void 0},t.prototype.toString=function(){var t=this,e=t.options,r=t.eventHook,n=a.parse("traceData.hookType")(e)||"internal",o=a.parse("traceData.context.state.name")(e)||a.parse("traceData.context")(e)||"unknown",s=i.fnToString(r.callback);return n+" context: "+o+", "+i.maxLength(200,s)},t.runSynchronousHooks=function(t,e){void 0===e&&(e=!1);for(var r=[],n=0;n<t.length;n++){var i=t[n];try{r.push(i.invokeHook())}catch(s){if(!e)return c.Rejection.errored(s).toPromise();var f=i.transition.router.stateService.defaultErrorHandler();f(s)}}var l=r.filter(c.Rejection.isTransitionRejectionPromise);return l.length?l[0]:r.filter(o.isPromise).reduce(function(t,e){return t.then(a.val(e))},u.services.$q.when())},t}();e.TransitionHook=p},function(t,e,r){"use strict";var n=r(3),i=function(){function t(t,e,r,n){void 0===r&&(r={}),void 0===n&&(n={}),this._identifier=t,this._definition=e,this._options=n,this._params=r||{}}return t.prototype.name=function(){return this._definition&&this._definition.name||this._identifier},t.prototype.identifier=function(){return this._identifier},t.prototype.params=function(){return this._params},t.prototype.$state=function(){return this._definition},t.prototype.state=function(){return this._definition&&this._definition.self},t.prototype.options=function(){return this._options},t.prototype.exists=function(){return!(!this._definition||!this._definition.self)},t.prototype.valid=function(){return!this.error()},t.prototype.error=function(){var t=this.options().relative;if(!this._definition&&t){var e=t.name?t.name:t;return"Could not resolve '"+this.name()+"' from state '"+e+"'"}return this._definition?this._definition.self?void 0:"State '"+this.name()+"' has an invalid definition":"No such state '"+this.name()+"'"},t.prototype.toString=function(){return"'"+this.name()+"'"+n.toJson(this.params())},t}();e.TargetState=i},function(t,e,r){"use strict";function n(t,e){function r(t){for(var e=n,r=0;r<e.length;r++){var i=s.Glob.fromString(e[r]);if(i&&i.matches(t.name)||!i&&e[r]===t.name)return!0}return!1}var n=a.isString(e)?[e]:e,i=a.isFunction(n)?n:r;return!!i(t)}function i(t,e){return function(r,n,i){void 0===i&&(i={});var a=new u(r,n,i);return t[e].push(a),function(){a._deregistered=!0,o.removeFrom(t[e])(a)}}}var o=r(3),a=r(4),s=r(7);e.matchState=n;var u=function(){function t(t,e,r){void 0===r&&(r={}),this.callback=e,this.matchCriteria=o.extend({to:!0,from:!0,exiting:!0,retained:!0,entering:!0},t),this.priority=r.priority||0,this.bind=r.bind||null,this._deregistered=!1}return t._matchingNodes=function(t,e){if(e===!0)return t;var r=t.filter(function(t){return n(t.state,e)});return r.length?r:null},t.prototype.matches=function(e){var r=this.matchCriteria,n=t._matchingNodes,i={to:n([o.tail(e.to)],r.to),from:n([o.tail(e.from)],r.from),exiting:n(e.exiting,r.exiting),retained:n(e.retained,r.retained),entering:n(e.entering,r.entering)},a=["to","from","exiting","retained","entering"].map(function(t){return i[t]}).reduce(o.allTrueR,!0);return a?i:null},t}();e.EventHook=u;var c=function(){function t(){var t=this;this._transitionEvents={onBefore:[],onStart:[],onEnter:[],onRetain:[],onExit:[],onFinish:[],onSuccess:[],onError:[]},this.getHooks=function(e){return t._transitionEvents[e]},this.onBefore=i(this._transitionEvents,"onBefore"),this.onStart=i(this._transitionEvents,"onStart"),this.onEnter=i(this._transitionEvents,"onEnter"),this.onRetain=i(this._transitionEvents,"onRetain"),this.onExit=i(this._transitionEvents,"onExit"),this.onFinish=i(this._transitionEvents,"onFinish"),this.onSuccess=i(this._transitionEvents,"onSuccess"),this.onError=i(this._transitionEvents,"onError")}return t.mixin=function(t,e){Object.keys(t._transitionEvents).concat(["getHooks"]).forEach(function(r){return e[r]=t[r]})},t}();e.HookRegistry=c},function(t,e,r){"use strict";function n(t){return void 0===t&&(t=!1),function(e,r){var n=t?-1:1,i=(e.node.state.path.length-r.node.state.path.length)*n;return 0!==i?i:r.hook.priority-e.hook.priority}}var i=r(3),o=r(4),a=r(13),s=r(17),u=function(){function t(t,e,r){var o=this;this.$transitions=t,this.transition=e,this.baseHookOptions=r,this.getOnBeforeHooks=function(){return o._buildNodeHooks("onBefore","to",n(),{async:!1})},this.getOnStartHooks=function(){return o._buildNodeHooks("onStart","to",n())},this.getOnExitHooks=function(){return o._buildNodeHooks("onExit","exiting",n(!0),{stateHook:!0})},this.getOnRetainHooks=function(){return o._buildNodeHooks("onRetain","retained",n(!1),{stateHook:!0})},this.getOnEnterHooks=function(){return o._buildNodeHooks("onEnter","entering",n(!1),{stateHook:!0})},this.getOnFinishHooks=function(){return o._buildNodeHooks("onFinish","to",n())},this.getOnSuccessHooks=function(){return o._buildNodeHooks("onSuccess","to",n(),{async:!1,rejectIfSuperseded:!1})},this.getOnErrorHooks=function(){return o._buildNodeHooks("onError","to",n(),{async:!1,rejectIfSuperseded:!1})},this.treeChanges=e.treeChanges(),this.toState=i.tail(this.treeChanges.to).state,this.fromState=i.tail(this.treeChanges.from).state,this.transitionOptions=e.options()}return t.prototype.asyncHooks=function(){var t=this.getOnStartHooks(),e=this.getOnExitHooks(),r=this.getOnRetainHooks(),n=this.getOnEnterHooks(),o=this.getOnFinishHooks(),a=[t,e,r,n,o];return a.reduce(i.unnestR,[]).filter(i.identity)},t.prototype._buildNodeHooks=function(t,e,r,n){var o=this,u=this._matchingHooks(t,this.treeChanges);if(!u)return[];var c=function(r){var u=r.matches(o.treeChanges),c=u[e],f="exiting"===e?o.treeChanges.from:o.treeChanges.to;new s.ResolveContext(f);return c.map(function(e){var s=i.extend({bind:r.bind,traceData:{hookType:t,context:e}},o.baseHookOptions,n),u=s.stateHook?e.state:null,c=new a.TransitionHook(o.transition,u,r,s);return{hook:r,node:e,transitionHook:c}})};return u.map(c).reduce(i.unnestR,[]).sort(r).map(function(t){return t.transitionHook})},t.prototype._matchingHooks=function(t,e){return[this.transition,this.$transitions].map(function(e){return e.getHooks(t)}).filter(i.assertPredicate(o.isArray,"broken event named: "+t)).reduce(i.unnestR,[]).filter(function(t){return t.matches(e)})},t}();e.HookBuilder=u},function(t,e,r){"use strict";var n=r(3),i=r(5),o=r(12),a=r(6),s=r(18),u=r(19),c=r(20),f=r(9),l=s.resolvePolicies.when,p=[l.EAGER,l.LAZY],h=[l.EAGER];e.NATIVE_INJECTOR_TOKEN="Native Injector";var v=function(){function t(t){this._path=t}return t.prototype.getTokens=function(){return this._path.reduce(function(t,e){return t.concat(e.resolvables.map(function(t){return t.token}))},[]).reduce(n.uniqR,[])},t.prototype.getResolvable=function(t){var e=this._path.map(function(t){return t.resolvables}).reduce(n.unnestR,[]).filter(function(e){return e.token===t});return n.tail(e)},t.prototype.subContext=function(e){return new t(c.PathFactory.subPath(this._path,function(t){return t.state===e}))},t.prototype.addResolvables=function(t,e){var r=n.find(this._path,i.propEq("state",e)),o=t.map(function(t){return t.token});r.resolvables=r.resolvables.filter(function(t){return o.indexOf(t.token)===-1}).concat(t)},t.prototype.resolvePath=function(t,e){var r=this;void 0===t&&(t="LAZY");var i=n.inArray(p,t)?t:"LAZY",u=i===s.resolvePolicies.when.EAGER?h:p;o.trace.traceResolvePath(this._path,t,e);var c=this._path.reduce(function(t,i){var o=function(t){return n.inArray(u,t.getPolicy(i.state).when)},a=i.resolvables.filter(o),s=r.subContext(i.state),c=function(t){return t.get(s,e).then(function(e){return{token:t.token,value:e}})};return t.concat(a.map(c))},[]);return a.services.$q.all(c)},t.prototype.injector=function(){
1776 1776 return this._injector||(this._injector=new d(this))},t.prototype.findNode=function(t){return n.find(this._path,function(e){return n.inArray(e.resolvables,t)})},t.prototype.getDependencies=function(t){var e=this,r=this.findNode(t),i=c.PathFactory.subPath(this._path,function(t){return t===r})||this._path,o=i.reduce(function(t,e){return t.concat(e.resolvables)},[]).filter(function(e){return e!==t}),a=function(t){var r=o.filter(function(e){return e.token===t});if(r.length)return n.tail(r);var i=e.injector().getNative(t);if(!i)throw new Error("Could not find Dependency Injection token: "+f.stringify(t));return new u.Resolvable(t,function(){return i},[],i)};return t.deps.map(a)},t}();e.ResolveContext=v;var d=function(){function t(t){this.context=t,this["native"]=this.get(e.NATIVE_INJECTOR_TOKEN)||a.services.$injector}return t.prototype.get=function(t){var e=this.context.getResolvable(t);if(e){if(!e.resolved)throw new Error("Resolvable async .get() not complete:"+f.stringify(e.token));return e.data}return this["native"]&&this["native"].get(t)},t.prototype.getAsync=function(t){var e=this.context.getResolvable(t);return e?e.get(this.context):a.services.$q.when(this["native"].get(t))},t.prototype.getNative=function(t){return this["native"].get(t)},t}()},function(t,e){"use strict";e.resolvePolicies={when:{LAZY:"LAZY",EAGER:"EAGER"},async:{WAIT:"WAIT",NOWAIT:"NOWAIT",RXWAIT:"RXWAIT"}}},function(t,e,r){"use strict";var n=r(3),i=r(6),o=r(12),a=r(9),s=r(4);e.defaultResolvePolicy={when:"LAZY",async:"WAIT"};var u=function(){function t(e,r,o,a,u){if(this.resolved=!1,this.promise=void 0,e instanceof t)n.extend(this,e);else if(s.isFunction(r)){if(null==e||void 0==e)throw new Error("new Resolvable(): token argument is required");if(!s.isFunction(r))throw new Error("new Resolvable(): resolveFn argument must be a function");this.token=e,this.policy=a,this.resolveFn=r,this.deps=o||[],this.data=u,this.resolved=void 0!==u,this.promise=this.resolved?i.services.$q.when(this.data):void 0}else if(s.isObject(e)&&e.token&&s.isFunction(e.resolveFn)){var c=e;return new t(c.token,c.resolveFn,c.deps,c.policy,c.data)}}return t.prototype.getPolicy=function(t){var r=this.policy||{},n=t&&t.resolvePolicy||{};return{when:r.when||n.when||e.defaultResolvePolicy.when,async:r.async||n.async||e.defaultResolvePolicy.async}},t.prototype.resolve=function(t,e){var r=this,a=i.services.$q,s=function(){return a.all(t.getDependencies(r).map(function(r){return r.get(t,e)}))},u=function(t){return r.resolveFn.apply(null,t)},c=function(t){var e=t.cache(1);return e.take(1).toPromise().then(function(){return e})},f=t.findNode(this),l=f&&f.state,p="RXWAIT"===this.getPolicy(l).async?c:n.identity,h=function(t){return r.data=t,r.resolved=!0,o.trace.traceResolvableResolved(r,e),r.data};return this.promise=a.when().then(s).then(u).then(p).then(h)},t.prototype.get=function(t,e){return this.promise||this.resolve(t,e)},t.prototype.toString=function(){return"Resolvable(token: "+a.stringify(this.token)+", requires: ["+this.deps.map(a.stringify)+"])"},t.prototype.clone=function(){return new t(this)},t.fromData=function(e,r){return new t(e,function(){return r},null,null,r)},t}();e.Resolvable=u},function(t,e,r){"use strict";var n=r(3),i=r(5),o=r(14),a=r(21),s=function(){function t(){}return t.makeTargetState=function(t){var e=n.tail(t).state;return new o.TargetState(e,e,t.map(i.prop("paramValues")).reduce(n.mergeR,{}))},t.buildPath=function(t){var e=t.params();return t.$state().path.map(function(t){return new a.PathNode(t).applyRawParams(e)})},t.buildToPath=function(e,r){var n=t.buildPath(r);return r.options().inherit?t.inheritParams(e,n,Object.keys(r.params())):n},t.applyViewConfigs=function(e,r,i){r.filter(function(t){return n.inArray(i,t.state)}).forEach(function(i){var o=n.values(i.state.views||{}),a=t.subPath(r,function(t){return t===i}),s=o.map(function(t){return e.createViewConfig(a,t)});i.views=s.reduce(n.unnestR,[])})},t.inheritParams=function(t,e,r){function o(t,e){var r=n.find(t,i.propEq("state",e));return n.extend({},r&&r.paramValues)}function s(e){var i=n.extend({},e&&e.paramValues),s=n.pick(i,r);i=n.omit(i,r);var u=o(t,e.state)||{},c=n.extend(i,u,s);return new a.PathNode(e.state).applyRawParams(c)}return void 0===r&&(r=[]),e.map(s)},t.treeChanges=function(t,e,r){function n(t,r){var n=a.PathNode.clone(t);return n.paramValues=e[r].paramValues,n}for(var o=0,s=Math.min(t.length,e.length),u=function(t){return t.parameters({inherit:!1}).filter(i.not(i.prop("dynamic"))).map(i.prop("id"))},c=function(t,e){return t.equals(e,u(t.state))};o<s&&t[o].state!==r&&c(t[o],e[o]);)o++;var f,l,p,h,v;f=t,l=f.slice(0,o),p=f.slice(o);var d=l.map(n);return h=e.slice(o),v=d.concat(h),{from:f,to:v,retained:l,exiting:p,entering:h}},t.subPath=function(t,e){var r=n.find(t,e),i=t.indexOf(r);return i===-1?void 0:t.slice(0,i+1)},t.paramValues=function(t){return t.reduce(function(t,e){return n.extend(t,e.paramValues)},{})},t}();e.PathFactory=s},function(t,e,r){"use strict";var n=r(3),i=r(5),o=r(22),a=function(){function t(e){if(e instanceof t){var r=e;this.state=r.state,this.paramSchema=r.paramSchema.slice(),this.paramValues=n.extend({},r.paramValues),this.resolvables=r.resolvables.slice(),this.views=r.views&&r.views.slice()}else{var i=e;this.state=i,this.paramSchema=i.parameters({inherit:!1}),this.paramValues={},this.resolvables=i.resolvables.map(function(t){return t.clone()})}}return t.prototype.applyRawParams=function(t){var e=function(e){return[e.id,e.value(t[e.id])]};return this.paramValues=this.paramSchema.reduce(function(t,r){return n.applyPairs(t,e(r))},{}),this},t.prototype.parameter=function(t){return n.find(this.paramSchema,i.propEq("id",t))},t.prototype.equals=function(t,e){var r=this;void 0===e&&(e=this.paramSchema.map(function(t){return t.id}));var i=function(e){return r.parameter(e).type.equals(r.paramValues[e],t.paramValues[e])};return this.state===t.state&&e.map(i).reduce(n.allTrueR,!0)},t.clone=function(e){return new t(e)},t.matching=function(t,e,r){void 0===r&&(r=!0);for(var n=[],i=0;i<t.length&&i<e.length;i++){var a=t[i],s=e[i];if(a.state!==s.state)break;var u=o.Param.changed(a.paramSchema,a.paramValues,s.paramValues).filter(function(t){return!(r&&t.dynamic)});if(u.length)break;n.push(a)}return n},t}();e.PathNode=a},function(t,e,r){"use strict";function n(t){return t=v(t)&&{value:t}||t,s.extend(t,{$$fn:c.isInjectable(t.value)?t.value:function(){return t.value}})}function i(t,e,r,n,i){if(t.type&&e&&"string"!==e.name)throw new Error("Param '"+n+"' has two type configurations.");return t.type&&e&&"string"===e.name&&i.type(t.type)?i.type(t.type):e?e:t.type?t.type instanceof p.ParamType?t.type:i.type(t.type):r===d.CONFIG?i.type("any"):i.type("string")}function o(t,e){var r=t.squash;if(!e||r===!1)return!1;if(!c.isDefined(r)||null==r)return l.matcherConfig.defaultSquashPolicy();if(r===!0||c.isString(r))return r;throw new Error("Invalid squash policy: '"+r+"'. Valid policies: false, true, or arbitrary string")}function a(t,e,r,n){var i,o,a=[{from:"",to:r||e?void 0:""},{from:null,to:r||e?void 0:""}];return i=c.isArray(t.replace)?t.replace:[],c.isString(n)&&i.push({from:n,to:void 0}),o=s.map(i,u.prop("from")),s.filter(a,function(t){return o.indexOf(t.from)===-1}).concat(i)}var s=r(3),u=r(5),c=r(4),f=r(6),l=r(23),p=r(24),h=Object.prototype.hasOwnProperty,v=function(t){return 0===["value","type","squash","array","dynamic"].filter(h.bind(t||{})).length};!function(t){t[t.PATH=0]="PATH",t[t.SEARCH=1]="SEARCH",t[t.CONFIG=2]="CONFIG"}(e.DefType||(e.DefType={}));var d=e.DefType,m=function(){function t(t,e,r,u,f){function l(){var e={array:u===d.SEARCH&&"auto"},n=t.match(/\[\]$/)?{array:!0}:{};return s.extend(e,n,r).array}r=n(r),e=i(r,e,u,t,f);var p=l();e=p?e.$asArray(p,u===d.SEARCH):e;var h=void 0!==r.value,v=c.isDefined(r.dynamic)?!!r.dynamic:!!e.dynamic,m=o(r,h),g=a(r,p,h,m);s.extend(this,{id:t,type:e,location:u,squash:m,replace:g,isOptional:h,dynamic:v,config:r,array:p})}return t.prototype.isDefaultValue=function(t){return this.isOptional&&this.type.equals(this.value(),t)},t.prototype.value=function(t){var e=this,r=function(){if(!f.services.$injector)throw new Error("Injectable functions cannot be called at configuration time");var t=f.services.$injector.invoke(e.config.$$fn);if(null!==t&&void 0!==t&&!e.type.is(t))throw new Error("Default value ("+t+") for parameter '"+e.id+"' is not an instance of ParamType ("+e.type.name+")");return t},n=function(t){var r=s.map(s.filter(e.replace,u.propEq("from",t)),u.prop("to"));return r.length?r[0]:t};return t=n(t),c.isDefined(t)?this.type.$normalize(t):r()},t.prototype.isSearch=function(){return this.location===d.SEARCH},t.prototype.validates=function(t){if((!c.isDefined(t)||null===t)&&this.isOptional)return!0;var e=this.type.$normalize(t);if(!this.type.is(e))return!1;var r=this.type.encode(e);return!(c.isString(r)&&!this.type.pattern.exec(r))},t.prototype.toString=function(){return"{Param:"+this.id+" "+this.type+" squash: '"+this.squash+"' optional: "+this.isOptional+"}"},t.fromConfig=function(e,r,n,i){return new t(e,r,n,d.CONFIG,i)},t.fromPath=function(e,r,n,i){return new t(e,r,n,d.PATH,i)},t.fromSearch=function(e,r,n,i){return new t(e,r,n,d.SEARCH,i)},t.values=function(t,e){return void 0===e&&(e={}),t.map(function(t){return[t.id,t.value(e[t.id])]}).reduce(s.applyPairs,{})},t.changed=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r={}),t.filter(function(t){return!t.type.equals(e[t.id],r[t.id])})},t.equals=function(e,r,n){return void 0===r&&(r={}),void 0===n&&(n={}),0===t.changed(e,r,n).length},t.validates=function(t,e){return void 0===e&&(e={}),t.map(function(t){return t.validates(e[t.id])}).reduce(s.allTrueR,!0)},t}();e.Param=m},function(t,e,r){"use strict";var n=r(4),i=function(){function t(){this._isCaseInsensitive=!1,this._isStrictMode=!0,this._defaultSquashPolicy=!1}return t.prototype.caseInsensitive=function(t){return this._isCaseInsensitive=n.isDefined(t)?t:this._isCaseInsensitive},t.prototype.strictMode=function(t){return this._isStrictMode=n.isDefined(t)?t:this._isStrictMode},t.prototype.defaultSquashPolicy=function(t){if(n.isDefined(t)&&t!==!0&&t!==!1&&!n.isString(t))throw new Error("Invalid squash policy: "+t+". Valid policies: false, true, arbitrary-string");return this._defaultSquashPolicy=n.isDefined(t)?t:this._defaultSquashPolicy},t}();e.MatcherConfig=i,e.matcherConfig=new i},function(t,e,r){"use strict";function n(t,e){function r(t){return o.isArray(t)?t:o.isDefined(t)?[t]:[]}function n(t){switch(t.length){case 0:return;case 1:return"auto"===e?t[0]:t;default:return t}}function a(t,e){return function(a){if(o.isArray(a)&&0===a.length)return a;var s=r(a),u=i.map(s,t);return e===!0?0===i.filter(u,function(t){return!t}).length:n(u)}}function s(t){return function(e,n){var i=r(e),o=r(n);if(i.length!==o.length)return!1;for(var a=0;a<i.length;a++)if(!t(i[a],o[a]))return!1;return!0}}var u=this;["encode","decode","equals","$normalize"].forEach(function(e){var r=t[e].bind(t),n="equals"===e?s:a;u[e]=n(r)}),i.extend(this,{dynamic:t.dynamic,name:t.name,pattern:t.pattern,is:a(t.is.bind(t),!0),$arrayMode:e})}var i=r(3),o=r(4),a=function(){function t(t){this.pattern=/.*/,i.extend(this,t)}return t.prototype.is=function(t,e){return!0},t.prototype.encode=function(t,e){return t},t.prototype.decode=function(t,e){return t},t.prototype.equals=function(t,e){return t==e},t.prototype.$subPattern=function(){var t=this.pattern.toString();return t.substr(1,t.length-2)},t.prototype.toString=function(){return"{ParamType:"+this.name+"}"},t.prototype.$normalize=function(t){return this.is(t)?t:this.decode(t)},t.prototype.$asArray=function(t,e){if(!t)return this;if("auto"===t&&!e)throw new Error("'auto' array mode is for query parameters only");return new n(this,t)},t}();e.ParamType=a},function(t,e,r){"use strict";var n=r(26),i=r(29),o=r(29),a=r(30),s=r(37),u=r(38),c=r(43),f=r(44),l=function(){function t(){this.viewService=new s.ViewService,this.transitionService=new a.TransitionService(this),this.globals=new f.Globals(this.transitionService),this.urlMatcherFactory=new n.UrlMatcherFactory,this.urlRouterProvider=new i.UrlRouterProvider(this.urlMatcherFactory,this.globals.params),this.urlRouter=new o.UrlRouter(this.urlRouterProvider),this.stateRegistry=new u.StateRegistry(this.urlMatcherFactory,this.urlRouterProvider),this.stateService=new c.StateService(this),this.viewService.rootContext(this.stateRegistry.root()),this.globals.$current=this.stateRegistry.root(),this.globals.current=this.globals.$current.self}return t}();e.UIRouter=l},function(t,e,r){"use strict";function n(){return{strict:s.matcherConfig.strictMode(),caseInsensitive:s.matcherConfig.caseInsensitive()}}var i=r(3),o=r(4),a=r(27),s=r(23),u=r(22),c=r(28),f=function(){function t(){this.paramTypes=new c.ParamTypes,i.extend(this,{UrlMatcher:a.UrlMatcher,Param:u.Param})}return t.prototype.caseInsensitive=function(t){return s.matcherConfig.caseInsensitive(t)},t.prototype.strictMode=function(t){return s.matcherConfig.strictMode(t)},t.prototype.defaultSquashPolicy=function(t){return s.matcherConfig.defaultSquashPolicy(t)},t.prototype.compile=function(t,e){return new a.UrlMatcher(t,this.paramTypes,i.extend(n(),e))},t.prototype.isMatcher=function(t){if(!o.isObject(t))return!1;var e=!0;return i.forEach(a.UrlMatcher.prototype,function(r,n){o.isFunction(r)&&(e=e&&o.isDefined(t[n])&&o.isFunction(t[n]))}),e},t.prototype.type=function(t,e,r){var n=this.paramTypes.type(t,e,r);return o.isDefined(e)?this:n},t.prototype.$get=function(){return this.paramTypes.enqueue=!1,this.paramTypes._flushTypeQueue(),this},t}();e.UrlMatcherFactory=f},function(t,e,r){"use strict";function n(t,e){var r=["",""],n=t.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!e)return n;switch(e.squash){case!1:r=["(",")"+(e.isOptional?"?":"")];break;case!0:n=n.replace(/\/$/,""),r=["(?:/(",")|/)?"];break;default:r=["("+e.squash+"|",")?"]}return n+r[0]+e.type.pattern.source+r[1]}var i=r(3),o=r(5),a=r(4),s=r(22),u=r(4),c=r(22),f=r(3),l=r(3),p=function(t,e,r){return t[e]=t[e]||r()},h=function(){function t(e,r,a){var u=this;this.config=a,this._cache={path:[],pattern:null},this._children=[],this._params=[],this._segments=[],this._compiled=[],this.pattern=e,this.config=i.defaults(this.config,{params:{},strict:!0,caseInsensitive:!1,paramMap:i.identity});for(var c,f,l,p=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,h=/([:]?)([\w\[\].-]+)|\{([\w\[\].-]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,v=0,d=[],m=function(r){if(!t.nameValidator.test(r))throw new Error("Invalid parameter name '"+r+"' in pattern '"+e+"'");if(i.find(u._params,o.propEq("id",r)))throw new Error("Duplicate parameter name '"+r+"' in pattern '"+e+"'")},g=function(t,n){var o=t[2]||t[3],a=n?t[4]:t[4]||("*"===t[1]?".*":null);return{id:o,regexp:a,cfg:u.config.params[o],segment:e.substring(v,t.index),type:a?r.type(a||"string")||i.inherit(r.type("string"),{pattern:new RegExp(a,u.config.caseInsensitive?"i":void 0)}):null}};(c=p.exec(e))&&(f=g(c,!1),!(f.segment.indexOf("?")>=0));)m(f.id),this._params.push(s.Param.fromPath(f.id,f.type,this.config.paramMap(f.cfg,!1),r)),this._segments.push(f.segment),d.push([f.segment,i.tail(this._params)]),v=p.lastIndex;l=e.substring(v);var y=l.indexOf("?");if(y>=0){var w=l.substring(y);if(l=l.substring(0,y),w.length>0)for(v=0;c=h.exec(w);)f=g(c,!0),m(f.id),this._params.push(s.Param.fromSearch(f.id,f.type,this.config.paramMap(f.cfg,!0),r)),v=p.lastIndex}this._segments.push(l),i.extend(this,{_compiled:d.map(function(t){return n.apply(null,t)}).concat(n(l)),prefix:this._segments[0]}),Object.freeze(this)}return t.prototype.append=function(t){return this._children.push(t),i.forEach(t._cache,function(e,r){return t._cache[r]=a.isArray(e)?[]:null}),t._cache.path=this._cache.path.concat(this),t},t.prototype.isRoot=function(){return 0===this._cache.path.length},t.prototype.toString=function(){return this.pattern},t.prototype.exec=function(t,e,r,n){function a(t){var e=function(t){return t.split("").reverse().join("")},r=function(t){return t.replace(/\\-/g,"-")},n=e(t).split(/-(?!\\)/),o=i.map(n,e);return i.map(o,r).reverse()}var s=this;void 0===e&&(e={}),void 0===n&&(n={});var c=p(this._cache,"pattern",function(){return new RegExp(["^",i.unnest(s._cache.path.concat(s).map(o.prop("_compiled"))).join(""),s.config.strict===!1?"/?":"","$"].join(""),s.config.caseInsensitive?"i":void 0)}).exec(t);if(!c)return null;var f=this.parameters(),l=f.filter(function(t){return!t.isSearch()}),h=f.filter(function(t){return t.isSearch()}),v=this._cache.path.concat(this).map(function(t){return t._segments.length-1}).reduce(function(t,e){return t+e}),d={};if(v!==c.length-1)throw new Error("Unbalanced capture group in route '"+this.pattern+"'");for(var m=0;m<v;m++){for(var g=l[m],y=c[m+1],w=0;w<g.replace.length;w++)g.replace[w].from===y&&(y=g.replace[w].to);y&&g.array===!0&&(y=a(y)),u.isDefined(y)&&(y=g.type.decode(y)),d[g.id]=g.value(y)}return h.forEach(function(t){for(var r=e[t.id],n=0;n<t.replace.length;n++)t.replace[n].from===r&&(r=t.replace[n].to);u.isDefined(r)&&(r=t.type.decode(r)),d[t.id]=t.value(r)}),r&&(d["#"]=r),d},t.prototype.parameters=function(t){return void 0===t&&(t={}),t.inherit===!1?this._params:i.unnest(this._cache.path.concat(this).map(o.prop("_params")))},t.prototype.parameter=function(t,e){void 0===e&&(e={});var r=i.tail(this._cache.path);return i.find(this._params,o.propEq("id",t))||e.inherit!==!1&&r&&r.parameter(t)||null},t.prototype.validates=function(t){var e=this,r=function(t,e){return!t||t.validates(e)};return i.pairs(t||{}).map(function(t){var n=t[0],i=t[1];return r(e.parameter(n),i)}).reduce(i.allTrueR,!0)},t.prototype.format=function(e){function r(t){var r=t.value(e[t.id]),n=t.isDefaultValue(r),i=!!n&&t.squash,o=t.type.encode(r);return{param:t,value:r,isDefaultValue:n,squash:i,encoded:o}}if(void 0===e&&(e={}),!this.validates(e))return null;var n=this._cache.path.slice().concat(this),o=n.map(t.pathSegmentsAndParams).reduce(f.unnestR,[]),s=n.map(t.queryParams).reduce(f.unnestR,[]),u=o.reduce(function(e,n){if(a.isString(n))return e+n;var o=r(n),s=o.squash,u=o.encoded,c=o.param;return s===!0?e.match(/\/$/)?e.slice(0,-1):e:a.isString(s)?e+s:s!==!1?e:null==u?e:a.isArray(u)?e+i.map(u,t.encodeDashes).join("-"):c.type.raw?e+u:e+encodeURIComponent(u)},""),c=s.map(function(t){var e=r(t),n=e.squash,o=e.encoded,s=e.isDefaultValue;if(!(null==o||s&&n!==!1)&&(a.isArray(o)||(o=[o]),0!==o.length))return t.type.raw||(o=i.map(o,encodeURIComponent)),o.map(function(e){return t.id+"="+e})}).filter(i.identity).reduce(f.unnestR,[]).join("&");return u+(c?"?"+c:"")+(e["#"]?"#"+e["#"]:"")},t.encodeDashes=function(t){return encodeURIComponent(t).replace(/-/g,function(t){return"%5C%"+t.charCodeAt(0).toString(16).toUpperCase()})},t.pathSegmentsAndParams=function(t){var e=t._segments,r=t._params.filter(function(t){return t.location===c.DefType.PATH});return l.arrayTuples(e,r.concat(void 0)).reduce(f.unnestR,[]).filter(function(t){return""!==t&&u.isDefined(t)})},t.queryParams=function(t){return t._params.filter(function(t){return t.location===c.DefType.SEARCH})},t.nameValidator=/^\w+([-.]+\w+)*(?:\[\])?$/,t}();e.UrlMatcher=h},function(t,e,r){"use strict";function n(t){return null!=t?t.toString().replace(/(~|\/)/g,function(t){return{"~":"~~","/":"~2F"}[t]}):t}function i(t){return null!=t?t.toString().replace(/(~~|~2F)/g,function(t){return{"~~":"~","~2F":"/"}[t]}):t}var o=r(3),a=r(4),s=r(5),u=r(6),c=r(24),f=function(){function t(){this.enqueue=!0,this.typeQueue=[],this.defaultTypes={hash:{encode:n,decode:i,is:s.is(String),pattern:/.*/,equals:function(t,e){return t==e}},string:{encode:n,decode:i,is:s.is(String),pattern:/[^\/]*/},"int":{encode:n,decode:function(t){return parseInt(t,10)},is:function(t){return a.isDefined(t)&&this.decode(t.toString())===t},pattern:/-?\d+/},bool:{encode:function(t){return t&&1||0},decode:function(t){return 0!==parseInt(t,10)},is:s.is(Boolean),pattern:/0|1/},date:{encode:function(t){return this.is(t)?[t.getFullYear(),("0"+(t.getMonth()+1)).slice(-2),("0"+t.getDate()).slice(-2)].join("-"):void 0},decode:function(t){if(this.is(t))return t;var e=this.capture.exec(t);return e?new Date(e[1],e[2]-1,e[3]):void 0},is:function(t){return t instanceof Date&&!isNaN(t.valueOf())},equals:function(t,e){return["getFullYear","getMonth","getDate"].reduce(function(r,n){return r&&t[n]()===e[n]()},!0)},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:o.toJson,decode:o.fromJson,is:s.is(Object),equals:o.equals,pattern:/[^\/]*/},any:{encode:o.identity,decode:o.identity,equals:o.equals,pattern:/.*/}};var t=function(t,e){return new c.ParamType(o.extend({name:e},t))};this.types=o.inherit(o.map(this.defaultTypes,t),{})}return t.prototype.type=function(t,e,r){if(!a.isDefined(e))return this.types[t];if(this.types.hasOwnProperty(t))throw new Error("A type named '"+t+"' has already been defined.");return this.types[t]=new c.ParamType(o.extend({name:t},e)),r&&(this.typeQueue.push({name:t,def:r}),this.enqueue||this._flushTypeQueue()),this},t.prototype._flushTypeQueue=function(){for(;this.typeQueue.length;){var t=this.typeQueue.shift();if(t.pattern)throw new Error("You cannot override a type's .pattern at runtime.");o.extend(this.types[t.name],u.services.$injector.invoke(t.def))}},t}();e.ParamTypes=f},function(t,e,r){"use strict";function n(t){var e=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(t.source);return null!=e?e[1].replace(/\\(.)/g,"$1"):""}function i(t,e){return t.replace(/\$(\$|\d{1,2})/,function(t,r){return e["$"===r?0:Number(r)]})}function o(t,e,r,n){if(!n)return!1;var i=t.invoke(r,r,{$match:n,$stateParams:e});return!c.isDefined(i)||i}function a(t,e,r){var n=f.services.locationConfig.baseHref();return"/"===n?t:e?n.slice(0,-1)+t:r?n.slice(1)+t:t}function s(t,e,r){function n(t){var e=t(f.services.$injector,l);return!!e&&(c.isString(e)&&l.setUrl(e,!0),!0)}if(!r||!r.defaultPrevented){for(var i=t.length,o=0;o<i;o++)if(n(t[o]))return;e&&n(e)}}var u=r(3),c=r(4),f=r(6),l=f.services.location,p=function(){function t(t,e){this.rules=[],this.interceptDeferred=!1,this.$urlMatcherFactory=t,this.$stateParams=e}return t.prototype.rule=function(t){if(!c.isFunction(t))throw new Error("'rule' must be a function");return this.rules.push(t),this},t.prototype.removeRule=function(t){return this.rules.length!==u.removeFrom(this.rules,t).length},t.prototype.otherwise=function(t){if(!c.isFunction(t)&&!c.isString(t))throw new Error("'rule' must be a string or function");return this.otherwiseFn=c.isString(t)?function(){return t}:t,this},t.prototype.when=function(t,e,r){void 0===r&&(r=function(t){});var a,s=this,p=s.$urlMatcherFactory,h=s.$stateParams,v=c.isString(e);if(c.isString(t)&&(t=p.compile(t)),!v&&!c.isFunction(e)&&!c.isArray(e))throw new Error("invalid 'handler' in when()");var d={matcher:function(t,e){return v&&(a=p.compile(e),e=["$match",a.format.bind(a)]),u.extend(function(){return o(f.services.$injector,h,e,t.exec(l.path(),l.search(),l.hash()))},{prefix:c.isString(t.prefix)?t.prefix:""})},regex:function(t,e){if(t.global||t.sticky)throw new Error("when() RegExp must not be global or sticky");return v&&(a=e,e=["$match",function(t){return i(a,t)}]),u.extend(function(){return o(f.services.$injector,h,e,t.exec(l.path()))},{prefix:n(t)})}},m={matcher:p.isMatcher(t),regex:t instanceof RegExp};for(var g in m)if(m[g]){var y=d[g](t,e);return r(y),this.rule(y)}throw new Error("invalid 'what' in when()")},t.prototype.deferIntercept=function(t){void 0===t&&(t=!0),this.interceptDeferred=t},t}();e.UrlRouterProvider=p;var h=function(){function t(e){this.urlRouterProvider=e,u.bindFunctions(t.prototype,this,this)}return t.prototype.sync=function(){s(this.urlRouterProvider.rules,this.urlRouterProvider.otherwiseFn)},t.prototype.listen=function(){var t=this;return this.listener=this.listener||l.onChange(function(e){return s(t.urlRouterProvider.rules,t.urlRouterProvider.otherwiseFn,e)})},t.prototype.update=function(t){return t?void(this.location=l.path()):void(l.path()!==this.location&&l.setUrl(this.location,!0))},t.prototype.push=function(t,e,r){var n=r&&!!r.replace;l.setUrl(t.format(e||{}),n)},t.prototype.href=function(t,e,r){if(!t.validates(e))return null;var n=t.format(e);r=r||{absolute:!1};var i=f.services.locationConfig,o=i.html5Mode();if(o||null===n||(n="#"+i.hashPrefix()+n),n=a(n,o,r.absolute),!r.absolute||!n)return n;var s=!o&&n?"/":"",u=i.port();return u=80===u||443===u?"":":"+u,[i.protocol(),"://",i.host(),u,s,n].join("")},t}();e.UrlRouter=h},function(t,e,r){"use strict";var n=r(11),i=r(15),o=r(31),a=r(32),s=r(33),u=r(34),c=r(35),f=r(36);e.defaultTransOpts={location:!0,relative:null,inherit:!1,notify:!0,reload:!1,custom:{},current:function(){return null},source:"unknown"};var l=function(){function t(t){this._router=t,this.$view=t.viewService,i.HookRegistry.mixin(new i.HookRegistry,this),this._deregisterHookFns={},this.registerTransitionHooks()}return t.prototype.registerTransitionHooks=function(){var t=this._deregisterHookFns;t.redirectTo=u.registerRedirectToHook(this),t.onExit=c.registerOnExitHook(this),t.onRetain=c.registerOnRetainHook(this),t.onEnter=c.registerOnEnterHook(this),t.eagerResolve=o.registerEagerResolvePath(this),t.lazyResolve=o.registerLazyResolveState(this),t.loadViews=a.registerLoadEnteringViews(this),t.activateViews=a.registerActivateViews(this),t.updateUrl=s.registerUpdateUrl(this),t.lazyLoad=f.registerLazyLoadHook(this)},t.prototype.onBefore=function(t,e,r){throw""},t.prototype.onStart=function(t,e,r){throw""},t.prototype.onExit=function(t,e,r){throw""},t.prototype.onRetain=function(t,e,r){throw""},t.prototype.onEnter=function(t,e,r){throw""},t.prototype.onFinish=function(t,e,r){throw""},t.prototype.onSuccess=function(t,e,r){throw""},t.prototype.onError=function(t,e,r){throw""},t.prototype.create=function(t,e){return new n.Transition(t,e,this._router)},t}();e.TransitionService=l},function(t,e,r){"use strict";var n=r(3),i=r(17),o=r(5),a=function(t){return new i.ResolveContext(t.treeChanges().to).resolvePath("EAGER",t).then(n.noop)};e.registerEagerResolvePath=function(t){return t.onStart({},a,{priority:1e3})};var s=function(t,e){return new i.ResolveContext(t.treeChanges().to).subContext(e).resolvePath("LAZY",t).then(n.noop)};e.registerLazyResolveState=function(t){return t.onEnter({entering:o.val(!0)},s,{priority:1e3})}},function(t,e,r){"use strict";var n=r(3),i=r(6),o=function(t){var e=t.views("entering");if(e.length)return i.services.$q.all(e.map(function(t){return t.load()})).then(n.noop)};e.registerLoadEnteringViews=function(t){return t.onStart({},o)};var a=function(t){var e=t.views("entering"),r=t.views("exiting");if(e.length||r.length){var n=t.router.viewService;r.forEach(function(t){return n.deactivateViewConfig(t)}),e.forEach(function(t){return n.activateViewConfig(t)}),n.sync()}};e.registerActivateViews=function(t){return t.onSuccess({},a)}},function(t,e){"use strict";var r=function(t){var e=t.options(),r=t.router.stateService,n=t.router.urlRouter;if("url"!==e.source&&e.location&&r.$current.navigable){var i={replace:"replace"===e.location};n.push(r.$current.navigable.url,r.params,i)}n.update(!0)};e.registerUpdateUrl=function(t){return t.onSuccess({},r,{priority:9999})}},function(t,e,r){"use strict";var n=r(4),i=r(6),o=r(14),a=function(t){function e(e){var r=t.router.stateService;return e instanceof o.TargetState?e:n.isString(e)?r.target(e,t.params(),t.options()):e.state||e.params?r.target(e.state||t.to(),e.params||t.params(),t.options()):void 0}var r=t.to().redirectTo;if(r)return n.isFunction(r)?i.services.$q.when(r(t)).then(e):e(r)};e.registerRedirectToHook=function(t){return t.onStart({to:function(t){return!!t.redirectTo}},a)}},function(t,e){"use strict";function r(t){return function(e,r){var n=r[t];return n(e,r)}}var n=r("onExit");e.registerOnExitHook=function(t){return t.onExit({exiting:function(t){return!!t.onExit}},n)};var i=r("onRetain");e.registerOnRetainHook=function(t){return t.onRetain({retained:function(t){return!!t.onRetain}},i)};var o=r("onEnter");e.registerOnEnterHook=function(t){return t.onEnter({entering:function(t){return!!t.onEnter}},o)}},function(t,e,r){"use strict";var n=r(6),i=function(t){function e(){if("url"===t.options().source){var e=n.services.location,r=e.path(),i=e.search(),a=e.hash(),s=function(t){return[t,t.url&&t.url.exec(r,i,a)]},u=o.get().map(function(t){return t.$$state()}).map(s).filter(function(t){var e=(t[0],t[1]);return!!e});if(u.length){var c=u[0],f=c[0],l=c[1];return t.router.stateService.target(f,l,t.options())}t.router.urlRouter.sync()}var p=t.targetState();return t.router.stateService.target(p.identifier(),p.params(),p.options())}function r(e){o.deregister(t.$to()),e&&Array.isArray(e.states)&&e.states.forEach(function(t){return o.register(t)})}var i=t.to(),o=t.router.stateRegistry,a=i.lazyLoad,s=a._promise;if(!s){s=a._promise=a(t).then(r);var u=function(){return delete a._promise};s.then(u,u)}return s.then(e)};e.registerLazyLoadHook=function(t){return t.onBefore({to:function(t){return!!t.lazyLoad}},i)}},function(t,e,r){"use strict";var n=r(3),i=r(5),o=r(4),a=r(12),s=function(){function t(){var t=this;this.uiViews=[],this.viewConfigs=[],this._viewConfigFactories={},this.sync=function(){function e(t){return t.fqn.split(".").length}function r(t){for(var e=t.viewDecl.$context,r=0;++r&&e.parent;)e=e.parent;return r}var o=t.uiViews.map(function(t){return[t.fqn,t]}).reduce(n.applyPairs,{}),a=function(t){return function(e){if(t.$type!==e.viewDecl.$type)return!1;var r=e.viewDecl,i=r.$uiViewName.split("."),a=t.fqn.split(".");if(!n.equals(i,a.slice(0-i.length)))return!1;var s=1-i.length||void 0,u=a.slice(0,s).join("."),c=o[u].creationContext;return r.$uiViewContextAnchor===(c&&c.name)}},s=i.curry(function(t,e,r,n){return e*(t(r)-t(n))}),u=function(e){var n=t.viewConfigs.filter(a(e));return n.length>1&&n.sort(s(r,-1)),[e,n[0]]},c=function(e){var r=e[0],n=e[1];t.uiViews.indexOf(r)!==-1&&r.configUpdated(n)};t.uiViews.sort(s(e,1)).map(u).forEach(c)}}return t.prototype.rootContext=function(t){return this._rootContext=t||this._rootContext},t.prototype.viewConfigFactory=function(t,e){this._viewConfigFactories[t]=e},t.prototype.createViewConfig=function(t,e){var r=this._viewConfigFactories[e.$type];if(!r)throw new Error("ViewService: No view config factory registered for type "+e.$type);var n=r(t,e);return o.isArray(n)?n:[n]},t.prototype.deactivateViewConfig=function(t){a.trace.traceViewServiceEvent("<- Removing",t),n.removeFrom(this.viewConfigs,t)},t.prototype.activateViewConfig=function(t){a.trace.traceViewServiceEvent("-> Registering",t),this.viewConfigs.push(t)},t.prototype.registerUIView=function(t){a.trace.traceViewServiceUIViewEvent("-> Registering",t);var e=this.uiViews,r=function(e){return e.fqn===t.fqn};return e.filter(r).length&&a.trace.traceViewServiceUIViewEvent("!!!! duplicate uiView named:",t),e.push(t),this.sync(),function(){var r=e.indexOf(t);return r===-1?void a.trace.traceViewServiceUIViewEvent("Tried removing non-registered uiView",t):(a.trace.traceViewServiceUIViewEvent("<- Deregistering",t),void n.removeFrom(e)(t))}},t.prototype.available=function(){return this.uiViews.map(i.prop("fqn"))},t.prototype.active=function(){return this.uiViews.filter(i.prop("$config")).map(i.prop("name"))},t.normalizeUIViewTarget=function(t,e){void 0===e&&(e="");var r=e.split("@"),n=r[0]||"$default",i=o.isString(r[1])?r[1]:"^",a=/^(\^(?:\.\^)*)\.(.*$)/.exec(n);a&&(i=a[1],n=a[2]),"!"===n.charAt(0)&&(n=n.substr(1),i="");var s=/^(\^(?:\.\^)*)$/;if(s.exec(i)){var u=i.split(".").reduce(function(t,e){return t.parent},t);i=u.name}return{uiViewName:n,uiViewContextAnchor:i}},t}();e.ViewService=s},function(t,e,r){"use strict";var n=r(39),i=r(40),o=r(41),a=r(3),s=function(){function t(t,e){this.urlRouterProvider=e,this.states={},this.listeners=[],this.matcher=new n.StateMatcher(this.states),this.builder=new i.StateBuilder(this.matcher,t),this.stateQueue=new o.StateQueueManager(this.states,this.builder,e,this.listeners);
1777 1777 var r={name:"",url:"^",views:null,params:{"#":{value:null,type:"hash",dynamic:!0}},"abstract":!0},a=this._root=this.stateQueue.register(r);a.navigable=null}return t.prototype.onStatesChanged=function(t){return this.listeners.push(t),function(){a.removeFrom(this.listeners)(t)}.bind(this)},t.prototype.root=function(){return this._root},t.prototype.register=function(t){return this.stateQueue.register(t)},t.prototype._deregisterTree=function(t){var e=this,r=this.get().map(function(t){return t.$$state()}),n=function(t){var e=r.filter(function(e){return t.indexOf(e.parent)!==-1});return 0===e.length?e:e.concat(n(e))},i=n([t]),o=[t].concat(i).reverse();return o.forEach(function(t){e.urlRouterProvider.removeRule(t._urlRule),delete e.states[t.name]}),o},t.prototype.deregister=function(t){var e=this.get(t);if(!e)throw new Error("Can't deregister state; not found: "+t);var r=this._deregisterTree(e.$$state());return this.listeners.forEach(function(t){return t("deregistered",r.map(function(t){return t.self}))}),r},t.prototype.get=function(t,e){var r=this;if(0===arguments.length)return Object.keys(this.states).map(function(t){return r.states[t].self});var n=this.matcher.find(t,e);return n&&n.self||null},t.prototype.decorator=function(t,e){return this.builder.builder(t,e)},t}();e.StateRegistry=s},function(t,e,r){"use strict";var n=r(4),i=r(7),o=r(3),a=function(){function t(t){this._states=t}return t.prototype.isRelative=function(t){return t=t||"",0===t.indexOf(".")||0===t.indexOf("^")},t.prototype.find=function(t,e){if(t||""===t){var r=n.isString(t),a=r?t:t.name;this.isRelative(a)&&(a=this.resolvePath(a,e));var s=this._states[a];if(s&&(r||!(r||s!==t&&s.self!==t)))return s;if(r){var u=o.values(this._states).filter(function(t){return new i.Glob(t.name).matches(a)});return u.length>1&&console.log("stateMatcher.find: Found multiple matches for "+a+" using glob: ",u.map(function(t){return t.name})),u[0]}}},t.prototype.resolvePath=function(t,e){if(!e)throw new Error("No reference point given for path '"+t+"'");for(var r=this.find(e),n=t.split("."),i=0,o=n.length,a=r;i<o;i++)if(""!==n[i]||0!==i){if("^"!==n[i])break;if(!a.parent)throw new Error("Path '"+t+"' not valid for state '"+r.name+"'");a=a.parent}else a=r;var s=n.slice(i).join(".");return a.name+(a.name&&s?".":"")+s},t}();e.StateMatcher=a},function(t,e,r){"use strict";function n(t){return t.lazyLoad&&(t.name=t.self.name+".**"),t.name}function i(t){return t.self.$$state=function(){return t},t.self}function o(t){return t.parent&&t.parent.data&&(t.data=t.self.data=c.inherit(t.parent.data,t.data)),t.data}function a(t){return t.parent?t.parent.path.concat(t):[t]}function s(t){var e=t.parent?c.extend({},t.parent.includes):{};return e[t.name]=!0,e}function u(t){var e=function(t,e){return Object.keys(t||{}).map(function(r){return{token:r,val:t[r],deps:void 0,policy:e[r]}})},r=function(t){return t.$inject||d.services.$injector.annotate(t,d.services.$injector.strictDi)},n=function(t){return!(!t.token||!t.resolveFn)},i=function(t){return!(!t.provide&&!t.token||!(t.useValue||t.useFactory||t.useExisting||t.useClass))},o=function(t){return!!(t&&t.val&&(f.isString(t.val)||f.isArray(t.val)||f.isFunction(t.val)))},a=function(t){return t.provide||t.token},s=p.pattern([[p.prop("resolveFn"),function(t){return new v.Resolvable(a(t),t.resolveFn,t.deps,t.policy)}],[p.prop("useFactory"),function(t){return new v.Resolvable(a(t),t.useFactory,t.deps||t.dependencies,t.policy)}],[p.prop("useClass"),function(t){return new v.Resolvable(a(t),function(){return new t.useClass},[],t.policy)}],[p.prop("useValue"),function(t){return new v.Resolvable(a(t),function(){return t.useValue},[],t.policy,t.useValue)}],[p.prop("useExisting"),function(t){return new v.Resolvable(a(t),c.identity,[t.useExisting],t.policy)}]]),u=p.pattern([[p.pipe(p.prop("val"),f.isString),function(t){return new v.Resolvable(t.token,c.identity,[t.val],t.policy)}],[p.pipe(p.prop("val"),f.isArray),function(t){return new v.Resolvable(t.token,c.tail(t.val),t.val.slice(0,-1),t.policy)}],[p.pipe(p.prop("val"),f.isFunction),function(t){return new v.Resolvable(t.token,t.val,r(t.val),t.policy)}]]),h=p.pattern([[p.is(v.Resolvable),function(t){return t}],[n,s],[i,s],[o,u],[p.val(!0),function(t){throw new Error("Invalid resolve value: "+l.stringify(t))}]]),m=t.resolve,g=f.isArray(m)?m:e(m,t.resolvePolicy||{});return g.map(h)}var c=r(3),f=r(4),l=r(9),p=r(5),h=r(22),v=r(19),d=r(6),m=function(t){if(!f.isString(t))return!1;var e="^"===t.charAt(0);return{val:e?t.substring(1):t,root:e}},g=function(t,e){return function(r){var n=r;n&&n.url&&n.lazyLoad&&(n.url+="{remainder:any}");var i=m(n.url),o=r.parent,a=i?t.compile(i.val,{params:r.params||{},paramMap:function(t,e){return n.reloadOnSearch===!1&&e&&(t=c.extend(t||{},{dynamic:!0})),t}}):n.url;if(!a)return null;if(!t.isMatcher(a))throw new Error("Invalid url '"+a+"' in state '"+r+"'");return i&&i.root?a:(o&&o.navigable||e()).url.append(a)}},y=function(t){return function(e){return!t(e)&&e.url?e:e.parent?e.parent.navigable:null}},w=function(t){return function(e){var r=function(e,r){return h.Param.fromConfig(r,null,e,t)},n=e.url&&e.url.parameters({inherit:!1})||[],i=c.values(c.mapObj(c.omit(e.params||{},n.map(p.prop("id"))),r));return n.concat(i).map(function(t){return[t.id,t]}).reduce(c.applyPairs,{})}};e.resolvablesBuilder=u;var b=function(){function t(t,e){function r(e){return l(e)?null:t.find(c.parentName(e))||f()}this.matcher=t;var c=this,f=function(){return t.find("")},l=function(t){return""===t.name};this.builders={name:[n],self:[i],parent:[r],data:[o],url:[g(e,f)],navigable:[y(l)],params:[w(e.paramTypes)],views:[],path:[a],includes:[s],resolvables:[u]}}return t.prototype.builder=function(t,e){var r=this.builders,n=r[t]||[];return f.isString(t)&&!f.isDefined(e)?n.length>1?n:n[0]:f.isString(t)&&f.isFunction(e)?(r[t]=n,r[t].push(e),function(){return r[t].splice(r[t].indexOf(e,1))&&null}):void 0},t.prototype.build=function(t){var e=this,r=e.matcher,n=e.builders,i=this.parentName(t);if(i&&!r.find(i))return null;for(var o in n)if(n.hasOwnProperty(o)){var a=n[o].reduce(function(t,e){return function(r){return e(r,t)}},c.noop);t[o]=a(t)}return t},t.prototype.parentName=function(t){var e=t.name||"",r=e.split(".");if(r.length>1){if(t.parent)throw new Error("States that specify the 'parent:' property should not have a '.' in their name ("+e+")");var n=r.pop();return"**"===n&&r.pop(),r.join(".")}return t.parent?f.isString(t.parent)?t.parent:t.parent.name:""},t.prototype.name=function(t){var e=t.name;if(e.indexOf(".")!==-1||!t.parent)return e;var r=f.isString(t.parent)?t.parent:t.parent.name;return r?r+"."+e:e},t}();e.StateBuilder=b},function(t,e,r){"use strict";var n=r(3),i=r(4),o=r(42),a=function(){function t(t,e,r,n){this.states=t,this.builder=e,this.$urlRouterProvider=r,this.listeners=n,this.queue=[]}return t.prototype.register=function(t){var e=this,r=e.states,a=e.queue,s=e.$state,u=n.inherit(new o.State,n.extend({},t,{self:t,resolve:t.resolve||[],toString:function(){return t.name}}));if(!i.isString(u.name))throw new Error("State must have a valid name");if(r.hasOwnProperty(u.name)||n.pluck(a,"name").indexOf(u.name)!==-1)throw new Error("State '"+u.name+"' is already defined");return a.push(u),this.$state&&this.flush(s),u},t.prototype.flush=function(t){for(var e=this,r=e.queue,n=e.states,i=e.builder,o=[],a=[],s={};r.length>0;){var u=r.shift(),c=i.build(u),f=a.indexOf(u);if(c){if(n.hasOwnProperty(u.name))throw new Error("State '"+name+"' is already defined");n[u.name]=u,this.attachRoute(t,u),f>=0&&a.splice(f,1),o.push(u)}else{var l=s[u.name];if(s[u.name]=r.length,f>=0&&l===r.length)return r.push(u),n;f<0&&a.push(u),r.push(u)}}return o.length&&this.listeners.forEach(function(t){return t("registered",o.map(function(t){return t.self}))}),n},t.prototype.autoFlush=function(t){this.$state=t,this.flush(t)},t.prototype.attachRoute=function(t,e){var r=this.$urlRouterProvider;!e["abstract"]&&e.url&&r.when(e.url,["$match","$stateParams",function(r,i){t.$current.navigable===e&&n.equalForKeys(r,i)||t.transitionTo(e,r,{inherit:!0,source:"url"})}],function(t){return e._urlRule=t})},t}();e.StateQueueManager=a},function(t,e,r){"use strict";var n=r(3),i=r(5),o=function(){function t(t){n.extend(this,t)}return t.prototype.is=function(t){return this===t||this.self===t||this.fqn()===t},t.prototype.fqn=function(){if(!(this.parent&&this.parent instanceof this.constructor))return this.name;var t=this.parent.fqn();return t?t+"."+this.name:this.name},t.prototype.root=function(){return this.parent&&this.parent.root()||this},t.prototype.parameters=function(t){t=n.defaults(t,{inherit:!0});var e=t.inherit&&this.parent&&this.parent.parameters()||[];return e.concat(n.values(this.params))},t.prototype.parameter=function(t,e){return void 0===e&&(e={}),this.url&&this.url.parameter(t,e)||n.find(n.values(this.params),i.propEq("id",t))||e.inherit&&this.parent&&this.parent.parameter(t)},t.prototype.toString=function(){return this.fqn()},t}();e.State=o},function(t,e,r){"use strict";var n=r(3),i=r(4),o=r(8),a=r(6),s=r(20),u=r(21),c=r(30),f=r(10),l=r(14),p=r(22),h=r(7),v=r(3),d=r(3),m=r(17),g=function(){function t(e){this.router=e,this.invalidCallbacks=[],this._defaultErrorHandler=function(t){t instanceof Error&&t.stack?(console.error(t),console.error(t.stack)):t instanceof f.Rejection?(console.error(t.toString()),t.detail&&t.detail.stack&&console.error(t.detail.stack)):console.error(t)};var r=["current","$current","params","transition"],n=Object.keys(t.prototype).filter(function(t){return r.indexOf(t)===-1});d.bindFunctions(t.prototype,this,this,n)}return Object.defineProperty(t.prototype,"transition",{get:function(){return this.router.globals.transition},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"params",{get:function(){return this.router.globals.params},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"current",{get:function(){return this.router.globals.current},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"$current",{get:function(){return this.router.globals.$current},enumerable:!0,configurable:!0}),t.prototype._handleInvalidTargetState=function(t,e){function r(){var t=h.dequeue();if(void 0===t)return f.Rejection.invalid(e.error()).toPromise();var n=a.services.$q.when(t(e,i,v));return n.then(d).then(function(t){return t||r()})}var n=this,i=s.PathFactory.makeTargetState(t),u=this.router.globals,c=function(){return u.transitionHistory.peekTail()},p=c(),h=new o.Queue(this.invalidCallbacks.slice()),v=new m.ResolveContext(t).injector(),d=function(t){if(t instanceof l.TargetState){var e=t;return e=n.target(e.identifier(),e.params(),e.options()),e.valid()?c()!==p?f.Rejection.superseded().toPromise():n.transitionTo(e.identifier(),e.params(),e.options()):f.Rejection.invalid(e.error()).toPromise()}};return r()},t.prototype.onInvalid=function(t){return this.invalidCallbacks.push(t),function(){n.removeFrom(this.invalidCallbacks)(t)}.bind(this)},t.prototype.reload=function(t){return this.transitionTo(this.current,this.params,{reload:!i.isDefined(t)||t,inherit:!1,notify:!1})},t.prototype.go=function(t,e,r){var i={relative:this.$current,inherit:!0},o=n.defaults(r,i,c.defaultTransOpts);return this.transitionTo(t,e,o)},t.prototype.target=function(t,e,r){if(void 0===r&&(r={}),i.isObject(r.reload)&&!r.reload.name)throw new Error("Invalid reload state object");var n=this.router.stateRegistry;if(r.reloadState=r.reload===!0?n.root():n.matcher.find(r.reload,r.relative),r.reload&&!r.reloadState)throw new Error("No such reload state '"+(i.isString(r.reload)?r.reload:r.reload.name)+"'");var o=n.matcher.find(t,r.relative);return new l.TargetState(t,o,e,r)},t.prototype.transitionTo=function(t,e,r){var i=this;void 0===e&&(e={}),void 0===r&&(r={});var o=this.router,s=o.globals,p=s.transitionHistory;r=n.defaults(r,c.defaultTransOpts),r=n.extend(r,{current:p.peekTail.bind(p)});var h=this.target(t,e,r),v=s.successfulTransitions.peekTail(),d=function(){return[new u.PathNode(i.router.stateRegistry.root())]},m=v?v.treeChanges().to:d();if(!h.exists())return this._handleInvalidTargetState(m,h);if(!h.valid())return n.silentRejection(h.error());var g=function(t){return function(e){if(e instanceof f.Rejection){if(e.type===f.RejectType.IGNORED)return o.urlRouter.update(),a.services.$q.when(s.current);var r=e.detail;if(e.type===f.RejectType.SUPERSEDED&&e.redirected&&r instanceof l.TargetState){var n=t.redirect(r);return n.run()["catch"](g(n))}e.type===f.RejectType.ABORTED&&o.urlRouter.update()}var u=i.defaultErrorHandler();return u(e),a.services.$q.reject(e)}},y=this.router.transitionService.create(m,h),w=y.run()["catch"](g(y));return n.silenceUncaughtInPromise(w),n.extend(w,{transition:y})},t.prototype.is=function(t,e,r){r=n.defaults(r,{relative:this.$current});var o=this.router.stateRegistry.matcher.find(t,r.relative);if(i.isDefined(o))return this.$current===o&&(!i.isDefined(e)||null===e||p.Param.equals(o.parameters(),this.params,e))},t.prototype.includes=function(t,e,r){r=n.defaults(r,{relative:this.$current});var o=i.isString(t)&&h.Glob.fromString(t);if(o){if(!o.matches(this.$current.name))return!1;t=this.$current.name}var a=this.router.stateRegistry.matcher.find(t,r.relative),s=this.$current.includes;if(i.isDefined(a))return!!i.isDefined(s[a.name])&&(!e||v.equalForKeys(p.Param.values(a.parameters(),e),this.params,Object.keys(e)))},t.prototype.href=function(t,e,r){var o={lossy:!0,inherit:!0,absolute:!1,relative:this.$current};r=n.defaults(r,o),e=e||{};var a=this.router.stateRegistry.matcher.find(t,r.relative);if(!i.isDefined(a))return null;r.inherit&&(e=this.params.$inherit(e,this.$current,a));var s=a&&r.lossy?a.navigable:a;return s&&void 0!==s.url&&null!==s.url?this.router.urlRouter.href(s.url,p.Param.values(a.parameters(),e),{absolute:r.absolute}):null},t.prototype.defaultErrorHandler=function(t){return this._defaultErrorHandler=t||this._defaultErrorHandler},t.prototype.get=function(t,e){var r=this.router.stateRegistry;return 0===arguments.length?r.get():r.get(t,e||this.$current)},t}();e.StateService=g},function(t,e,r){"use strict";var n=r(45),i=r(8),o=r(3),a=function(){function t(t){var e=this;this.params=new n.StateParams,this.transitionHistory=new i.Queue([],1),this.successfulTransitions=new i.Queue([],1);var r=function(t){e.transition=t,e.transitionHistory.enqueue(t);var r=function(){e.successfulTransitions.enqueue(t),e.$current=t.$to(),e.current=e.$current.self,o.copy(t.params(),e.params)};t.onSuccess({},r,{priority:1e4});var n=function(){e.transition===t&&(e.transition=null)};t.promise.then(n,n)};t.onBefore({},r)}return t}();e.Globals=a},function(t,e,r){"use strict";var n=r(3),i=function(){function t(t){void 0===t&&(t={}),n.extend(this,t)}return t.prototype.$inherit=function(t,e,r){var i,o=n.ancestors(e,r),a={},s=[];for(var u in o)if(o[u]&&o[u].params&&(i=Object.keys(o[u].params),i.length))for(var c in i)s.indexOf(i[c])>=0||(s.push(i[c]),a[i[c]]=this[i[c]]);return n.extend({},a,t)},t}();e.StateParams=i},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(22)),n(r(28)),n(r(45)),n(r(24))},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(21)),n(r(20))},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(18)),n(r(19)),n(r(17))},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(40)),n(r(42)),n(r(39)),n(r(41)),n(r(38)),n(r(43)),n(r(14))},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(16)),n(r(15)),n(r(10)),n(r(11)),n(r(13)),n(r(30))},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(27)),n(r(23)),n(r(26)),n(r(29))},function(t,e,r){"use strict";function n(t){for(var r in t)e.hasOwnProperty(r)||(e[r]=t[r])}n(r(37))},function(t,e,r){"use strict";function n(t){var e=l.services.$injector,r=e.get("$controller"),n=e.instantiate;try{var i;return e.instantiate=function(t){e.instantiate=n,i=e.annotate(t)},r(t,{$scope:{}}),i}finally{e.instantiate=n}}function i(t){function e(e,n,i,o,a,s){return o.$on("$locationChangeSuccess",function(t){return r.forEach(function(e){return e(t)})}),l.services.locationConfig.html5Mode=function(){var e=t.html5Mode();return e=v.isObject(e)?e.enabled:e,e&&i.history},l.services.location.setUrl=function(t,r){void 0===r&&(r=!1),e.url(t),r&&e.replace()},l.services.template.get=function(t){return a.get(t,{cache:s,headers:{Accept:"text/html"}}).then(h.prop("data"))},p.bindFunctions(e,l.services.location,e,["replace","url","path","search","hash"]),p.bindFunctions(e,l.services.locationConfig,e,["port","protocol","host"]),p.bindFunctions(n,l.services.locationConfig,n,["baseHref"]),R}R=new f.UIRouter,R.stateProvider=new w.StateProvider(R.stateRegistry,R.stateService),R.stateRegistry.decorator("views",g.ng1ViewsBuilder),R.stateRegistry.decorator("onExit",b.getStateHookBuilder("onExit")),R.stateRegistry.decorator("onRetain",b.getStateHookBuilder("onRetain")),R.stateRegistry.decorator("onEnter",b.getStateHookBuilder("onEnter")),R.viewService.viewConfigFactory("ng1",g.ng1ViewConfigFactory),p.bindFunctions(t,l.services.locationConfig,t,["hashPrefix"]);var r=[];l.services.location.onChange=function(t){return r.push(t),function(){return p.removeFrom(r)(t)}},this.$get=e,e.$inject=["$location","$browser","$sniffer","$rootScope","$http","$templateCache"]}function o(t,e){l.services.$injector=t,l.services.$q=e}function a(){return R.urlRouterProvider.$get=function(){return R.urlRouter.update(!0),this.interceptDeferred||R.urlRouter.listen(),R.urlRouter},R.urlRouterProvider}function s(){return R.stateProvider.$get=function(){return R.stateRegistry.stateQueue.autoFlush(R.stateService),R.stateService},R.stateProvider}function u(){return R.transitionService.$get=function(){return R.transitionService},R.transitionService}function c(t){t.$watch(function(){m.trace.approximateDigests++})}var f=r(25),l=r(6),p=r(3),h=r(5),v=r(4),d=r(54),m=r(12),g=r(55),y=r(56),w=r(58),b=r(59),$=r(57);$.module("ui.router.angular1",[]);$.module("ui.router.util",["ng","ui.router.init"]),$.module("ui.router.router",["ui.router.util"]),$.module("ui.router.state",["ui.router.router","ui.router.util","ui.router.angular1"]),$.module("ui.router",["ui.router.init","ui.router.state","ui.router.angular1"]),$.module("ui.router.compat",["ui.router"]),e.annotateController=n;var R=null;i.$inject=["$locationProvider"],$.module("ui.router.init",[]).provider("$uiRouter",i),o.$inject=["$injector","$q"],$.module("ui.router.init").run(o),$.module("ui.router.init").run(["$uiRouter",function(t){}]),$.module("ui.router.util").provider("$urlMatcherFactory",["$uiRouterProvider",function(){return R.urlMatcherFactory}]),$.module("ui.router.util").run(["$urlMatcherFactory",function(t){}]),$.module("ui.router.router").provider("$urlRouter",["$uiRouterProvider",a]),$.module("ui.router.router").run(["$urlRouter",function(t){}]),$.module("ui.router.state").provider("$state",["$uiRouterProvider",s]),$.module("ui.router.state").run(["$state",function(t){}]),$.module("ui.router.state").factory("$stateParams",["$uiRouter",function(t){return t.globals.params}]),$.module("ui.router.state").provider("$transitions",["$uiRouterProvider",u]),$.module("ui.router.util").factory("$templateFactory",["$uiRouter",function(){return new y.TemplateFactory}]),$.module("ui.router").factory("$view",function(){return R.viewService}),$.module("ui.router").factory("$resolve",d.resolveFactory),$.module("ui.router").service("$trace",function(){return m.trace}),c.$inject=["$rootScope"],e.watchDigests=c,$.module("ui.router").run(c),e.getLocals=function(t){var e=t.getTokens().filter(v.isString),r=e.map(function(e){return[e,t.getResolvable(e).data]});return r.reduce(p.applyPairs,{})}},function(t,e,r){"use strict";var n=r(42),i=r(21),o=r(17),a=r(3),s=r(40),u={resolve:function(t,e,r){void 0===e&&(e={});var u=new i.PathNode(new n.State({params:{},resolvables:[]})),c=new i.PathNode(new n.State({params:{},resolvables:[]})),f=new o.ResolveContext([u,c]);f.addResolvables(s.resolvablesBuilder({resolve:t}),c.state);var l=function(t){var r=function(t){return s.resolvablesBuilder({resolve:a.mapObj(t,function(t){return function(){return t}})})};f.addResolvables(r(t),u.state),f.addResolvables(r(e),c.state);var n=function(t,e){return t[e.token]=e.value,t};return f.resolvePath().then(function(t){return t.reduce(n,{})})};return r?r.then(l):l({})}};e.resolveFactory=function(){return u}},function(t,e,r){"use strict";function n(t){var e=["templateProvider","templateUrl","template","notify","async"],r=["controller","controllerProvider","controllerAs","resolveAs"],n=["component","bindings"],c=e.concat(r),f=n.concat(c),l={},p=t.views||{$default:o.pick(t,f)};return o.forEach(p,function(e,r){if(r=r||"$default",u.isString(e)&&(e={component:e}),Object.keys(e).length){if(e.component){if(c.map(function(t){return u.isDefined(e[t])}).reduce(o.anyTrueR,!1))throw new Error("Cannot combine: "+n.join("|")+" with: "+c.join("|")+" in stateview: 'name@"+t.name+"'");e.templateProvider=["$injector",function(t){var r=function(t){return e.bindings&&e.bindings[t]||t},n=v.version.minor>=3?"::":"",o=function(t){var e=a.kebobString(t.name),i=r(t.name);return"@"===t.type?e+"='{{"+n+"$resolve."+i+"}}'":e+"='"+n+"$resolve."+i+"'"},s=i(t,e.component).map(o).join(" "),u=a.kebobString(e.component);return"<"+u+" "+s+"></"+u+">"}]}e.resolveAs=e.resolveAs||"$resolve",e.$type="ng1",e.$context=t,e.$name=r;var f=s.ViewService.normalizeUIViewTarget(e.$context,e.$name);e.$uiViewName=f.uiViewName,e.$uiViewContextAnchor=f.uiViewContextAnchor,l[r]=e}}),l}function i(t,e){var r=t.get(e+"Directive");if(!r||!r.length)throw new Error("Unable to find component named '"+e+"'");return r.map(m).reduce(o.unnestR,[])}var o=r(3),a=r(9),s=r(37),u=r(4),c=r(6),f=r(12),l=r(56),p=r(17),h=r(19),v=r(57);e.ng1ViewConfigFactory=function(t,e){return[new y(t,e)]},e.ng1ViewsBuilder=n;var d=function(t){return Object.keys(t||{}).map(function(e){return[e,/^([=<@])[?]?(.*)/.exec(t[e])]}).filter(function(t){return u.isDefined(t)&&u.isDefined(t[1])}).map(function(t){return{name:t[1][2]||t[0],type:t[1][1]}})},m=function(t){return d(u.isObject(t.bindToController)?t.bindToController:t.scope)},g=0,y=function(){function t(t,e){this.path=t,this.viewDecl=e,this.$id=g++,this.loaded=!1}return t.prototype.load=function(){var t=this,e=c.services.$q;if(!this.hasTemplate())throw new Error("No template configuration specified for '"+this.viewDecl.$uiViewName+"@"+this.viewDecl.$uiViewContextAnchor+"'");var r=new p.ResolveContext(this.path),n=this.path.reduce(function(t,e){return o.extend(t,e.paramValues)},{}),i={template:e.when(this.getTemplate(n,new l.TemplateFactory,r)),controller:e.when(this.getController(r))};return e.all(i).then(function(e){return f.trace.traceViewServiceEvent("Loaded",t),t.controller=e.controller,t.template=e.template,t})},t.prototype.hasTemplate=function(){return!!(this.viewDecl.template||this.viewDecl.templateUrl||this.viewDecl.templateProvider)},t.prototype.getTemplate=function(t,e,r){return e.fromConfig(this.viewDecl,t,r)},t.prototype.getController=function(t){var e=this.viewDecl.controllerProvider;if(!u.isInjectable(e))return this.viewDecl.controller;var r=c.services.$injector.annotate(e),n=u.isArray(e)?o.tail(e):e,i=new h.Resolvable("",n,r);return i.get(t)},t}();e.Ng1ViewConfig=y},function(t,e,r){"use strict";var n=r(4),i=r(6),o=r(3),a=r(19),s=function(){function t(){}return t.prototype.fromConfig=function(t,e,r){return n.isDefined(t.template)?this.fromString(t.template,e):n.isDefined(t.templateUrl)?this.fromUrl(t.templateUrl,e):n.isDefined(t.templateProvider)?this.fromProvider(t.templateProvider,e,r):null},t.prototype.fromString=function(t,e){return n.isFunction(t)?t(e):t},t.prototype.fromUrl=function(t,e){return n.isFunction(t)&&(t=t(e)),null==t?null:i.services.template.get(t)},t.prototype.fromProvider=function(t,e,r){var s=i.services.$injector.annotate(t),u=n.isArray(t)?o.tail(t):t,c=new a.Resolvable("",u,s);return c.get(r)},t}();e.TemplateFactory=s},function(e,r){e.exports=t},function(t,e,r){"use strict";var n=r(4),i=r(3),o=function(){function t(e,r){this.stateRegistry=e,this.stateService=r,i.bindFunctions(t.prototype,this,this)}return t.prototype.decorator=function(t,e){return this.stateRegistry.decorator(t,e)||this},t.prototype.state=function(t,e){return n.isObject(t)?e=t:e.name=t,this.stateRegistry.register(e),this},t.prototype.onInvalid=function(t){return this.stateService.onInvalid(t)},t}();e.StateProvider=o},function(t,e,r){"use strict";var n=r(6),i=r(53),o=r(17),a=r(3);e.getStateHookBuilder=function(t){return function(e,r){function s(t,e){var r=new o.ResolveContext(t.treeChanges().to);return n.services.$injector.invoke(u,this,a.extend({$state$:e},i.getLocals(r)))}var u=e[t];return u?s:void 0}}},function(t,e,r){"use strict";function n(t,e){var r,n=t.match(/^\s*({[^}]*})\s*$/);if(n&&(t=e+"("+n[1]+")"),r=t.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!r||4!==r.length)throw new Error("Invalid state ref '"+t+"'");return{state:r[1],paramExpr:r[3]||null}}function i(t){var e=t.parent().inheritedData("$uiView"),r=l.parse("$cfg.path")(e);return r?c.tail(r).state.name:void 0}function o(t){var e="[object SVGAnimatedString]"===Object.prototype.toString.call(t.prop("href")),r="FORM"===t[0].nodeName;return{attr:r?"action":e?"xlink:href":"href",isAnchor:"A"===t.prop("tagName").toUpperCase(),clickable:!r}}function a(t,e,r,n,i){return function(o){var a=o.which||o.button,s=i();if(!(a>1||o.ctrlKey||o.metaKey||o.shiftKey||t.attr("target"))){var u=r(function(){e.go(s.state,s.params,s.options)});o.preventDefault();var c=n.isAnchor&&!s.href?1:0;o.preventDefault=function(){c--<=0&&r.cancel(u)}}}}function s(t,e){return{relative:i(t)||e.$current,inherit:!0,source:"sref"}}var u=r(57),c=r(3),f=r(4),l=r(5),p=["$state","$timeout",function(t,e){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(r,i,f,l){var p,h=n(f.uiSref,t.current.name),v={state:h.state,href:null,params:null,options:null},d=o(i),m=l[1]||l[0],g=null;v.options=c.extend(s(i,t),f.uiSrefOpts?r.$eval(f.uiSrefOpts):{});var y=function(e){e&&(v.params=u.copy(e)),v.href=t.href(h.state,v.params,v.options),g&&g(),m&&(g=m.$$addStateInfo(h.state,v.params)),null!==v.href&&f.$set(d.attr,v.href)};h.paramExpr&&(r.$watch(h.paramExpr,function(t){t!==v.params&&y(t)},!0),v.params=u.copy(r.$eval(h.paramExpr))),y(),d.clickable&&(p=a(i,t,e,d,function(){return v}),i.on("click",p),r.$on("$destroy",function(){i.off("click",p)}))}}}],h=["$state","$timeout",function(t,e){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(r,n,i,s){function u(e){v.state=e[0],v.params=e[1],v.options=e[2],v.href=t.href(v.state,v.params,v.options),d&&d(),l&&(d=l.$$addStateInfo(v.state,v.params)),v.href&&i.$set(f.attr,v.href)}var c,f=o(n),l=s[1]||s[0],p=[i.uiState,i.uiStateParams||null,i.uiStateOpts||null],h="["+p.map(function(t){return t||"null"}).join(", ")+"]",v={state:null,params:null,options:null,href:null},d=null;r.$watch(h,u,!0),u(r.$eval(h)),f.clickable&&(c=a(n,t,e,f,function(){return v}),n.on("click",c),r.$on("$destroy",function(){n.off("click",c)}))}}}],v=["$state","$stateParams","$interpolate","$transitions","$uiRouter",function(t,e,r,o,a){return{restrict:"A",controller:["$scope","$element","$attrs","$timeout",function(e,s,u,l){function p(t){t.promise.then(d)}function h(e,r,n){var o=t.get(e,i(s)),a=v(e,r),u={state:o||{name:e},params:r,hash:a};return R.push(u),S[a]=n,function(){var t=R.indexOf(u);t!==-1&&R.splice(t,1)}}function v(t,r){if(!f.isString(t))throw new Error("state should be a string");return f.isObject(r)?t+c.toJson(r):(r=e.$eval(r),f.isObject(r)?t+c.toJson(r):t)}function d(){for(var t=0;t<R.length;t++)y(R[t].state,R[t].params)?m(s,S[R[t].hash]):g(s,S[R[t].hash]),w(R[t].state,R[t].params)?m(s,b):g(s,b)}function m(t,e){l(function(){t.addClass(e)})}function g(t,e){t.removeClass(e)}function y(e,r){return t.includes(e.name,r)}function w(e,r){return t.is(e.name,r)}var b,$,R=[],S={};b=r(u.uiSrefActiveEq||"",!1)(e);try{$=e.$eval(u.uiSrefActive)}catch(E){}$=$||r(u.uiSrefActive||"",!1)(e),f.isObject($)&&c.forEach($,function(r,i){if(f.isString(r)){var o=n(r,t.current.name);h(o.state,e.$eval(o.paramExpr),i)}}),this.$$addStateInfo=function(t,e){if(!(f.isObject($)&&R.length>0)){var r=h(t,e,$);return d(),r}},e.$on("$stateChangeSuccess",d),e.$on("$destroy",o.onStart({},p)),a.globals.transition&&p(a.globals.transition),d()}]}}];u.module("ui.router.state").directive("uiSref",p).directive("uiSrefActive",v).directive("uiSrefActiveEq",v).directive("uiState",h)},function(t,e,r){"use strict";function n(t){var e=function(e,r,n){return t.is(e,r,n)};return e.$stateful=!0,e}function i(t){var e=function(e,r,n){return t.includes(e,r,n)};return e.$stateful=!0,e}var o=r(57);n.$inject=["$state"],e.$IsStateFilter=n,i.$inject=["$state"],e.$IncludedByStateFilter=i,o.module("ui.router.state").filter("isState",n).filter("includedByState",i)},function(t,e,r){"use strict";function n(t,e,r,n,u){var v=c.parse("viewDecl.controllerAs"),d=c.parse("viewDecl.resolveAs");return{restrict:"ECA",priority:-400,compile:function(n){var u=n.html();return function(n,c){var m=c.data("$uiView");if(m){var g=m.$cfg||{viewDecl:{}};c.html(g.template||u),s.trace.traceUIViewFill(m.$uiView,c.html());var y=t(c.contents()),w=g.controller,b=v(g),$=d(g),R=g.path&&new f.ResolveContext(g.path),S=R&&p.getLocals(R);if(n[$]=S,w){var E=e(w,o.extend({},S,{$scope:n,$element:c}));b&&(n[b]=E,n[b][$]=S),c.data("$ngControllerController",E),c.children().data("$ngControllerController",E),i(r,E,n,g)}if(a.isString(g.viewDecl.component))var x=g.viewDecl.component,k=l.kebobString(x),P=function(){var t=[].slice.call(c[0].children).filter(function(t){return t&&t.tagName&&t.tagName.toLowerCase()===k});return t&&h.element(t).data("$"+x+"Controller")},_=n.$watch(P,function(t){t&&(i(r,t,n,g),_())});y(n)}}}}}function i(t,e,r,n){!a.isFunction(e.$onInit)||n.viewDecl.component&&d||e.$onInit();var i=o.tail(n.path).state.self,s={bind:e};if(a.isFunction(e.uiOnParamsChanged)){var u=new f.ResolveContext(n.path),c=u.getResolvable("$transition$").data,l=function(t){if(t!==c&&t.exiting().indexOf(i)===-1){var r=t.params("to"),n=t.params("from"),a=t.treeChanges().to.map(function(t){return t.paramSchema}).reduce(o.unnestR,[]),s=t.treeChanges().from.map(function(t){return t.paramSchema}).reduce(o.unnestR,[]),u=a.filter(function(t){var e=s.indexOf(t);return e===-1||!s[e].type.equals(r[t.id],n[t.id])});if(u.length){var f=u.map(function(t){return t.id});e.uiOnParamsChanged(o.filter(r,function(t,e){return f.indexOf(e)!==-1}),t)}}};r.$on("$destroy",t.onSuccess({},l,s))}if(a.isFunction(e.uiCanExit)){var p={exiting:i.name};r.$on("$destroy",t.onBefore(p,e.uiCanExit,s))}}var o=r(3),a=r(4),s=r(12),u=r(55),c=r(5),f=r(17),l=r(9),p=r(53),h=r(57),v=["$view","$animate","$uiViewScroll","$interpolate","$q",function(t,e,r,n,i){function o(t,r){return{enter:function(t,r,n){h.version.minor>2?e.enter(t,null,r).then(n):e.enter(t,null,r,n)},leave:function(t,r){h.version.minor>2?e.leave(t).then(r):e.leave(t,r)}}}function f(t,e){return t===e}var l={$cfg:{viewDecl:{$context:t.rootContext()}},$uiView:{}},p={count:0,restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(e,h,v){return function(e,h,d){function m(t){(!t||t instanceof u.Ng1ViewConfig)&&(f(k,t)||(s.trace.traceUIViewConfigUpdated(C,t&&t.viewDecl&&t.viewDecl.$context),k=t,y(t)))}function g(){if(w&&(s.trace.traceUIViewEvent("Removing (previous) el",w.data("$uiView")),w.remove(),w=null),$&&(s.trace.traceUIViewEvent("Destroying scope",C),$.$destroy(),$=null),b){var t=b.data("$uiViewAnim");s.trace.traceUIViewEvent("Animate out",t),x.leave(b,function(){t.$$animLeave.resolve(),w=null}),w=b,b=null}}function y(t){var n=e.$new(),o=i.defer(),s=i.defer(),u={$cfg:t,$uiView:C},c={$animEnter:o.promise,$animLeave:s.promise,$$animLeave:s},f=v(n,function(t){t.data("$uiViewAnim",c),t.data("$uiView",u),
1778 1778 x.enter(t,h,function(){o.resolve(),$&&$.$emit("$viewContentAnimationEnded"),(a.isDefined(E)&&!E||e.$eval(E))&&r(t)}),g()});b=f,$=n,$.$emit("$viewContentLoaded",t||k),$.$eval(S)}var w,b,$,R,S=d.onload||"",E=d.autoscroll,x=o(d,e),k=void 0,P=h.inheritedData("$uiView")||l,_=n(d.uiView||d.name||"")(e)||"$default",C={$type:"ng1",id:p.count++,name:_,fqn:P.$uiView.fqn?P.$uiView.fqn+"."+_:_,config:null,configUpdated:m,get creationContext(){return c.parse("$cfg.viewDecl.$context")(P)}};s.trace.traceUIViewEvent("Linking",C),h.data("$uiView",{$uiView:C}),y(),R=t.registerUIView(C),e.$on("$destroy",function(){s.trace.traceUIViewEvent("Destroying/Unregistering",C),R()})}}};return p}];n.$inject=["$compile","$controller","$transitions","$view","$timeout"];var d="function"==typeof h.module("ui.router").component;h.module("ui.router.state").directive("uiView",v),h.module("ui.router.state").directive("uiView",n)},function(t,e,r){"use strict";function n(){var t=!1;this.useAnchorScroll=function(){t=!0},this.$get=["$anchorScroll","$timeout",function(e,r){return t?e:function(t){return r(function(){t[0].scrollIntoView()},0,!1)}}]}var i=r(57);i.module("ui.router.state").provider("$uiViewScroll",n)}])});
1779 1779 //# sourceMappingURL=angular-ui-router.min.js.map
1780 1780 ;angular.module('angular-toArrayFilter', [])
1781 1781
1782 1782 .filter('toArray', function () {
1783 1783 return function (obj, addKey) {
1784 1784 if (!angular.isObject(obj)) return obj;
1785 1785 if ( addKey === false ) {
1786 1786 return Object.keys(obj).map(function(key) {
1787 1787 return obj[key];
1788 1788 });
1789 1789 } else {
1790 1790 return Object.keys(obj).map(function (key) {
1791 1791 var value = obj[key];
1792 1792 return angular.isObject(value) ?
1793 1793 Object.defineProperty(value, '$key', { enumerable: false, value: key}) :
1794 1794 { $key: key, $value: value };
1795 1795 });
1796 1796 }
1797 1797 };
1798 1798 });
1799 1799 ;//Copyright (C) 2012 Kory Nunn
1800 1800
1801 1801 //Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
1802 1802
1803 1803 //The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
1804 1804
1805 1805 //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1806 1806
1807 1807 /*
1808 1808
1809 1809 This code is not formatted for readability, but rather run-speed and to assist compilers.
1810 1810
1811 1811 However, the code's intention should be transparent.
1812 1812
1813 1813 *** IE SUPPORT ***
1814 1814
1815 1815 If you require this library to work in IE7, add the following after declaring crel.
1816 1816
1817 1817 var testDiv = document.createElement('div'),
1818 1818 testLabel = document.createElement('label');
1819 1819
1820 1820 testDiv.setAttribute('class', 'a');
1821 1821 testDiv['className'] !== 'a' ? crel.attrMap['class'] = 'className':undefined;
1822 1822 testDiv.setAttribute('name','a');
1823 1823 testDiv['name'] !== 'a' ? crel.attrMap['name'] = function(element, value){
1824 1824 element.id = value;
1825 1825 }:undefined;
1826 1826
1827 1827
1828 1828 testLabel.setAttribute('for', 'a');
1829 1829 testLabel['htmlFor'] !== 'a' ? crel.attrMap['for'] = 'htmlFor':undefined;
1830 1830
1831 1831
1832 1832
1833 1833 */
1834 1834
1835 1835 (function (root, factory) {
1836 1836 if (typeof exports === 'object') {
1837 1837 if (!root.window) {
1838 1838 var jsdom = require('jsdom').jsdom;
1839 1839 root.window = jsdom().parentWindow;
1840 1840 }
1841 1841 module.exports = factory(root.window);
1842 1842 } else if (typeof define === 'function' && define.amd) {
1843 1843 define(factory.bind(null, window));
1844 1844 } else {
1845 1845 root.crel = factory(root.window);
1846 1846 }
1847 1847 }(this, function (window) {
1848 1848 // based on http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object
1849 1849 var isNode = typeof Node === 'object'
1850 1850 ? function (object) { return object instanceof Node }
1851 1851 : function (object) {
1852 1852 return object
1853 1853 && typeof object === 'object'
1854 1854 && typeof object.nodeType === 'number'
1855 1855 && typeof object.nodeName === 'string';
1856 1856 };
1857 1857
1858 1858 function crel(){
1859 1859 var document = window.document,
1860 1860 args = arguments, //Note: assigned to a variable to assist compilers. Saves about 40 bytes in closure compiler. Has negligable effect on performance.
1861 1861 element = document.createElement(args[0]),
1862 1862 child,
1863 1863 settings = args[1],
1864 1864 childIndex = 2,
1865 1865 argumentsLength = args.length,
1866 1866 attributeMap = crel.attrMap;
1867 1867
1868 1868 // shortcut
1869 1869 if(argumentsLength === 1){
1870 1870 return element;
1871 1871 }
1872 1872
1873 1873 if(typeof settings !== 'object' || isNode(settings)) {
1874 1874 --childIndex;
1875 1875 settings = null;
1876 1876 }
1877 1877
1878 1878 // shortcut if there is only one child that is a string
1879 1879 if((argumentsLength - childIndex) === 1 && typeof args[childIndex] === 'string' && element.textContent !== undefined){
1880 1880 element.textContent = args[childIndex];
1881 1881 }else{
1882 1882 for(; childIndex < argumentsLength; ++childIndex){
1883 1883 child = args[childIndex];
1884 1884
1885 1885 if(child == null){
1886 1886 continue;
1887 1887 }
1888 1888
1889 1889 if(!isNode(child)){
1890 1890 child = document.createTextNode(child);
1891 1891 }
1892 1892
1893 1893 element.appendChild(child);
1894 1894 }
1895 1895 }
1896 1896
1897 1897 for(var key in settings){
1898 1898 if(!attributeMap[key]){
1899 1899 element.setAttribute(key, settings[key]);
1900 1900 }else{
1901 1901 var attr = crel.attrMap[key];
1902 1902 if(typeof attr === 'function'){
1903 1903 attr(element, settings[key]);
1904 1904 }else{
1905 1905 element.setAttribute(attr, settings[key]);
1906 1906 }
1907 1907 }
1908 1908 }
1909 1909
1910 1910 return element;
1911 1911 }
1912 1912
1913 1913 // Used for mapping one kind of attribute to the supported version of that in bad browsers.
1914 1914 // String referenced so that compilers maintain the property name.
1915 1915 crel['attrMap'] = {};
1916 1916
1917 1917 // String referenced so that compilers maintain the property name.
1918 1918 crel["isNode"] = isNode;
1919 1919
1920 1920 return crel;
1921 1921 }));
1922 1922
1923 1923 ;/*globals define, module, require, document*/
1924 1924 (function (root, factory) {
1925 1925 "use strict";
1926 1926 if (typeof define === 'function' && define.amd) {
1927 1927 define([], factory);
1928 1928 } else if (typeof module !== 'undefined' && module.exports) {
1929 1929 module.exports = factory();
1930 1930 } else {
1931 1931 root.JsonHuman = factory();
1932 1932 }
1933 1933 }(this, function () {
1934 1934 "use strict";
1935 1935
1936 1936 var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
1937 1937
1938 1938 function makePrefixer(prefix) {
1939 1939 return function (name) {
1940 1940 return prefix + "-" + name;
1941 1941 };
1942 1942 }
1943 1943
1944 1944 function isArray(obj) {
1945 1945 return toString.call(obj) === '[object Array]';
1946 1946 }
1947 1947
1948 1948 function sn(tagName, className, data) {
1949 1949 var result = document.createElement(tagName);
1950 1950
1951 1951 result.className = className;
1952 1952 result.appendChild(document.createTextNode("" + data));
1953 1953
1954 1954 return result;
1955 1955 }
1956 1956
1957 1957 function scn(tagName, className, child) {
1958 1958 var result = document.createElement(tagName),
1959 1959 i, len;
1960 1960
1961 1961 result.className = className;
1962 1962
1963 1963 if (isArray(child)) {
1964 1964 for (i = 0, len = child.length; i < len; i += 1) {
1965 1965 result.appendChild(child[i]);
1966 1966 }
1967 1967 } else {
1968 1968 result.appendChild(child);
1969 1969 }
1970 1970
1971 1971 return result;
1972 1972 }
1973 1973
1974 1974 function linkNode(child, href, target){
1975 1975 var a = scn("a", HYPERLINK_CLASS_NAME, child);
1976 1976 a.setAttribute('href', href);
1977 1977 a.setAttribute('target', target);
1978 1978 return a;
1979 1979 }
1980 1980
1981 1981 var toString = Object.prototype.toString,
1982 1982 prefixer = makePrefixer("jh"),
1983 1983 p = prefixer,
1984 1984 ARRAY = 2,
1985 1985 BOOL = 4,
1986 1986 INT = 8,
1987 1987 FLOAT = 16,
1988 1988 STRING = 32,
1989 1989 OBJECT = 64,
1990 1990 SPECIAL_OBJECT = 128,
1991 1991 FUNCTION = 256,
1992 1992 UNK = 1,
1993 1993
1994 1994 STRING_CLASS_NAME = p("type-string"),
1995 1995 STRING_EMPTY_CLASS_NAME = p("type-string") + " " + p("empty"),
1996 1996
1997 1997 BOOL_TRUE_CLASS_NAME = p("type-bool-true"),
1998 1998 BOOL_FALSE_CLASS_NAME = p("type-bool-false"),
1999 1999 BOOL_IMAGE = p("type-bool-image"),
2000 2000 INT_CLASS_NAME = p("type-int") + " " + p("type-number"),
2001 2001 FLOAT_CLASS_NAME = p("type-float") + " " + p("type-number"),
2002 2002
2003 2003 OBJECT_CLASS_NAME = p("type-object"),
2004 2004 OBJ_KEY_CLASS_NAME = p("key") + " " + p("object-key"),
2005 2005 OBJ_VAL_CLASS_NAME = p("value") + " " + p("object-value"),
2006 2006 OBJ_EMPTY_CLASS_NAME = p("type-object") + " " + p("empty"),
2007 2007
2008 2008 FUNCTION_CLASS_NAME = p("type-function"),
2009 2009
2010 2010 ARRAY_KEY_CLASS_NAME = p("key") + " " + p("array-key"),
2011 2011 ARRAY_VAL_CLASS_NAME = p("value") + " " + p("array-value"),
2012 2012 ARRAY_CLASS_NAME = p("type-array"),
2013 2013 ARRAY_EMPTY_CLASS_NAME = p("type-array") + " " + p("empty"),
2014 2014
2015 2015 HYPERLINK_CLASS_NAME = p('a'),
2016 2016
2017 2017 UNKNOWN_CLASS_NAME = p("type-unk");
2018 2018
2019 2019 function getType(obj) {
2020 2020 var type = typeof obj;
2021 2021
2022 2022 switch (type) {
2023 2023 case "boolean":
2024 2024 return BOOL;
2025 2025 case "string":
2026 2026 return STRING;
2027 2027 case "number":
2028 2028 return (obj % 1 === 0) ? INT : FLOAT;
2029 2029 case "function":
2030 2030 return FUNCTION;
2031 2031 default:
2032 2032 if (isArray(obj)) {
2033 2033 return ARRAY;
2034 2034 } else if (obj === Object(obj)) {
2035 2035 if (obj.constructor === Object) {
2036 2036 return OBJECT;
2037 2037 }
2038 2038 return OBJECT | SPECIAL_OBJECT
2039 2039 } else {
2040 2040 return UNK;
2041 2041 }
2042 2042 }
2043 2043 }
2044 2044
2045 2045 function _format(data, options, parentKey) {
2046 2046
2047 2047 var result, container, key, keyNode, valNode, len, childs, tr, value,
2048 2048 isEmpty = true,
2049 2049 isSpecial = false,
2050 2050 accum = [],
2051 2051 type = getType(data);
2052 2052
2053 2053 // Initialized & used only in case of objects & arrays
2054 2054 var hyperlinksEnabled, aTarget, hyperlinkKeys ;
2055 2055
2056 2056 if (type === BOOL) {
2057 2057 var boolOpt = options.bool;
2058 2058 container = document.createElement('div');
2059 2059
2060 2060 if (boolOpt.showImage) {
2061 2061 var img = document.createElement('img');
2062 2062 img.setAttribute('class', BOOL_IMAGE);
2063 2063
2064 2064 img.setAttribute('src',
2065 2065 '' + (data ? boolOpt.img.true : boolOpt.img.false));
2066 2066
2067 2067 container.appendChild(img);
2068 2068 }
2069 2069
2070 2070 if (boolOpt.showText) {
2071 2071 container.appendChild(data ?
2072 2072 sn("span", BOOL_TRUE_CLASS_NAME, boolOpt.text.true) :
2073 2073 sn("span", BOOL_FALSE_CLASS_NAME, boolOpt.text.false));
2074 2074 }
2075 2075
2076 2076 result = container;
2077 2077
2078 2078 } else if (type === STRING) {
2079 2079 if (data === "") {
2080 2080 result = sn("span", STRING_EMPTY_CLASS_NAME, "(Empty Text)");
2081 2081 } else {
2082 2082 result = sn("span", STRING_CLASS_NAME, data);
2083 2083 }
2084 2084 } else if (type === INT) {
2085 2085 result = sn("span", INT_CLASS_NAME, data);
2086 2086 } else if (type === FLOAT) {
2087 2087 result = sn("span", FLOAT_CLASS_NAME, data);
2088 2088 } else if (type & OBJECT) {
2089 2089 if (type & SPECIAL_OBJECT) {
2090 2090 isSpecial = true;
2091 2091 }
2092 2092 childs = [];
2093 2093
2094 2094 aTarget = options.hyperlinks.target;
2095 2095 hyperlinkKeys = options.hyperlinks.keys;
2096 2096
2097 2097 // Is Hyperlink Key
2098 2098 hyperlinksEnabled =
2099 2099 options.hyperlinks.enable &&
2100 2100 hyperlinkKeys &&
2101 2101 hyperlinkKeys.length > 0;
2102 2102
2103 2103 for (key in data) {
2104 2104 isEmpty = false;
2105 2105
2106 2106 value = data[key];
2107 2107
2108 2108 valNode = _format(value, options, key);
2109 2109 keyNode = sn("th", OBJ_KEY_CLASS_NAME, key);
2110 2110
2111 2111 if( hyperlinksEnabled &&
2112 2112 typeof(value) === 'string' &&
2113 2113 indexOf.call(hyperlinkKeys, key) >= 0){
2114 2114
2115 2115 valNode = scn("td", OBJ_VAL_CLASS_NAME, linkNode(valNode, value, aTarget));
2116 2116 } else {
2117 2117 valNode = scn("td", OBJ_VAL_CLASS_NAME, valNode);
2118 2118 }
2119 2119
2120 2120 tr = document.createElement("tr");
2121 2121 tr.appendChild(keyNode);
2122 2122 tr.appendChild(valNode);
2123 2123
2124 2124 childs.push(tr);
2125 2125 }
2126 2126
2127 2127 if (isSpecial) {
2128 2128 result = sn('span', STRING_CLASS_NAME, data.toString())
2129 2129 } else if (isEmpty) {
2130 2130 result = sn("span", OBJ_EMPTY_CLASS_NAME, "(Empty Object)");
2131 2131 } else {
2132 2132 result = scn("table", OBJECT_CLASS_NAME, scn("tbody", '', childs));
2133 2133 }
2134 2134 } else if (type === FUNCTION) {
2135 2135 result = sn("span", FUNCTION_CLASS_NAME, data);
2136 2136 } else if (type === ARRAY) {
2137 2137 if (data.length > 0) {
2138 2138 childs = [];
2139 2139 var showArrayIndices = options.showArrayIndex;
2140 2140
2141 2141 aTarget = options.hyperlinks.target;
2142 2142 hyperlinkKeys = options.hyperlinks.keys;
2143 2143
2144 2144 // Hyperlink of arrays?
2145 2145 hyperlinksEnabled = parentKey && options.hyperlinks.enable &&
2146 2146 hyperlinkKeys &&
2147 2147 hyperlinkKeys.length > 0 &&
2148 2148 indexOf.call(hyperlinkKeys, parentKey) >= 0;
2149 2149
2150 2150 for (key = 0, len = data.length; key < len; key += 1) {
2151 2151
2152 2152 keyNode = sn("th", ARRAY_KEY_CLASS_NAME, key);
2153 2153 value = data[key];
2154 2154
2155 2155 if (hyperlinksEnabled && typeof(value) === "string") {
2156 2156 valNode = _format(value, options, key);
2157 2157 valNode = scn("td", ARRAY_VAL_CLASS_NAME,
2158 2158 linkNode(valNode, value, aTarget));
2159 2159 } else {
2160 2160 valNode = scn("td", ARRAY_VAL_CLASS_NAME,
2161 2161 _format(value, options, key));
2162 2162 }
2163 2163
2164 2164 tr = document.createElement("tr");
2165 2165
2166 2166 if (showArrayIndices) {
2167 2167 tr.appendChild(keyNode);
2168 2168 }
2169 2169 tr.appendChild(valNode);
2170 2170
2171 2171 childs.push(tr);
2172 2172 }
2173 2173
2174 2174 result = scn("table", ARRAY_CLASS_NAME, scn("tbody", '', childs));
2175 2175 } else {
2176 2176 result = sn("span", ARRAY_EMPTY_CLASS_NAME, "(Empty List)");
2177 2177 }
2178 2178 } else {
2179 2179 result = sn("span", UNKNOWN_CLASS_NAME, data);
2180 2180 }
2181 2181
2182 2182 return result;
2183 2183 }
2184 2184
2185 2185 function format(data, options) {
2186 2186 options = validateOptions(options || {});
2187 2187
2188 2188 var result;
2189 2189
2190 2190 result = _format(data, options);
2191 2191 result.className = result.className + " " + prefixer("root");
2192 2192
2193 2193 return result;
2194 2194 }
2195 2195
2196 2196 function validateOptions(options){
2197 2197 options = validateArrayIndexOption(options);
2198 2198 options = validateHyperlinkOptions(options);
2199 2199 options = validateBoolOptions(options);
2200 2200
2201 2201 // Add any more option validators here
2202 2202
2203 2203 return options;
2204 2204 }
2205 2205
2206 2206
2207 2207 function validateArrayIndexOption(options) {
2208 2208 if(options.showArrayIndex === undefined){
2209 2209 options.showArrayIndex = true;
2210 2210 } else {
2211 2211 // Force to boolean just in case
2212 2212 options.showArrayIndex = options.showArrayIndex ? true: false;
2213 2213 }
2214 2214
2215 2215 return options;
2216 2216 }
2217 2217
2218 2218 function validateHyperlinkOptions(options){
2219 2219 var hyperlinks = {
2220 2220 enable : false,
2221 2221 keys : null,
2222 2222 target : ''
2223 2223 };
2224 2224
2225 2225 if(options.hyperlinks && options.hyperlinks.enable) {
2226 2226 hyperlinks.enable = true;
2227 2227
2228 2228 hyperlinks.keys = isArray(options.hyperlinks.keys) ? options.hyperlinks.keys : [];
2229 2229
2230 2230 if(options.hyperlinks.target) {
2231 2231 hyperlinks.target = '' + options.hyperlinks.target;
2232 2232 } else {
2233 2233 hyperlinks.target = '_blank';
2234 2234 }
2235 2235 }
2236 2236
2237 2237 options.hyperlinks = hyperlinks;
2238 2238
2239 2239 return options;
2240 2240 }
2241 2241
2242 2242 function validateBoolOptions(options){
2243 2243 if(!options.bool){
2244 2244 options.bool = {
2245 2245 text: {
2246 2246 true : "true",
2247 2247 false : "false"
2248 2248 },
2249 2249 img : {
2250 2250 true: "",
2251 2251 false: ""
2252 2252 },
2253 2253 showImage : false,
2254 2254 showText : true
2255 2255 };
2256 2256 } else {
2257 2257 var boolOptions = options.bool;
2258 2258
2259 2259 // Show text if no option
2260 2260 if(!boolOptions.showText && !boolOptions.showImage){
2261 2261 boolOptions.showImage = false;
2262 2262 boolOptions.showText = true;
2263 2263 }
2264 2264
2265 2265 if(boolOptions.showText){
2266 2266 if(!boolOptions.text){
2267 2267 boolOptions.text = {
2268 2268 true : "true",
2269 2269 false : "false"
2270 2270 };
2271 2271 } else {
2272 2272 var t = boolOptions.text.true, f = boolOptions.text.false;
2273 2273
2274 2274 if(getType(t) != STRING || t === ''){
2275 2275 boolOptions.text.true = 'true';
2276 2276 }
2277 2277
2278 2278 if(getType(f) != STRING || f === ''){
2279 2279 boolOptions.text.false = 'false';
2280 2280 }
2281 2281 }
2282 2282 }
2283 2283
2284 2284 if(boolOptions.showImage){
2285 2285 if(!boolOptions.img.true && !boolOptions.img.false){
2286 2286 boolOptions.showImage = false;
2287 2287 }
2288 2288 }
2289 2289 }
2290 2290
2291 2291 return options;
2292 2292 }
2293 2293
2294 2294 return {
2295 2295 format: format
2296 2296 };
2297 2297 }));
2298 2298
2299 2299 ;//! moment.js
2300 2300 //! version : 2.8.4
2301 2301 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
2302 2302 //! license : MIT
2303 2303 //! momentjs.com
2304 2304 (function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return zb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){tb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return m(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){qc[a]||(e(b),qc[a]=!0)}function h(a,b){return function(c){return p(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(){}function k(a,b){b!==!1&&F(a),n(this,a),this._d=new Date(+a._d)}function l(a){var b=y(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=tb.localeData(),this._bubble()}function m(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function n(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Ib.length>0)for(c in Ib)d=Ib[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function o(a){return 0>a?Math.ceil(a):Math.floor(a)}function p(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.length<b;)d="0"+d;return(e?c?"+":"":"-")+d}function q(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function r(a,b){var c;return b=K(b,a),a.isBefore(b)?c=q(a,b):(c=q(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c}function s(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(g(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=tb.duration(c,d),t(this,e,a),this}}function t(a,b,c,d){var e=b._milliseconds,f=b._days,g=b._months;d=null==d?!0:d,e&&a._d.setTime(+a._d+e*c),f&&nb(a,"Date",mb(a,"Date")+f*c),g&&lb(a,mb(a,"Month")+g*c),d&&tb.updateOffset(a,f||g)}function u(a){return"[object Array]"===Object.prototype.toString.call(a)}function v(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function w(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&A(a[d])!==A(b[d]))&&g++;return g+f}function x(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=jc[a]||kc[b]||b}return a}function y(a){var b,d,e={};for(d in a)c(a,d)&&(b=x(d),b&&(e[b]=a[d]));return e}function z(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}tb[b]=function(e,f){var g,h,i=tb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=tb().utc().set(d,a);return i.call(tb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function A(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function B(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function C(a,b,c){return hb(tb([a,11,31+b-c]),b,c).week}function D(a){return E(a)?366:365}function E(a){return a%4===0&&a%100!==0||a%400===0}function F(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Bb]<0||a._a[Bb]>11?Bb:a._a[Cb]<1||a._a[Cb]>B(a._a[Ab],a._a[Bb])?Cb:a._a[Db]<0||a._a[Db]>24||24===a._a[Db]&&(0!==a._a[Eb]||0!==a._a[Fb]||0!==a._a[Gb])?Db:a._a[Eb]<0||a._a[Eb]>59?Eb:a._a[Fb]<0||a._a[Fb]>59?Fb:a._a[Gb]<0||a._a[Gb]>999?Gb:-1,a._pf._overflowDayOfYear&&(Ab>b||b>Cb)&&(b=Cb),a._pf.overflow=b)}function G(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function H(a){return a?a.toLowerCase().replace("_","-"):a}function I(a){for(var b,c,d,e,f=0;f<a.length;){for(e=H(a[f]).split("-"),b=e.length,c=H(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=J(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&w(e,c,!0)>=b-1)break;b--}f++}return null}function J(a){var b=null;if(!Hb[a]&&Jb)try{b=tb.locale(),require("./locale/"+a),tb.locale(b)}catch(c){}return Hb[a]}function K(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(tb.isMoment(a)||v(a)?+a:+tb(a))-+c,c._d.setTime(+c._d+d),tb.updateOffset(c,!1),c):tb(a).local()}function L(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function M(a){var b,c,d=a.match(Nb);for(b=0,c=d.length;c>b;b++)d[b]=pc[d[b]]?pc[d[b]]:L(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function N(a,b){return a.isValid()?(b=O(b,a.localeData()),lc[b]||(lc[b]=M(b)),lc[b](a)):a.localeData().invalidDate()}function O(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Ob.lastIndex=0;d>=0&&Ob.test(a);)a=a.replace(Ob,c),Ob.lastIndex=0,d-=1;return a}function P(a,b){var c,d=b._strict;switch(a){case"Q":return Zb;case"DDDD":return _b;case"YYYY":case"GGGG":case"gggg":return d?ac:Rb;case"Y":case"G":case"g":return cc;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?bc:Sb;case"S":if(d)return Zb;case"SS":if(d)return $b;case"SSS":if(d)return _b;case"DDD":return Qb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ub;case"a":case"A":return b._locale._meridiemParse;case"x":return Xb;case"X":return Yb;case"Z":case"ZZ":return Vb;case"T":return Wb;case"SSSS":return Tb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?$b:Pb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Pb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp(Y(X(a.replace("\\","")),"i"))}}function Q(a){a=a||"";var b=a.match(Vb)||[],c=b[b.length-1]||[],d=(c+"").match(hc)||["-",0,0],e=+(60*d[1])+A(d[2]);return"+"===d[0]?-e:e}function R(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Bb]=3*(A(b)-1));break;case"M":case"MM":null!=b&&(e[Bb]=A(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Bb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Cb]=A(b));break;case"Do":null!=b&&(e[Cb]=A(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=A(b));break;case"YY":e[Ab]=tb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Ab]=A(b);break;case"a":case"A":c._isPm=c._locale.isPM(b);break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Db]=A(b);break;case"m":case"mm":e[Eb]=A(b);break;case"s":case"ss":e[Fb]=A(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Gb]=A(1e3*("0."+b));break;case"x":c._d=new Date(A(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=Q(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=A(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=tb.parseTwoDigitYear(b)}}function S(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Ab],hb(tb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Ab],hb(tb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=ib(d,e,f,h,g),a._a[Ab]=i.year,a._dayOfYear=i.dayOfYear}function T(a){var c,d,e,f,g=[];if(!a._d){for(e=V(a),a._w&&null==a._a[Cb]&&null==a._a[Bb]&&S(a),a._dayOfYear&&(f=b(a._a[Ab],e[Ab]),a._dayOfYear>D(f)&&(a._pf._overflowDayOfYear=!0),d=db(f,0,a._dayOfYear),a._a[Bb]=d.getUTCMonth(),a._a[Cb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Db]&&0===a._a[Eb]&&0===a._a[Fb]&&0===a._a[Gb]&&(a._nextDay=!0,a._a[Db]=0),a._d=(a._useUTC?db:cb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()+a._tzm),a._nextDay&&(a._a[Db]=24)}}function U(a){var b;a._d||(b=y(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],T(a))}function V(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function W(b){if(b._f===tb.ISO_8601)return void $(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=O(b._f,b._locale).match(Nb)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(P(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),pc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),R(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Db]<=12&&(b._pf.bigHour=a),b._isPm&&b._a[Db]<12&&(b._a[Db]+=12),b._isPm===!1&&12===b._a[Db]&&(b._a[Db]=0),T(b),F(b)}function X(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function Y(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Z(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;f<a._f.length;f++)g=0,b=n({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._pf=d(),b._f=a._f[f],W(b),G(b)&&(g+=b._pf.charsLeftOver,g+=10*b._pf.unusedTokens.length,b._pf.score=g,(null==e||e>g)&&(e=g,c=b));m(a,c||b)}function $(a){var b,c,d=a._i,e=dc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=fc.length;c>b;b++)if(fc[b][1].exec(d)){a._f=fc[b][0]+(e[6]||" ");break}for(b=0,c=gc.length;c>b;b++)if(gc[b][1].exec(d)){a._f+=gc[b][0];break}d.match(Vb)&&(a._f+="Z"),W(a)}else a._isValid=!1}function _(a){$(a),a._isValid===!1&&(delete a._isValid,tb.createFromInputFallback(a))}function ab(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function bb(b){var c,d=b._i;d===a?b._d=new Date:v(d)?b._d=new Date(+d):null!==(c=Kb.exec(d))?b._d=new Date(+c[1]):"string"==typeof d?_(b):u(d)?(b._a=ab(d.slice(0),function(a){return parseInt(a,10)}),T(b)):"object"==typeof d?U(b):"number"==typeof d?b._d=new Date(d):tb.createFromInputFallback(b)}function cb(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function db(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function eb(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function fb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function gb(a,b,c){var d=tb.duration(a).abs(),e=yb(d.as("s")),f=yb(d.as("m")),g=yb(d.as("h")),h=yb(d.as("d")),i=yb(d.as("M")),j=yb(d.as("y")),k=e<mc.s&&["s",e]||1===f&&["m"]||f<mc.m&&["mm",f]||1===g&&["h"]||g<mc.h&&["hh",g]||1===h&&["d"]||h<mc.d&&["dd",h]||1===i&&["M"]||i<mc.M&&["MM",i]||1===j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,fb.apply({},k)}function hb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=tb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function ib(a,b,c,d,e){var f,g,h=db(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:D(a-1)+g}}function jb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||tb.localeData(b._l),null===d||e===a&&""===d?tb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),tb.isMoment(d)?new k(d,!0):(e?u(e)?Z(b):W(b):bb(b),c=new k(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function kb(a,b){var c,d;if(1===b.length&&u(b[0])&&(b=b[0]),!b.length)return tb();for(c=b[0],d=1;d<b.length;++d)b[d][a](c)&&(c=b[d]);return c}function lb(a,b){var c;return"string"==typeof b&&(b=a.localeData().monthsParse(b),"number"!=typeof b)?a:(c=Math.min(a.date(),B(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a)}function mb(a,b){return a._d["get"+(a._isUTC?"UTC":"")+b]()}function nb(a,b,c){return"Month"===b?lb(a,c):a._d["set"+(a._isUTC?"UTC":"")+b](c)}function ob(a,b){return function(c){return null!=c?(nb(this,a,c),tb.updateOffset(this,b),this):mb(this,a)}}function pb(a){return 400*a/146097}function qb(a){return 146097*a/400}function rb(a){tb.duration.fn[a]=function(){return this._data[a]}}function sb(a){"undefined"==typeof ender&&(ub=xb.moment,xb.moment=a?f("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.",tb):tb)}for(var tb,ub,vb,wb="2.8.4",xb="undefined"!=typeof global?global:this,yb=Math.round,zb=Object.prototype.hasOwnProperty,Ab=0,Bb=1,Cb=2,Db=3,Eb=4,Fb=5,Gb=6,Hb={},Ib=[],Jb="undefined"!=typeof module&&module&&module.exports,Kb=/^\/?Date\((\-?\d+)/i,Lb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,Mb=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Nb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,Ob=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Pb=/\d\d?/,Qb=/\d{1,3}/,Rb=/\d{1,4}/,Sb=/[+\-]?\d{1,6}/,Tb=/\d+/,Ub=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Vb=/Z|[\+\-]\d\d:?\d\d/gi,Wb=/T/i,Xb=/[\+\-]?\d+/,Yb=/[\+\-]?\d+(\.\d{1,3})?/,Zb=/\d/,$b=/\d\d/,_b=/\d{3}/,ac=/\d{4}/,bc=/[+-]?\d{6}/,cc=/[+-]?\d+/,dc=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ec="YYYY-MM-DDTHH:mm:ssZ",fc=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],gc=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],hc=/([\+\-]|\d\d)/gi,ic=("Date|Hours|Minutes|Seconds|Milliseconds".split("|"),{Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6}),jc={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",Q:"quarter",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},kc={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},lc={},mc={s:45,m:45,h:22,d:26,M:11},nc="DDD w W M D d".split(" "),oc="M D H h m s w W".split(" "),pc={M:function(){return this.month()+1},MMM:function(a){return this.localeData().monthsShort(this,a)},MMMM:function(a){return this.localeData().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.localeData().weekdaysMin(this,a)},ddd:function(a){return this.localeData().weekdaysShort(this,a)},dddd:function(a){return this.localeData().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return p(this.year()%100,2)},YYYY:function(){return p(this.year(),4)},YYYYY:function(){return p(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+p(Math.abs(a),6)},gg:function(){return p(this.weekYear()%100,2)},gggg:function(){return p(this.weekYear(),4)},ggggg:function(){return p(this.weekYear(),5)},GG:function(){return p(this.isoWeekYear()%100,2)},GGGG:function(){return p(this.isoWeekYear(),4)},GGGGG:function(){return p(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return A(this.milliseconds()/100)},SS:function(){return p(A(this.milliseconds()/10),2)},SSS:function(){return p(this.milliseconds(),3)},SSSS:function(){return p(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+p(A(a/60),2)+":"+p(A(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+p(A(a/60),2)+p(A(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},qc={},rc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];nc.length;)vb=nc.pop(),pc[vb+"o"]=i(pc[vb],vb);for(;oc.length;)vb=oc.pop(),pc[vb+vb]=h(pc[vb],2);pc.DDDD=h(pc.DDD,3),m(j.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=tb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=tb([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return hb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),tb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),jb(g)},tb.suppressDeprecationWarnings=!1,tb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),tb.min=function(){var a=[].slice.call(arguments,0);return kb("isBefore",a)},tb.max=function(){var a=[].slice.call(arguments,0);return kb("isAfter",a)},tb.utc=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=b,g._f=c,g._strict=f,g._pf=d(),jb(g).utc()},tb.unix=function(a){return tb(1e3*a)},tb.duration=function(a,b){var d,e,f,g,h=a,i=null;return tb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Lb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:A(i[Cb])*d,h:A(i[Db])*d,m:A(i[Eb])*d,s:A(i[Fb])*d,ms:A(i[Gb])*d}):(i=Mb.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):"object"==typeof h&&("from"in h||"to"in h)&&(g=r(tb(h.from),tb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new l(h),tb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},tb.version=wb,tb.defaultFormat=ec,tb.ISO_8601=function(){},tb.momentProperties=Ib,tb.updateOffset=function(){},tb.relativeTimeThreshold=function(b,c){return mc[b]===a?!1:c===a?mc[b]:(mc[b]=c,!0)},tb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return tb.locale(a,b)}),tb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?tb.defineLocale(a,b):tb.localeData(a),c&&(tb.duration._locale=tb._locale=c)),tb._locale._abbr},tb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Hb[a]||(Hb[a]=new j),Hb[a].set(b),tb.locale(a),Hb[a]):(delete Hb[a],null)},tb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return tb.localeData(a)}),tb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return tb._locale;if(!u(a)){if(b=J(a))return b;a=[a]}return I(a)},tb.isMoment=function(a){return a instanceof k||null!=a&&c(a,"_isAMomentObject")},tb.isDuration=function(a){return a instanceof l};for(vb=rc.length-1;vb>=0;--vb)z(rc[vb]);tb.normalizeUnits=function(a){return x(a)},tb.invalid=function(a){var b=tb.utc(0/0);return null!=a?m(b._pf,a):b._pf.userInvalidated=!0,b},tb.parseZone=function(){return tb.apply(null,arguments).parseZone()},tb.parseTwoDigitYear=function(a){return A(a)+(A(a)>68?1900:2e3)},m(tb.fn=k.prototype,{clone:function(){return tb(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=tb(this).utc();return 0<a.year()&&a.year()<=9999?"function"==typeof Date.prototype.toISOString?this.toDate().toISOString():N(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):N(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return G(this)},isDSTShifted:function(){return this._a?this.isValid()&&w(this._a,(this._isUTC?tb.utc(this._a):tb(this._a)).toArray())>0:!1},parsingFlags:function(){return m({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.zone(0,a)},local:function(a){return this._isUTC&&(this.zone(0,a),this._isUTC=!1,a&&this.add(this._dateTzOffset(),"m")),this},format:function(a){var b=N(this,a||tb.defaultFormat);return this.localeData().postformat(b)},add:s(1,"add"),subtract:s(-1,"subtract"),diff:function(a,b,c){var d,e,f,g=K(a,this),h=6e4*(this.zone()-g.zone());return b=x(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+g.daysInMonth()),e=12*(this.year()-g.year())+(this.month()-g.month()),f=this-tb(this).startOf("month")-(g-tb(g).startOf("month")),f-=6e4*(this.zone()-tb(this).startOf("month").zone()-(g.zone()-tb(g).startOf("month").zone())),e+=f/d,"year"===b&&(e/=12)):(d=this-g,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-h)/864e5:"week"===b?(d-h)/6048e5:d),c?e:o(e)},from:function(a,b){return tb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(tb(),a)},calendar:function(a){var b=a||tb(),c=K(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,tb(b)))},isLeapYear:function(){return E(this.year())},isDST:function(){return this.zone()<this.clone().month(0).zone()||this.zone()<this.clone().month(5).zone()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=eb(a,this.localeData()),this.add(a-b,"d")):b},month:ob("Month",!0),startOf:function(a){switch(a=x(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=x(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=x("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+this>+a):(c=tb.isMoment(a)?+a:+tb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=x("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+a>+this):(c=tb.isMoment(a)?+a:+tb(a),+this.clone().endOf(b)<c)},isSame:function(a,b){var c;return b=x(b||"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+this===+a):(c=+tb(a),+this.clone().startOf(b)<=c&&c<=+this.clone().endOf(b))},min:f("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(a){return a=tb.apply(null,arguments),this>a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=tb.apply(null,arguments),a>this?this:a}),zone:function(a,b){var c,d=this._offset||0;return null==a?this._isUTC?d:this._dateTzOffset():("string"==typeof a&&(a=Q(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateTzOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.subtract(c,"m"),d!==a&&(!b||this._changeInProgress?t(this,tb.duration(d-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,tb.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?tb(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return B(this.year(),this.month())},dayOfYear:function(a){var b=yb((tb(this).startOf("day")-tb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=hb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=hb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=hb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return C(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return C(this.year(),a.dow,a.doy)},get:function(a){return a=x(a),this[a]()},set:function(a,b){return a=x(a),"function"==typeof this[a]&&this[a](b),this},locale:function(b){var c;return b===a?this._locale._abbr:(c=tb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),tb.fn.millisecond=tb.fn.milliseconds=ob("Milliseconds",!1),tb.fn.second=tb.fn.seconds=ob("Seconds",!1),tb.fn.minute=tb.fn.minutes=ob("Minutes",!1),tb.fn.hour=tb.fn.hours=ob("Hours",!0),tb.fn.date=ob("Date",!0),tb.fn.dates=f("dates accessor is deprecated. Use date instead.",ob("Date",!0)),tb.fn.year=ob("FullYear",!0),tb.fn.years=f("years accessor is deprecated. Use year instead.",ob("FullYear",!0)),tb.fn.days=tb.fn.day,tb.fn.months=tb.fn.month,tb.fn.weeks=tb.fn.week,tb.fn.isoWeeks=tb.fn.isoWeek,tb.fn.quarters=tb.fn.quarter,tb.fn.toJSON=tb.fn.toISOString,m(tb.duration.fn=l.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=o(d/1e3),g.seconds=a%60,b=o(a/60),g.minutes=b%60,c=o(b/60),g.hours=c%24,e+=o(c/24),h=o(pb(e)),e-=o(qb(h)),f+=o(e/30),e%=30,h+=o(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return o(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*A(this._months/12)},humanize:function(a){var b=gb(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=tb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=tb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=x(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=x(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*pb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(qb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;
2305 2305 case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:tb.fn.lang,locale:tb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale}}),tb.duration.fn.toString=tb.duration.fn.toISOString;for(vb in ic)c(ic,vb)&&rb(vb.toLowerCase());tb.duration.fn.asMilliseconds=function(){return this.as("ms")},tb.duration.fn.asSeconds=function(){return this.as("s")},tb.duration.fn.asMinutes=function(){return this.as("m")},tb.duration.fn.asHours=function(){return this.as("h")},tb.duration.fn.asDays=function(){return this.as("d")},tb.duration.fn.asWeeks=function(){return this.as("weeks")},tb.duration.fn.asMonths=function(){return this.as("M")},tb.duration.fn.asYears=function(){return this.as("y")},tb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===A(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),Jb?module.exports=tb:"function"==typeof define&&define.amd?(define("moment",function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(xb.moment=ub),tb}),sb(!0)):sb()}).call(this);
2306 2306 ;!function(){function n(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function t(n){return null===n?0/0:+n}function e(n){return!isNaN(n)}function r(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function u(n){return n.length}function i(n){for(var t=1;n*t%1;)t*=10;return t}function o(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function a(){this._=Object.create(null)}function c(n){return(n+="")===da||n[0]===ma?ma+n:n}function l(n){return(n+="")[0]===ma?n.slice(1):n}function s(n){return c(n)in this._}function f(n){return(n=c(n))in this._&&delete this._[n]}function h(){var n=[];for(var t in this._)n.push(l(t));return n}function g(){var n=0;for(var t in this._)++n;return n}function p(){for(var n in this._)return!1;return!0}function v(){this._=Object.create(null)}function d(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function m(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=ya.length;r>e;++e){var u=ya[e]+t;if(u in n)return u}}function y(){}function M(){}function x(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new a;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function b(){ta.event.preventDefault()}function _(){for(var n,t=ta.event;n=t.sourceEvent;)t=n;return t}function w(n){for(var t=new M,e=0,r=arguments.length;++e<r;)t[arguments[e]]=x(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=ta.event;u.target=n,ta.event=u,t[u.type].apply(e,r)}finally{ta.event=i}}},t}function S(n){return xa(n,ka),n}function k(n){return"function"==typeof n?n:function(){return ba(n,this)}}function E(n){return"function"==typeof n?n:function(){return _a(n,this)}}function A(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ta.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function N(n){return n.trim().replace(/\s+/g," ")}function C(n){return new RegExp("(?:^|\\s+)"+ta.requote(n)+"(?:\\s+|$)","g")}function z(n){return(n+"").trim().split(/^|\s+/)}function q(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=z(n).map(L);var u=n.length;return"function"==typeof t?r:e}function L(n){var t=C(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",N(u+" "+n))):e.setAttribute("class",N(u.replace(t," ")))}}function T(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function R(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function D(n){return"function"==typeof n?n:(n=ta.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function P(){var n=this.parentNode;n&&n.removeChild(this)}function U(n){return{__data__:n}}function j(n){return function(){return Sa(this,n)}}function F(t){return arguments.length||(t=n),function(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}}function H(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function O(n){return xa(n,Aa),n}function Y(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function I(n){var t=n.__transition__;t&&++t.active}function Z(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,ra(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+ta.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=V;a>0&&(n=n.slice(0,a));var l=Ca.get(n);return l&&(n=l,c=X),a?t?u:r:t?y:i}function V(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function X(n,t){var e=V(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function $(){var n=".dragsuppress-"+ ++qa,t="click"+n,e=ta.select(oa).on("touchmove"+n,b).on("dragstart"+n,b).on("selectstart"+n,b);if(za){var r=ia.style,u=r[za];r[za]="none"}return function(i){if(e.on(n,null),za&&(r[za]=u),i){var o=function(){e.on(t,null)};e.on(t,function(){b(),o()},!0),setTimeout(o,0)}}}function B(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>La&&(oa.scrollX||oa.scrollY)){e=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();La=!(u.f||u.e),e.remove()}return La?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function W(){return ta.event.changedTouches[0].identifier}function J(){return ta.event.target}function G(){return oa}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?Da:Math.acos(n)}function tt(n){return n>1?ja:-1>n?-ja:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Fa)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Ja,r=pt(r)*Ga,i=pt(i)*Ka,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Ha,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,255&n>>8,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=tc.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Ja),u=vt((.2126729*n+.7151522*t+.072175*e)/Ga),i=vt((.0193339*n+.119192*t+.9503041*e)/Ka);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return n}function Nt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Ct(t,e,n,r)}}function Ct(n,t,e,r){function u(){var n,t=c.status;if(!t&&qt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!oa.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(zt(r))}function zt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function qt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function Lt(){var n=Tt(),t=Rt()-n;t>24?(isFinite(t)&&(clearTimeout(ic),ic=setTimeout(Lt,t)),uc=0):(uc=1,ac(Lt))}function Tt(){var n=Date.now();for(oc=ec;oc;)n>=oc.t&&(oc.f=oc.c(n-oc.t)),oc=oc.n;return n}function Rt(){for(var n,t=ec,e=1/0;t;)t.f?t=n?n.n=t.n:ec=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return rc=n,e}function Dt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Pt(n,t){var e=Math.pow(10,3*va(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Ut(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:At;return function(n){var e=lc.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=sc.get(g)||jt;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function jt(n){return n+""}function Ft(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ht(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new hc(e-1)),1),e}function i(n,e){return t(n=new hc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{hc=Ft;var r=new Ft;return r._=n,o(r,t,e)}finally{hc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ot(n);return c.floor=c,c.round=Ot(r),c.ceil=Ot(u),c.offset=Ot(i),c.range=a,n}function Ot(n){return function(t,e){try{hc=Ft;var r=new Ft;return r._=t,n(r,e)._}finally{hc=Date}}}function Yt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(c,a)),null!=(u=pc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=N[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.slice(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&hc!==Ft,o=new(i?Ft:hc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(0|r.Z/100),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in pc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{hc=Ft;var t=new hc;return t._=n,r(t)}finally{hc=Date}}var r=t(n);return e.parse=function(n){try{hc=Ft;var t=r.parse(n);return t&&t._}finally{hc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ce;var M=ta.map(),x=Zt(v),b=Vt(v),_=Zt(d),w=Vt(d),S=Zt(m),k=Vt(m),E=Zt(y),A=Vt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+fc.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(fc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(fc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:oe,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:ne,e:ne,H:ee,I:ee,j:te,L:ie,m:Qt,M:re,p:s,S:ue,U:$t,w:Xt,W:Bt,x:c,X:l,y:Jt,Y:Wt,Z:Gt,"%":ae};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Zt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Vt(n){for(var t=new a,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Xt(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function $t(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Bt(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Wt(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Jt(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.y=Kt(+r[0]),e+r[0].length):-1}function Gt(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Kt(n){return n+(n>68?1900:2e3)}function Qt(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function ne(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function te(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function ee(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function re(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ue(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ie(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function oe(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=0|va(t)/60,u=va(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function ae(n,t,e){dc.lastIndex=0;var r=dc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ce(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function le(){}function se(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function fe(n,t){n&&xc.hasOwnProperty(n.type)&&xc[n.type](n,t)}function he(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function ge(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)he(n[e],t,1);t.polygonEnd()}function pe(){function n(n,t){n*=Fa,t=t*Fa/2+Da/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);_c.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;wc.point=function(o,a){wc.point=n,r=(t=o)*Fa,u=Math.cos(a=(e=a)*Fa/2+Da/4),i=Math.sin(a)},wc.lineEnd=function(){n(t,e)}}function ve(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function de(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function me(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function ye(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Me(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function xe(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function be(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function _e(n,t){return va(n[0]-t[0])<Ta&&va(n[1]-t[1])<Ta}function we(n,t){n*=Fa;var e=Math.cos(t*=Fa);Se(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Se(n,t,e){++Sc,Ec+=(n-Ec)/Sc,Ac+=(t-Ac)/Sc,Nc+=(e-Nc)/Sc}function ke(){function n(n,u){n*=Fa;var i=Math.cos(u*=Fa),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);kc+=l,Cc+=l*(t+(t=o)),zc+=l*(e+(e=a)),qc+=l*(r+(r=c)),Se(t,e,r)}var t,e,r;Dc.point=function(u,i){u*=Fa;var o=Math.cos(i*=Fa);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),Dc.point=n,Se(t,e,r)}}function Ee(){Dc.point=we}function Ae(){function n(n,t){n*=Fa;var e=Math.cos(t*=Fa),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-nt(g)/h,v=Math.atan2(h,g);Lc+=p*l,Tc+=p*s,Rc+=p*f,kc+=v,Cc+=v*(r+(r=o)),zc+=v*(u+(u=a)),qc+=v*(i+(i=c)),Se(r,u,i)}var t,e,r,u,i;Dc.point=function(o,a){t=o,e=a,Dc.point=n,o*=Fa;var c=Math.cos(a*=Fa);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Se(r,u,i)},Dc.lineEnd=function(){n(t,e),Dc.lineEnd=Ee,Dc.point=we}}function Ne(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ce(){return!0}function ze(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(_e(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new Le(e,n,null,!0),l=new Le(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new Le(r,n,null,!1),l=new Le(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),qe(i),qe(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qe(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function Le(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Te(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function l(){y.point=o,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,o=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Re))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=He(m,p);g.length?(b||(i.polygonStart(),b=!0),ze(g,Pe,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=De(),x=t(M),b=!1;return y}}function Re(n){return n.length>1}function De(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:y,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Pe(n,t){return((n=n.x)[0]<0?n[1]-ja-Ta:ja-n[1])-((t=t.x)[0]<0?t[1]-ja-Ta:ja-t[1])}function Ue(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Da:-Da,c=va(i-e);va(c-Da)<Ta?(n.point(e,r=(r+o)/2>0?ja:-ja),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Da&&(va(e-u)<Ta&&(e-=u*Ta),va(i-a)<Ta&&(i-=a*Ta),r=je(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function je(n,t,e,r){var u,i,o=Math.sin(n-e);return va(o)>Ta?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function Fe(n,t,e,r){var u;if(null==n)u=e*ja,r.point(-Da,u),r.point(0,u),r.point(Da,u),r.point(Da,0),r.point(Da,-u),r.point(0,-u),r.point(-Da,-u),r.point(-Da,0),r.point(-Da,u);else if(va(n[0]-t[0])>Ta){var i=n[0]<t[0]?Da:-Da;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function He(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;_c.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+Da/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+Da/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>Da,k=p*M;if(_c.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Pa:b,S^h>=e^m>=e){var E=me(ve(f),ve(n));xe(E);var A=me(u,E);xe(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ta>i||Ta>i&&0>_c)^1&o}function Oe(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Da:-Da),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(_e(e,g)||_e(p,g))&&(p[0]+=Ta,p[1]+=Ta,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&_e(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=ve(n),u=ve(t),o=[1,0,0],a=me(r,u),c=de(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=me(o,a),p=Me(o,f),v=Me(a,h);ye(p,v);var d=g,m=de(p,d),y=de(d,d),M=m*m-y*(de(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=Me(d,(-m-x)/y);if(ye(b,p),b=be(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=va(A-Da)<Ta,C=N||Ta>A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(va(b[0]-w)<Ta?k:E):k<=b[1]&&b[1]<=E:A>Da^(w<=b[0]&&b[0]<=S)){var z=Me(d,(-m+x)/y);return ye(z,p),[b,be(z)]}}}function u(t,e){var r=o?n:Da-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=va(i)>Ta,c=pr(n,6*Fa);return Te(t,e,c,o?[0,-n]:[-Da,n-Da])}function Ye(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return va(r[0]-n)<Ta?u>0?0:3:va(r[0]-e)<Ta?u>0?2:1:va(r[1]-t)<Ta?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Uc,Math.min(Uc,n)),t=Math.max(-Uc,Math.min(Uc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=De(),N=Ye(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&ze(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ze(n){var t=0,e=Da/3,r=or(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Da/180,e=n[1]*Da/180):[180*(t/Da),180*(e/Da)]},u}function Ve(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Xe(){function n(n,t){Fc+=u*n-r*t,r=n,u=t}var t,e,r,u;Zc.point=function(i,o){Zc.point=n,t=r=i,e=u=o},Zc.lineEnd=function(){n(t,e)}}function $e(n,t){Hc>n&&(Hc=n),n>Yc&&(Yc=n),Oc>t&&(Oc=t),t>Ic&&(Ic=t)}function Be(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=We(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=We(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function We(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Je(n,t){Ec+=n,Ac+=t,++Nc}function Ge(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);Cc+=o*(t+n)/2,zc+=o*(e+r)/2,qc+=o,Je(t=n,e=r)}var t,e;Xc.point=function(r,u){Xc.point=n,Je(t=r,e=u)}}function Ke(){Xc.point=Je}function Qe(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);Cc+=o*(r+n)/2,zc+=o*(u+t)/2,qc+=o,o=u*n-r*t,Lc+=o*(r+n),Tc+=o*(u+t),Rc+=3*o,Je(r=n,u=t)}var t,e,r,u;Xc.point=function(i,o){Xc.point=n,Je(t=r=i,e=u=o)},Xc.lineEnd=function(){n(t,e)}}function nr(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Pa)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:y};return a}function tr(n){function t(n){return(a?r:e)(n)}function e(t){return ur(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=ve([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=va(va(w)-1)<Ta||va(r-h)<Ta?(r+h)/2:Math.atan2(_,b),A=n(E,k),N=A[0],C=A[1],z=N-t,q=C-e,L=M*z-y*q;
2307 2307 (L*L/x>i||va((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Fa),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function er(n){var t=tr(function(t,e){return n([t*Ha,e*Ha])});return function(n){return ar(t(n))}}function rr(n){this.stream=n}function ur(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ir(n){return or(function(){return n})()}function or(n){function t(n){return n=a(n[0]*Fa,n[1]*Fa),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Ha,n[1]*Ha]}function r(){a=Ne(o=sr(m,y,M),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=tr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,M=0,x=Pc,b=At,_=null,w=null;return t.stream=function(n){return s&&(s.valid=!1),s=ar(x(o,f(b(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(x=null==n?(_=n,Pc):Oe((_=+n)*Fa),u()):_},t.clipExtent=function(n){return arguments.length?(w=n,b=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):At,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Fa,d=n[1]%360*Fa,r()):[v*Ha,d*Ha]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Fa,y=n[1]%360*Fa,M=n.length>2?n[2]%360*Fa:0,r()):[m*Ha,y*Ha,M*Ha]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function ar(n){return ur(n,function(t,e){n.point(t*Fa,e*Fa)})}function cr(n,t){return[n,t]}function lr(n,t){return[n>Da?n-Pa:-Da>n?n+Pa:n,t]}function sr(n,t,e){return n?t||e?Ne(hr(n),gr(t,e)):hr(n):t||e?gr(t,e):lr}function fr(n){return function(t,e){return t+=n,[t>Da?t-Pa:-Da>t?t+Pa:t,e]}}function hr(n){var t=fr(n);return t.invert=fr(-n),t}function gr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function pr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=vr(e,u),i=vr(e,i),(o>0?i>u:u>i)&&(u+=o*Pa)):(u=n+o*Pa,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=be([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function vr(n,t){var e=ve(t);e[0]-=n,xe(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ta)%(2*Math.PI)}function dr(n,t,e){var r=ta.range(n,t-Ta,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function mr(n,t,e){var r=ta.range(n,t-Ta,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function yr(n){return n.source}function Mr(n){return n.target}function xr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ha,Math.atan2(o,Math.sqrt(r*r+u*u))*Ha]}:function(){return[n*Ha,t*Ha]};return p.distance=h,p}function br(){function n(n,u){var i=Math.sin(u*=Fa),o=Math.cos(u),a=va((n*=Fa)-t),c=Math.cos(a);$c+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Bc.point=function(u,i){t=u*Fa,e=Math.sin(i*=Fa),r=Math.cos(i),Bc.point=n},Bc.lineEnd=function(){Bc.point=Bc.lineEnd=y}}function _r(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function wr(n,t){function e(n,t){o>0?-ja+Ta>t&&(t=-ja+Ta):t>ja-Ta&&(t=ja-Ta);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(Da/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-ja]},e):kr}function Sr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return va(u)<Ta?cr:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function kr(n,t){return[n,Math.log(Math.tan(Da/4+t/2))]}function Er(n){var t,e=ir(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=Da*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ar(n,t){return[Math.log(Math.tan(Da/4+t/2)),-n]}function Nr(n){return n[0]}function Cr(n){return n[1]}function zr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qr(n,t){return n[0]-t[0]||n[1]-t[1]}function Lr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Tr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Rr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Dr(){eu(this),this.edge=this.site=this.circle=null}function Pr(n){var t=ol.pop()||new Dr;return t.site=n,t}function Ur(n){$r(n),rl.remove(n),ol.push(n),eu(n)}function jr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Ur(n);for(var c=i;c.circle&&va(e-c.circle.x)<Ta&&va(r-c.circle.cy)<Ta;)i=c.P,a.unshift(c),Ur(c),c=i;a.unshift(c),$r(c);for(var l=o;l.circle&&va(e-l.circle.x)<Ta&&va(r-l.circle.cy)<Ta;)o=l.N,a.push(l),Ur(l),l=o;a.push(l),$r(l);var s,f=a.length;for(s=1;f>s;++s)l=a[s],c=a[s-1],Qr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Gr(c.site,l.site,null,u),Xr(c),Xr(l)}function Fr(n){for(var t,e,r,u,i=n.x,o=n.y,a=rl._;a;)if(r=Hr(a,o)-i,r>Ta)a=a.L;else{if(u=i-Or(a,o),!(u>Ta)){r>-Ta?(t=a.P,e=a):u>-Ta?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Pr(n);if(rl.insert(t,c),t||e){if(t===e)return $r(t),e=Pr(t.site),rl.insert(c,e),c.edge=e.edge=Gr(t.site,c.site),Xr(t),Xr(e),void 0;if(!e)return c.edge=Gr(t.site,c.site),void 0;$r(t),$r(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Qr(e.edge,l,p,x),c.edge=Gr(l,n,null,x),e.edge=Gr(n,p,null,x),Xr(t),Xr(e)}}function Hr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Or(n,t){var e=n.N;if(e)return Hr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Yr(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=el,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(va(r-t)>Ta||va(u-e)>Ta)&&(a.splice(o,0,new nu(Kr(i.site,s,va(r-f)<Ta&&p-u>Ta?{x:f,y:va(t-f)<Ta?e:p}:va(u-p)<Ta&&h-r>Ta?{x:va(e-p)<Ta?t:h,y:p}:va(r-h)<Ta&&u-g>Ta?{x:h,y:va(t-h)<Ta?e:g}:va(u-g)<Ta&&r-f>Ta?{x:va(e-g)<Ta?t:f,y:g}:null),i.site,null)),++c)}function Zr(n,t){return t.angle-n.angle}function Vr(){eu(this),this.x=this.y=this.arc=this.site=this.cy=null}function Xr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,l=r.y-a,s=i.x-o,f=i.y-a,h=2*(c*f-l*s);if(!(h>=-Ra)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=al.pop()||new Vr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=il._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}il.insert(y,m),y||(ul=m)}}}}function $r(n){var t=n.circle;t&&(t.P||(ul=t.N),il.remove(t),al.push(t),eu(t),n.circle=null)}function Br(n){for(var t,e=tl,r=Ye(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Wr(t,n)||!r(t)||va(t.a.x-t.b.x)<Ta&&va(t.a.y-t.b.y)<Ta)&&(t.a=t.b=null,e.splice(u,1))}function Wr(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Jr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Gr(n,t,e,r){var u=new Jr(n,t);return tl.push(u),e&&Qr(u,n,t,e),r&&Qr(u,t,n,r),el[n.i].edges.push(new nu(u,n,t)),el[t.i].edges.push(new nu(u,t,n)),u}function Kr(n,t,e){var r=new Jr(n,null);return r.a=t,r.b=e,tl.push(r),r}function Qr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function nu(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function tu(){this._=null}function eu(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function ru(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function uu(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function iu(n){for(;n.L;)n=n.L;return n}function ou(n,t){var e,r,u,i=n.sort(au).pop();for(tl=[],el=new Array(n.length),rl=new tu,il=new tu;;)if(u=ul,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(el[i.i]=new Yr(i),Fr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;jr(u.arc)}t&&(Br(t),Ir(t));var o={cells:el,edges:tl};return rl=il=tl=el=null,o}function au(n,t){return t.y-n.y||t.x-n.x}function cu(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function lu(n){return n.x}function su(n){return n.y}function fu(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function hu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&hu(n,c[0],e,r,o,a),c[1]&&hu(n,c[1],o,r,u,a),c[2]&&hu(n,c[2],e,a,o,i),c[3]&&hu(n,c[3],o,a,u,i)}}function gu(n,t,e,r,u,i,o){var a,c=1/0;return function l(n,s,f,h,g){if(!(s>i||f>o||r>h||u>g)){if(p=n.point){var p,v=t-p[0],d=e-p[1],m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function pu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function vu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=yu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function du(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mu(n,t){var e,r,u,i=ll.lastIndex=sl.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=ll.exec(n))&&(r=sl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:du(e,r)})),i=sl.lastIndex;return i<t.length&&(u=t.slice(i),a[o]?a[o]+=u:a[++o]=u),a.length<2?c[0]?(t=c[0].x,function(n){return t(n)+""}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function yu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function Mu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(yu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function xu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function bu(n){return function(t){return 1-n(1-t)}}function _u(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function wu(n){return n*n}function Su(n){return n*n*n}function ku(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Eu(n){return function(t){return Math.pow(t,n)}}function Au(n){return 1-Math.cos(n*ja)}function Nu(n){return Math.pow(2,10*(n-1))}function Cu(n){return 1-Math.sqrt(1-n*n)}function zu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Pa*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Pa/t)}}function qu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Lu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Tu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Pu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Uu(n){var t=[n.a,n.b],e=[n.c,n.d],r=Fu(t),u=ju(t,e),i=Fu(Hu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ha,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ha:0}function ju(n,t){return n[0]*t[0]+n[1]*t[1]}function Fu(n){var t=Math.sqrt(ju(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Hu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ou(n,t){var e,r=[],u=[],i=ta.transform(n),o=ta.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:du(a[0],c[0])},{i:3,x:du(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:du(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:du(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:du(g[0],p[0])},{i:e-2,x:du(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Yu(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Iu(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Zu(n){for(var t=n.source,e=n.target,r=Xu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Vu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Xu(n,t){if(n===t)return n;for(var e=Vu(n),r=Vu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function $u(n){n.fixed|=2}function Bu(n){n.fixed&=-7}function Wu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Ju(n){n.fixed&=-5}function Gu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Gu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Ku(n,t){return ta.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ui,n}function Qu(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function ni(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++o<u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function ti(n){return n.children}function ei(n){return n.value}function ri(n,t){return t.value-n.value}function ui(n){return ta.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ii(n){return n.x}function oi(n){return n.y}function ai(n,t,e){n.y0=t,n.y=e}function ci(n){return ta.range(n.length)}function li(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function si(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function fi(n){return n.reduce(hi,0)}function hi(n,t){return n+t[1]}function gi(n,t){return pi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function pi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function vi(n){return[ta.min(n),ta.max(n)]}function di(n,t){return n.value-t.value}function mi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function yi(n,t){n._pack_next=t,t._pack_prev=n}function Mi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function xi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(bi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],Si(r,u,i),t(i),mi(r,i),r._pack_prev=i,mi(i,u),u=r._pack_next,o=3;l>o;o++){Si(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(Mi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!Mi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?yi(r,u=a):yi(r=c,u),o--):(mi(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(_i)}}function bi(n){n._pack_next=n._pack_prev=n}function _i(n){delete n._pack_next,delete n._pack_prev}function wi(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)wi(u[i],t,e,r)}function Si(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function ki(n,t){return n.parent==t.parent?1:2}function Ei(n){var t=n.children;return t.length?t[0]:n.t}function Ai(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ni(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Ci(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function zi(n,t,e){return n.a.parent===t.parent?n.a:e}function qi(n){return 1+ta.max(n,function(n){return n.y})}function Li(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ti(n){var t=n.children;return t&&t.length?Ti(t[0]):n}function Ri(n){var t,e=n.children;return e&&(t=e.length)?Ri(e[t-1]):n}function Di(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Pi(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ui(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function ji(n){return n.rangeExtent?n.rangeExtent():Ui(n.range())}function Fi(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Hi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Oi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:bl}function Yi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=ta.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Ii(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Yi:Fi,c=r?Iu:Yu;return o=u(n,t,c,e),a=u(t,n,c,yu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Pu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return $i(n,t)},i.tickFormat=function(t,e){return Bi(n,t,e)},i.nice=function(t){return Vi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Zi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Vi(n,t){return Hi(n,Oi(Xi(n,t)[2]))}function Xi(n,t){null==t&&(t=10);var e=Ui(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function $i(n,t){return ta.range.apply(ta,Xi(n,t))}function Bi(n,t,e){var r=Xi(n,t);if(e){var u=lc.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(va(r[0]),va(r[1])));return u[7]||(u[7]="."+Wi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Ji(u[8],r)),e=u.join("")}else e=",."+Wi(r[2])+"f";return ta.format(e)}function Wi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Ji(n,t){var e=Wi(t[2]);return n in _l?Math.abs(e-Wi(Math.max(va(t[0]),va(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Gi(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Hi(r.map(u),e?Math:Sl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Ui(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return wl;arguments.length<2?t=wl:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Gi(n.copy(),t,e,r)},Zi(o,n)}function Ki(n,t,e){function r(t){return n(u(t))}var u=Qi(t),i=Qi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return $i(e,n)},r.tickFormat=function(n,t){return Bi(e,n,t)},r.nice=function(n){return r.domain(Vi(e,n))},r.exponent=function(o){return arguments.length?(u=Qi(t=o),i=Qi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Ki(n.copy(),t,e)},Zi(r,n)}function Qi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function no(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new a;for(var i,o=-1,c=r.length;++o<c;)u.has(i=r[o])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,o=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=(c+l)/2,0):(l-c)/(n.length-1+a);return i=r(c+s*a/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=l=Math.round((c+l)/2),0):0|(l-c)/(n.length-1+a);return i=r(c+Math.round(s*a/2+(l-c-(n.length-1+a)*s)/2),s),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-a+2*c);return i=r(s+h*c,h),l&&i.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-a+2*c));return i=r(s+Math.round((f-s-(n.length-a)*h)/2),h),l&&i.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Ui(t.a[0])},e.copy=function(){return no(n,t)},e.domain(n)}function to(r,u){function i(){var n=0,t=u.length;for(a=[];++n<t;)a[n-1]=ta.quantile(r,n/t);return o}function o(n){return isNaN(n=+n)?void 0:u[ta.bisect(a,n)]}var a;return o.domain=function(u){return arguments.length?(r=u.map(t).filter(e).sort(n),i()):r},o.range=function(n){return arguments.length?(u=n,i()):u},o.quantiles=function(){return a},o.invertExtent=function(n){return n=u.indexOf(n),0>n?[0/0,0/0]:[n>0?a[n-1]:r[0],n<a.length?a[n]:r[r.length-1]]},o.copy=function(){return to(r,u)},i()}function eo(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return eo(n,t,e)},u()}function ro(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ro(n,t)},e}function uo(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return $i(n,t)},t.tickFormat=function(t,e){return Bi(n,t,e)},t.copy=function(){return uo(n)},t}function io(){return 0}function oo(n){return n.innerRadius}function ao(n){return n.outerRadius}function co(n){return n.startAngle}function lo(n){return n.endAngle}function so(n){return n&&n.padAngle}function fo(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function ho(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function go(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Nr,r=Cr,u=Ce,i=po,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=zl.get(n)||po).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function po(n){return n.join("L")}function vo(n){return po(n)+"Z"}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function yo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function Mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function xo(n,t){return n.length<4?po(n):n[1]+wo(n.slice(1,-1),So(n,t))}function bo(n,t){return n.length<3?po(n):n[0]+wo((n.push(n[0]),n),So([n[n.length-2]].concat(n,[n[1]]),t))}function _o(n,t){return n.length<3?po(n):n[0]+wo(n,So(n,t))}function wo(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return po(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function So(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function ko(n){if(n.length<3)return po(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",Co(Tl,o),",",Co(Tl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),zo(c,o,a);return n.pop(),c.push("L",r),c.join("")}function Eo(n){if(n.length<4)return po(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(Co(Tl,i)+","+Co(Tl,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),zo(e,i,o);return e.join("")}function Ao(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[Co(Tl,o),",",Co(Tl,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),zo(t,o,a);return t.join("")}function No(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return ko(n)}function Co(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function zo(n,t,e){n.push("C",Co(ql,t),",",Co(ql,e),",",Co(Ll,t),",",Co(Ll,e),",",Co(Tl,t),",",Co(Tl,e))}function qo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Lo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=qo(u,i);++t<e;)r[t]=(o+(o=qo(u=i,i=n[t+1])))/2;return r[t]=o,r}function To(n){for(var t,e,r,u,i=[],o=Lo(n),a=-1,c=n.length-1;++a<c;)t=qo(n[a],n[a+1]),va(t)<Ta?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Ro(n){return n.length<3?po(n):n[0]+wo(n,To(n))}function Do(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-ja,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Po(n){function t(t){function c(){v.push("M",a(n(m),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=Et(e),b=Et(u),_=e===r?function(){return g}:Et(r),w=u===i?function(){return p}:Et(i);++y<M;)o.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Nr,r=Nr,u=0,i=Cr,o=Ce,a=po,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=zl.get(n)||po).key,l=a.reverse||a,s=a.closed?"M":"L",t):c
2308 2308 },t.tension=function(n){return arguments.length?(f=n,t):f},t}function Uo(n){return n.radius}function jo(n){return[n.x,n.y]}function Fo(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-ja;return[e*Math.cos(r),e*Math.sin(r)]}}function Ho(){return 64}function Oo(){return"circle"}function Yo(n){var t=Math.sqrt(n/Da);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Io(n,t,e){return xa(n,Fl),n.namespace=t,n.id=e,n}function Zo(n,t,e,r){var u=n.id,i=n.namespace;return H(n,"function"==typeof e?function(n,o,a){n[i][u].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Vo(n){return null==n&&(n=""),function(){this.textContent=n}}function Xo(n){return null==n?"__transition__":"__transition_"+n+"__"}function $o(n,t,e,r,u){var i=n[e]||(n[e]={active:0,count:0}),o=i[r];if(!o){var c=u.time;o=i[r]={tween:new a,time:c,delay:u.delay,duration:u.duration,ease:u.ease},u=null,++i.count,ta.timer(function(u){function a(e){return i.active>r?s(!1):(i.active=r,o.event&&o.event.start.call(n,g,t),o.tween.forEach(function(e,r){(r=r.call(n,g,t))&&d.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return v.c=l(e||1)?Ce:l,1},0,c),void 0)}function l(t){if(i.active!==r)return s(!1);for(var e=t/f,u=h(e),o=d.length;o>0;)d[--o].call(n,u);return e>=1?s(!0):void 0}function s(u){return o.event&&o.event[u?"end":"interrupt"].call(n,g,t),--i.count?delete i[r]:delete n[e],1}var f,h,g=n.__data__,p=o.delay,v=oc,d=[];return v.t=p+c,u>=p?a(u-p):(v.c=a,void 0)},0,c)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Bl,u);return i==Bl.length?[t.year,Xi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Bl[i-1]<Bl[i]/u?i-1:i]:[Gl,Xi(n,e)[2]]}return r.invert=function(t){return Ko(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ko)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Ko(+e+1),t).length}var i=r.domain(),o=Ui(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Hi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Ui(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Zi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.0"};Date.now||(Date.now=function(){return+new Date});var ea=[].slice,ra=function(n){return ea.call(n)},ua=document,ia=ua.documentElement,oa=window;try{ra(ia.childNodes)[0].nodeType}catch(aa){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{ua.createElement("div").style.setProperty("opacity",0,"")}catch(ca){var la=oa.Element.prototype,sa=la.setAttribute,fa=la.setAttributeNS,ha=oa.CSSStyleDeclaration.prototype,ga=ha.setProperty;la.setAttribute=function(n,t){sa.call(this,n,t+"")},la.setAttributeNS=function(n,t,e){fa.call(this,n,t,e+"")},ha.setProperty=function(n,t,e){ga.call(this,n,t+"",e)}}ta.ascending=n,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var r,u=0,i=n.length,o=-1;if(1===arguments.length)for(;++o<i;)e(r=+n[o])&&(u+=r);else for(;++o<i;)e(r=+t.call(n,n[o],o))&&(u+=r);return u},ta.mean=function(n,r){var u,i=0,o=n.length,a=-1,c=o;if(1===arguments.length)for(;++a<o;)e(u=t(n[a]))?i+=u:--c;else for(;++a<o;)e(u=t(r.call(n,n[a],a)))?i+=u:--c;return c?i/c:void 0},ta.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},ta.median=function(r,u){var i,o=[],a=r.length,c=-1;if(1===arguments.length)for(;++c<a;)e(i=t(r[c]))&&o.push(i);else for(;++c<a;)e(i=t(u.call(r,r[c],c)))&&o.push(i);return o.length?ta.quantile(o.sort(n),.5):void 0};var pa=r(n);ta.bisectLeft=pa.left,ta.bisect=ta.bisectRight=pa.right,ta.bisector=function(t){return r(1===t.length?function(e,r){return n(t(e),r)}:t)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=0|Math.random()*i--,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,u),e=new Array(t);++n<t;)for(var r,i=-1,o=e[n]=new Array(r);++i<r;)o[i]=arguments[i][n];return e},ta.transpose=function(n){return ta.zip.apply(ta,n)},ta.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ta.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ta.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ta.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var va=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/e)throw new Error("infinite range");var r,u=[],o=i(va(e)),a=-1;if(n*=o,t*=o,e*=o,0>e)for(;(r=n+e*++a)>t;)u.push(r/o);else for(;(r=n+e*++a)<t;)u.push(r/o);return u},ta.map=function(n,t){var e=new a;if(n instanceof a)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var o in n)e.set(o,n[o]);return e};var da="__proto__",ma="\x00";o(a,{has:s,get:function(n){return this._[c(n)]},set:function(n,t){return this._[c(n)]=t},remove:f,keys:h,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:l(t),value:this._[t]});return n},size:g,empty:p,forEach:function(n){for(var t in this._)n.call(this,l(t),this._[t])}}),ta.nest=function(){function n(t,o,c){if(c>=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var l,s,f,h,g=-1,p=o.length,v=i[c++],d=new a;++g<p;)(h=d.get(l=v(s=o[g])))?h.push(s):d.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,c))}):(s={},f=function(e,r){s[e]=n(t,r,c)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new v;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},o(v,{has:s,add:function(n){return this._[c(n+="")]=!0,n},remove:f,values:h,size:g,empty:p,forEach:function(n){for(var t in this._)n.call(this,l(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=d(n,t,t[e]);return n};var ya=["webkit","ms","moz","Moz","o","O"];ta.dispatch=function(){for(var n=new M,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=x(n);return n},M.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(Ma,"\\$&")};var Ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,xa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ba=function(n,t){return t.querySelector(n)},_a=function(n,t){return t.querySelectorAll(n)},wa=ia.matches||ia[m(ia,"matchesSelector")],Sa=function(n,t){return wa.call(n,t)};"function"==typeof Sizzle&&(ba=function(n,t){return Sizzle(n,t)[0]||null},_a=Sizzle,Sa=Sizzle.matchesSelector),ta.selection=function(){return Na};var ka=ta.selection.prototype=[];ka.select=function(n){var t,e,r,u,i=[];n=k(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return S(i)},ka.selectAll=function(n){var t,e,r=[];n=E(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=ra(n.call(e,e.__data__,a,u))),t.parentNode=e);return S(r)};var Ea={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ta.ns={prefix:Ea,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),Ea.hasOwnProperty(e)?{space:Ea[e],local:n}:n}},ka.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(A(t,n[t]));return this}return this.each(A(n,t))},ka.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=z(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!C(n[u]).test(t))return!1;return!0}for(t in n)this.each(q(t,n[t]));return this}return this.each(q(n,t))},ka.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(T(e,n[e],t));return this}if(2>r)return oa.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(T(n,t,e))},ka.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},ka.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},ka.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},ka.append=function(n){return n=D(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},ka.insert=function(n,t){return n=D(n),t=k(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},ka.remove=function(){return this.each(P)},ka.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new a,y=new Array(o);for(r=-1;++r<o;)m.has(d=t.call(u=n[r],u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d;for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=U(i),m.set(d,!0);for(r=-1;++r<o;)m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=U(i);for(;f>r;++r)p[r]=U(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),l.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++i<o;)(u=r[i])&&(n[i]=u.__data__);return n}var c=O([]),l=S([]),s=S([]);if("function"==typeof n)for(;++i<o;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<o;)e(r=this[i],n);return l.enter=function(){return c},l.exit=function(){return s},l},ka.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},ka.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=j(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return S(u)},ka.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},ka.sort=function(n){n=F.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},ka.each=function(n){return H(this,function(t,e,r){n.call(t,t.__data__,e,r)})},ka.call=function(n){var t=ra(arguments);return n.apply(t[0]=this,t),this},ka.empty=function(){return!this.node()},ka.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},ka.size=function(){var n=0;return H(this,function(){++n}),n};var Aa=[];ta.selection.enter=O,ta.selection.enter.prototype=Aa,Aa.append=ka.append,Aa.empty=ka.empty,Aa.node=ka.node,Aa.call=ka.call,Aa.size=ka.size,Aa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return S(o)},Aa.insert=function(n,t){return arguments.length<2&&(t=Y(this)),ka.insert.call(this,n,t)},ka.transition=function(n){for(var t,e,r=Dl||++Hl,u=Xo(n),i=[],o=Pl||{time:Date.now(),ease:ku,delay:0,duration:250},a=-1,c=this.length;++a<c;){i.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(e=l[s])&&$o(e,s,u,r,o),t.push(e)}return Io(i,u,r)},ka.interrupt=function(n){var t=Xo(n);return this.each(function(){var n=this[t];n&&++n.active})},ta.select=function(n){var t=["string"==typeof n?ba(n,ua):n];return t.parentNode=ia,S([t])},ta.selectAll=function(n){var t=ra("string"==typeof n?_a(n,ua):n);return t.parentNode=ia,S([t])};var Na=ta.select(ia);ka.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(Z(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(Z(n,t,e))};var Ca=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ca.forEach(function(n){"on"+n in ua&&Ca.remove(n)});var za="onselectstart"in ua?null:m(ia.style,"userSelect"),qa=0;ta.mouse=function(n){return B(n,_())};var La=/WebKit/.test(oa.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=_().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return B(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",i)}function t(n,t,u,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=e.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(u()).on(i+d,a).on(o+d,c),y=$(),M=t(h,v);r?(l=r.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var e=w(n,"drag","dragstart","dragend"),r=null,u=t(y,ta.mouse,G,"mousemove","mouseup"),i=t(W,ta.touch,J,"touchmove","touchend");return n.origin=function(t){return arguments.length?(r=t,n):r},ta.rebind(n,e,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=_().touches),t?ra(t).map(function(t){var e=B(n,t);return e.identifier=t.identifier,e}):[]};var Ta=1e-6,Ra=Ta*Ta,Da=Math.PI,Pa=2*Da,Ua=Pa-Ta,ja=Da/2,Fa=Da/180,Ha=180/Da,Oa=Math.SQRT2,Ya=2,Ia=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(Ya*h)*(e*ut(Oa*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Oa*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Oa*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Ia*f)/(2*i*Ya*h),p=(c*c-i*i-Ia*f)/(2*c*Ya*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Oa;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(z,s).on(Xa+".zoom",h).on("dblclick.zoom",g).on(T,f)}function t(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function e(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function r(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=e(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function i(t,e,i,o){t.__chart__={x:k.x,y:k.y,k:k.k},r(Math.pow(2,o)),u(v=e,i),t=ta.select(t),N>0&&(t=t.transition().duration(N)),t.call(n.event)}function o(){x&&x.domain(M.range().map(function(n){return(n-k.x)/k.k}).map(M.invert)),S&&S.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function a(n){C++||n({type:"zoomstart"})}function c(n){o(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function l(n){--C||n({type:"zoomend"}),v=null}function s(){function n(){s=1,u(ta.mouse(r),h),c(o)}function e(){f.on(q,null).on(L,null),g(s&&ta.event.target===i),l(o)}var r=this,i=ta.event.target,o=R.of(r,arguments),s=0,f=ta.select(oa).on(q,n).on(L,e),h=t(ta.mouse(r)),g=$();I(r),a(o)}function f(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=t(n))}),n}function e(){var t=ta.event.target;ta.select(t).on(x,o).on(_,h),w.push(t);for(var e=ta.event.changedTouches,r=0,u=e.length;u>r;++r)d[e[r].identifier]=null;var a=n(),c=Date.now();if(1===a.length){if(500>c-y){var l=a[0];i(p,l,d[l.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),b()}y=c}else if(a.length>1){var l=a[0],s=a[1],f=l[0]-s[0],g=l[1]-s[1];m=f*f+g*g}}function o(){var n,t,e,i,o=ta.touches(p);I(p);for(var a=0,l=o.length;l>a;++a,i=null)if(e=o[a],i=d[e.identifier]){if(t)break;n=e,t=i}if(i){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}y=null,u(n,t),c(v)}function h(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(w).on(M,null),S.on(z,s).on(T,f),E(),l(v)}var g,p=this,v=R.of(p,arguments),d={},m=0,M=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+M,_="touchend"+M,w=[],S=ta.select(p),E=$();e(),a(v),S.on(z,null).on(T,e)}function h(){var n=R.of(this,arguments);m?clearTimeout(m):(p=t(v=d||ta.mouse(this)),I(this),a(n)),m=setTimeout(function(){m=null,l(n)},50),b(),r(Math.pow(2,.002*Za())*k.k),u(v,p),c(n)}function g(){var n=ta.mouse(this),e=Math.log(k.k)/Math.LN2;i(this,n,t(n),ta.event.shiftKey?Math.ceil(e)-1:Math.floor(e)+1)}var p,v,d,m,y,M,x,_,S,k={x:0,y:0,k:1},E=[960,500],A=Va,N=250,C=0,z="mousedown.zoom",q="mousemove.zoom",L="mouseup.zoom",T="touchstart.zoom",R=w(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=R.of(this,arguments),t=k;Dl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},a(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],u=v?v[0]:e/2,i=v?v[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){l(n)}).each("end.zoom",function(){l(n)}):(this.__chart__=k,a(n),c(n),l(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Va:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(d=t&&[+t[0],+t[1]],n):d},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(N=+t,n):N},n.x=function(t){return arguments.length?(x=t,M=t.copy(),k={x:0,y:0,k:1},n):x},n.y=function(t){return arguments.length?(S=t,_=t.copy(),k={x:0,y:0,k:1},n):S},ta.rebind(n,R,"on")};var Za,Va=[0,1/0],Xa="onwheel"in ua?(Za=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Za=function(){return ta.event.wheelDelta},"mousewheel"):(Za=function(){return-ta.event.detail},"MozMousePixelScroll");ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var $a=at.prototype=new ot;$a.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},$a.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},$a.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Ba=lt.prototype=new ot;Ba.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Wa*(arguments.length?n:1)))},Ba.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Wa*(arguments.length?n:1)))},Ba.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Wa=18,Ja=.95047,Ga=1,Ka=1.08883,Qa=ft.prototype=new ot;Qa.brighter=function(n){return new ft(Math.min(100,this.l+Wa*(arguments.length?n:1)),this.a,this.b)},Qa.darker=function(n){return new ft(Math.max(0,this.l-Wa*(arguments.length?n:1)),this.a,this.b)},Qa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var nc=mt.prototype=new ot;nc.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},nc.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},nc.hsl=function(){return _t(this.r,this.g,this.b)},nc.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var tc=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});tc.forEach(function(n,t){tc.set(n,yt(t))}),ta.functor=Et,ta.xhr=Nt(At),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Ct(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;l>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new v,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var ec,rc,uc,ic,oc,ac=oa[m(oa,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};rc?rc.n=i:ec=i,rc=i,uc||(ic=clearTimeout(ic),uc=1,ac(Lt))},ta.timer.flush=function(){Tt(),Rt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var cc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Pt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Dt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),cc[8+e/3]};var lc=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,sc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Dt(n,t))).toFixed(Math.max(0,Math.min(20,Dt(n*(1+1e-15),t))))}}),fc=ta.time={},hc=Date;Ft.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){gc.setUTCDate.apply(this._,arguments)},setDay:function(){gc.setUTCDay.apply(this._,arguments)},setFullYear:function(){gc.setUTCFullYear.apply(this._,arguments)},setHours:function(){gc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){gc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){gc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){gc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){gc.setUTCSeconds.apply(this._,arguments)},setTime:function(){gc.setTime.apply(this._,arguments)}};var gc=Date.prototype;fc.year=Ht(function(n){return n=fc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),fc.years=fc.year.range,fc.years.utc=fc.year.utc.range,fc.day=Ht(function(n){var t=new hc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),fc.days=fc.day.range,fc.days.utc=fc.day.utc.range,fc.dayOfYear=function(n){var t=fc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=fc[n]=Ht(function(n){return(n=fc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=fc.year(n).getDay();return Math.floor((fc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});fc[n+"s"]=e.range,fc[n+"s"].utc=e.utc.range,fc[n+"OfYear"]=function(n){var e=fc.year(n).getDay();return Math.floor((fc.dayOfYear(n)+(e+t)%7)/7)}}),fc.week=fc.sunday,fc.weeks=fc.sunday.range,fc.weeks.utc=fc.sunday.utc.range,fc.weekOfYear=fc.sundayOfYear;var pc={"-":"",_:" ",0:"0"},vc=/^\s*\d+/,dc=/^%/;ta.locale=function(n){return{numberFormat:Ut(n),timeFormat:Yt(n)}};var mc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=mc.numberFormat,ta.geo={},le.prototype={s:0,t:0,add:function(n){se(n,this.t,yc),se(yc.s,this.s,this),this.s?this.t+=yc.t:this.s=yc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var yc=new le;ta.geo.stream=function(n,t){n&&Mc.hasOwnProperty(n.type)?Mc[n.type](n,t):fe(n,t)};var Mc={Feature:function(n,t){fe(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)fe(e[r].geometry,t)}},xc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){he(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)he(e[r],t,0)},Polygon:function(n,t){ge(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)ge(e[r],t)
2309 2309 },GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)fe(e[r],t)}};ta.geo.area=function(n){return bc=0,ta.geo.stream(n,wc),bc};var bc,_c=new le,wc={sphere:function(){bc+=4*Da},point:y,lineStart:y,lineEnd:y,polygonStart:function(){_c.reset(),wc.lineStart=pe},polygonEnd:function(){var n=2*_c;bc+=0>n?4*Da+n:n,wc.lineStart=wc.lineEnd=wc.point=y}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=ve([t*Fa,e*Fa]);if(m){var u=me(m,r),i=[u[1],-u[0],0],o=me(i,u);xe(o),o=be(o);var c=t-p,l=c>0?1:-1,v=o[0]*Ha*l,d=va(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Ha;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Ha;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=va(r)>180?r+(r>0?360:-360):r}else v=n,d=e;wc.point(n,e),t(n,e)}function i(){wc.lineStart()}function o(){u(v,d),wc.lineEnd(),va(y)>Ta&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,wc.polygonStart()},polygonEnd:function(){wc.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>_c?(s=-(h=180),f=-(g=90)):y>Ta?g=90:-Ta>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){Sc=kc=Ec=Ac=Nc=Cc=zc=qc=Lc=Tc=Rc=0,ta.geo.stream(n,Dc);var t=Lc,e=Tc,r=Rc,u=t*t+e*e+r*r;return Ra>u&&(t=Cc,e=zc,r=qc,Ta>kc&&(t=Ec,e=Ac,r=Nc),u=t*t+e*e+r*r,Ra>u)?[0/0,0/0]:[Math.atan2(e,t)*Ha,tt(r/Math.sqrt(u))*Ha]};var Sc,kc,Ec,Ac,Nc,Cc,zc,qc,Lc,Tc,Rc,Dc={sphere:y,point:we,lineStart:ke,lineEnd:Ee,polygonStart:function(){Dc.lineStart=Ae},polygonEnd:function(){Dc.lineStart=ke}},Pc=Te(Ce,Ue,Fe,[-Da,-Da/2]),Uc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ze(Ve)}).raw=Ve,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ta,f+.12*l+Ta],[s-.214*l-Ta,f+.234*l-Ta]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ta,f+.166*l+Ta],[s-.115*l-Ta,f+.234*l-Ta]]).stream(c).point,n},n.scale(1070)};var jc,Fc,Hc,Oc,Yc,Ic,Zc={point:y,lineStart:y,lineEnd:y,polygonStart:function(){Fc=0,Zc.lineStart=Xe},polygonEnd:function(){Zc.lineStart=Zc.lineEnd=Zc.point=y,jc+=va(Fc/2)}},Vc={point:$e,lineStart:y,lineEnd:y,polygonStart:y,polygonEnd:y},Xc={point:Je,lineStart:Ge,lineEnd:Ke,polygonStart:function(){Xc.lineStart=Qe},polygonEnd:function(){Xc.point=Je,Xc.lineStart=Ge,Xc.lineEnd=Ke}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return jc=0,ta.geo.stream(n,u(Zc)),jc},n.centroid=function(n){return Ec=Ac=Nc=Cc=zc=qc=Lc=Tc=Rc=0,ta.geo.stream(n,u(Xc)),Rc?[Lc/Rc,Tc/Rc]:qc?[Cc/qc,zc/qc]:Nc?[Ec/Nc,Ac/Nc]:[0/0,0/0]},n.bounds=function(n){return Yc=Ic=-(Hc=Oc=1/0),ta.geo.stream(n,u(Vc)),[[Hc,Oc],[Yc,Ic]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||er(n):At,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Be:new nr(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new rr(t);for(var r in n)e[r]=n[r];return e}}},rr.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ir,ta.geo.projectionMutator=or,(ta.geo.equirectangular=function(){return ir(cr)}).raw=cr.invert=cr,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Fa,t[1]*Fa),t[0]*=Ha,t[1]*=Ha,t}return n=sr(n[0]%360*Fa,n[1]*Fa,n.length>2?n[2]*Fa:0),t.invert=function(t){return t=n.invert(t[0]*Fa,t[1]*Fa),t[0]*=Ha,t[1]*=Ha,t},t},lr.invert=cr,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=sr(-n[0]*Fa,-n[1]*Fa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ha,n[1]*=Ha}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=pr((t=+r)*Fa,u*Fa),n):t},n.precision=function(r){return arguments.length?(e=pr(t*Fa,(u=+r)*Fa),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Fa,u=n[1]*Fa,i=t[1]*Fa,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return va(n%d)>Ta}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return va(n%m)>Ta}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=dr(a,o,90),f=mr(r,e,y),h=dr(l,c,90),g=mr(i,u,y),n):y},n.majorExtent([[-180,-90+Ta],[180,90-Ta]]).minorExtent([[-180,-80-Ta],[180,80+Ta]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=yr,u=Mr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return xr(n[0]*Fa,n[1]*Fa,t[0]*Fa,t[1]*Fa)},ta.geo.length=function(n){return $c=0,ta.geo.stream(n,Bc),$c};var $c,Bc={sphere:y,point:y,lineStart:br,lineEnd:y,polygonStart:y,polygonEnd:y},Wc=_r(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ir(Wc)}).raw=Wc;var Jc=_r(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},At);(ta.geo.azimuthalEquidistant=function(){return ir(Jc)}).raw=Jc,(ta.geo.conicConformal=function(){return Ze(wr)}).raw=wr,(ta.geo.conicEquidistant=function(){return Ze(Sr)}).raw=Sr;var Gc=_r(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ir(Gc)}).raw=Gc,kr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-ja]},(ta.geo.mercator=function(){return Er(kr)}).raw=kr;var Kc=_r(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ir(Kc)}).raw=Kc;var Qc=_r(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ir(Qc)}).raw=Qc,Ar.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-ja]},(ta.geo.transverseMercator=function(){var n=Er(Ar),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ar,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(qr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=zr(a),s=zr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[a[s[t]][2]]);return g}var e=Nr,r=Cr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ta.geom.polygon=function(n){return xa(n,nl),n};var nl=ta.geom.polygon.prototype=[];nl.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},nl.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},nl.clip=function(n){for(var t,e,r,u,i,o,a=Rr(n),c=-1,l=this.length-Rr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],Lr(o,s,u)?(Lr(i,s,u)||n.push(Tr(i,o,s,u)),n.push(o)):Lr(i,s,u)&&n.push(Tr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n};var tl,el,rl,ul,il,ol=[],al=[];Yr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Zr),t.length},nu.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},tu.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=iu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(ru(this,e),n=e,e=n.U),e.C=!1,r.C=!0,uu(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(uu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ru(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?iu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,ru(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,uu(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,ru(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,uu(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,ru(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,uu(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},ta.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return ou(e(n),a).cells.forEach(function(e,a){var c=e.edges,l=e.site,s=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ta)*Ta,y:Math.round(o(n,t)/Ta)*Ta,i:t}})}var r=Nr,u=Cr,i=r,o=u,a=cl;return n?t(n):(t.links=function(n){return ou(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ou(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Zr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c<l;)u=s,i=f,s=a[c].edge,f=s.l===o?s.r:s.l,r<i.i&&r<f.i&&cu(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=Et(r=n),t):r},t.y=function(n){return arguments.length?(o=Et(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?cl:n,t):a===cl?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===cl?null:a&&a[1]},t)};var cl=[[-1e6,-1e6],[1e6,1e6]];ta.geom.delaunay=function(n){return ta.geom.voronoi().triangles(n)},ta.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(va(c-e)+va(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=fu()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=fu();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){hu(n,k,v,d,m,y)},k.find=function(n){return gu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var o,a=Nr,c=Cr;return(o=arguments.length)?(a=lu,c=su,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},ta.interpolateRgb=pu,ta.interpolateObject=vu,ta.interpolateNumber=du,ta.interpolateString=mu;var ll=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,sl=new RegExp(ll.source,"g");ta.interpolate=yu,ta.interpolators=[function(n,t){var e=typeof t;return("string"===e?tc.has(t)||/^(#|rgb\(|hsl\()/.test(t)?pu:mu:t instanceof ot?pu:Array.isArray(t)?Mu:"object"===e&&isNaN(t)?vu:du)(n,t)}],ta.interpolateArray=Mu;var fl=function(){return At},hl=ta.map({linear:fl,poly:Eu,quad:function(){return wu},cubic:function(){return Su},sin:function(){return Au},exp:function(){return Nu},circle:function(){return Cu},elastic:zu,back:qu,bounce:function(){return Lu}}),gl=ta.map({"in":At,out:bu,"in-out":_u,"out-in":function(n){return _u(bu(n))}});ta.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=hl.get(e)||fl,r=gl.get(r)||At,xu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Tu,ta.interpolateHsl=Ru,ta.interpolateLab=Du,ta.interpolateRound=Pu,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Uu(e?e.matrix:pl)})(n)},Uu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var pl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Ou,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Zu(n[e]));return t}},ta.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=ta.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(ta.range(i)),n+=l}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Pa-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ta.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=vl,h=dl,g=-30,p=ml,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,M,x,b=m.length,_=y.length;for(e=0;_>e;++e)a=y[e],f=a.source,h=a.target,M=h.x-f.x,x=h.y-f.y,(p=M*M+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,M*=p,x*=p,h.x-=M*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=M*(d=1-d),f.y+=x*d);if((d=r*v)&&(M=l[0]/2,x=l[1]/2,e=-1,d))for(;++e<b;)a=m[e],a.x+=(M-a.x)*d,a.y+=(x-a.y)*d;if(g)for(Gu(t=ta.geom.quadtree(m),r,o),e=-1;++e<b;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;l>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++a<l;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=y.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(At).on("dragstart.force",$u).on("drag.force",t).on("dragend.force",Bu)),arguments.length?(this.on("mouseover.force",Wu).on("mouseout.force",Ju).call(e),void 0):e},ta.rebind(a,c,"on")};var vl=20,dl=1,ml=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return ni(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ri,e=ti,r=ei;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Qu(t,function(n){n.children&&(n.value=0)}),ni(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=ta.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Ku(e,r)},ta.layout.pie=function(){function n(o){var a,c=o.length,l=o.map(function(e,r){return+t.call(n,e,r)}),s=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/c,+("function"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===yl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=yl,r=0,u=Pa,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var yl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=At,e=ci,r=li,u=ai,i=ii,o=oi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:Ml.get(t)||ci,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:xl.get(t)||li,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var Ml=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(si),i=n.map(fi),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ci}),xl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:li});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=vi,u=gi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return pi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,ni(a,function(n){n.r=+s(n.value)}),ni(a,xi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;ni(a,function(n){n.r+=f}),ni(a,xi),ni(a,function(n){n.r-=f})}return wi(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(di),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Ku(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(ni(h,e),h.parent.m=-h.z,Qu(h,r),l)Qu(f,i);else{var g=f,p=f,v=f;Qu(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Qu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ci(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ai(o),u=Ei(u),o&&u;)c=Ei(c),i=Ai(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ni(zi(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ai(i)&&(i.t=o,i.m+=f-s),u&&!Ei(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=ki,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Ku(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;ni(c,function(n){var t=n.children;t&&t.length?(n.x=Li(t),n.y=qi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Ti(c),f=Ri(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return ni(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=ki,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Ku(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=ta.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Di,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Di(t):Pi(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Pi(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Di:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Ku(i,a)},ta.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;
2310 2310 do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var bl={floor:At,ceil:At};ta.scale.linear=function(){return Ii([0,1],[0,1],yu,!1)};var _l={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Gi(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var wl=ta.format(".0e"),Sl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Ki(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return no([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(kl)},ta.scale.category20=function(){return ta.scale.ordinal().range(El)},ta.scale.category20b=function(){return ta.scale.ordinal().range(Al)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Nl)};var kl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),El=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),Al=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Nl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return to([],[])},ta.scale.quantize=function(){return eo(0,1,[0,1])},ta.scale.threshold=function(){return ro([.5],[0,1])},ta.scale.identity=function(){return uo([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-ja,f=a.apply(this,arguments)-ja,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ua)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===Cl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=Da?0:1;if(A&&fo(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=Da?0:1;if(E&&fo(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Tr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=ho(null==S?[_,w]:[S,k],[y,M],l,H,g),Y=ho([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^fo(O[1][0],O[1][1],Y[1][0],Y[1][1]),",",g," ",Y[1],"A",H,",",H," 0 0,",v," ",Y[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",Y[0])}else N.push("M",y,",",M);if(null!=S){var I=Math.min(p,(n-F)/(j-1)),Z=ho([y,M],[S,k],n,-I,g),V=ho([_,w],null==x?[y,M]:[x,b],n,-I,g);p===I?N.push("L",V[0],"A",I,",",I," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^fo(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",I,",",I," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",I,",",I," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=oo,r=ao,u=io,i=Cl,o=co,a=lo,c=so;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Cl?Cl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-ja;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Cl="auto";ta.svg.line=function(){return go(At)};var zl=ta.map({linear:po,"linear-closed":vo,step:mo,"step-before":yo,"step-after":Mo,basis:ko,"basis-open":Eo,"basis-closed":Ao,bundle:No,cardinal:_o,"cardinal-open":xo,"cardinal-closed":bo,monotone:Ro});zl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var ql=[0,2/3,1/3,0],Ll=[0,1/3,2/3,0],Tl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=go(Do);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},yo.reverse=Mo,Mo.reverse=yo,ta.svg.area=function(){return Po(At)},ta.svg.area.radial=function(){var n=Po(Do);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-ja,s=l.call(n,u,r)-ja;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Da)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=yr,o=Mr,a=Uo,c=co,l=lo;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=yr,e=Mr,r=jo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=jo,e=n.projection;return n.projection=function(n){return arguments.length?e(Fo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(Rl.get(t.call(this,n,r))||Yo)(e.call(this,n,r))}var t=Oo,e=Ho;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var Rl=ta.map({circle:Yo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*jl)),e=t*jl;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Ul),e=t*Ul/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Ul),e=t*Ul/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=Rl.keys();var Dl,Pl,Ul=Math.sqrt(3),jl=Math.tan(30*Fa),Fl=[],Hl=0;Fl.call=ka.call,Fl.empty=ka.empty,Fl.node=ka.node,Fl.size=ka.size,ta.transition=function(n){return arguments.length?Dl?n.transition():n:Na.transition()},ta.transition.prototype=Fl,Fl.select=function(n){var t,e,r,u=this.id,i=this.namespace,o=[];n=k(n);for(var a=-1,c=this.length;++a<c;){o.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(r=l[s])&&(e=n.call(r,r.__data__,s,a))?("__data__"in r&&(e.__data__=r.__data__),$o(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Io(o,i,u)},Fl.selectAll=function(n){var t,e,r,u,i,o=this.id,a=this.namespace,c=[];n=E(n);for(var l=-1,s=this.length;++l<s;)for(var f=this[l],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[a][o],e=n.call(r,r.__data__,h,l),c.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&$o(u,p,a,o,i),t.push(u)}return Io(c,a,o)},Fl.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=j(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Io(u,this.namespace,this.id)},Fl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):H(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Fl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Ou:yu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Fl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Fl.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=oa.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=yu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Zo(this,"style."+n,t,u)},Fl.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,oa.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Fl.text=function(n){return Zo(this,"text",n,Vo)},Fl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Fl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),H(this,function(r){r[e][t].ease=n}))},Fl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:H(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Fl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:H(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Fl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Pl,i=Dl;Dl=e,H(this,function(t,u,i){Pl=t[r][e],n.call(t,t.__data__,u,i)}),Pl=u,Dl=i}else H(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Fl.transition=function(){for(var n,t,e,r,u=this.id,i=++Hl,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Io(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):At:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ta),d=ta.transition(p.exit()).style("opacity",Ta).remove(),m=ta.transition(p.order()).style("opacity",1),y=Math.max(u,0)+o,M=ji(f),x=l.selectAll(".domain").data([0]),b=(x.enter().append("path").attr("class","domain"),ta.transition(x));v.append("line"),v.append("text");var _,w,S,k,E=v.select("line"),A=m.select("line"),N=p.select("text").text(g),C=v.select("text"),z=m.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,_="x",S="y",w="x2",k="y2",N.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),b.attr("d","M"+M[0]+","+q*i+"V0H"+M[1]+"V"+q*i)):(n=Wo,_="y",S="x",w="y2",k="x2",N.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),b.attr("d","M"+q*i+","+M[0]+"H0V"+M[1]+"H"+q*i)),E.attr(k,q*u),C.attr(S,q*y),A.attr(w,0).attr(k,q*u),z.attr(_,0).attr(S,q*y),f.rangeBand){var L=f,T=L.rangeBand()/2;s=f=function(n){return L(n)+T}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=Ol,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Yl?t+"":Ol,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ol="bottom",Yl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(i){i.each(function(){var i=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,At);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Il[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var s,f=ta.transition(i),h=ta.transition(o);c&&(s=ji(c),h.attr("x",s[0]).attr("width",s[1]-s[0]),e(f)),l&&(s=ji(l),h.attr("y",s[0]).attr("height",s[1]-s[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==ta.event.keyCode&&(N||(y=null,z[0]-=s[1],z[1]-=f[1],N=2),b())}function p(){32==ta.event.keyCode&&2==N&&(z[0]+=s[1],z[1]+=f[1],N=0,b())}function v(){var n=ta.mouse(x),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),N||(ta.event.altKey?(y||(y=[(s[0]+s[1])/2,(f[0]+f[1])/2]),z[0]=s[+(n[0]<y[0])],z[1]=f[+(n[1]<y[1])]):y=null),E&&d(n,c,0)&&(e(S),u=!0),A&&d(n,l,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:N?"move":"resize"}))}function d(n,t,e){var r,u,a=ji(t),c=a[0],l=a[1],p=z[e],v=e?f:s,d=v[1]-v[0];return N&&(c-=p,l-=d+p),r=(e?g:h)?Math.max(c,Math.min(l,n[e])):n[e],N?u=(r+=p)+d:(y&&(p=Math.max(c,Math.min(l,2*y[e]-r))),r>p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function m(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),C(),w({type:"brushend"})}var y,M,x=this,_=ta.select(ta.event.target),w=a.of(x,arguments),S=ta.select(x),k=_.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&l,N=_.classed("extent"),C=$(),z=ta.mouse(x),q=ta.select(oa).on("keydown.brush",u).on("keyup.brush",p);if(ta.event.changedTouches?q.on("touchmove.brush",v).on("touchend.brush",m):q.on("mousemove.brush",v).on("mouseup.brush",m),S.interrupt().selectAll("*").interrupt(),N)z[0]=s[0]-z[0],z[1]=f[0]-z[1];else if(k){var L=+/w$/.test(k),T=+/^n/.test(k);M=[s[1-L]-z[0],f[1-T]-z[1]],z[0]=s[L],z[1]=f[T]}else ta.event.altKey&&(y=z.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=w(n,"brushstart","brush","brushend"),c=null,l=null,s=[0,0],f=[0,0],h=!0,g=!0,p=Zl[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:s,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Dl?ta.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,s=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=Mu(s,t.x),r=Mu(f,t.y);return i=o=null,function(u){s=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Zl[!c<<1|!l],n):c},n.y=function(t){return arguments.length?(l=t,p=Zl[!c<<1|!l],n):l},n.clamp=function(t){return arguments.length?(c&&l?(h=!!t[0],g=!!t[1]):c?h=!!t:l&&(g=!!t),n):c&&l?[h,g]:c?h:l?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],l&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=s[0]||r!=s[1])&&(s=[e,r])),l&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],l.invert&&(u=l(u),a=l(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),l&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],l.invert&&(u=l.invert(u),a=l.invert(a)),u>a&&(h=u,u=a,a=h))),c&&l?[[e,u],[r,a]]:c?[e,r]:l&&[u,a])},n.clear=function(){return n.empty()||(s=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!l&&f[0]==f[1]},ta.rebind(n,a,"on")};var Il={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Zl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Vl=fc.format=mc.timeFormat,Xl=Vl.utc,$l=Xl("%Y-%m-%dT%H:%M:%S.%LZ");Vl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:$l,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=$l.toString,fc.second=Ht(function(n){return new hc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),fc.seconds=fc.second.range,fc.seconds.utc=fc.second.utc.range,fc.minute=Ht(function(n){return new hc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),fc.minutes=fc.minute.range,fc.minutes.utc=fc.minute.utc.range,fc.hour=Ht(function(n){var t=n.getTimezoneOffset()/60;return new hc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),fc.hours=fc.hour.range,fc.hours.utc=fc.hour.utc.range,fc.month=Ht(function(n){return n=fc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),fc.months=fc.month.range,fc.months.utc=fc.month.utc.range;var Bl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Wl=[[fc.second,1],[fc.second,5],[fc.second,15],[fc.second,30],[fc.minute,1],[fc.minute,5],[fc.minute,15],[fc.minute,30],[fc.hour,1],[fc.hour,3],[fc.hour,6],[fc.hour,12],[fc.day,1],[fc.day,2],[fc.week,1],[fc.month,1],[fc.month,3],[fc.year,1]],Jl=Vl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ce]]),Gl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:At,ceil:At};Wl.year=fc.year,fc.scale=function(){return Go(ta.scale.linear(),Wl,Jl)};var Kl=Wl.map(function(n){return[n[0].utc,n[1]]}),Ql=Xl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ce]]);Kl.year=fc.year.utc,fc.scale.utc=function(){return Go(ta.scale.linear(),Kl,Ql)},ta.text=Nt(function(n){return n.responseText}),ta.json=function(n,t){return Ct(n,"application/json",Qo,t)},ta.html=function(n,t){return Ct(n,"text/html",na,t)},ta.xml=Nt(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}();
2311 2311 ;!function(a){"use strict";function b(a){this.owner=a}function c(a,b){if(Object.create)b.prototype=Object.create(a.prototype);else{var c=function(){};c.prototype=a.prototype,b.prototype=new c}return b.prototype.constructor=b,b}function d(a){var b=this.internal=new e(this);b.loadConfig(a),b.beforeInit(a),b.init(),b.afterInit(a),function c(a,b,d){Object.keys(a).forEach(function(e){b[e]=a[e].bind(d),Object.keys(a[e]).length>0&&c(a[e],b[e],d)})}(h,this,this)}function e(b){var c=this;c.d3=a.d3?a.d3:"undefined"!=typeof require?require("d3"):void 0,c.api=b,c.config=c.getDefaultConfig(),c.data={},c.cache={},c.axes={}}function f(a){b.call(this,a)}function g(a,b){function c(a,b){a.attr("transform",function(a){return"translate("+Math.ceil(b(a)+u)+", 0)"})}function d(a,b){a.attr("transform",function(a){return"translate(0,"+Math.ceil(b(a))+")"})}function e(a){var b=a[0],c=a[a.length-1];return c>b?[b,c]:[c,b]}function f(a){var b,c,d=[];if(a.ticks)return a.ticks.apply(a,n);for(c=a.domain(),b=Math.ceil(c[0]);b<c[1];b++)d.push(b);return d.length>0&&d[0]>0&&d.unshift(d[0]-(d[1]-d[0])),d}function g(){var a,c=p.copy();return b.isCategory&&(a=p.domain(),c.domain([a[0],a[1]-1])),c}function h(a){var b=m?m(a):a;return"undefined"!=typeof b?b:""}function i(a){if(A)return A;var b={h:11.5,w:5.5};return a.select("text").text(h).each(function(a){var c=this.getBoundingClientRect(),d=h(a),e=c.height,f=d?c.width/d.length:void 0;e&&f&&(b.h=e,b.w=f)}).text(""),A=b,b}function j(c){return b.withoutTransition?c:a.transition(c)}function k(m){m.each(function(){function m(a,c){function d(a,b){f=void 0;for(var h=1;h<b.length;h++)if(" "===b.charAt(h)&&(f=h),e=b.substr(0,h+1),g=U.w*e.length,g>c)return d(a.concat(b.substr(0,f?f:h)),b.slice(f?f+1:h));return a.concat(b)}var e,f,g,i=h(a),j=[];return"[object Array]"===Object.prototype.toString.call(i)?i:((!c||0>=c)&&(c=X?95:b.isCategory?Math.ceil(F(G[1])-F(G[0]))-12:110),d(j,i+""))}function n(a,b){var c=U.h;return 0===b&&(c="left"===q||"right"===q?-((V[a.index]-1)*(U.h/2)-3):".71em"),c}function v(a){var b=p(a)+(o?0:u);return L[0]<b&&b<L[1]?r:0}function w(a){return a?a>0?"start":"end":"middle"}function x(a){return a?"rotate("+a+")":""}function y(a){return a?8*Math.sin(Math.PI*(a/180)):0}function z(a){return a?11.5-2.5*(a/15)*(a>0?1:-1):W}var A,B,C,D=k.g=a.select(this),E=this.__chart__||p,F=this.__chart__=g(),G=t?t:f(F),H=D.selectAll(".tick").data(G,F),I=H.enter().insert("g",".domain").attr("class","tick").style("opacity",1e-6),J=H.exit().remove(),K=j(H).style("opacity",1),L=p.rangeExtent?p.rangeExtent():e(p.range()),M=D.selectAll(".domain").data([0]),N=(M.enter().append("path").attr("class","domain"),j(M));I.append("line"),I.append("text");var O=I.select("line"),P=K.select("line"),Q=I.select("text"),R=K.select("text");b.isCategory?(u=Math.ceil((F(1)-F(0))/2),B=o?0:u,C=o?u:0):u=B=0;var S,T,U=i(D.select(".tick")),V=[],W=Math.max(r,0)+s,X="left"===q||"right"===q;S=H.select("text"),T=S.selectAll("tspan").data(function(a,c){var d=b.tickMultiline?m(a,b.tickWidth):[].concat(h(a));return V[c]=d.length,d.map(function(a){return{index:c,splitted:a}})}),T.enter().append("tspan"),T.exit().remove(),T.text(function(a){return a.splitted});var Y=b.tickTextRotate;switch(q){case"bottom":A=c,O.attr("y2",r),Q.attr("y",W),P.attr("x1",B).attr("x2",B).attr("y2",v),R.attr("x",0).attr("y",z(Y)).style("text-anchor",w(Y)).attr("transform",x(Y)),T.attr("x",0).attr("dy",n).attr("dx",y(Y)),N.attr("d","M"+L[0]+","+l+"V0H"+L[1]+"V"+l);break;case"top":A=c,O.attr("y2",-r),Q.attr("y",-W),P.attr("x2",0).attr("y2",-r),R.attr("x",0).attr("y",-W),S.style("text-anchor","middle"),T.attr("x",0).attr("dy","0em"),N.attr("d","M"+L[0]+","+-l+"V0H"+L[1]+"V"+-l);break;case"left":A=d,O.attr("x2",-r),Q.attr("x",-W),P.attr("x2",-r).attr("y1",C).attr("y2",C),R.attr("x",-W).attr("y",u),S.style("text-anchor","end"),T.attr("x",-W).attr("dy",n),N.attr("d","M"+-l+","+L[0]+"H0V"+L[1]+"H"+-l);break;case"right":A=d,O.attr("x2",r),Q.attr("x",W),P.attr("x2",r).attr("y2",0),R.attr("x",W).attr("y",0),S.style("text-anchor","start"),T.attr("x",W).attr("dy",n),N.attr("d","M"+l+","+L[0]+"H0V"+L[1]+"H"+l)}if(F.rangeBand){var Z=F,$=Z.rangeBand()/2;E=F=function(a){return Z(a)+$}}else E.rangeBand?E=F:J.call(A,F);I.call(A,E),K.call(A,F)})}var l,m,n,o,p=a.scale.linear(),q="bottom",r=6,s=3,t=null,u=0,v=!0;return b=b||{},l=b.withOuterTick?6:0,k.scale=function(a){return arguments.length?(p=a,k):p},k.orient=function(a){return arguments.length?(q=a in{top:1,right:1,bottom:1,left:1}?a+"":"bottom",k):q},k.tickFormat=function(a){return arguments.length?(m=a,k):m},k.tickCentered=function(a){return arguments.length?(o=a,k):o},k.tickOffset=function(){return u},k.tickInterval=function(){var a,c;return b.isCategory?a=2*u:(c=k.g.select("path.domain").node().getTotalLength()-2*l,a=c/k.g.selectAll("line").size()),a===1/0?0:a},k.ticks=function(){return arguments.length?(n=arguments,k):n},k.tickCulling=function(a){return arguments.length?(v=a,k):v},k.tickValues=function(a){if("function"==typeof a)t=function(){return a(p.domain())};else{if(!arguments.length)return t;t=a}return k},k}var h,i,j,k={version:"0.4.11"};k.generate=function(a){return new d(a)},k.chart={fn:d.prototype,internal:{fn:e.prototype,axis:{fn:f.prototype}}},h=k.chart.fn,i=k.chart.internal.fn,j=k.chart.internal.axis.fn,i.beforeInit=function(){},i.afterInit=function(){},i.init=function(){var a=this,b=a.config;if(a.initParams(),b.data_url)a.convertUrlToData(b.data_url,b.data_mimeType,b.data_headers,b.data_keys,a.initWithData);else if(b.data_json)a.initWithData(a.convertJsonToData(b.data_json,b.data_keys));else if(b.data_rows)a.initWithData(a.convertRowsToData(b.data_rows));else{if(!b.data_columns)throw Error("url or json or rows or columns is required.");a.initWithData(a.convertColumnsToData(b.data_columns))}},i.initParams=function(){var a=this,b=a.d3,c=a.config;a.clipId="c3-"+ +new Date+"-clip",a.clipIdForXAxis=a.clipId+"-xaxis",a.clipIdForYAxis=a.clipId+"-yaxis",a.clipIdForGrid=a.clipId+"-grid",a.clipIdForSubchart=a.clipId+"-subchart",a.clipPath=a.getClipPath(a.clipId),a.clipPathForXAxis=a.getClipPath(a.clipIdForXAxis),a.clipPathForYAxis=a.getClipPath(a.clipIdForYAxis),a.clipPathForGrid=a.getClipPath(a.clipIdForGrid),a.clipPathForSubchart=a.getClipPath(a.clipIdForSubchart),a.dragStart=null,a.dragging=!1,a.flowing=!1,a.cancelClick=!1,a.mouseover=!1,a.transiting=!1,a.color=a.generateColor(),a.levelColor=a.generateLevelColor(),a.dataTimeFormat=c.data_xLocaltime?b.time.format:b.time.format.utc,a.axisTimeFormat=c.axis_x_localtime?b.time.format:b.time.format.utc,a.defaultAxisTimeFormat=a.axisTimeFormat.multi([[".%L",function(a){return a.getMilliseconds()}],[":%S",function(a){return a.getSeconds()}],["%I:%M",function(a){return a.getMinutes()}],["%I %p",function(a){return a.getHours()}],["%-m/%-d",function(a){return a.getDay()&&1!==a.getDate()}],["%-m/%-d",function(a){return 1!==a.getDate()}],["%-m/%-d",function(a){return a.getMonth()}],["%Y/%-m/%-d",function(){return!0}]]),a.hiddenTargetIds=[],a.hiddenLegendIds=[],a.focusedTargetIds=[],a.defocusedTargetIds=[],a.xOrient=c.axis_rotated?"left":"bottom",a.yOrient=c.axis_rotated?c.axis_y_inner?"top":"bottom":c.axis_y_inner?"right":"left",a.y2Orient=c.axis_rotated?c.axis_y2_inner?"bottom":"top":c.axis_y2_inner?"left":"right",a.subXOrient=c.axis_rotated?"left":"bottom",a.isLegendRight="right"===c.legend_position,a.isLegendInset="inset"===c.legend_position,a.isLegendTop="top-left"===c.legend_inset_anchor||"top-right"===c.legend_inset_anchor,a.isLegendLeft="top-left"===c.legend_inset_anchor||"bottom-left"===c.legend_inset_anchor,a.legendStep=0,a.legendItemWidth=0,a.legendItemHeight=0,a.currentMaxTickWidths={x:0,y:0,y2:0},a.rotated_padding_left=30,a.rotated_padding_right=c.axis_rotated&&!c.axis_x_show?0:30,a.rotated_padding_top=5,a.withoutFadeIn={},a.intervalForObserveInserted=void 0,a.axes.subx=b.selectAll([])},i.initChartElements=function(){this.initBar&&this.initBar(),this.initLine&&this.initLine(),this.initArc&&this.initArc(),this.initGauge&&this.initGauge(),this.initText&&this.initText()},i.initWithData=function(a){var b,c,d=this,e=d.d3,g=d.config,h=!0;d.axis=new f(d),d.initPie&&d.initPie(),d.initBrush&&d.initBrush(),d.initZoom&&d.initZoom(),g.bindto?"function"==typeof g.bindto.node?d.selectChart=g.bindto:d.selectChart=e.select(g.bindto):d.selectChart=e.selectAll([]),d.selectChart.empty()&&(d.selectChart=e.select(document.createElement("div")).style("opacity",0),d.observeInserted(d.selectChart),h=!1),d.selectChart.html("").classed("c3",!0),d.data.xs={},d.data.targets=d.convertDataToTargets(a),g.data_filter&&(d.data.targets=d.data.targets.filter(g.data_filter)),g.data_hide&&d.addHiddenTargetIds(g.data_hide===!0?d.mapToIds(d.data.targets):g.data_hide),g.legend_hide&&d.addHiddenLegendIds(g.legend_hide===!0?d.mapToIds(d.data.targets):g.legend_hide),d.hasType("gauge")&&(g.legend_show=!1),d.updateSizes(),d.updateScales(),d.x.domain(e.extent(d.getXDomain(d.data.targets))),d.y.domain(d.getYDomain(d.data.targets,"y")),d.y2.domain(d.getYDomain(d.data.targets,"y2")),d.subX.domain(d.x.domain()),d.subY.domain(d.y.domain()),d.subY2.domain(d.y2.domain()),d.orgXDomain=d.x.domain(),d.brush&&d.brush.scale(d.subX),g.zoom_enabled&&d.zoom.scale(d.x),d.svg=d.selectChart.append("svg").style("overflow","hidden").on("mouseenter",function(){return g.onmouseover.call(d)}).on("mouseleave",function(){return g.onmouseout.call(d)}),d.config.svg_classname&&d.svg.attr("class",d.config.svg_classname),b=d.svg.append("defs"),d.clipChart=d.appendClip(b,d.clipId),d.clipXAxis=d.appendClip(b,d.clipIdForXAxis),d.clipYAxis=d.appendClip(b,d.clipIdForYAxis),d.clipGrid=d.appendClip(b,d.clipIdForGrid),d.clipSubchart=d.appendClip(b,d.clipIdForSubchart),d.updateSvgSize(),c=d.main=d.svg.append("g").attr("transform",d.getTranslate("main")),d.initSubchart&&d.initSubchart(),d.initTooltip&&d.initTooltip(),d.initLegend&&d.initLegend(),d.initTitle&&d.initTitle(),c.append("text").attr("class",l.text+" "+l.empty).attr("text-anchor","middle").attr("dominant-baseline","middle"),d.initRegion(),d.initGrid(),c.append("g").attr("clip-path",d.clipPath).attr("class",l.chart),g.grid_lines_front&&d.initGridLines(),d.initEventRect(),d.initChartElements(),c.insert("rect",g.zoom_privileged?null:"g."+l.regions).attr("class",l.zoomRect).attr("width",d.width).attr("height",d.height).style("opacity",0).on("dblclick.zoom",null),g.axis_x_extent&&d.brush.extent(d.getDefaultExtent()),d.axis.init(),d.updateTargets(d.data.targets),h&&(d.updateDimension(),d.config.oninit.call(d),d.redraw({withTransition:!1,withTransform:!0,withUpdateXDomain:!0,withUpdateOrgXDomain:!0,withTransitionForAxis:!1})),d.bindResize(),d.api.element=d.selectChart.node()},i.smoothLines=function(a,b){var c=this;"grid"===b&&a.each(function(){var a=c.d3.select(this),b=a.attr("x1"),d=a.attr("x2"),e=a.attr("y1"),f=a.attr("y2");a.attr({x1:Math.ceil(b),x2:Math.ceil(d),y1:Math.ceil(e),y2:Math.ceil(f)})})},i.updateSizes=function(){var a=this,b=a.config,c=a.legend?a.getLegendHeight():0,d=a.legend?a.getLegendWidth():0,e=a.isLegendRight||a.isLegendInset?0:c,f=a.hasArcType(),g=b.axis_rotated||f?0:a.getHorizontalAxisHeight("x"),h=b.subchart_show&&!f?b.subchart_size_height+g:0;a.currentWidth=a.getCurrentWidth(),a.currentHeight=a.getCurrentHeight(),a.margin=b.axis_rotated?{top:a.getHorizontalAxisHeight("y2")+a.getCurrentPaddingTop(),right:f?0:a.getCurrentPaddingRight(),bottom:a.getHorizontalAxisHeight("y")+e+a.getCurrentPaddingBottom(),left:h+(f?0:a.getCurrentPaddingLeft())}:{top:4+a.getCurrentPaddingTop(),right:f?0:a.getCurrentPaddingRight(),bottom:g+h+e+a.getCurrentPaddingBottom(),left:f?0:a.getCurrentPaddingLeft()},a.margin2=b.axis_rotated?{top:a.margin.top,right:NaN,bottom:20+e,left:a.rotated_padding_left}:{top:a.currentHeight-h-e,right:NaN,bottom:g+e,left:a.margin.left},a.margin3={top:0,right:NaN,bottom:0,left:0},a.updateSizeForLegend&&a.updateSizeForLegend(c,d),a.width=a.currentWidth-a.margin.left-a.margin.right,a.height=a.currentHeight-a.margin.top-a.margin.bottom,a.width<0&&(a.width=0),a.height<0&&(a.height=0),a.width2=b.axis_rotated?a.margin.left-a.rotated_padding_left-a.rotated_padding_right:a.width,a.height2=b.axis_rotated?a.height:a.currentHeight-a.margin2.top-a.margin2.bottom,a.width2<0&&(a.width2=0),a.height2<0&&(a.height2=0),a.arcWidth=a.width-(a.isLegendRight?d+10:0),a.arcHeight=a.height-(a.isLegendRight?0:10),a.hasType("gauge")&&!b.gauge_fullCircle&&(a.arcHeight+=a.height-a.getGaugeLabelHeight()),a.updateRadius&&a.updateRadius(),a.isLegendRight&&f&&(a.margin3.left=a.arcWidth/2+1.1*a.radiusExpanded)},i.updateTargets=function(a){var b=this;b.updateTargetsForText(a),b.updateTargetsForBar(a),b.updateTargetsForLine(a),b.hasArcType()&&b.updateTargetsForArc&&b.updateTargetsForArc(a),b.updateTargetsForSubchart&&b.updateTargetsForSubchart(a),b.showTargets()},i.showTargets=function(){var a=this;a.svg.selectAll("."+l.target).filter(function(b){return a.isTargetToShow(b.id)}).transition().duration(a.config.transition_duration).style("opacity",1)},i.redraw=function(a,b){var c,d,e,f,g,h,i,j,k,m,n,o,p,q,r,s,t,u,v,x,y,z,A,B,C,D,E,F,G,H=this,I=H.main,J=H.d3,K=H.config,L=H.getShapeIndices(H.isAreaType),M=H.getShapeIndices(H.isBarType),N=H.getShapeIndices(H.isLineType),O=H.hasArcType(),P=H.filterTargetsToShow(H.data.targets),Q=H.xv.bind(H);if(a=a||{},c=w(a,"withY",!0),d=w(a,"withSubchart",!0),e=w(a,"withTransition",!0),h=w(a,"withTransform",!1),i=w(a,"withUpdateXDomain",!1),j=w(a,"withUpdateOrgXDomain",!1),k=w(a,"withTrimXDomain",!0),p=w(a,"withUpdateXAxis",i),m=w(a,"withLegend",!1),n=w(a,"withEventRect",!0),o=w(a,"withDimension",!0),f=w(a,"withTransitionForExit",e),g=w(a,"withTransitionForAxis",e),v=e?K.transition_duration:0,x=f?v:0,y=g?v:0,b=b||H.axis.generateTransitions(y),m&&K.legend_show?H.updateLegend(H.mapToIds(H.data.targets),a,b):o&&H.updateDimension(!0),H.isCategorized()&&0===P.length&&H.x.domain([0,H.axes.x.selectAll(".tick").size()]),P.length?(H.updateXDomain(P,i,j,k),K.axis_x_tick_values||(B=H.axis.updateXAxisTickValues(P))):(H.xAxis.tickValues([]),H.subXAxis.tickValues([])),K.zoom_rescale&&!a.flow&&(E=H.x.orgDomain()),H.y.domain(H.getYDomain(P,"y",E)),H.y2.domain(H.getYDomain(P,"y2",E)),!K.axis_y_tick_values&&K.axis_y_tick_count&&H.yAxis.tickValues(H.axis.generateTickValues(H.y.domain(),K.axis_y_tick_count)),!K.axis_y2_tick_values&&K.axis_y2_tick_count&&H.y2Axis.tickValues(H.axis.generateTickValues(H.y2.domain(),K.axis_y2_tick_count)),H.axis.redraw(b,O),H.axis.updateLabels(e),(i||p)&&P.length)if(K.axis_x_tick_culling&&B){for(C=1;C<B.length;C++)if(B.length/C<K.axis_x_tick_culling_max){D=C;break}H.svg.selectAll("."+l.axisX+" .tick text").each(function(a){var b=B.indexOf(a);b>=0&&J.select(this).style("display",b%D?"none":"block")})}else H.svg.selectAll("."+l.axisX+" .tick text").style("display","block");q=H.generateDrawArea?H.generateDrawArea(L,!1):void 0,r=H.generateDrawBar?H.generateDrawBar(M):void 0,s=H.generateDrawLine?H.generateDrawLine(N,!1):void 0,t=H.generateXYForText(L,M,N,!0),u=H.generateXYForText(L,M,N,!1),c&&(H.subY.domain(H.getYDomain(P,"y")),H.subY2.domain(H.getYDomain(P,"y2"))),H.updateXgridFocus(),I.select("text."+l.text+"."+l.empty).attr("x",H.width/2).attr("y",H.height/2).text(K.data_empty_label_text).transition().style("opacity",P.length?0:1),H.updateGrid(v),H.updateRegion(v),H.updateBar(x),H.updateLine(x),H.updateArea(x),H.updateCircle(),H.hasDataLabel()&&H.updateText(x),H.redrawTitle&&H.redrawTitle(),H.redrawArc&&H.redrawArc(v,x,h),H.redrawSubchart&&H.redrawSubchart(d,b,v,x,L,M,N),I.selectAll("."+l.selectedCircles).filter(H.isBarType.bind(H)).selectAll("circle").remove(),K.interaction_enabled&&!a.flow&&n&&(H.redrawEventRect(),H.updateZoom&&H.updateZoom()),H.updateCircleY(),F=(H.config.axis_rotated?H.circleY:H.circleX).bind(H),G=(H.config.axis_rotated?H.circleX:H.circleY).bind(H),a.flow&&(A=H.generateFlow({targets:P,flow:a.flow,duration:a.flow.duration,drawBar:r,drawLine:s,drawArea:q,cx:F,cy:G,xv:Q,xForText:t,yForText:u})),(v||A)&&H.isTabVisible()?J.transition().duration(v).each(function(){var b=[];[H.redrawBar(r,!0),H.redrawLine(s,!0),H.redrawArea(q,!0),H.redrawCircle(F,G,!0),H.redrawText(t,u,a.flow,!0),H.redrawRegion(!0),H.redrawGrid(!0)].forEach(function(a){a.forEach(function(a){b.push(a)})}),z=H.generateWait(),b.forEach(function(a){z.add(a)})}).call(z,function(){A&&A(),K.onrendered&&K.onrendered.call(H)}):(H.redrawBar(r),H.redrawLine(s),H.redrawArea(q),H.redrawCircle(F,G),H.redrawText(t,u,a.flow),H.redrawRegion(),H.redrawGrid(),K.onrendered&&K.onrendered.call(H)),H.mapToIds(H.data.targets).forEach(function(a){H.withoutFadeIn[a]=!0})},i.updateAndRedraw=function(a){var b,c=this,d=c.config;a=a||{},a.withTransition=w(a,"withTransition",!0),a.withTransform=w(a,"withTransform",!1),a.withLegend=w(a,"withLegend",!1),a.withUpdateXDomain=!0,a.withUpdateOrgXDomain=!0,a.withTransitionForExit=!1,a.withTransitionForTransform=w(a,"withTransitionForTransform",a.withTransition),c.updateSizes(),a.withLegend&&d.legend_show||(b=c.axis.generateTransitions(a.withTransitionForAxis?d.transition_duration:0),c.updateScales(),c.updateSvgSize(),c.transformAll(a.withTransitionForTransform,b)),c.redraw(a,b)},i.redrawWithoutRescale=function(){this.redraw({withY:!1,withSubchart:!1,withEventRect:!1,withTransitionForAxis:!1})},i.isTimeSeries=function(){return"timeseries"===this.config.axis_x_type},i.isCategorized=function(){return this.config.axis_x_type.indexOf("categor")>=0},i.isCustomX=function(){var a=this,b=a.config;return!a.isTimeSeries()&&(b.data_x||v(b.data_xs))},i.isTimeSeriesY=function(){return"timeseries"===this.config.axis_y_type},i.getTranslate=function(a){var b,c,d=this,e=d.config;return"main"===a?(b=s(d.margin.left),c=s(d.margin.top)):"context"===a?(b=s(d.margin2.left),c=s(d.margin2.top)):"legend"===a?(b=d.margin3.left,c=d.margin3.top):"x"===a?(b=0,c=e.axis_rotated?0:d.height):"y"===a?(b=0,c=e.axis_rotated?d.height:0):"y2"===a?(b=e.axis_rotated?0:d.width,c=e.axis_rotated?1:0):"subx"===a?(b=0,c=e.axis_rotated?0:d.height2):"arc"===a&&(b=d.arcWidth/2,c=d.arcHeight/2),"translate("+b+","+c+")"},i.initialOpacity=function(a){return null!==a.value&&this.withoutFadeIn[a.id]?1:0},i.initialOpacityForCircle=function(a){return null!==a.value&&this.withoutFadeIn[a.id]?this.opacityForCircle(a):0},i.opacityForCircle=function(a){var b=this.config.point_show?1:0;return m(a.value)?this.isScatterType(a)?.5:b:0},i.opacityForText=function(){return this.hasDataLabel()?1:0},i.xx=function(a){return a?this.x(a.x):null},i.xv=function(a){var b=this,c=a.value;return b.isTimeSeries()?c=b.parseDate(a.value):b.isCategorized()&&"string"==typeof a.value&&(c=b.config.axis_x_categories.indexOf(a.value)),Math.ceil(b.x(c))},i.yv=function(a){var b=this,c=a.axis&&"y2"===a.axis?b.y2:b.y;return Math.ceil(c(a.value))},i.subxx=function(a){return a?this.subX(a.x):null},i.transformMain=function(a,b){var c,d,e,f=this;b&&b.axisX?c=b.axisX:(c=f.main.select("."+l.axisX),a&&(c=c.transition())),b&&b.axisY?d=b.axisY:(d=f.main.select("."+l.axisY),a&&(d=d.transition())),b&&b.axisY2?e=b.axisY2:(e=f.main.select("."+l.axisY2),a&&(e=e.transition())),(a?f.main.transition():f.main).attr("transform",f.getTranslate("main")),c.attr("transform",f.getTranslate("x")),d.attr("transform",f.getTranslate("y")),e.attr("transform",f.getTranslate("y2")),f.main.select("."+l.chartArcs).attr("transform",f.getTranslate("arc"))},i.transformAll=function(a,b){var c=this;c.transformMain(a,b),c.config.subchart_show&&c.transformContext(a,b),c.legend&&c.transformLegend(a)},i.updateSvgSize=function(){var a=this,b=a.svg.select(".c3-brush .background");a.svg.attr("width",a.currentWidth).attr("height",a.currentHeight),a.svg.selectAll(["#"+a.clipId,"#"+a.clipIdForGrid]).select("rect").attr("width",a.width).attr("height",a.height),a.svg.select("#"+a.clipIdForXAxis).select("rect").attr("x",a.getXAxisClipX.bind(a)).attr("y",a.getXAxisClipY.bind(a)).attr("width",a.getXAxisClipWidth.bind(a)).attr("height",a.getXAxisClipHeight.bind(a)),a.svg.select("#"+a.clipIdForYAxis).select("rect").attr("x",a.getYAxisClipX.bind(a)).attr("y",a.getYAxisClipY.bind(a)).attr("width",a.getYAxisClipWidth.bind(a)).attr("height",a.getYAxisClipHeight.bind(a)),a.svg.select("#"+a.clipIdForSubchart).select("rect").attr("width",a.width).attr("height",b.size()?b.attr("height"):0),a.svg.select("."+l.zoomRect).attr("width",a.width).attr("height",a.height),a.selectChart.style("max-height",a.currentHeight+"px")},i.updateDimension=function(a){var b=this;a||(b.config.axis_rotated?(b.axes.x.call(b.xAxis),b.axes.subx.call(b.subXAxis)):(b.axes.y.call(b.yAxis),b.axes.y2.call(b.y2Axis))),b.updateSizes(),b.updateScales(),b.updateSvgSize(),b.transformAll(!1)},i.observeInserted=function(b){var c,d=this;return"undefined"==typeof MutationObserver?void a.console.error("MutationObserver not defined."):(c=new MutationObserver(function(e){e.forEach(function(e){"childList"===e.type&&e.previousSibling&&(c.disconnect(),d.intervalForObserveInserted=a.setInterval(function(){b.node().parentNode&&(a.clearInterval(d.intervalForObserveInserted),d.updateDimension(),d.brush&&d.brush.update(),d.config.oninit.call(d),d.redraw({withTransform:!0,withUpdateXDomain:!0,withUpdateOrgXDomain:!0,withTransition:!1,withTransitionForTransform:!1,withLegend:!0}),b.transition().style("opacity",1))},10))})}),void c.observe(b.node(),{attributes:!0,childList:!0,characterData:!0}))},i.bindResize=function(){var b=this,c=b.config;if(b.resizeFunction=b.generateResize(),b.resizeFunction.add(function(){c.onresize.call(b)}),c.resize_auto&&b.resizeFunction.add(function(){void 0!==b.resizeTimeout&&a.clearTimeout(b.resizeTimeout),b.resizeTimeout=a.setTimeout(function(){delete b.resizeTimeout,b.api.flush()},100)}),b.resizeFunction.add(function(){c.onresized.call(b)}),a.attachEvent)a.attachEvent("onresize",b.resizeFunction);else if(a.addEventListener)a.addEventListener("resize",b.resizeFunction,!1);else{var d=a.onresize;d?d.add&&d.remove||(d=b.generateResize(),d.add(a.onresize)):d=b.generateResize(),d.add(b.resizeFunction),a.onresize=d}},i.generateResize=function(){function a(){b.forEach(function(a){a()})}var b=[];return a.add=function(a){b.push(a)},a.remove=function(a){for(var c=0;c<b.length;c++)if(b[c]===a){b.splice(c,1);break}},a},i.endall=function(a,b){var c=0;a.each(function(){++c}).each("end",function(){--c||b.apply(this,arguments)})},i.generateWait=function(){var a=[],b=function(b,c){var d=setInterval(function(){var b=0;a.forEach(function(a){if(a.empty())return void(b+=1);try{a.transition()}catch(c){b+=1}}),b===a.length&&(clearInterval(d),c&&c())},10)};return b.add=function(b){a.push(b)},b},i.parseDate=function(b){var c,d=this;return b instanceof Date?c=b:"string"==typeof b?c=d.dataTimeFormat(d.config.data_xFormat).parse(b):"number"!=typeof b||isNaN(b)||(c=new Date(+b)),c&&!isNaN(+c)||a.console.error("Failed to parse x '"+b+"' to Date object"),c},i.isTabVisible=function(){var a;return"undefined"!=typeof document.hidden?a="hidden":"undefined"!=typeof document.mozHidden?a="mozHidden":"undefined"!=typeof document.msHidden?a="msHidden":"undefined"!=typeof document.webkitHidden&&(a="webkitHidden"),!document[a]},i.getDefaultConfig=function(){var a={bindto:"#chart",svg_classname:void 0,size_width:void 0,size_height:void 0,padding_left:void 0,padding_right:void 0,padding_top:void 0,padding_bottom:void 0,resize_auto:!0,zoom_enabled:!1,zoom_extent:void 0,zoom_privileged:!1,zoom_rescale:!1,zoom_onzoom:function(){},zoom_onzoomstart:function(){},zoom_onzoomend:function(){},zoom_x_min:void 0,zoom_x_max:void 0,interaction_brighten:!0,interaction_enabled:!0,onmouseover:function(){},onmouseout:function(){},onresize:function(){},onresized:function(){},oninit:function(){},onrendered:function(){},transition_duration:350,data_x:void 0,data_xs:{},data_xFormat:"%Y-%m-%d",data_xLocaltime:!0,data_xSort:!0,data_idConverter:function(a){return a},data_names:{},data_classes:{},data_groups:[],data_axes:{},data_type:void 0,data_types:{},data_labels:{},data_order:"desc",data_regions:{},data_color:void 0,data_colors:{},data_hide:!1,data_filter:void 0,data_selection_enabled:!1,data_selection_grouped:!1,data_selection_isselectable:function(){return!0},data_selection_multiple:!0,data_selection_draggable:!1,data_onclick:function(){},data_onmouseover:function(){},data_onmouseout:function(){},data_onselected:function(){},data_onunselected:function(){},data_url:void 0,data_headers:void 0,data_json:void 0,data_rows:void 0,data_columns:void 0,data_mimeType:void 0,data_keys:void 0,data_empty_label_text:"",subchart_show:!1,subchart_size_height:60,subchart_axis_x_show:!0,subchart_onbrush:function(){},color_pattern:[],color_threshold:{},legend_show:!0,legend_hide:!1,legend_position:"bottom",legend_inset_anchor:"top-left",legend_inset_x:10,legend_inset_y:0,legend_inset_step:void 0,legend_item_onclick:void 0,legend_item_onmouseover:void 0,legend_item_onmouseout:void 0,legend_equally:!1,legend_padding:0,legend_item_tile_width:10,legend_item_tile_height:10,axis_rotated:!1,axis_x_show:!0,axis_x_type:"indexed",axis_x_localtime:!0,axis_x_categories:[],axis_x_tick_centered:!1,axis_x_tick_format:void 0,axis_x_tick_culling:{},axis_x_tick_culling_max:10,axis_x_tick_count:void 0,axis_x_tick_fit:!0,axis_x_tick_values:null,axis_x_tick_rotate:0,axis_x_tick_outer:!0,axis_x_tick_multiline:!0,axis_x_tick_width:null,axis_x_max:void 0,axis_x_min:void 0,axis_x_padding:{},axis_x_height:void 0,axis_x_extent:void 0,axis_x_label:{},axis_y_show:!0,axis_y_type:void 0,axis_y_max:void 0,axis_y_min:void 0,axis_y_inverted:!1,axis_y_center:void 0,axis_y_inner:void 0,axis_y_label:{},axis_y_tick_format:void 0,axis_y_tick_outer:!0,axis_y_tick_values:null,axis_y_tick_rotate:0,axis_y_tick_count:void 0,axis_y_tick_time_value:void 0,axis_y_tick_time_interval:void 0,axis_y_padding:{},axis_y_default:void 0,axis_y2_show:!1,axis_y2_max:void 0,axis_y2_min:void 0,axis_y2_inverted:!1,axis_y2_center:void 0,axis_y2_inner:void 0,axis_y2_label:{},axis_y2_tick_format:void 0,axis_y2_tick_outer:!0,axis_y2_tick_values:null,axis_y2_tick_count:void 0,axis_y2_padding:{},axis_y2_default:void 0,grid_x_show:!1,grid_x_type:"tick",grid_x_lines:[],grid_y_show:!1,grid_y_lines:[],grid_y_ticks:10,grid_focus_show:!0,grid_lines_front:!0,point_show:!0,point_r:2.5,point_sensitivity:10,point_focus_expand_enabled:!0,point_focus_expand_r:void 0,point_select_r:void 0,line_connectNull:!1,line_step_type:"step",bar_width:void 0,bar_width_ratio:.6,bar_width_max:void 0,bar_zerobased:!0,area_zerobased:!0,area_above:!1,pie_label_show:!0,pie_label_format:void 0,pie_label_threshold:.05,pie_label_ratio:void 0,pie_expand:{},pie_expand_duration:50,gauge_fullCircle:!1,gauge_label_show:!0,gauge_label_format:void 0,gauge_min:0,gauge_max:100,gauge_startingAngle:-1*Math.PI/2,gauge_units:void 0,gauge_width:void 0,gauge_expand:{},gauge_expand_duration:50,donut_label_show:!0,donut_label_format:void 0,donut_label_threshold:.05,donut_label_ratio:void 0,donut_width:void 0,donut_title:"",donut_expand:{},donut_expand_duration:50,spline_interpolation_type:"cardinal",regions:[],tooltip_show:!0,tooltip_grouped:!0,tooltip_format_title:void 0,tooltip_format_name:void 0,tooltip_format_value:void 0,tooltip_position:void 0,tooltip_contents:function(a,b,c,d){return this.getTooltipContent?this.getTooltipContent(a,b,c,d):""},tooltip_init_show:!1,tooltip_init_x:0,tooltip_init_position:{top:"0px",left:"50px"},tooltip_onshow:function(){},tooltip_onhide:function(){},title_text:void 0,title_padding:{top:0,right:0,bottom:0,left:0},title_position:"top-center"};return Object.keys(this.additionalConfig).forEach(function(b){a[b]=this.additionalConfig[b]},this),a},i.additionalConfig={},i.loadConfig=function(a){function b(){var a=d.shift();return a&&c&&"object"==typeof c&&a in c?(c=c[a],b()):a?void 0:c}var c,d,e,f=this.config;Object.keys(f).forEach(function(g){c=a,d=g.split("_"),e=b(),q(e)&&(f[g]=e)})},i.getScale=function(a,b,c){return(c?this.d3.time.scale():this.d3.scale.linear()).range([a,b])},i.getX=function(a,b,c,d){var e,f=this,g=f.getScale(a,b,f.isTimeSeries()),h=c?g.domain(c):g;f.isCategorized()?(d=d||function(){return 0},g=function(a,b){var c=h(a)+d(a);return b?c:Math.ceil(c)}):g=function(a,b){var c=h(a);return b?c:Math.ceil(c)};for(e in h)g[e]=h[e];return g.orgDomain=function(){return h.domain()},f.isCategorized()&&(g.domain=function(a){return arguments.length?(h.domain(a),g):(a=this.orgDomain(),[a[0],a[1]+1])}),g},i.getY=function(a,b,c){var d=this.getScale(a,b,this.isTimeSeriesY());return c&&d.domain(c),d},i.getYScale=function(a){return"y2"===this.axis.getId(a)?this.y2:this.y},i.getSubYScale=function(a){return"y2"===this.axis.getId(a)?this.subY2:this.subY},i.updateScales=function(){var a=this,b=a.config,c=!a.x;a.xMin=b.axis_rotated?1:0,a.xMax=b.axis_rotated?a.height:a.width,a.yMin=b.axis_rotated?0:a.height,a.yMax=b.axis_rotated?a.width:1,a.subXMin=a.xMin,a.subXMax=a.xMax,a.subYMin=b.axis_rotated?0:a.height2,a.subYMax=b.axis_rotated?a.width2:1,a.x=a.getX(a.xMin,a.xMax,c?void 0:a.x.orgDomain(),function(){return a.xAxis.tickOffset()}),a.y=a.getY(a.yMin,a.yMax,c?b.axis_y_default:a.y.domain()),a.y2=a.getY(a.yMin,a.yMax,c?b.axis_y2_default:a.y2.domain()),a.subX=a.getX(a.xMin,a.xMax,a.orgXDomain,function(b){return b%1?0:a.subXAxis.tickOffset()}),a.subY=a.getY(a.subYMin,a.subYMax,c?b.axis_y_default:a.subY.domain()),a.subY2=a.getY(a.subYMin,a.subYMax,c?b.axis_y2_default:a.subY2.domain()),a.xAxisTickFormat=a.axis.getXAxisTickFormat(),a.xAxisTickValues=a.axis.getXAxisTickValues(),a.yAxisTickValues=a.axis.getYAxisTickValues(),a.y2AxisTickValues=a.axis.getY2AxisTickValues(),a.xAxis=a.axis.getXAxis(a.x,a.xOrient,a.xAxisTickFormat,a.xAxisTickValues,b.axis_x_tick_outer),a.subXAxis=a.axis.getXAxis(a.subX,a.subXOrient,a.xAxisTickFormat,a.xAxisTickValues,b.axis_x_tick_outer),a.yAxis=a.axis.getYAxis(a.y,a.yOrient,b.axis_y_tick_format,a.yAxisTickValues,b.axis_y_tick_outer),a.y2Axis=a.axis.getYAxis(a.y2,a.y2Orient,b.axis_y2_tick_format,a.y2AxisTickValues,b.axis_y2_tick_outer),c||(a.brush&&a.brush.scale(a.subX),b.zoom_enabled&&a.zoom.scale(a.x)),a.updateArc&&a.updateArc()},i.getYDomainMin=function(a){var b,c,d,e,f,g,h=this,i=h.config,j=h.mapToIds(a),k=h.getValuesAsIdKeyed(a);if(i.data_groups.length>0)for(g=h.hasNegativeValueInTargets(a),b=0;b<i.data_groups.length;b++)if(e=i.data_groups[b].filter(function(a){return j.indexOf(a)>=0}),0!==e.length)for(d=e[0],g&&k[d]&&k[d].forEach(function(a,b){k[d][b]=0>a?a:0}),c=1;c<e.length;c++)f=e[c],k[f]&&k[f].forEach(function(a,b){h.axis.getId(f)!==h.axis.getId(d)||!k[d]||g&&+a>0||(k[d][b]+=+a)});return h.d3.min(Object.keys(k).map(function(a){return h.d3.min(k[a])}))},i.getYDomainMax=function(a){var b,c,d,e,f,g,h=this,i=h.config,j=h.mapToIds(a),k=h.getValuesAsIdKeyed(a);if(i.data_groups.length>0)for(g=h.hasPositiveValueInTargets(a),b=0;b<i.data_groups.length;b++)if(e=i.data_groups[b].filter(function(a){return j.indexOf(a)>=0}),0!==e.length)for(d=e[0],g&&k[d]&&k[d].forEach(function(a,b){k[d][b]=a>0?a:0}),c=1;c<e.length;c++)f=e[c],k[f]&&k[f].forEach(function(a,b){h.axis.getId(f)!==h.axis.getId(d)||!k[d]||g&&0>+a||(k[d][b]+=+a)});return h.d3.max(Object.keys(k).map(function(a){return h.d3.max(k[a])}))},i.getYDomain=function(a,b,c){var d,e,f,g,h,i,j,k,l,n,o,p=this,q=p.config,r=a.filter(function(a){return p.axis.getId(a.id)===b}),s=c?p.filterByXDomain(r,c):r,u="y2"===b?q.axis_y2_min:q.axis_y_min,w="y2"===b?q.axis_y2_max:q.axis_y_max,x=p.getYDomainMin(s),y=p.getYDomainMax(s),z="y2"===b?q.axis_y2_center:q.axis_y_center,A=p.hasType("bar",s)&&q.bar_zerobased||p.hasType("area",s)&&q.area_zerobased,B="y2"===b?q.axis_y2_inverted:q.axis_y_inverted,C=p.hasDataLabel()&&q.axis_rotated,D=p.hasDataLabel()&&!q.axis_rotated;return x=m(u)?u:m(w)?w>x?x:w-10:x,y=m(w)?w:m(u)?y>u?y:u+10:y,0===s.length?"y2"===b?p.y2.domain():p.y.domain():(isNaN(x)&&(x=0),isNaN(y)&&(y=x),x===y&&(0>x?y=0:x=0),n=x>=0&&y>=0,o=0>=x&&0>=y,(m(u)&&n||m(w)&&o)&&(A=!1),A&&(n&&(x=0),o&&(y=0)),e=Math.abs(y-x),f=g=h=.1*e,"undefined"!=typeof z&&(i=Math.max(Math.abs(x),Math.abs(y)),y=z+i,x=z-i),C?(j=p.getDataLabelLength(x,y,"width"),k=t(p.y.range()),l=[j[0]/k,j[1]/k],
2312 2312 g+=e*(l[1]/(1-l[0]-l[1])),h+=e*(l[0]/(1-l[0]-l[1]))):D&&(j=p.getDataLabelLength(x,y,"height"),g+=p.axis.convertPixelsToAxisPadding(j[1],e),h+=p.axis.convertPixelsToAxisPadding(j[0],e)),"y"===b&&v(q.axis_y_padding)&&(g=p.axis.getPadding(q.axis_y_padding,"top",g,e),h=p.axis.getPadding(q.axis_y_padding,"bottom",h,e)),"y2"===b&&v(q.axis_y2_padding)&&(g=p.axis.getPadding(q.axis_y2_padding,"top",g,e),h=p.axis.getPadding(q.axis_y2_padding,"bottom",h,e)),A&&(n&&(h=x),o&&(g=-y)),d=[x-h,y+g],B?d.reverse():d)},i.getXDomainMin=function(a){var b=this,c=b.config;return q(c.axis_x_min)?b.isTimeSeries()?this.parseDate(c.axis_x_min):c.axis_x_min:b.d3.min(a,function(a){return b.d3.min(a.values,function(a){return a.x})})},i.getXDomainMax=function(a){var b=this,c=b.config;return q(c.axis_x_max)?b.isTimeSeries()?this.parseDate(c.axis_x_max):c.axis_x_max:b.d3.max(a,function(a){return b.d3.max(a.values,function(a){return a.x})})},i.getXDomainPadding=function(a){var b,c,d,e,f=this,g=f.config,h=a[1]-a[0];return f.isCategorized()?c=0:f.hasType("bar")?(b=f.getMaxDataCount(),c=b>1?h/(b-1)/2:.5):c=.01*h,"object"==typeof g.axis_x_padding&&v(g.axis_x_padding)?(d=m(g.axis_x_padding.left)?g.axis_x_padding.left:c,e=m(g.axis_x_padding.right)?g.axis_x_padding.right:c):d=e="number"==typeof g.axis_x_padding?g.axis_x_padding:c,{left:d,right:e}},i.getXDomain=function(a){var b=this,c=[b.getXDomainMin(a),b.getXDomainMax(a)],d=c[0],e=c[1],f=b.getXDomainPadding(c),g=0,h=0;return d-e!==0||b.isCategorized()||(b.isTimeSeries()?(d=new Date(.5*d.getTime()),e=new Date(1.5*e.getTime())):(d=0===d?1:.5*d,e=0===e?-1:1.5*e)),(d||0===d)&&(g=b.isTimeSeries()?new Date(d.getTime()-f.left):d-f.left),(e||0===e)&&(h=b.isTimeSeries()?new Date(e.getTime()+f.right):e+f.right),[g,h]},i.updateXDomain=function(a,b,c,d,e){var f=this,g=f.config;return c&&(f.x.domain(e?e:f.d3.extent(f.getXDomain(a))),f.orgXDomain=f.x.domain(),g.zoom_enabled&&f.zoom.scale(f.x).updateScaleExtent(),f.subX.domain(f.x.domain()),f.brush&&f.brush.scale(f.subX)),b&&(f.x.domain(e?e:!f.brush||f.brush.empty()?f.orgXDomain:f.brush.extent()),g.zoom_enabled&&f.zoom.scale(f.x).updateScaleExtent()),d&&f.x.domain(f.trimXDomain(f.x.orgDomain())),f.x.domain()},i.trimXDomain=function(a){var b=this.getZoomDomain(),c=b[0],d=b[1];return a[0]<=c&&(a[1]=+a[1]+(c-a[0]),a[0]=c),d<=a[1]&&(a[0]=+a[0]-(a[1]-d),a[1]=d),a},i.isX=function(a){var b=this,c=b.config;return c.data_x&&a===c.data_x||v(c.data_xs)&&x(c.data_xs,a)},i.isNotX=function(a){return!this.isX(a)},i.getXKey=function(a){var b=this,c=b.config;return c.data_x?c.data_x:v(c.data_xs)?c.data_xs[a]:null},i.getXValuesOfXKey=function(a,b){var c,d=this,e=b&&v(b)?d.mapToIds(b):[];return e.forEach(function(b){d.getXKey(b)===a&&(c=d.data.xs[b])}),c},i.getIndexByX=function(a){var b=this,c=b.filterByX(b.data.targets,a);return c.length?c[0].index:null},i.getXValue=function(a,b){var c=this;return a in c.data.xs&&c.data.xs[a]&&m(c.data.xs[a][b])?c.data.xs[a][b]:b},i.getOtherTargetXs=function(){var a=this,b=Object.keys(a.data.xs);return b.length?a.data.xs[b[0]]:null},i.getOtherTargetX=function(a){var b=this.getOtherTargetXs();return b&&a<b.length?b[a]:null},i.addXs=function(a){var b=this;Object.keys(a).forEach(function(c){b.config.data_xs[c]=a[c]})},i.hasMultipleX=function(a){return this.d3.set(Object.keys(a).map(function(b){return a[b]})).size()>1},i.isMultipleX=function(){return v(this.config.data_xs)||!this.config.data_xSort||this.hasType("scatter")},i.addName=function(a){var b,c=this;return a&&(b=c.config.data_names[a.id],a.name=void 0!==b?b:a.id),a},i.getValueOnIndex=function(a,b){var c=a.filter(function(a){return a.index===b});return c.length?c[0]:null},i.updateTargetX=function(a,b){var c=this;a.forEach(function(a){a.values.forEach(function(d,e){d.x=c.generateTargetX(b[e],a.id,e)}),c.data.xs[a.id]=b})},i.updateTargetXs=function(a,b){var c=this;a.forEach(function(a){b[a.id]&&c.updateTargetX([a],b[a.id])})},i.generateTargetX=function(a,b,c){var d,e=this;return d=e.isTimeSeries()?a?e.parseDate(a):e.parseDate(e.getXValue(b,c)):e.isCustomX()&&!e.isCategorized()?m(a)?+a:e.getXValue(b,c):c},i.cloneTarget=function(a){return{id:a.id,id_org:a.id_org,values:a.values.map(function(a){return{x:a.x,value:a.value,id:a.id}})}},i.updateXs=function(){var a=this;a.data.targets.length&&(a.xs=[],a.data.targets[0].values.forEach(function(b){a.xs[b.index]=b.x}))},i.getPrevX=function(a){var b=this.xs[a-1];return"undefined"!=typeof b?b:null},i.getNextX=function(a){var b=this.xs[a+1];return"undefined"!=typeof b?b:null},i.getMaxDataCount=function(){var a=this;return a.d3.max(a.data.targets,function(a){return a.values.length})},i.getMaxDataCountTarget=function(a){var b,c=a.length,d=0;return c>1?a.forEach(function(a){a.values.length>d&&(b=a,d=a.values.length)}):b=c?a[0]:null,b},i.getEdgeX=function(a){var b=this;return a.length?[b.d3.min(a,function(a){return a.values[0].x}),b.d3.max(a,function(a){return a.values[a.values.length-1].x})]:[0,0]},i.mapToIds=function(a){return a.map(function(a){return a.id})},i.mapToTargetIds=function(a){var b=this;return a?[].concat(a):b.mapToIds(b.data.targets)},i.hasTarget=function(a,b){var c,d=this.mapToIds(a);for(c=0;c<d.length;c++)if(d[c]===b)return!0;return!1},i.isTargetToShow=function(a){return this.hiddenTargetIds.indexOf(a)<0},i.isLegendToShow=function(a){return this.hiddenLegendIds.indexOf(a)<0},i.filterTargetsToShow=function(a){var b=this;return a.filter(function(a){return b.isTargetToShow(a.id)})},i.mapTargetsToUniqueXs=function(a){var b=this,c=b.d3.set(b.d3.merge(a.map(function(a){return a.values.map(function(a){return+a.x})}))).values();return c=b.isTimeSeries()?c.map(function(a){return new Date(+a)}):c.map(function(a){return+a}),c.sort(function(a,b){return b>a?-1:a>b?1:a>=b?0:NaN})},i.addHiddenTargetIds=function(a){this.hiddenTargetIds=this.hiddenTargetIds.concat(a)},i.removeHiddenTargetIds=function(a){this.hiddenTargetIds=this.hiddenTargetIds.filter(function(b){return a.indexOf(b)<0})},i.addHiddenLegendIds=function(a){this.hiddenLegendIds=this.hiddenLegendIds.concat(a)},i.removeHiddenLegendIds=function(a){this.hiddenLegendIds=this.hiddenLegendIds.filter(function(b){return a.indexOf(b)<0})},i.getValuesAsIdKeyed=function(a){var b={};return a.forEach(function(a){b[a.id]=[],a.values.forEach(function(c){b[a.id].push(c.value)})}),b},i.checkValueInTargets=function(a,b){var c,d,e,f=Object.keys(a);for(c=0;c<f.length;c++)for(e=a[f[c]].values,d=0;d<e.length;d++)if(b(e[d].value))return!0;return!1},i.hasNegativeValueInTargets=function(a){return this.checkValueInTargets(a,function(a){return 0>a})},i.hasPositiveValueInTargets=function(a){return this.checkValueInTargets(a,function(a){return a>0})},i.isOrderDesc=function(){var a=this.config;return"string"==typeof a.data_order&&"desc"===a.data_order.toLowerCase()},i.isOrderAsc=function(){var a=this.config;return"string"==typeof a.data_order&&"asc"===a.data_order.toLowerCase()},i.orderTargets=function(a){var b=this,c=b.config,d=b.isOrderAsc(),e=b.isOrderDesc();return d||e?a.sort(function(a,b){var c=function(a,b){return a+Math.abs(b.value)},e=a.values.reduce(c,0),f=b.values.reduce(c,0);return d?f-e:e-f}):n(c.data_order)&&a.sort(c.data_order),a},i.filterByX=function(a,b){return this.d3.merge(a.map(function(a){return a.values})).filter(function(a){return a.x-b===0})},i.filterRemoveNull=function(a){return a.filter(function(a){return m(a.value)})},i.filterByXDomain=function(a,b){return a.map(function(a){return{id:a.id,id_org:a.id_org,values:a.values.filter(function(a){return b[0]<=a.x&&a.x<=b[1]})}})},i.hasDataLabel=function(){var a=this.config;return"boolean"==typeof a.data_labels&&a.data_labels?!0:!("object"!=typeof a.data_labels||!v(a.data_labels))},i.getDataLabelLength=function(a,b,c){var d=this,e=[0,0],f=1.3;return d.selectChart.select("svg").selectAll(".dummy").data([a,b]).enter().append("text").text(function(a){return d.dataLabelFormat(a.id)(a)}).each(function(a,b){e[b]=this.getBoundingClientRect()[c]*f}).remove(),e},i.isNoneArc=function(a){return this.hasTarget(this.data.targets,a.id)},i.isArc=function(a){return"data"in a&&this.hasTarget(this.data.targets,a.data.id)},i.findSameXOfValues=function(a,b){var c,d=a[b].x,e=[];for(c=b-1;c>=0&&d===a[c].x;c--)e.push(a[c]);for(c=b;c<a.length&&d===a[c].x;c++)e.push(a[c]);return e},i.findClosestFromTargets=function(a,b){var c,d=this;return c=a.map(function(a){return d.findClosest(a.values,b)}),d.findClosest(c,b)},i.findClosest=function(a,b){var c,d=this,e=d.config.point_sensitivity;return a.filter(function(a){return a&&d.isBarType(a.id)}).forEach(function(a){var b=d.main.select("."+l.bars+d.getTargetSelectorSuffix(a.id)+" ."+l.bar+"-"+a.index).node();!c&&d.isWithinBar(b)&&(c=a)}),a.filter(function(a){return a&&!d.isBarType(a.id)}).forEach(function(a){var f=d.dist(a,b);e>f&&(e=f,c=a)}),c},i.dist=function(a,b){var c=this,d=c.config,e=d.axis_rotated?1:0,f=d.axis_rotated?0:1,g=c.circleY(a,a.index),h=c.x(a.x);return Math.sqrt(Math.pow(h-b[e],2)+Math.pow(g-b[f],2))},i.convertValuesToStep=function(a){var b,c=[].concat(a);if(!this.isCategorized())return a;for(b=a.length+1;b>0;b--)c[b]=c[b-1];return c[0]={x:c[0].x-1,value:c[0].value,id:c[0].id},c[a.length+1]={x:c[a.length].x+1,value:c[a.length].value,id:c[a.length].id},c},i.updateDataAttributes=function(a,b){var c=this,d=c.config,e=d["data_"+a];return"undefined"==typeof b?e:(Object.keys(b).forEach(function(a){e[a]=b[a]}),c.redraw({withLegend:!0}),e)},i.convertUrlToData=function(a,b,c,d,e){var f=this,g=b?b:"csv",h=f.d3.xhr(a);c&&Object.keys(c).forEach(function(a){h.header(a,c[a])}),h.get(function(a,b){var c;if(!b)throw new Error(a.responseURL+" "+a.status+" ("+a.statusText+")");c="json"===g?f.convertJsonToData(JSON.parse(b.response),d):"tsv"===g?f.convertTsvToData(b.response):f.convertCsvToData(b.response),e.call(f,c)})},i.convertXsvToData=function(a,b){var c,d=b.parseRows(a);return 1===d.length?(c=[{}],d[0].forEach(function(a){c[0][a]=null})):c=b.parse(a),c},i.convertCsvToData=function(a){return this.convertXsvToData(a,this.d3.csv)},i.convertTsvToData=function(a){return this.convertXsvToData(a,this.d3.tsv)},i.convertJsonToData=function(a,b){var c,d,e=this,f=[];return b?(b.x?(c=b.value.concat(b.x),e.config.data_x=b.x):c=b.value,f.push(c),a.forEach(function(a){var b=[];c.forEach(function(c){var d=e.findValueInJson(a,c);p(d)&&(d=null),b.push(d)}),f.push(b)}),d=e.convertRowsToData(f)):(Object.keys(a).forEach(function(b){f.push([b].concat(a[b]))}),d=e.convertColumnsToData(f)),d},i.findValueInJson=function(a,b){b=b.replace(/\[(\w+)\]/g,".$1"),b=b.replace(/^\./,"");for(var c=b.split("."),d=0;d<c.length;++d){var e=c[d];if(!(e in a))return;a=a[e]}return a},i.convertRowsToData=function(a){var b,c,d=a[0],e={},f=[];for(b=1;b<a.length;b++){for(e={},c=0;c<a[b].length;c++){if(p(a[b][c]))throw new Error("Source data is missing a component at ("+b+","+c+")!");e[d[c]]=a[b][c]}f.push(e)}return f},i.convertColumnsToData=function(a){var b,c,d,e=[];for(b=0;b<a.length;b++)for(d=a[b][0],c=1;c<a[b].length;c++){if(p(e[c-1])&&(e[c-1]={}),p(a[b][c]))throw new Error("Source data is missing a component at ("+b+","+c+")!");e[c-1][d]=a[b][c]}return e},i.convertDataToTargets=function(a,b){var c,d=this,e=d.config,f=d.d3.keys(a[0]).filter(d.isNotX,d),g=d.d3.keys(a[0]).filter(d.isX,d);return f.forEach(function(c){var f=d.getXKey(c);d.isCustomX()||d.isTimeSeries()?g.indexOf(f)>=0?d.data.xs[c]=(b&&d.data.xs[c]?d.data.xs[c]:[]).concat(a.map(function(a){return a[f]}).filter(m).map(function(a,b){return d.generateTargetX(a,c,b)})):e.data_x?d.data.xs[c]=d.getOtherTargetXs():v(e.data_xs)&&(d.data.xs[c]=d.getXValuesOfXKey(f,d.data.targets)):d.data.xs[c]=a.map(function(a,b){return b})}),f.forEach(function(a){if(!d.data.xs[a])throw new Error('x is not defined for id = "'+a+'".')}),c=f.map(function(b,c){var f=e.data_idConverter(b);return{id:f,id_org:b,values:a.map(function(a,g){var h,i=d.getXKey(b),j=a[i],k=null===a[b]||isNaN(a[b])?null:+a[b];return d.isCustomX()&&d.isCategorized()&&0===c&&!p(j)?(0===c&&0===g&&(e.axis_x_categories=[]),h=e.axis_x_categories.indexOf(j),-1===h&&(h=e.axis_x_categories.length,e.axis_x_categories.push(j))):h=d.generateTargetX(j,b,g),(p(a[b])||d.data.xs[b].length<=g)&&(h=void 0),{x:h,value:k,id:f}}).filter(function(a){return q(a.x)})}}),c.forEach(function(a){var b;e.data_xSort&&(a.values=a.values.sort(function(a,b){var c=a.x||0===a.x?a.x:1/0,d=b.x||0===b.x?b.x:1/0;return c-d})),b=0,a.values.forEach(function(a){a.index=b++}),d.data.xs[a.id].sort(function(a,b){return a-b})}),d.hasNegativeValue=d.hasNegativeValueInTargets(c),d.hasPositiveValue=d.hasPositiveValueInTargets(c),e.data_type&&d.setTargetType(d.mapToIds(c).filter(function(a){return!(a in e.data_types)}),e.data_type),c.forEach(function(a){d.addCache(a.id_org,a)}),c},i.load=function(a,b){var c=this;a&&(b.filter&&(a=a.filter(b.filter)),(b.type||b.types)&&a.forEach(function(a){var d=b.types&&b.types[a.id]?b.types[a.id]:b.type;c.setTargetType(a.id,d)}),c.data.targets.forEach(function(b){for(var c=0;c<a.length;c++)if(b.id===a[c].id){b.values=a[c].values,a.splice(c,1);break}}),c.data.targets=c.data.targets.concat(a)),c.updateTargets(c.data.targets),c.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0}),b.done&&b.done()},i.loadFromArgs=function(a){var b=this;a.data?b.load(b.convertDataToTargets(a.data),a):a.url?b.convertUrlToData(a.url,a.mimeType,a.headers,a.keys,function(c){b.load(b.convertDataToTargets(c),a)}):a.json?b.load(b.convertDataToTargets(b.convertJsonToData(a.json,a.keys)),a):a.rows?b.load(b.convertDataToTargets(b.convertRowsToData(a.rows)),a):a.columns?b.load(b.convertDataToTargets(b.convertColumnsToData(a.columns)),a):b.load(null,a)},i.unload=function(a,b){var c=this;return b||(b=function(){}),a=a.filter(function(a){return c.hasTarget(c.data.targets,a)}),a&&0!==a.length?(c.svg.selectAll(a.map(function(a){return c.selectorTarget(a)})).transition().style("opacity",0).remove().call(c.endall,b),void a.forEach(function(a){c.withoutFadeIn[a]=!1,c.legend&&c.legend.selectAll("."+l.legendItem+c.getTargetSelectorSuffix(a)).remove(),c.data.targets=c.data.targets.filter(function(b){return b.id!==a})})):void b()},i.categoryName=function(a){var b=this.config;return a<b.axis_x_categories.length?b.axis_x_categories[a]:a},i.initEventRect=function(){var a=this;a.main.select("."+l.chart).append("g").attr("class",l.eventRects).style("fill-opacity",0)},i.redrawEventRect=function(){var a,b,c=this,d=c.config,e=c.isMultipleX(),f=c.main.select("."+l.eventRects).style("cursor",d.zoom_enabled?d.axis_rotated?"ns-resize":"ew-resize":null).classed(l.eventRectsMultiple,e).classed(l.eventRectsSingle,!e);f.selectAll("."+l.eventRect).remove(),c.eventRect=f.selectAll("."+l.eventRect),e?(a=c.eventRect.data([0]),c.generateEventRectsForMultipleXs(a.enter()),c.updateEventRect(a)):(b=c.getMaxDataCountTarget(c.data.targets),f.datum(b?b.values:[]),c.eventRect=f.selectAll("."+l.eventRect),a=c.eventRect.data(function(a){return a}),c.generateEventRectsForSingleX(a.enter()),c.updateEventRect(a),a.exit().remove())},i.updateEventRect=function(a){var b,c,d,e,f,g,h=this,i=h.config;a=a||h.eventRect.data(function(a){return a}),h.isMultipleX()?(b=0,c=0,d=h.width,e=h.height):(!h.isCustomX()&&!h.isTimeSeries()||h.isCategorized()?(f=h.getEventRectWidth(),g=function(a){return h.x(a.x)-f/2}):(h.updateXs(),f=function(a){var b=h.getPrevX(a.index),c=h.getNextX(a.index);return null===b&&null===c?i.axis_rotated?h.height:h.width:(null===b&&(b=h.x.domain()[0]),null===c&&(c=h.x.domain()[1]),Math.max(0,(h.x(c)-h.x(b))/2))},g=function(a){var b=h.getPrevX(a.index),c=h.getNextX(a.index),d=h.data.xs[a.id][a.index];return null===b&&null===c?0:(null===b&&(b=h.x.domain()[0]),(h.x(d)+h.x(b))/2)}),b=i.axis_rotated?0:g,c=i.axis_rotated?g:0,d=i.axis_rotated?h.width:f,e=i.axis_rotated?f:h.height),a.attr("class",h.classEvent.bind(h)).attr("x",b).attr("y",c).attr("width",d).attr("height",e)},i.generateEventRectsForSingleX=function(a){var b=this,c=b.d3,d=b.config;a.append("rect").attr("class",b.classEvent.bind(b)).style("cursor",d.data_selection_enabled&&d.data_selection_grouped?"pointer":null).on("mouseover",function(a){var c=a.index;b.dragging||b.flowing||b.hasArcType()||(d.point_focus_expand_enabled&&b.expandCircles(c,null,!0),b.expandBars(c,null,!0),b.main.selectAll("."+l.shape+"-"+c).each(function(a){d.data_onmouseover.call(b.api,a)}))}).on("mouseout",function(a){var c=a.index;b.config&&(b.hasArcType()||(b.hideXGridFocus(),b.hideTooltip(),b.unexpandCircles(),b.unexpandBars(),b.main.selectAll("."+l.shape+"-"+c).each(function(a){d.data_onmouseout.call(b.api,a)})))}).on("mousemove",function(a){var e,f=a.index,g=b.svg.select("."+l.eventRect+"-"+f);b.dragging||b.flowing||b.hasArcType()||(b.isStepType(a)&&"step-after"===b.config.line_step_type&&c.mouse(this)[0]<b.x(b.getXValue(a.id,f))&&(f-=1),e=b.filterTargetsToShow(b.data.targets).map(function(a){return b.addName(b.getValueOnIndex(a.values,f))}),d.tooltip_grouped&&(b.showTooltip(e,this),b.showXGridFocus(e)),(!d.tooltip_grouped||d.data_selection_enabled&&!d.data_selection_grouped)&&b.main.selectAll("."+l.shape+"-"+f).each(function(){c.select(this).classed(l.EXPANDED,!0),d.data_selection_enabled&&g.style("cursor",d.data_selection_grouped?"pointer":null),d.tooltip_grouped||(b.hideXGridFocus(),b.hideTooltip(),d.data_selection_grouped||(b.unexpandCircles(f),b.unexpandBars(f)))}).filter(function(a){return b.isWithinShape(this,a)}).each(function(a){d.data_selection_enabled&&(d.data_selection_grouped||d.data_selection_isselectable(a))&&g.style("cursor","pointer"),d.tooltip_grouped||(b.showTooltip([a],this),b.showXGridFocus([a]),d.point_focus_expand_enabled&&b.expandCircles(f,a.id,!0),b.expandBars(f,a.id,!0))}))}).on("click",function(a){var e=a.index;if(!b.hasArcType()&&b.toggleShape){if(b.cancelClick)return void(b.cancelClick=!1);b.isStepType(a)&&"step-after"===d.line_step_type&&c.mouse(this)[0]<b.x(b.getXValue(a.id,e))&&(e-=1),b.main.selectAll("."+l.shape+"-"+e).each(function(a){(d.data_selection_grouped||b.isWithinShape(this,a))&&(b.toggleShape(this,a,e),b.config.data_onclick.call(b.api,a,this))})}}).call(d.data_selection_draggable&&b.drag?c.behavior.drag().origin(Object).on("drag",function(){b.drag(c.mouse(this))}).on("dragstart",function(){b.dragstart(c.mouse(this))}).on("dragend",function(){b.dragend()}):function(){})},i.generateEventRectsForMultipleXs=function(a){function b(){c.svg.select("."+l.eventRect).style("cursor",null),c.hideXGridFocus(),c.hideTooltip(),c.unexpandCircles(),c.unexpandBars()}var c=this,d=c.d3,e=c.config;a.append("rect").attr("x",0).attr("y",0).attr("width",c.width).attr("height",c.height).attr("class",l.eventRect).on("mouseout",function(){c.config&&(c.hasArcType()||b())}).on("mousemove",function(){var a,f,g,h,i=c.filterTargetsToShow(c.data.targets);if(!c.dragging&&!c.hasArcType(i)){if(a=d.mouse(this),f=c.findClosestFromTargets(i,a),!c.mouseover||f&&f.id===c.mouseover.id||(e.data_onmouseout.call(c.api,c.mouseover),c.mouseover=void 0),!f)return void b();g=c.isScatterType(f)||!e.tooltip_grouped?[f]:c.filterByX(i,f.x),h=g.map(function(a){return c.addName(a)}),c.showTooltip(h,this),e.point_focus_expand_enabled&&c.expandCircles(f.index,f.id,!0),c.expandBars(f.index,f.id,!0),c.showXGridFocus(h),(c.isBarType(f.id)||c.dist(f,a)<e.point_sensitivity)&&(c.svg.select("."+l.eventRect).style("cursor","pointer"),c.mouseover||(e.data_onmouseover.call(c.api,f),c.mouseover=f))}}).on("click",function(){var a,b,f=c.filterTargetsToShow(c.data.targets);c.hasArcType(f)||(a=d.mouse(this),b=c.findClosestFromTargets(f,a),b&&(c.isBarType(b.id)||c.dist(b,a)<e.point_sensitivity)&&c.main.selectAll("."+l.shapes+c.getTargetSelectorSuffix(b.id)).selectAll("."+l.shape+"-"+b.index).each(function(){(e.data_selection_grouped||c.isWithinShape(this,b))&&(c.toggleShape(this,b,b.index),c.config.data_onclick.call(c.api,b,this))}))}).call(e.data_selection_draggable&&c.drag?d.behavior.drag().origin(Object).on("drag",function(){c.drag(d.mouse(this))}).on("dragstart",function(){c.dragstart(d.mouse(this))}).on("dragend",function(){c.dragend()}):function(){})},i.dispatchEvent=function(b,c,d){var e=this,f="."+l.eventRect+(e.isMultipleX()?"":"-"+c),g=e.main.select(f).node(),h=g.getBoundingClientRect(),i=h.left+(d?d[0]:0),j=h.top+(d?d[1]:0),k=document.createEvent("MouseEvents");k.initMouseEvent(b,!0,!0,a,0,i,j,i,j,!1,!1,!1,!1,0,null),g.dispatchEvent(k)},i.getCurrentWidth=function(){var a=this,b=a.config;return b.size_width?b.size_width:a.getParentWidth()},i.getCurrentHeight=function(){var a=this,b=a.config,c=b.size_height?b.size_height:a.getParentHeight();return c>0?c:320/(a.hasType("gauge")&&!b.gauge_fullCircle?2:1)},i.getCurrentPaddingTop=function(){var a=this,b=a.config,c=m(b.padding_top)?b.padding_top:0;return a.title&&a.title.node()&&(c+=a.getTitlePadding()),c},i.getCurrentPaddingBottom=function(){var a=this.config;return m(a.padding_bottom)?a.padding_bottom:0},i.getCurrentPaddingLeft=function(a){var b=this,c=b.config;return m(c.padding_left)?c.padding_left:c.axis_rotated?c.axis_x_show?Math.max(r(b.getAxisWidthByAxisId("x",a)),40):1:!c.axis_y_show||c.axis_y_inner?b.axis.getYAxisLabelPosition().isOuter?30:1:r(b.getAxisWidthByAxisId("y",a))},i.getCurrentPaddingRight=function(){var a=this,b=a.config,c=10,d=a.isLegendRight?a.getLegendWidth()+20:0;return m(b.padding_right)?b.padding_right+1:b.axis_rotated?c+d:!b.axis_y2_show||b.axis_y2_inner?2+d+(a.axis.getY2AxisLabelPosition().isOuter?20:0):r(a.getAxisWidthByAxisId("y2"))+d},i.getParentRectValue=function(a){for(var b,c=this.selectChart.node();c&&"BODY"!==c.tagName;){try{b=c.getBoundingClientRect()[a]}catch(d){"width"===a&&(b=c.offsetWidth)}if(b)break;c=c.parentNode}return b},i.getParentWidth=function(){return this.getParentRectValue("width")},i.getParentHeight=function(){var a=this.selectChart.style("height");return a.indexOf("px")>0?+a.replace("px",""):0},i.getSvgLeft=function(a){var b=this,c=b.config,d=c.axis_rotated||!c.axis_rotated&&!c.axis_y_inner,e=c.axis_rotated?l.axisX:l.axisY,f=b.main.select("."+e).node(),g=f&&d?f.getBoundingClientRect():{right:0},h=b.selectChart.node().getBoundingClientRect(),i=b.hasArcType(),j=g.right-h.left-(i?0:b.getCurrentPaddingLeft(a));return j>0?j:0},i.getAxisWidthByAxisId=function(a,b){var c=this,d=c.axis.getLabelPositionById(a);return c.axis.getMaxTickWidth(a,b)+(d.isInner?20:40)},i.getHorizontalAxisHeight=function(a){var b=this,c=b.config,d=30;return"x"!==a||c.axis_x_show?"x"===a&&c.axis_x_height?c.axis_x_height:"y"!==a||c.axis_y_show?"y2"!==a||c.axis_y2_show?("x"===a&&!c.axis_rotated&&c.axis_x_tick_rotate&&(d=30+b.axis.getMaxTickWidth(a)*Math.cos(Math.PI*(90-c.axis_x_tick_rotate)/180)),"y"===a&&c.axis_rotated&&c.axis_y_tick_rotate&&(d=30+b.axis.getMaxTickWidth(a)*Math.cos(Math.PI*(90-c.axis_y_tick_rotate)/180)),d+(b.axis.getLabelPositionById(a).isInner?0:10)+("y2"===a?-10:0)):b.rotated_padding_top:!c.legend_show||b.isLegendRight||b.isLegendInset?1:10:8},i.getEventRectWidth=function(){return Math.max(0,this.xAxis.tickInterval())},i.getShapeIndices=function(a){var b,c,d=this,e=d.config,f={},g=0;return d.filterTargetsToShow(d.data.targets.filter(a,d)).forEach(function(a){for(b=0;b<e.data_groups.length;b++)if(!(e.data_groups[b].indexOf(a.id)<0))for(c=0;c<e.data_groups[b].length;c++)if(e.data_groups[b][c]in f){f[a.id]=f[e.data_groups[b][c]];break}p(f[a.id])&&(f[a.id]=g++)}),f.__max__=g-1,f},i.getShapeX=function(a,b,c,d){var e=this,f=d?e.subX:e.x;return function(d){var e=d.id in c?c[d.id]:0;return d.x||0===d.x?f(d.x)-a*(b/2-e):0}},i.getShapeY=function(a){var b=this;return function(c){var d=a?b.getSubYScale(c.id):b.getYScale(c.id);return d(c.value)}},i.getShapeOffset=function(a,b,c){var d=this,e=d.orderTargets(d.filterTargetsToShow(d.data.targets.filter(a,d))),f=e.map(function(a){return a.id});return function(a,g){var h=c?d.getSubYScale(a.id):d.getYScale(a.id),i=h(0),j=i;return e.forEach(function(c){var e=d.isStepType(a)?d.convertValuesToStep(c.values):c.values;c.id!==a.id&&b[c.id]===b[a.id]&&f.indexOf(c.id)<f.indexOf(a.id)&&("undefined"!=typeof e[g]&&+e[g].x===+a.x||(g=-1,e.forEach(function(b,c){b.x===a.x&&(g=c)})),g in e&&e[g].value*a.value>=0&&(j+=h(e[g].value)-i))}),j}},i.isWithinShape=function(a,b){var c,d=this,e=d.d3.select(a);return d.isTargetToShow(b.id)?"circle"===a.nodeName?c=d.isStepType(b)?d.isWithinStep(a,d.getYScale(b.id)(b.value)):d.isWithinCircle(a,1.5*d.pointSelectR(b)):"path"===a.nodeName&&(c=e.classed(l.bar)?d.isWithinBar(a):!0):c=!1,c},i.getInterpolate=function(a){var b=this,c=b.isInterpolationType(b.config.spline_interpolation_type)?b.config.spline_interpolation_type:"cardinal";return b.isSplineType(a)?c:b.isStepType(a)?b.config.line_step_type:"linear"},i.initLine=function(){var a=this;a.main.select("."+l.chart).append("g").attr("class",l.chartLines)},i.updateTargetsForLine=function(a){var b,c,d=this,e=d.config,f=d.classChartLine.bind(d),g=d.classLines.bind(d),h=d.classAreas.bind(d),i=d.classCircles.bind(d),j=d.classFocus.bind(d);b=d.main.select("."+l.chartLines).selectAll("."+l.chartLine).data(a).attr("class",function(a){return f(a)+j(a)}),c=b.enter().append("g").attr("class",f).style("opacity",0).style("pointer-events","none"),c.append("g").attr("class",g),c.append("g").attr("class",h),c.append("g").attr("class",function(a){return d.generateClass(l.selectedCircles,a.id)}),c.append("g").attr("class",i).style("cursor",function(a){return e.data_selection_isselectable(a)?"pointer":null}),a.forEach(function(a){d.main.selectAll("."+l.selectedCircles+d.getTargetSelectorSuffix(a.id)).selectAll("."+l.selectedCircle).each(function(b){b.value=a.values[b.index].value})})},i.updateLine=function(a){var b=this;b.mainLine=b.main.selectAll("."+l.lines).selectAll("."+l.line).data(b.lineData.bind(b)),b.mainLine.enter().append("path").attr("class",b.classLine.bind(b)).style("stroke",b.color),b.mainLine.style("opacity",b.initialOpacity.bind(b)).style("shape-rendering",function(a){return b.isStepType(a)?"crispEdges":""}).attr("transform",null),b.mainLine.exit().transition().duration(a).style("opacity",0).remove()},i.redrawLine=function(a,b){return[(b?this.mainLine.transition(Math.random().toString()):this.mainLine).attr("d",a).style("stroke",this.color).style("opacity",1)]},i.generateDrawLine=function(a,b){var c=this,d=c.config,e=c.d3.svg.line(),f=c.generateGetLinePoints(a,b),g=b?c.getSubYScale:c.getYScale,h=function(a){return(b?c.subxx:c.xx).call(c,a)},i=function(a,b){return d.data_groups.length>0?f(a,b)[0][1]:g.call(c,a.id)(a.value)};return e=d.axis_rotated?e.x(i).y(h):e.x(h).y(i),d.line_connectNull||(e=e.defined(function(a){return null!=a.value})),function(a){var f,h=d.line_connectNull?c.filterRemoveNull(a.values):a.values,i=b?c.x:c.subX,j=g.call(c,a.id),k=0,l=0;return c.isLineType(a)?d.data_regions[a.id]?f=c.lineWithRegions(h,i,j,d.data_regions[a.id]):(c.isStepType(a)&&(h=c.convertValuesToStep(h)),f=e.interpolate(c.getInterpolate(a))(h)):(h[0]&&(k=i(h[0].x),l=j(h[0].value)),f=d.axis_rotated?"M "+l+" "+k:"M "+k+" "+l),f?f:"M 0 0"}},i.generateGetLinePoints=function(a,b){var c=this,d=c.config,e=a.__max__+1,f=c.getShapeX(0,e,a,!!b),g=c.getShapeY(!!b),h=c.getShapeOffset(c.isLineType,a,!!b),i=b?c.getSubYScale:c.getYScale;return function(a,b){var e=i.call(c,a.id)(0),j=h(a,b)||e,k=f(a),l=g(a);return d.axis_rotated&&(0<a.value&&e>l||a.value<0&&l>e)&&(l=e),[[k,l-(e-j)],[k,l-(e-j)],[k,l-(e-j)],[k,l-(e-j)]]}},i.lineWithRegions=function(a,b,c,d){function e(a,b){var c;for(c=0;c<b.length;c++)if(b[c].start<a&&a<=b[c].end)return!0;return!1}function f(a){return"M"+a[0][0]+" "+a[0][1]+" "+a[1][0]+" "+a[1][1]}var g,h,i,j,k,l,m,n,o,r,s,t,u=this,v=u.config,w=-1,x="M",y=u.isCategorized()?.5:0,z=[];if(q(d))for(g=0;g<d.length;g++)z[g]={},p(d[g].start)?z[g].start=a[0].x:z[g].start=u.isTimeSeries()?u.parseDate(d[g].start):d[g].start,p(d[g].end)?z[g].end=a[a.length-1].x:z[g].end=u.isTimeSeries()?u.parseDate(d[g].end):d[g].end;for(s=v.axis_rotated?function(a){return c(a.value)}:function(a){return b(a.x)},t=v.axis_rotated?function(a){return b(a.x)}:function(a){return c(a.value)},i=u.isTimeSeries()?function(a,d,e,g){var h,i=a.x.getTime(),j=d.x-a.x,l=new Date(i+j*e),m=new Date(i+j*(e+g));return h=v.axis_rotated?[[c(k(e)),b(l)],[c(k(e+g)),b(m)]]:[[b(l),c(k(e))],[b(m),c(k(e+g))]],f(h)}:function(a,d,e,g){var h;return h=v.axis_rotated?[[c(k(e),!0),b(j(e))],[c(k(e+g),!0),b(j(e+g))]]:[[b(j(e),!0),c(k(e))],[b(j(e+g),!0),c(k(e+g))]],f(h)},g=0;g<a.length;g++){if(p(z)||!e(a[g].x,z))x+=" "+s(a[g])+" "+t(a[g]);else for(j=u.getScale(a[g-1].x+y,a[g].x+y,u.isTimeSeries()),k=u.getScale(a[g-1].value,a[g].value),l=b(a[g].x)-b(a[g-1].x),m=c(a[g].value)-c(a[g-1].value),n=Math.sqrt(Math.pow(l,2)+Math.pow(m,2)),o=2/n,r=2*o,h=o;1>=h;h+=r)x+=i(a[g-1],a[g],h,o);w=a[g].x}return x},i.updateArea=function(a){var b=this,c=b.d3;b.mainArea=b.main.selectAll("."+l.areas).selectAll("."+l.area).data(b.lineData.bind(b)),b.mainArea.enter().append("path").attr("class",b.classArea.bind(b)).style("fill",b.color).style("opacity",function(){return b.orgAreaOpacity=+c.select(this).style("opacity"),0}),b.mainArea.style("opacity",b.orgAreaOpacity),b.mainArea.exit().transition().duration(a).style("opacity",0).remove()},i.redrawArea=function(a,b){return[(b?this.mainArea.transition(Math.random().toString()):this.mainArea).attr("d",a).style("fill",this.color).style("opacity",this.orgAreaOpacity)]},i.generateDrawArea=function(a,b){var c=this,d=c.config,e=c.d3.svg.area(),f=c.generateGetAreaPoints(a,b),g=b?c.getSubYScale:c.getYScale,h=function(a){return(b?c.subxx:c.xx).call(c,a)},i=function(a,b){return d.data_groups.length>0?f(a,b)[0][1]:g.call(c,a.id)(c.getAreaBaseValue(a.id))},j=function(a,b){return d.data_groups.length>0?f(a,b)[1][1]:g.call(c,a.id)(a.value)};return e=d.axis_rotated?e.x0(i).x1(j).y(h):e.x(h).y0(d.area_above?0:i).y1(j),d.line_connectNull||(e=e.defined(function(a){return null!==a.value})),function(a){var b,f=d.line_connectNull?c.filterRemoveNull(a.values):a.values,g=0,h=0;return c.isAreaType(a)?(c.isStepType(a)&&(f=c.convertValuesToStep(f)),b=e.interpolate(c.getInterpolate(a))(f)):(f[0]&&(g=c.x(f[0].x),h=c.getYScale(a.id)(f[0].value)),b=d.axis_rotated?"M "+h+" "+g:"M "+g+" "+h),b?b:"M 0 0"}},i.getAreaBaseValue=function(){return 0},i.generateGetAreaPoints=function(a,b){var c=this,d=c.config,e=a.__max__+1,f=c.getShapeX(0,e,a,!!b),g=c.getShapeY(!!b),h=c.getShapeOffset(c.isAreaType,a,!!b),i=b?c.getSubYScale:c.getYScale;return function(a,b){var e=i.call(c,a.id)(0),j=h(a,b)||e,k=f(a),l=g(a);return d.axis_rotated&&(0<a.value&&e>l||a.value<0&&l>e)&&(l=e),[[k,j],[k,l-(e-j)],[k,l-(e-j)],[k,j]]}},i.updateCircle=function(){var a=this;a.mainCircle=a.main.selectAll("."+l.circles).selectAll("."+l.circle).data(a.lineOrScatterData.bind(a)),a.mainCircle.enter().append("circle").attr("class",a.classCircle.bind(a)).attr("r",a.pointR.bind(a)).style("fill",a.color),a.mainCircle.style("opacity",a.initialOpacityForCircle.bind(a)),a.mainCircle.exit().remove()},i.redrawCircle=function(a,b,c){var d=this.main.selectAll("."+l.selectedCircle);return[(c?this.mainCircle.transition(Math.random().toString()):this.mainCircle).style("opacity",this.opacityForCircle.bind(this)).style("fill",this.color).attr("cx",a).attr("cy",b),(c?d.transition(Math.random().toString()):d).attr("cx",a).attr("cy",b)]},i.circleX=function(a){return a.x||0===a.x?this.x(a.x):null},i.updateCircleY=function(){var a,b,c=this;c.config.data_groups.length>0?(a=c.getShapeIndices(c.isLineType),b=c.generateGetLinePoints(a),c.circleY=function(a,c){return b(a,c)[0][1]}):c.circleY=function(a){return c.getYScale(a.id)(a.value)}},i.getCircles=function(a,b){var c=this;return(b?c.main.selectAll("."+l.circles+c.getTargetSelectorSuffix(b)):c.main).selectAll("."+l.circle+(m(a)?"-"+a:""))},i.expandCircles=function(a,b,c){var d=this,e=d.pointExpandedR.bind(d);c&&d.unexpandCircles(),d.getCircles(a,b).classed(l.EXPANDED,!0).attr("r",e)},i.unexpandCircles=function(a){var b=this,c=b.pointR.bind(b);b.getCircles(a).filter(function(){return b.d3.select(this).classed(l.EXPANDED)}).classed(l.EXPANDED,!1).attr("r",c)},i.pointR=function(a){var b=this,c=b.config;return b.isStepType(a)?0:n(c.point_r)?c.point_r(a):c.point_r;
2313 2313 },i.pointExpandedR=function(a){var b=this,c=b.config;return c.point_focus_expand_enabled?c.point_focus_expand_r?c.point_focus_expand_r:1.75*b.pointR(a):b.pointR(a)},i.pointSelectR=function(a){var b=this,c=b.config;return n(c.point_select_r)?c.point_select_r(a):c.point_select_r?c.point_select_r:4*b.pointR(a)},i.isWithinCircle=function(a,b){var c=this.d3,d=c.mouse(a),e=c.select(a),f=+e.attr("cx"),g=+e.attr("cy");return Math.sqrt(Math.pow(f-d[0],2)+Math.pow(g-d[1],2))<b},i.isWithinStep=function(a,b){return Math.abs(b-this.d3.mouse(a)[1])<30},i.initBar=function(){var a=this;a.main.select("."+l.chart).append("g").attr("class",l.chartBars)},i.updateTargetsForBar=function(a){var b,c,d=this,e=d.config,f=d.classChartBar.bind(d),g=d.classBars.bind(d),h=d.classFocus.bind(d);b=d.main.select("."+l.chartBars).selectAll("."+l.chartBar).data(a).attr("class",function(a){return f(a)+h(a)}),c=b.enter().append("g").attr("class",f).style("opacity",0).style("pointer-events","none"),c.append("g").attr("class",g).style("cursor",function(a){return e.data_selection_isselectable(a)?"pointer":null})},i.updateBar=function(a){var b=this,c=b.barData.bind(b),d=b.classBar.bind(b),e=b.initialOpacity.bind(b),f=function(a){return b.color(a.id)};b.mainBar=b.main.selectAll("."+l.bars).selectAll("."+l.bar).data(c),b.mainBar.enter().append("path").attr("class",d).style("stroke",f).style("fill",f),b.mainBar.style("opacity",e),b.mainBar.exit().transition().duration(a).style("opacity",0).remove()},i.redrawBar=function(a,b){return[(b?this.mainBar.transition(Math.random().toString()):this.mainBar).attr("d",a).style("fill",this.color).style("opacity",1)]},i.getBarW=function(a,b){var c=this,d=c.config,e="number"==typeof d.bar_width?d.bar_width:b?a.tickInterval()*d.bar_width_ratio/b:0;return d.bar_width_max&&e>d.bar_width_max?d.bar_width_max:e},i.getBars=function(a,b){var c=this;return(b?c.main.selectAll("."+l.bars+c.getTargetSelectorSuffix(b)):c.main).selectAll("."+l.bar+(m(a)?"-"+a:""))},i.expandBars=function(a,b,c){var d=this;c&&d.unexpandBars(),d.getBars(a,b).classed(l.EXPANDED,!0)},i.unexpandBars=function(a){var b=this;b.getBars(a).classed(l.EXPANDED,!1)},i.generateDrawBar=function(a,b){var c=this,d=c.config,e=c.generateGetBarPoints(a,b);return function(a,b){var c=e(a,b),f=d.axis_rotated?1:0,g=d.axis_rotated?0:1,h="M "+c[0][f]+","+c[0][g]+" L"+c[1][f]+","+c[1][g]+" L"+c[2][f]+","+c[2][g]+" L"+c[3][f]+","+c[3][g]+" z";return h}},i.generateGetBarPoints=function(a,b){var c=this,d=b?c.subXAxis:c.xAxis,e=a.__max__+1,f=c.getBarW(d,e),g=c.getShapeX(f,e,a,!!b),h=c.getShapeY(!!b),i=c.getShapeOffset(c.isBarType,a,!!b),j=b?c.getSubYScale:c.getYScale;return function(a,b){var d=j.call(c,a.id)(0),e=i(a,b)||d,k=g(a),l=h(a);return c.config.axis_rotated&&(0<a.value&&d>l||a.value<0&&l>d)&&(l=d),[[k,e],[k,l-(d-e)],[k+f,l-(d-e)],[k+f,e]]}},i.isWithinBar=function(a){var b=this.d3.mouse(a),c=a.getBoundingClientRect(),d=a.pathSegList.getItem(0),e=a.pathSegList.getItem(1),f=Math.min(d.x,e.x),g=Math.min(d.y,e.y),h=c.width,i=c.height,j=2,k=f-j,l=f+h+j,m=g+i+j,n=g-j;return k<b[0]&&b[0]<l&&n<b[1]&&b[1]<m},i.initText=function(){var a=this;a.main.select("."+l.chart).append("g").attr("class",l.chartTexts),a.mainText=a.d3.selectAll([])},i.updateTargetsForText=function(a){var b,c,d=this,e=d.classChartText.bind(d),f=d.classTexts.bind(d),g=d.classFocus.bind(d);b=d.main.select("."+l.chartTexts).selectAll("."+l.chartText).data(a).attr("class",function(a){return e(a)+g(a)}),c=b.enter().append("g").attr("class",e).style("opacity",0).style("pointer-events","none"),c.append("g").attr("class",f)},i.updateText=function(a){var b=this,c=b.config,d=b.barOrLineData.bind(b),e=b.classText.bind(b);b.mainText=b.main.selectAll("."+l.texts).selectAll("."+l.text).data(d),b.mainText.enter().append("text").attr("class",e).attr("text-anchor",function(a){return c.axis_rotated?a.value<0?"end":"start":"middle"}).style("stroke","none").style("fill",function(a){return b.color(a)}).style("fill-opacity",0),b.mainText.text(function(a,c,d){return b.dataLabelFormat(a.id)(a.value,a.id,c,d)}),b.mainText.exit().transition().duration(a).style("fill-opacity",0).remove()},i.redrawText=function(a,b,c,d){return[(d?this.mainText.transition():this.mainText).attr("x",a).attr("y",b).style("fill",this.color).style("fill-opacity",c?0:this.opacityForText.bind(this))]},i.getTextRect=function(a,b,c){var d,e=this.d3.select("body").append("div").classed("c3",!0),f=e.append("svg").style("visibility","hidden").style("position","fixed").style("top",0).style("left",0),g=this.d3.select(c).style("font");return f.selectAll(".dummy").data([a]).enter().append("text").classed(b?b:"",!0).style("font",g).text(a).each(function(){d=this.getBoundingClientRect()}),e.remove(),d},i.generateXYForText=function(a,b,c,d){var e=this,f=e.generateGetAreaPoints(a,!1),g=e.generateGetBarPoints(b,!1),h=e.generateGetLinePoints(c,!1),i=d?e.getXForText:e.getYForText;return function(a,b){var c=e.isAreaType(a)?f:e.isBarType(a)?g:h;return i.call(e,c(a,b),a,this)}},i.getXForText=function(a,b,c){var d,e,f=this,g=c.getBoundingClientRect();return f.config.axis_rotated?(e=f.isBarType(b)?4:6,d=a[2][1]+e*(b.value<0?-1:1)):d=f.hasType("bar")?(a[2][0]+a[0][0])/2:a[0][0],null===b.value&&(d>f.width?d=f.width-g.width:0>d&&(d=4)),d},i.getYForText=function(a,b,c){var d,e=this,f=c.getBoundingClientRect();return e.config.axis_rotated?d=(a[0][0]+a[2][0]+.6*f.height)/2:(d=a[2][1],b.value<0||0===b.value&&!e.hasPositiveValue?(d+=f.height,e.isBarType(b)&&e.isSafari()?d-=3:!e.isBarType(b)&&e.isChrome()&&(d+=3)):d+=e.isBarType(b)?-3:-6),null!==b.value||e.config.axis_rotated||(d<f.height?d=f.height:d>this.height&&(d=this.height-4)),d},i.setTargetType=function(a,b){var c=this,d=c.config;c.mapToTargetIds(a).forEach(function(a){c.withoutFadeIn[a]=b===d.data_types[a],d.data_types[a]=b}),a||(d.data_type=b)},i.hasType=function(a,b){var c=this,d=c.config.data_types,e=!1;return b=b||c.data.targets,b&&b.length?b.forEach(function(b){var c=d[b.id];(c&&c.indexOf(a)>=0||!c&&"line"===a)&&(e=!0)}):Object.keys(d).length?Object.keys(d).forEach(function(b){d[b]===a&&(e=!0)}):e=c.config.data_type===a,e},i.hasArcType=function(a){return this.hasType("pie",a)||this.hasType("donut",a)||this.hasType("gauge",a)},i.isLineType=function(a){var b=this.config,c=o(a)?a:a.id;return!b.data_types[c]||["line","spline","area","area-spline","step","area-step"].indexOf(b.data_types[c])>=0},i.isStepType=function(a){var b=o(a)?a:a.id;return["step","area-step"].indexOf(this.config.data_types[b])>=0},i.isSplineType=function(a){var b=o(a)?a:a.id;return["spline","area-spline"].indexOf(this.config.data_types[b])>=0},i.isAreaType=function(a){var b=o(a)?a:a.id;return["area","area-spline","area-step"].indexOf(this.config.data_types[b])>=0},i.isBarType=function(a){var b=o(a)?a:a.id;return"bar"===this.config.data_types[b]},i.isScatterType=function(a){var b=o(a)?a:a.id;return"scatter"===this.config.data_types[b]},i.isPieType=function(a){var b=o(a)?a:a.id;return"pie"===this.config.data_types[b]},i.isGaugeType=function(a){var b=o(a)?a:a.id;return"gauge"===this.config.data_types[b]},i.isDonutType=function(a){var b=o(a)?a:a.id;return"donut"===this.config.data_types[b]},i.isArcType=function(a){return this.isPieType(a)||this.isDonutType(a)||this.isGaugeType(a)},i.lineData=function(a){return this.isLineType(a)?[a]:[]},i.arcData=function(a){return this.isArcType(a.data)?[a]:[]},i.barData=function(a){return this.isBarType(a)?a.values:[]},i.lineOrScatterData=function(a){return this.isLineType(a)||this.isScatterType(a)?a.values:[]},i.barOrLineData=function(a){return this.isBarType(a)||this.isLineType(a)?a.values:[]},i.isInterpolationType=function(a){return["linear","linear-closed","basis","basis-open","basis-closed","bundle","cardinal","cardinal-open","cardinal-closed","monotone"].indexOf(a)>=0},i.initGrid=function(){var a=this,b=a.config,c=a.d3;a.grid=a.main.append("g").attr("clip-path",a.clipPathForGrid).attr("class",l.grid),b.grid_x_show&&a.grid.append("g").attr("class",l.xgrids),b.grid_y_show&&a.grid.append("g").attr("class",l.ygrids),b.grid_focus_show&&a.grid.append("g").attr("class",l.xgridFocus).append("line").attr("class",l.xgridFocus),a.xgrid=c.selectAll([]),b.grid_lines_front||a.initGridLines()},i.initGridLines=function(){var a=this,b=a.d3;a.gridLines=a.main.append("g").attr("clip-path",a.clipPathForGrid).attr("class",l.grid+" "+l.gridLines),a.gridLines.append("g").attr("class",l.xgridLines),a.gridLines.append("g").attr("class",l.ygridLines),a.xgridLines=b.selectAll([])},i.updateXGrid=function(a){var b=this,c=b.config,d=b.d3,e=b.generateGridData(c.grid_x_type,b.x),f=b.isCategorized()?b.xAxis.tickOffset():0;b.xgridAttr=c.axis_rotated?{x1:0,x2:b.width,y1:function(a){return b.x(a)-f},y2:function(a){return b.x(a)-f}}:{x1:function(a){return b.x(a)+f},x2:function(a){return b.x(a)+f},y1:0,y2:b.height},b.xgrid=b.main.select("."+l.xgrids).selectAll("."+l.xgrid).data(e),b.xgrid.enter().append("line").attr("class",l.xgrid),a||b.xgrid.attr(b.xgridAttr).style("opacity",function(){return+d.select(this).attr(c.axis_rotated?"y1":"x1")===(c.axis_rotated?b.height:0)?0:1}),b.xgrid.exit().remove()},i.updateYGrid=function(){var a=this,b=a.config,c=a.yAxis.tickValues()||a.y.ticks(b.grid_y_ticks);a.ygrid=a.main.select("."+l.ygrids).selectAll("."+l.ygrid).data(c),a.ygrid.enter().append("line").attr("class",l.ygrid),a.ygrid.attr("x1",b.axis_rotated?a.y:0).attr("x2",b.axis_rotated?a.y:a.width).attr("y1",b.axis_rotated?0:a.y).attr("y2",b.axis_rotated?a.height:a.y),a.ygrid.exit().remove(),a.smoothLines(a.ygrid,"grid")},i.gridTextAnchor=function(a){return a.position?a.position:"end"},i.gridTextDx=function(a){return"start"===a.position?4:"middle"===a.position?0:-4},i.xGridTextX=function(a){return"start"===a.position?-this.height:"middle"===a.position?-this.height/2:0},i.yGridTextX=function(a){return"start"===a.position?0:"middle"===a.position?this.width/2:this.width},i.updateGrid=function(a){var b,c,d,e=this,f=e.main,g=e.config;e.grid.style("visibility",e.hasArcType()?"hidden":"visible"),f.select("line."+l.xgridFocus).style("visibility","hidden"),g.grid_x_show&&e.updateXGrid(),e.xgridLines=f.select("."+l.xgridLines).selectAll("."+l.xgridLine).data(g.grid_x_lines),b=e.xgridLines.enter().append("g").attr("class",function(a){return l.xgridLine+(a["class"]?" "+a["class"]:"")}),b.append("line").style("opacity",0),b.append("text").attr("text-anchor",e.gridTextAnchor).attr("transform",g.axis_rotated?"":"rotate(-90)").attr("dx",e.gridTextDx).attr("dy",-5).style("opacity",0),e.xgridLines.exit().transition().duration(a).style("opacity",0).remove(),g.grid_y_show&&e.updateYGrid(),e.ygridLines=f.select("."+l.ygridLines).selectAll("."+l.ygridLine).data(g.grid_y_lines),c=e.ygridLines.enter().append("g").attr("class",function(a){return l.ygridLine+(a["class"]?" "+a["class"]:"")}),c.append("line").style("opacity",0),c.append("text").attr("text-anchor",e.gridTextAnchor).attr("transform",g.axis_rotated?"rotate(-90)":"").attr("dx",e.gridTextDx).attr("dy",-5).style("opacity",0),d=e.yv.bind(e),e.ygridLines.select("line").transition().duration(a).attr("x1",g.axis_rotated?d:0).attr("x2",g.axis_rotated?d:e.width).attr("y1",g.axis_rotated?0:d).attr("y2",g.axis_rotated?e.height:d).style("opacity",1),e.ygridLines.select("text").transition().duration(a).attr("x",g.axis_rotated?e.xGridTextX.bind(e):e.yGridTextX.bind(e)).attr("y",d).text(function(a){return a.text}).style("opacity",1),e.ygridLines.exit().transition().duration(a).style("opacity",0).remove()},i.redrawGrid=function(a){var b=this,c=b.config,d=b.xv.bind(b),e=b.xgridLines.select("line"),f=b.xgridLines.select("text");return[(a?e.transition():e).attr("x1",c.axis_rotated?0:d).attr("x2",c.axis_rotated?b.width:d).attr("y1",c.axis_rotated?d:0).attr("y2",c.axis_rotated?d:b.height).style("opacity",1),(a?f.transition():f).attr("x",c.axis_rotated?b.yGridTextX.bind(b):b.xGridTextX.bind(b)).attr("y",d).text(function(a){return a.text}).style("opacity",1)]},i.showXGridFocus=function(a){var b=this,c=b.config,d=a.filter(function(a){return a&&m(a.value)}),e=b.main.selectAll("line."+l.xgridFocus),f=b.xx.bind(b);c.tooltip_show&&(b.hasType("scatter")||b.hasArcType()||(e.style("visibility","visible").data([d[0]]).attr(c.axis_rotated?"y1":"x1",f).attr(c.axis_rotated?"y2":"x2",f),b.smoothLines(e,"grid")))},i.hideXGridFocus=function(){this.main.select("line."+l.xgridFocus).style("visibility","hidden")},i.updateXgridFocus=function(){var a=this,b=a.config;a.main.select("line."+l.xgridFocus).attr("x1",b.axis_rotated?0:-10).attr("x2",b.axis_rotated?a.width:-10).attr("y1",b.axis_rotated?-10:0).attr("y2",b.axis_rotated?-10:a.height)},i.generateGridData=function(a,b){var c,d,e,f,g=this,h=[],i=g.main.select("."+l.axisX).selectAll(".tick").size();if("year"===a)for(c=g.getXDomain(),d=c[0].getFullYear(),e=c[1].getFullYear(),f=d;e>=f;f++)h.push(new Date(f+"-01-01 00:00:00"));else h=b.ticks(10),h.length>i&&(h=h.filter(function(a){return(""+a).indexOf(".")<0}));return h},i.getGridFilterToRemove=function(a){return a?function(b){var c=!1;return[].concat(a).forEach(function(a){("value"in a&&b.value===a.value||"class"in a&&b["class"]===a["class"])&&(c=!0)}),c}:function(){return!0}},i.removeGridLines=function(a,b){var c=this,d=c.config,e=c.getGridFilterToRemove(a),f=function(a){return!e(a)},g=b?l.xgridLines:l.ygridLines,h=b?l.xgridLine:l.ygridLine;c.main.select("."+g).selectAll("."+h).filter(e).transition().duration(d.transition_duration).style("opacity",0).remove(),b?d.grid_x_lines=d.grid_x_lines.filter(f):d.grid_y_lines=d.grid_y_lines.filter(f)},i.initTooltip=function(){var a,b=this,c=b.config;if(b.tooltip=b.selectChart.style("position","relative").append("div").attr("class",l.tooltipContainer).style("position","absolute").style("pointer-events","none").style("display","none"),c.tooltip_init_show){if(b.isTimeSeries()&&o(c.tooltip_init_x)){for(c.tooltip_init_x=b.parseDate(c.tooltip_init_x),a=0;a<b.data.targets[0].values.length&&b.data.targets[0].values[a].x-c.tooltip_init_x!==0;a++);c.tooltip_init_x=a}b.tooltip.html(c.tooltip_contents.call(b,b.data.targets.map(function(a){return b.addName(a.values[c.tooltip_init_x])}),b.axis.getXAxisTickFormat(),b.getYFormat(b.hasArcType()),b.color)),b.tooltip.style("top",c.tooltip_init_position.top).style("left",c.tooltip_init_position.left).style("display","block")}},i.getTooltipContent=function(a,b,c,d){var e,f,g,h,i,j,k=this,l=k.config,m=l.tooltip_format_title||b,n=l.tooltip_format_name||function(a){return a},o=l.tooltip_format_value||c,p=k.isOrderAsc();if(0===l.data_groups.length)a.sort(function(a,b){var c=a?a.value:null,d=b?b.value:null;return p?c-d:d-c});else{var q=k.orderTargets(k.data.targets).map(function(a){return a.id});a.sort(function(a,b){var c=a?a.value:null,d=b?b.value:null;return c>0&&d>0&&(c=a?q.indexOf(a.id):null,d=b?q.indexOf(b.id):null),p?c-d:d-c})}for(f=0;f<a.length;f++)if(a[f]&&(a[f].value||0===a[f].value)&&(e||(g=y(m?m(a[f].x):a[f].x),e="<table class='"+k.CLASS.tooltip+"'>"+(g||0===g?"<tr><th colspan='2'>"+g+"</th></tr>":"")),h=y(o(a[f].value,a[f].ratio,a[f].id,a[f].index,a)),void 0!==h)){if(null===a[f].name)continue;i=y(n(a[f].name,a[f].ratio,a[f].id,a[f].index)),j=k.levelColor?k.levelColor(a[f].value):d(a[f].id),e+="<tr class='"+k.CLASS.tooltipName+"-"+k.getTargetSelectorSuffix(a[f].id)+"'>",e+="<td class='name'><span style='background-color:"+j+"'></span>"+i+"</td>",e+="<td class='value'>"+h+"</td>",e+="</tr>"}return e+"</table>"},i.tooltipPosition=function(a,b,c,d){var e,f,g,h,i,j=this,k=j.config,l=j.d3,m=j.hasArcType(),n=l.mouse(d);return m?(f=(j.width-(j.isLegendRight?j.getLegendWidth():0))/2+n[0],h=j.height/2+n[1]+20):(e=j.getSvgLeft(!0),k.axis_rotated?(f=e+n[0]+100,g=f+b,i=j.currentWidth-j.getCurrentPaddingRight(),h=j.x(a[0].x)+20):(f=e+j.getCurrentPaddingLeft(!0)+j.x(a[0].x)+20,g=f+b,i=e+j.currentWidth-j.getCurrentPaddingRight(),h=n[1]+15),g>i&&(f-=g-i+20),h+c>j.currentHeight&&(h-=c+30)),0>h&&(h=0),{top:h,left:f}},i.showTooltip=function(a,b){var c,d,e,f=this,g=f.config,h=f.hasArcType(),j=a.filter(function(a){return a&&m(a.value)}),k=g.tooltip_position||i.tooltipPosition;0!==j.length&&g.tooltip_show&&(f.tooltip.html(g.tooltip_contents.call(f,a,f.axis.getXAxisTickFormat(),f.getYFormat(h),f.color)).style("display","block"),c=f.tooltip.property("offsetWidth"),d=f.tooltip.property("offsetHeight"),e=k.call(this,j,c,d,b),f.tooltip.style("top",e.top+"px").style("left",e.left+"px"))},i.hideTooltip=function(){this.tooltip.style("display","none")},i.initLegend=function(){var a=this;return a.legendItemTextBox={},a.legendHasRendered=!1,a.legend=a.svg.append("g").attr("transform",a.getTranslate("legend")),a.config.legend_show?void a.updateLegendWithDefaults():(a.legend.style("visibility","hidden"),void(a.hiddenLegendIds=a.mapToIds(a.data.targets)))},i.updateLegendWithDefaults=function(){var a=this;a.updateLegend(a.mapToIds(a.data.targets),{withTransform:!1,withTransitionForTransform:!1,withTransition:!1})},i.updateSizeForLegend=function(a,b){var c=this,d=c.config,e={top:c.isLegendTop?c.getCurrentPaddingTop()+d.legend_inset_y+5.5:c.currentHeight-a-c.getCurrentPaddingBottom()-d.legend_inset_y,left:c.isLegendLeft?c.getCurrentPaddingLeft()+d.legend_inset_x+.5:c.currentWidth-b-c.getCurrentPaddingRight()-d.legend_inset_x+.5};c.margin3={top:c.isLegendRight?0:c.isLegendInset?e.top:c.currentHeight-a,right:NaN,bottom:0,left:c.isLegendRight?c.currentWidth-b:c.isLegendInset?e.left:0}},i.transformLegend=function(a){var b=this;(a?b.legend.transition():b.legend).attr("transform",b.getTranslate("legend"))},i.updateLegendStep=function(a){this.legendStep=a},i.updateLegendItemWidth=function(a){this.legendItemWidth=a},i.updateLegendItemHeight=function(a){this.legendItemHeight=a},i.getLegendWidth=function(){var a=this;return a.config.legend_show?a.isLegendRight||a.isLegendInset?a.legendItemWidth*(a.legendStep+1):a.currentWidth:0},i.getLegendHeight=function(){var a=this,b=0;return a.config.legend_show&&(b=a.isLegendRight?a.currentHeight:Math.max(20,a.legendItemHeight)*(a.legendStep+1)),b},i.opacityForLegend=function(a){return a.classed(l.legendItemHidden)?null:1},i.opacityForUnfocusedLegend=function(a){return a.classed(l.legendItemHidden)?null:.3},i.toggleFocusLegend=function(a,b){var c=this;a=c.mapToTargetIds(a),c.legend.selectAll("."+l.legendItem).filter(function(b){return a.indexOf(b)>=0}).classed(l.legendItemFocused,b).transition().duration(100).style("opacity",function(){var a=b?c.opacityForLegend:c.opacityForUnfocusedLegend;return a.call(c,c.d3.select(this))})},i.revertLegend=function(){var a=this,b=a.d3;a.legend.selectAll("."+l.legendItem).classed(l.legendItemFocused,!1).transition().duration(100).style("opacity",function(){return a.opacityForLegend(b.select(this))})},i.showLegend=function(a){var b=this,c=b.config;c.legend_show||(c.legend_show=!0,b.legend.style("visibility","visible"),b.legendHasRendered||b.updateLegendWithDefaults()),b.removeHiddenLegendIds(a),b.legend.selectAll(b.selectorLegends(a)).style("visibility","visible").transition().style("opacity",function(){return b.opacityForLegend(b.d3.select(this))})},i.hideLegend=function(a){var b=this,c=b.config;c.legend_show&&u(a)&&(c.legend_show=!1,b.legend.style("visibility","hidden")),b.addHiddenLegendIds(a),b.legend.selectAll(b.selectorLegends(a)).style("opacity",0).style("visibility","hidden")},i.clearLegendItemTextBoxCache=function(){this.legendItemTextBox={}},i.updateLegend=function(a,b,c){function d(a,b){return y.legendItemTextBox[b]||(y.legendItemTextBox[b]=y.getTextRect(a.textContent,l.legendItem,a)),y.legendItemTextBox[b]}function e(b,c,e){function f(a,b){b||(g=(o-G-n)/2,E>g&&(g=(o-n)/2,G=0,M++)),L[a]=M,K[M]=y.isLegendInset?10:g,H[a]=G,G+=n}var g,h,i=0===e,j=e===a.length-1,k=d(b,c),l=k.width+F+(!j||y.isLegendRight||y.isLegendInset?B:0)+z.legend_padding,m=k.height+A,n=y.isLegendRight||y.isLegendInset?m:l,o=y.isLegendRight||y.isLegendInset?y.getLegendHeight():y.getLegendWidth();return i&&(G=0,M=0,C=0,D=0),z.legend_show&&!y.isLegendToShow(c)?void(I[c]=J[c]=L[c]=H[c]=0):(I[c]=l,J[c]=m,(!C||l>=C)&&(C=l),(!D||m>=D)&&(D=m),h=y.isLegendRight||y.isLegendInset?D:C,void(z.legend_equally?(Object.keys(I).forEach(function(a){I[a]=C}),Object.keys(J).forEach(function(a){J[a]=D}),g=(o-h*a.length)/2,E>g?(G=0,M=0,a.forEach(function(a){f(a)})):f(c,!0)):f(c)))}var f,g,h,i,j,k,m,n,o,p,r,s,t,u,v,x,y=this,z=y.config,A=4,B=10,C=0,D=0,E=10,F=z.legend_item_tile_width+5,G=0,H={},I={},J={},K=[0],L={},M=0;a=a.filter(function(a){return!q(z.data_names[a])||null!==z.data_names[a]}),b=b||{},r=w(b,"withTransition",!0),s=w(b,"withTransitionForTransform",!0),y.isLegendInset&&(M=z.legend_inset_step?z.legend_inset_step:a.length,y.updateLegendStep(M)),y.isLegendRight?(f=function(a){return C*L[a]},i=function(a){return K[L[a]]+H[a]}):y.isLegendInset?(f=function(a){return C*L[a]+10},i=function(a){return K[L[a]]+H[a]}):(f=function(a){return K[L[a]]+H[a]},i=function(a){return D*L[a]}),g=function(a,b){return f(a,b)+4+z.legend_item_tile_width},j=function(a,b){return i(a,b)+9},h=function(a,b){return f(a,b)},k=function(a,b){return i(a,b)-5},m=function(a,b){return f(a,b)-2},n=function(a,b){return f(a,b)-2+z.legend_item_tile_width},o=function(a,b){return i(a,b)+4},p=y.legend.selectAll("."+l.legendItem).data(a).enter().append("g").attr("class",function(a){return y.generateClass(l.legendItem,a)}).style("visibility",function(a){return y.isLegendToShow(a)?"visible":"hidden"}).style("cursor","pointer").on("click",function(a){z.legend_item_onclick?z.legend_item_onclick.call(y,a):y.d3.event.altKey?(y.api.hide(),y.api.show(a)):(y.api.toggle(a),y.isTargetToShow(a)?y.api.focus(a):y.api.revert())}).on("mouseover",function(a){z.legend_item_onmouseover?z.legend_item_onmouseover.call(y,a):(y.d3.select(this).classed(l.legendItemFocused,!0),!y.transiting&&y.isTargetToShow(a)&&y.api.focus(a))}).on("mouseout",function(a){z.legend_item_onmouseout?z.legend_item_onmouseout.call(y,a):(y.d3.select(this).classed(l.legendItemFocused,!1),y.api.revert())}),p.append("text").text(function(a){return q(z.data_names[a])?z.data_names[a]:a}).each(function(a,b){e(this,a,b)}).style("pointer-events","none").attr("x",y.isLegendRight||y.isLegendInset?g:-200).attr("y",y.isLegendRight||y.isLegendInset?-200:j),p.append("rect").attr("class",l.legendItemEvent).style("fill-opacity",0).attr("x",y.isLegendRight||y.isLegendInset?h:-200).attr("y",y.isLegendRight||y.isLegendInset?-200:k),p.append("line").attr("class",l.legendItemTile).style("stroke",y.color).style("pointer-events","none").attr("x1",y.isLegendRight||y.isLegendInset?m:-200).attr("y1",y.isLegendRight||y.isLegendInset?-200:o).attr("x2",y.isLegendRight||y.isLegendInset?n:-200).attr("y2",y.isLegendRight||y.isLegendInset?-200:o).attr("stroke-width",z.legend_item_tile_height),x=y.legend.select("."+l.legendBackground+" rect"),y.isLegendInset&&C>0&&0===x.size()&&(x=y.legend.insert("g","."+l.legendItem).attr("class",l.legendBackground).append("rect")),t=y.legend.selectAll("text").data(a).text(function(a){return q(z.data_names[a])?z.data_names[a]:a}).each(function(a,b){e(this,a,b)}),(r?t.transition():t).attr("x",g).attr("y",j),u=y.legend.selectAll("rect."+l.legendItemEvent).data(a),(r?u.transition():u).attr("width",function(a){return I[a]}).attr("height",function(a){return J[a]}).attr("x",h).attr("y",k),v=y.legend.selectAll("line."+l.legendItemTile).data(a),(r?v.transition():v).style("stroke",y.color).attr("x1",m).attr("y1",o).attr("x2",n).attr("y2",o),x&&(r?x.transition():x).attr("height",y.getLegendHeight()-12).attr("width",C*(M+1)+10),y.legend.selectAll("."+l.legendItem).classed(l.legendItemHidden,function(a){return!y.isTargetToShow(a)}),y.updateLegendItemWidth(C),y.updateLegendItemHeight(D),y.updateLegendStep(M),y.updateSizes(),y.updateScales(),y.updateSvgSize(),y.transformAll(s,c),y.legendHasRendered=!0},i.initTitle=function(){var a=this;a.title=a.svg.append("text").text(a.config.title_text).attr("class",a.CLASS.title)},i.redrawTitle=function(){var a=this;a.title.attr("x",a.xForTitle.bind(a)).attr("y",a.yForTitle.bind(a))},i.xForTitle=function(){var a,b=this,c=b.config,d=c.title_position||"left";return a=d.indexOf("right")>=0?b.currentWidth-b.getTextRect(b.title.node().textContent,b.CLASS.title,b.title.node()).width-c.title_padding.right:d.indexOf("center")>=0?(b.currentWidth-b.getTextRect(b.title.node().textContent,b.CLASS.title,b.title.node()).width)/2:c.title_padding.left},i.yForTitle=function(){var a=this;return a.config.title_padding.top+a.getTextRect(a.title.node().textContent,a.CLASS.title,a.title.node()).height},i.getTitlePadding=function(){var a=this;return a.yForTitle()+a.config.title_padding.bottom},c(b,f),f.prototype.init=function(){var a=this.owner,b=a.config,c=a.main;a.axes.x=c.append("g").attr("class",l.axis+" "+l.axisX).attr("clip-path",a.clipPathForXAxis).attr("transform",a.getTranslate("x")).style("visibility",b.axis_x_show?"visible":"hidden"),a.axes.x.append("text").attr("class",l.axisXLabel).attr("transform",b.axis_rotated?"rotate(-90)":"").style("text-anchor",this.textAnchorForXAxisLabel.bind(this)),a.axes.y=c.append("g").attr("class",l.axis+" "+l.axisY).attr("clip-path",b.axis_y_inner?"":a.clipPathForYAxis).attr("transform",a.getTranslate("y")).style("visibility",b.axis_y_show?"visible":"hidden"),a.axes.y.append("text").attr("class",l.axisYLabel).attr("transform",b.axis_rotated?"":"rotate(-90)").style("text-anchor",this.textAnchorForYAxisLabel.bind(this)),a.axes.y2=c.append("g").attr("class",l.axis+" "+l.axisY2).attr("transform",a.getTranslate("y2")).style("visibility",b.axis_y2_show?"visible":"hidden"),a.axes.y2.append("text").attr("class",l.axisY2Label).attr("transform",b.axis_rotated?"":"rotate(-90)").style("text-anchor",this.textAnchorForY2AxisLabel.bind(this))},f.prototype.getXAxis=function(a,b,c,d,e,f,h){var i=this.owner,j=i.config,k={isCategory:i.isCategorized(),withOuterTick:e,tickMultiline:j.axis_x_tick_multiline,tickWidth:j.axis_x_tick_width,tickTextRotate:h?0:j.axis_x_tick_rotate,withoutTransition:f},l=g(i.d3,k).scale(a).orient(b);return i.isTimeSeries()&&d&&"function"!=typeof d&&(d=d.map(function(a){return i.parseDate(a)})),l.tickFormat(c).tickValues(d),i.isCategorized()&&(l.tickCentered(j.axis_x_tick_centered),u(j.axis_x_tick_culling)&&(j.axis_x_tick_culling=!1)),l},f.prototype.updateXAxisTickValues=function(a,b){var c,d=this.owner,e=d.config;return(e.axis_x_tick_fit||e.axis_x_tick_count)&&(c=this.generateTickValues(d.mapTargetsToUniqueXs(a),e.axis_x_tick_count,d.isTimeSeries())),b?b.tickValues(c):(d.xAxis.tickValues(c),d.subXAxis.tickValues(c)),c},f.prototype.getYAxis=function(a,b,c,d,e,f,h){var i=this.owner,j=i.config,k={withOuterTick:e,withoutTransition:f,tickTextRotate:h?0:j.axis_y_tick_rotate},l=g(i.d3,k).scale(a).orient(b).tickFormat(c);return i.isTimeSeriesY()?l.ticks(i.d3.time[j.axis_y_tick_time_value],j.axis_y_tick_time_interval):l.tickValues(d),l},f.prototype.getId=function(a){var b=this.owner.config;return a in b.data_axes?b.data_axes[a]:"y"},f.prototype.getXAxisTickFormat=function(){var a=this.owner,b=a.config,c=a.isTimeSeries()?a.defaultAxisTimeFormat:a.isCategorized()?a.categoryName:function(a){return 0>a?a.toFixed(0):a};return b.axis_x_tick_format&&(n(b.axis_x_tick_format)?c=b.axis_x_tick_format:a.isTimeSeries()&&(c=function(c){return c?a.axisTimeFormat(b.axis_x_tick_format)(c):""})),n(c)?function(b){return c.call(a,b)}:c},f.prototype.getTickValues=function(a,b){return a?a:b?b.tickValues():void 0},f.prototype.getXAxisTickValues=function(){return this.getTickValues(this.owner.config.axis_x_tick_values,this.owner.xAxis)},f.prototype.getYAxisTickValues=function(){return this.getTickValues(this.owner.config.axis_y_tick_values,this.owner.yAxis)},f.prototype.getY2AxisTickValues=function(){return this.getTickValues(this.owner.config.axis_y2_tick_values,this.owner.y2Axis)},f.prototype.getLabelOptionByAxisId=function(a){var b,c=this.owner,d=c.config;return"y"===a?b=d.axis_y_label:"y2"===a?b=d.axis_y2_label:"x"===a&&(b=d.axis_x_label),b},f.prototype.getLabelText=function(a){var b=this.getLabelOptionByAxisId(a);return o(b)?b:b?b.text:null},f.prototype.setLabelText=function(a,b){var c=this.owner,d=c.config,e=this.getLabelOptionByAxisId(a);o(e)?"y"===a?d.axis_y_label=b:"y2"===a?d.axis_y2_label=b:"x"===a&&(d.axis_x_label=b):e&&(e.text=b)},f.prototype.getLabelPosition=function(a,b){var c=this.getLabelOptionByAxisId(a),d=c&&"object"==typeof c&&c.position?c.position:b;return{isInner:d.indexOf("inner")>=0,isOuter:d.indexOf("outer")>=0,isLeft:d.indexOf("left")>=0,isCenter:d.indexOf("center")>=0,isRight:d.indexOf("right")>=0,isTop:d.indexOf("top")>=0,isMiddle:d.indexOf("middle")>=0,isBottom:d.indexOf("bottom")>=0}},f.prototype.getXAxisLabelPosition=function(){return this.getLabelPosition("x",this.owner.config.axis_rotated?"inner-top":"inner-right")},f.prototype.getYAxisLabelPosition=function(){return this.getLabelPosition("y",this.owner.config.axis_rotated?"inner-right":"inner-top")},f.prototype.getY2AxisLabelPosition=function(){return this.getLabelPosition("y2",this.owner.config.axis_rotated?"inner-right":"inner-top")},f.prototype.getLabelPositionById=function(a){return"y2"===a?this.getY2AxisLabelPosition():"y"===a?this.getYAxisLabelPosition():this.getXAxisLabelPosition()},f.prototype.textForXAxisLabel=function(){return this.getLabelText("x")},f.prototype.textForYAxisLabel=function(){return this.getLabelText("y")},f.prototype.textForY2AxisLabel=function(){return this.getLabelText("y2")},f.prototype.xForAxisLabel=function(a,b){var c=this.owner;return a?b.isLeft?0:b.isCenter?c.width/2:c.width:b.isBottom?-c.height:b.isMiddle?-c.height/2:0},f.prototype.dxForAxisLabel=function(a,b){return a?b.isLeft?"0.5em":b.isRight?"-0.5em":"0":b.isTop?"-0.5em":b.isBottom?"0.5em":"0"},f.prototype.textAnchorForAxisLabel=function(a,b){return a?b.isLeft?"start":b.isCenter?"middle":"end":b.isBottom?"start":b.isMiddle?"middle":"end"},f.prototype.xForXAxisLabel=function(){return this.xForAxisLabel(!this.owner.config.axis_rotated,this.getXAxisLabelPosition())},f.prototype.xForYAxisLabel=function(){return this.xForAxisLabel(this.owner.config.axis_rotated,this.getYAxisLabelPosition())},f.prototype.xForY2AxisLabel=function(){return this.xForAxisLabel(this.owner.config.axis_rotated,this.getY2AxisLabelPosition())},f.prototype.dxForXAxisLabel=function(){return this.dxForAxisLabel(!this.owner.config.axis_rotated,this.getXAxisLabelPosition())},f.prototype.dxForYAxisLabel=function(){return this.dxForAxisLabel(this.owner.config.axis_rotated,this.getYAxisLabelPosition())},f.prototype.dxForY2AxisLabel=function(){return this.dxForAxisLabel(this.owner.config.axis_rotated,this.getY2AxisLabelPosition())},f.prototype.dyForXAxisLabel=function(){var a=this.owner,b=a.config,c=this.getXAxisLabelPosition();return b.axis_rotated?c.isInner?"1.2em":-25-this.getMaxTickWidth("x"):c.isInner?"-0.5em":b.axis_x_height?b.axis_x_height-10:"3em"},f.prototype.dyForYAxisLabel=function(){var a=this.owner,b=this.getYAxisLabelPosition();return a.config.axis_rotated?b.isInner?"-0.5em":"3em":b.isInner?"1.2em":-10-(a.config.axis_y_inner?0:this.getMaxTickWidth("y")+10)},f.prototype.dyForY2AxisLabel=function(){var a=this.owner,b=this.getY2AxisLabelPosition();return a.config.axis_rotated?b.isInner?"1.2em":"-2.2em":b.isInner?"-0.5em":15+(a.config.axis_y2_inner?0:this.getMaxTickWidth("y2")+15)},f.prototype.textAnchorForXAxisLabel=function(){var a=this.owner;return this.textAnchorForAxisLabel(!a.config.axis_rotated,this.getXAxisLabelPosition())},f.prototype.textAnchorForYAxisLabel=function(){var a=this.owner;return this.textAnchorForAxisLabel(a.config.axis_rotated,this.getYAxisLabelPosition())},f.prototype.textAnchorForY2AxisLabel=function(){var a=this.owner;return this.textAnchorForAxisLabel(a.config.axis_rotated,this.getY2AxisLabelPosition())},f.prototype.getMaxTickWidth=function(a,b){var c,d,e,f,g,h=this.owner,i=h.config,j=0;return b&&h.currentMaxTickWidths[a]?h.currentMaxTickWidths[a]:(h.svg&&(c=h.filterTargetsToShow(h.data.targets),"y"===a?(d=h.y.copy().domain(h.getYDomain(c,"y")),e=this.getYAxis(d,h.yOrient,i.axis_y_tick_format,h.yAxisTickValues,!1,!0,!0)):"y2"===a?(d=h.y2.copy().domain(h.getYDomain(c,"y2")),
2314 2314 e=this.getYAxis(d,h.y2Orient,i.axis_y2_tick_format,h.y2AxisTickValues,!1,!0,!0)):(d=h.x.copy().domain(h.getXDomain(c)),e=this.getXAxis(d,h.xOrient,h.xAxisTickFormat,h.xAxisTickValues,!1,!0,!0),this.updateXAxisTickValues(c,e)),f=h.d3.select("body").append("div").classed("c3",!0),g=f.append("svg").style("visibility","hidden").style("position","fixed").style("top",0).style("left",0),g.append("g").call(e).each(function(){h.d3.select(this).selectAll("text").each(function(){var a=this.getBoundingClientRect();j<a.width&&(j=a.width)}),f.remove()})),h.currentMaxTickWidths[a]=0>=j?h.currentMaxTickWidths[a]:j,h.currentMaxTickWidths[a])},f.prototype.updateLabels=function(a){var b=this.owner,c=b.main.select("."+l.axisX+" ."+l.axisXLabel),d=b.main.select("."+l.axisY+" ."+l.axisYLabel),e=b.main.select("."+l.axisY2+" ."+l.axisY2Label);(a?c.transition():c).attr("x",this.xForXAxisLabel.bind(this)).attr("dx",this.dxForXAxisLabel.bind(this)).attr("dy",this.dyForXAxisLabel.bind(this)).text(this.textForXAxisLabel.bind(this)),(a?d.transition():d).attr("x",this.xForYAxisLabel.bind(this)).attr("dx",this.dxForYAxisLabel.bind(this)).attr("dy",this.dyForYAxisLabel.bind(this)).text(this.textForYAxisLabel.bind(this)),(a?e.transition():e).attr("x",this.xForY2AxisLabel.bind(this)).attr("dx",this.dxForY2AxisLabel.bind(this)).attr("dy",this.dyForY2AxisLabel.bind(this)).text(this.textForY2AxisLabel.bind(this))},f.prototype.getPadding=function(a,b,c,d){var e="number"==typeof a?a:a[b];return m(e)?"ratio"===a.unit?a[b]*d:this.convertPixelsToAxisPadding(e,d):c},f.prototype.convertPixelsToAxisPadding=function(a,b){var c=this.owner,d=c.config.axis_rotated?c.width:c.height;return b*(a/d)},f.prototype.generateTickValues=function(a,b,c){var d,e,f,g,h,i,j,k=a;if(b)if(d=n(b)?b():b,1===d)k=[a[0]];else if(2===d)k=[a[0],a[a.length-1]];else if(d>2){for(g=d-2,e=a[0],f=a[a.length-1],h=(f-e)/(g+1),k=[e],i=0;g>i;i++)j=+e+h*(i+1),k.push(c?new Date(j):j);k.push(f)}return c||(k=k.sort(function(a,b){return a-b})),k},f.prototype.generateTransitions=function(a){var b=this.owner,c=b.axes;return{axisX:a?c.x.transition().duration(a):c.x,axisY:a?c.y.transition().duration(a):c.y,axisY2:a?c.y2.transition().duration(a):c.y2,axisSubX:a?c.subx.transition().duration(a):c.subx}},f.prototype.redraw=function(a,b){var c=this.owner;c.axes.x.style("opacity",b?0:1),c.axes.y.style("opacity",b?0:1),c.axes.y2.style("opacity",b?0:1),c.axes.subx.style("opacity",b?0:1),a.axisX.call(c.xAxis),a.axisY.call(c.yAxis),a.axisY2.call(c.y2Axis),a.axisSubX.call(c.subXAxis)},i.getClipPath=function(b){var c=a.navigator.appVersion.toLowerCase().indexOf("msie 9.")>=0;return"url("+(c?"":document.URL.split("#")[0])+"#"+b+")"},i.appendClip=function(a,b){return a.append("clipPath").attr("id",b).append("rect")},i.getAxisClipX=function(a){var b=Math.max(30,this.margin.left);return a?-(1+b):-(b-1)},i.getAxisClipY=function(a){return a?-20:-this.margin.top},i.getXAxisClipX=function(){var a=this;return a.getAxisClipX(!a.config.axis_rotated)},i.getXAxisClipY=function(){var a=this;return a.getAxisClipY(!a.config.axis_rotated)},i.getYAxisClipX=function(){var a=this;return a.config.axis_y_inner?-1:a.getAxisClipX(a.config.axis_rotated)},i.getYAxisClipY=function(){var a=this;return a.getAxisClipY(a.config.axis_rotated)},i.getAxisClipWidth=function(a){var b=this,c=Math.max(30,b.margin.left),d=Math.max(30,b.margin.right);return a?b.width+2+c+d:b.margin.left+20},i.getAxisClipHeight=function(a){return(a?this.margin.bottom:this.margin.top+this.height)+20},i.getXAxisClipWidth=function(){var a=this;return a.getAxisClipWidth(!a.config.axis_rotated)},i.getXAxisClipHeight=function(){var a=this;return a.getAxisClipHeight(!a.config.axis_rotated)},i.getYAxisClipWidth=function(){var a=this;return a.getAxisClipWidth(a.config.axis_rotated)+(a.config.axis_y_inner?20:0)},i.getYAxisClipHeight=function(){var a=this;return a.getAxisClipHeight(a.config.axis_rotated)},i.initPie=function(){var a=this,b=a.d3,c=a.config;a.pie=b.layout.pie().value(function(a){return a.values.reduce(function(a,b){return a+b.value},0)}),c.data_order||a.pie.sort(null)},i.updateRadius=function(){var a=this,b=a.config,c=b.gauge_width||b.donut_width;a.radiusExpanded=Math.min(a.arcWidth,a.arcHeight)/2,a.radius=.95*a.radiusExpanded,a.innerRadiusRatio=c?(a.radius-c)/a.radius:.6,a.innerRadius=a.hasType("donut")||a.hasType("gauge")?a.radius*a.innerRadiusRatio:0},i.updateArc=function(){var a=this;a.svgArc=a.getSvgArc(),a.svgArcExpanded=a.getSvgArcExpanded(),a.svgArcExpandedSub=a.getSvgArcExpanded(.98)},i.updateAngle=function(a){var b,c,d,e,f=this,g=f.config,h=!1,i=0;return g?(f.pie(f.filterTargetsToShow(f.data.targets)).forEach(function(b){h||b.data.id!==a.data.id||(h=!0,a=b,a.index=i),i++}),isNaN(a.startAngle)&&(a.startAngle=0),isNaN(a.endAngle)&&(a.endAngle=a.startAngle),f.isGaugeType(a.data)&&(b=g.gauge_min,c=g.gauge_max,d=Math.PI*(g.gauge_fullCircle?2:1)/(c-b),e=a.value<b?0:a.value<c?a.value-b:c-b,a.startAngle=g.gauge_startingAngle,a.endAngle=a.startAngle+d*e),h?a:null):null},i.getSvgArc=function(){var a=this,b=a.d3.svg.arc().outerRadius(a.radius).innerRadius(a.innerRadius),c=function(c,d){var e;return d?b(c):(e=a.updateAngle(c),e?b(e):"M 0 0")};return c.centroid=b.centroid,c},i.getSvgArcExpanded=function(a){var b=this,c=b.d3.svg.arc().outerRadius(b.radiusExpanded*(a?a:1)).innerRadius(b.innerRadius);return function(a){var d=b.updateAngle(a);return d?c(d):"M 0 0"}},i.getArc=function(a,b,c){return c||this.isArcType(a.data)?this.svgArc(a,b):"M 0 0"},i.transformForArcLabel=function(a){var b,c,d,e,f,g=this,h=g.config,i=g.updateAngle(a),j="";return i&&!g.hasType("gauge")&&(b=this.svgArc.centroid(i),c=isNaN(b[0])?0:b[0],d=isNaN(b[1])?0:b[1],e=Math.sqrt(c*c+d*d),f=g.hasType("donut")&&h.donut_label_ratio?n(h.donut_label_ratio)?h.donut_label_ratio(a,g.radius,e):h.donut_label_ratio:g.hasType("pie")&&h.pie_label_ratio?n(h.pie_label_ratio)?h.pie_label_ratio(a,g.radius,e):h.pie_label_ratio:g.radius&&e?(36/g.radius>.375?1.175-36/g.radius:.8)*g.radius/e:0,j="translate("+c*f+","+d*f+")"),j},i.getArcRatio=function(a){var b=this,c=b.config,d=Math.PI*(b.hasType("gauge")&&!c.gauge_fullCircle?1:2);return a?(a.endAngle-a.startAngle)/d:null},i.convertToArcData=function(a){return this.addName({id:a.data.id,value:a.value,ratio:this.getArcRatio(a),index:a.index})},i.textForArcLabel=function(a){var b,c,d,e,f,g=this;return g.shouldShowArcLabel()?(b=g.updateAngle(a),c=b?b.value:null,d=g.getArcRatio(b),e=a.data.id,g.hasType("gauge")||g.meetsArcLabelThreshold(d)?(f=g.getArcLabelFormat(),f?f(c,d,e):g.defaultArcValueFormat(c,d)):""):""},i.expandArc=function(b){var c,d=this;return d.transiting?void(c=a.setInterval(function(){d.transiting||(a.clearInterval(c),d.legend.selectAll(".c3-legend-item-focused").size()>0&&d.expandArc(b))},10)):(b=d.mapToTargetIds(b),void d.svg.selectAll(d.selectorTargets(b,"."+l.chartArc)).each(function(a){d.shouldExpand(a.data.id)&&d.d3.select(this).selectAll("path").transition().duration(d.expandDuration(a.data.id)).attr("d",d.svgArcExpanded).transition().duration(2*d.expandDuration(a.data.id)).attr("d",d.svgArcExpandedSub).each(function(a){d.isDonutType(a.data)})}))},i.unexpandArc=function(a){var b=this;b.transiting||(a=b.mapToTargetIds(a),b.svg.selectAll(b.selectorTargets(a,"."+l.chartArc)).selectAll("path").transition().duration(function(a){return b.expandDuration(a.data.id)}).attr("d",b.svgArc),b.svg.selectAll("."+l.arc).style("opacity",1))},i.expandDuration=function(a){var b=this,c=b.config;return b.isDonutType(a)?c.donut_expand_duration:b.isGaugeType(a)?c.gauge_expand_duration:b.isPieType(a)?c.pie_expand_duration:50},i.shouldExpand=function(a){var b=this,c=b.config;return b.isDonutType(a)&&c.donut_expand||b.isGaugeType(a)&&c.gauge_expand||b.isPieType(a)&&c.pie_expand},i.shouldShowArcLabel=function(){var a=this,b=a.config,c=!0;return a.hasType("donut")?c=b.donut_label_show:a.hasType("pie")&&(c=b.pie_label_show),c},i.meetsArcLabelThreshold=function(a){var b=this,c=b.config,d=b.hasType("donut")?c.donut_label_threshold:c.pie_label_threshold;return a>=d},i.getArcLabelFormat=function(){var a=this,b=a.config,c=b.pie_label_format;return a.hasType("gauge")?c=b.gauge_label_format:a.hasType("donut")&&(c=b.donut_label_format),c},i.getArcTitle=function(){var a=this;return a.hasType("donut")?a.config.donut_title:""},i.updateTargetsForArc=function(a){var b,c,d=this,e=d.main,f=d.classChartArc.bind(d),g=d.classArcs.bind(d),h=d.classFocus.bind(d);b=e.select("."+l.chartArcs).selectAll("."+l.chartArc).data(d.pie(a)).attr("class",function(a){return f(a)+h(a.data)}),c=b.enter().append("g").attr("class",f),c.append("g").attr("class",g),c.append("text").attr("dy",d.hasType("gauge")?"-.1em":".35em").style("opacity",0).style("text-anchor","middle").style("pointer-events","none")},i.initArc=function(){var a=this;a.arcs=a.main.select("."+l.chart).append("g").attr("class",l.chartArcs).attr("transform",a.getTranslate("arc")),a.arcs.append("text").attr("class",l.chartArcsTitle).style("text-anchor","middle").text(a.getArcTitle())},i.redrawArc=function(a,b,c){var d,e=this,f=e.d3,g=e.config,h=e.main;d=h.selectAll("."+l.arcs).selectAll("."+l.arc).data(e.arcData.bind(e)),d.enter().append("path").attr("class",e.classArc.bind(e)).style("fill",function(a){return e.color(a.data)}).style("cursor",function(a){return g.interaction_enabled&&g.data_selection_isselectable(a)?"pointer":null}).style("opacity",0).each(function(a){e.isGaugeType(a.data)&&(a.startAngle=a.endAngle=g.gauge_startingAngle),this._current=a}),d.attr("transform",function(a){return!e.isGaugeType(a.data)&&c?"scale(0)":""}).style("opacity",function(a){return a===this._current?0:1}).on("mouseover",g.interaction_enabled?function(a){var b,c;e.transiting||(b=e.updateAngle(a),b&&(c=e.convertToArcData(b),e.expandArc(b.data.id),e.api.focus(b.data.id),e.toggleFocusLegend(b.data.id,!0),e.config.data_onmouseover(c,this)))}:null).on("mousemove",g.interaction_enabled?function(a){var b,c,d=e.updateAngle(a);d&&(b=e.convertToArcData(d),c=[b],e.showTooltip(c,this))}:null).on("mouseout",g.interaction_enabled?function(a){var b,c;e.transiting||(b=e.updateAngle(a),b&&(c=e.convertToArcData(b),e.unexpandArc(b.data.id),e.api.revert(),e.revertLegend(),e.hideTooltip(),e.config.data_onmouseout(c,this)))}:null).on("click",g.interaction_enabled?function(a,b){var c,d=e.updateAngle(a);d&&(c=e.convertToArcData(d),e.toggleShape&&e.toggleShape(this,c,b),e.config.data_onclick.call(e.api,c,this))}:null).each(function(){e.transiting=!0}).transition().duration(a).attrTween("d",function(a){var b,c=e.updateAngle(a);return c?(isNaN(this._current.startAngle)&&(this._current.startAngle=0),isNaN(this._current.endAngle)&&(this._current.endAngle=this._current.startAngle),b=f.interpolate(this._current,c),this._current=b(0),function(c){var d=b(c);return d.data=a.data,e.getArc(d,!0)}):function(){return"M 0 0"}}).attr("transform",c?"scale(1)":"").style("fill",function(a){return e.levelColor?e.levelColor(a.data.values[0].value):e.color(a.data.id)}).style("opacity",1).call(e.endall,function(){e.transiting=!1}),d.exit().transition().duration(b).style("opacity",0).remove(),h.selectAll("."+l.chartArc).select("text").style("opacity",0).attr("class",function(a){return e.isGaugeType(a.data)?l.gaugeValue:""}).text(e.textForArcLabel.bind(e)).attr("transform",e.transformForArcLabel.bind(e)).style("font-size",function(a){return e.isGaugeType(a.data)?Math.round(e.radius/5)+"px":""}).transition().duration(a).style("opacity",function(a){return e.isTargetToShow(a.data.id)&&e.isArcType(a.data)?1:0}),h.select("."+l.chartArcsTitle).style("opacity",e.hasType("donut")||e.hasType("gauge")?1:0),e.hasType("gauge")&&(e.arcs.select("."+l.chartArcsBackground).attr("d",function(){var a={data:[{value:g.gauge_max}],startAngle:g.gauge_startingAngle,endAngle:-1*g.gauge_startingAngle};return e.getArc(a,!0,!0)}),e.arcs.select("."+l.chartArcsGaugeUnit).attr("dy",".75em").text(g.gauge_label_show?g.gauge_units:""),e.arcs.select("."+l.chartArcsGaugeMin).attr("dx",-1*(e.innerRadius+(e.radius-e.innerRadius)/(g.gauge_fullCircle?1:2))+"px").attr("dy","1.2em").text(g.gauge_label_show?g.gauge_min:""),e.arcs.select("."+l.chartArcsGaugeMax).attr("dx",e.innerRadius+(e.radius-e.innerRadius)/(g.gauge_fullCircle?1:2)+"px").attr("dy","1.2em").text(g.gauge_label_show?g.gauge_max:""))},i.initGauge=function(){var a=this.arcs;this.hasType("gauge")&&(a.append("path").attr("class",l.chartArcsBackground),a.append("text").attr("class",l.chartArcsGaugeUnit).style("text-anchor","middle").style("pointer-events","none"),a.append("text").attr("class",l.chartArcsGaugeMin).style("text-anchor","middle").style("pointer-events","none"),a.append("text").attr("class",l.chartArcsGaugeMax).style("text-anchor","middle").style("pointer-events","none"))},i.getGaugeLabelHeight=function(){return this.config.gauge_label_show?20:0},i.initRegion=function(){var a=this;a.region=a.main.append("g").attr("clip-path",a.clipPath).attr("class",l.regions)},i.updateRegion=function(a){var b=this,c=b.config;b.region.style("visibility",b.hasArcType()?"hidden":"visible"),b.mainRegion=b.main.select("."+l.regions).selectAll("."+l.region).data(c.regions),b.mainRegion.enter().append("g").append("rect").style("fill-opacity",0),b.mainRegion.attr("class",b.classRegion.bind(b)),b.mainRegion.exit().transition().duration(a).style("opacity",0).remove()},i.redrawRegion=function(a){var b=this,c=b.mainRegion.selectAll("rect").each(function(){var a=b.d3.select(this.parentNode).datum();b.d3.select(this).datum(a)}),d=b.regionX.bind(b),e=b.regionY.bind(b),f=b.regionWidth.bind(b),g=b.regionHeight.bind(b);return[(a?c.transition():c).attr("x",d).attr("y",e).attr("width",f).attr("height",g).style("fill-opacity",function(a){return m(a.opacity)?a.opacity:.1})]},i.regionX=function(a){var b,c=this,d=c.config,e="y"===a.axis?c.y:c.y2;return b="y"===a.axis||"y2"===a.axis?d.axis_rotated&&"start"in a?e(a.start):0:d.axis_rotated?0:"start"in a?c.x(c.isTimeSeries()?c.parseDate(a.start):a.start):0},i.regionY=function(a){var b,c=this,d=c.config,e="y"===a.axis?c.y:c.y2;return b="y"===a.axis||"y2"===a.axis?d.axis_rotated?0:"end"in a?e(a.end):0:d.axis_rotated&&"start"in a?c.x(c.isTimeSeries()?c.parseDate(a.start):a.start):0},i.regionWidth=function(a){var b,c=this,d=c.config,e=c.regionX(a),f="y"===a.axis?c.y:c.y2;return b="y"===a.axis||"y2"===a.axis?d.axis_rotated&&"end"in a?f(a.end):c.width:d.axis_rotated?c.width:"end"in a?c.x(c.isTimeSeries()?c.parseDate(a.end):a.end):c.width,e>b?0:b-e},i.regionHeight=function(a){var b,c=this,d=c.config,e=this.regionY(a),f="y"===a.axis?c.y:c.y2;return b="y"===a.axis||"y2"===a.axis?d.axis_rotated?c.height:"start"in a?f(a.start):c.height:d.axis_rotated&&"end"in a?c.x(c.isTimeSeries()?c.parseDate(a.end):a.end):c.height,e>b?0:b-e},i.isRegionOnX=function(a){return!a.axis||"x"===a.axis},i.drag=function(a){var b,c,d,e,f,g,h,i,j=this,k=j.config,m=j.main,n=j.d3;j.hasArcType()||k.data_selection_enabled&&(k.zoom_enabled&&!j.zoom.altDomain||k.data_selection_multiple&&(b=j.dragStart[0],c=j.dragStart[1],d=a[0],e=a[1],f=Math.min(b,d),g=Math.max(b,d),h=k.data_selection_grouped?j.margin.top:Math.min(c,e),i=k.data_selection_grouped?j.height:Math.max(c,e),m.select("."+l.dragarea).attr("x",f).attr("y",h).attr("width",g-f).attr("height",i-h),m.selectAll("."+l.shapes).selectAll("."+l.shape).filter(function(a){return k.data_selection_isselectable(a)}).each(function(a,b){var c,d,e,k,m,o,p=n.select(this),q=p.classed(l.SELECTED),r=p.classed(l.INCLUDED),s=!1;if(p.classed(l.circle))c=1*p.attr("cx"),d=1*p.attr("cy"),m=j.togglePoint,s=c>f&&g>c&&d>h&&i>d;else{if(!p.classed(l.bar))return;o=z(this),c=o.x,d=o.y,e=o.width,k=o.height,m=j.togglePath,s=!(c>g||f>c+e||d>i||h>d+k)}s^r&&(p.classed(l.INCLUDED,!r),p.classed(l.SELECTED,!q),m.call(j,!q,p,a,b))})))},i.dragstart=function(a){var b=this,c=b.config;b.hasArcType()||c.data_selection_enabled&&(b.dragStart=a,b.main.select("."+l.chart).append("rect").attr("class",l.dragarea).style("opacity",.1),b.dragging=!0)},i.dragend=function(){var a=this,b=a.config;a.hasArcType()||b.data_selection_enabled&&(a.main.select("."+l.dragarea).transition().duration(100).style("opacity",0).remove(),a.main.selectAll("."+l.shape).classed(l.INCLUDED,!1),a.dragging=!1)},i.selectPoint=function(a,b,c){var d=this,e=d.config,f=(e.axis_rotated?d.circleY:d.circleX).bind(d),g=(e.axis_rotated?d.circleX:d.circleY).bind(d),h=d.pointSelectR.bind(d);e.data_onselected.call(d.api,b,a.node()),d.main.select("."+l.selectedCircles+d.getTargetSelectorSuffix(b.id)).selectAll("."+l.selectedCircle+"-"+c).data([b]).enter().append("circle").attr("class",function(){return d.generateClass(l.selectedCircle,c)}).attr("cx",f).attr("cy",g).attr("stroke",function(){return d.color(b)}).attr("r",function(a){return 1.4*d.pointSelectR(a)}).transition().duration(100).attr("r",h)},i.unselectPoint=function(a,b,c){var d=this;d.config.data_onunselected.call(d.api,b,a.node()),d.main.select("."+l.selectedCircles+d.getTargetSelectorSuffix(b.id)).selectAll("."+l.selectedCircle+"-"+c).transition().duration(100).attr("r",0).remove()},i.togglePoint=function(a,b,c,d){a?this.selectPoint(b,c,d):this.unselectPoint(b,c,d)},i.selectPath=function(a,b){var c=this;c.config.data_onselected.call(c,b,a.node()),c.config.interaction_brighten&&a.transition().duration(100).style("fill",function(){return c.d3.rgb(c.color(b)).brighter(.75)})},i.unselectPath=function(a,b){var c=this;c.config.data_onunselected.call(c,b,a.node()),c.config.interaction_brighten&&a.transition().duration(100).style("fill",function(){return c.color(b)})},i.togglePath=function(a,b,c,d){a?this.selectPath(b,c,d):this.unselectPath(b,c,d)},i.getToggle=function(a,b){var c,d=this;return"circle"===a.nodeName?c=d.isStepType(b)?function(){}:d.togglePoint:"path"===a.nodeName&&(c=d.togglePath),c},i.toggleShape=function(a,b,c){var d=this,e=d.d3,f=d.config,g=e.select(a),h=g.classed(l.SELECTED),i=d.getToggle(a,b).bind(d);f.data_selection_enabled&&f.data_selection_isselectable(b)&&(f.data_selection_multiple||d.main.selectAll("."+l.shapes+(f.data_selection_grouped?d.getTargetSelectorSuffix(b.id):"")).selectAll("."+l.shape).each(function(a,b){var c=e.select(this);c.classed(l.SELECTED)&&i(!1,c.classed(l.SELECTED,!1),a,b)}),g.classed(l.SELECTED,!h),i(!h,g,b,c))},i.initBrush=function(){var a=this,b=a.d3;a.brush=b.svg.brush().on("brush",function(){a.redrawForBrush()}),a.brush.update=function(){return a.context&&a.context.select("."+l.brush).call(this),this},a.brush.scale=function(b){return a.config.axis_rotated?this.y(b):this.x(b)}},i.initSubchart=function(){var a=this,b=a.config,c=a.context=a.svg.append("g").attr("transform",a.getTranslate("context")),d=b.subchart_show?"visible":"hidden";c.style("visibility",d),c.append("g").attr("clip-path",a.clipPathForSubchart).attr("class",l.chart),c.select("."+l.chart).append("g").attr("class",l.chartBars),c.select("."+l.chart).append("g").attr("class",l.chartLines),c.append("g").attr("clip-path",a.clipPath).attr("class",l.brush).call(a.brush),a.axes.subx=c.append("g").attr("class",l.axisX).attr("transform",a.getTranslate("subx")).attr("clip-path",b.axis_rotated?"":a.clipPathForXAxis).style("visibility",b.subchart_axis_x_show?d:"hidden")},i.updateTargetsForSubchart=function(a){var b,c,d,e,f=this,g=f.context,h=f.config,i=f.classChartBar.bind(f),j=f.classBars.bind(f),k=f.classChartLine.bind(f),m=f.classLines.bind(f),n=f.classAreas.bind(f);h.subchart_show&&(e=g.select("."+l.chartBars).selectAll("."+l.chartBar).data(a).attr("class",i),d=e.enter().append("g").style("opacity",0).attr("class",i),d.append("g").attr("class",j),c=g.select("."+l.chartLines).selectAll("."+l.chartLine).data(a).attr("class",k),b=c.enter().append("g").style("opacity",0).attr("class",k),b.append("g").attr("class",m),b.append("g").attr("class",n),g.selectAll("."+l.brush+" rect").attr(h.axis_rotated?"width":"height",h.axis_rotated?f.width2:f.height2))},i.updateBarForSubchart=function(a){var b=this;b.contextBar=b.context.selectAll("."+l.bars).selectAll("."+l.bar).data(b.barData.bind(b)),b.contextBar.enter().append("path").attr("class",b.classBar.bind(b)).style("stroke","none").style("fill",b.color),b.contextBar.style("opacity",b.initialOpacity.bind(b)),b.contextBar.exit().transition().duration(a).style("opacity",0).remove()},i.redrawBarForSubchart=function(a,b,c){(b?this.contextBar.transition(Math.random().toString()).duration(c):this.contextBar).attr("d",a).style("opacity",1)},i.updateLineForSubchart=function(a){var b=this;b.contextLine=b.context.selectAll("."+l.lines).selectAll("."+l.line).data(b.lineData.bind(b)),b.contextLine.enter().append("path").attr("class",b.classLine.bind(b)).style("stroke",b.color),b.contextLine.style("opacity",b.initialOpacity.bind(b)),b.contextLine.exit().transition().duration(a).style("opacity",0).remove()},i.redrawLineForSubchart=function(a,b,c){(b?this.contextLine.transition(Math.random().toString()).duration(c):this.contextLine).attr("d",a).style("opacity",1)},i.updateAreaForSubchart=function(a){var b=this,c=b.d3;b.contextArea=b.context.selectAll("."+l.areas).selectAll("."+l.area).data(b.lineData.bind(b)),b.contextArea.enter().append("path").attr("class",b.classArea.bind(b)).style("fill",b.color).style("opacity",function(){return b.orgAreaOpacity=+c.select(this).style("opacity"),0}),b.contextArea.style("opacity",0),b.contextArea.exit().transition().duration(a).style("opacity",0).remove()},i.redrawAreaForSubchart=function(a,b,c){(b?this.contextArea.transition(Math.random().toString()).duration(c):this.contextArea).attr("d",a).style("fill",this.color).style("opacity",this.orgAreaOpacity)},i.redrawSubchart=function(a,b,c,d,e,f,g){var h,i,j,k=this,l=k.d3,m=k.config;k.context.style("visibility",m.subchart_show?"visible":"hidden"),m.subchart_show&&(l.event&&"zoom"===l.event.type&&k.brush.extent(k.x.orgDomain()).update(),a&&(k.brush.empty()||k.brush.extent(k.x.orgDomain()).update(),h=k.generateDrawArea(e,!0),i=k.generateDrawBar(f,!0),j=k.generateDrawLine(g,!0),k.updateBarForSubchart(c),k.updateLineForSubchart(c),k.updateAreaForSubchart(c),k.redrawBarForSubchart(i,c,c),k.redrawLineForSubchart(j,c,c),k.redrawAreaForSubchart(h,c,c)))},i.redrawForBrush=function(){var a=this,b=a.x;a.redraw({withTransition:!1,withY:a.config.zoom_rescale,withSubchart:!1,withUpdateXDomain:!0,withDimension:!1}),a.config.subchart_onbrush.call(a.api,b.orgDomain())},i.transformContext=function(a,b){var c,d=this;b&&b.axisSubX?c=b.axisSubX:(c=d.context.select("."+l.axisX),a&&(c=c.transition())),d.context.attr("transform",d.getTranslate("context")),c.attr("transform",d.getTranslate("subx"))},i.getDefaultExtent=function(){var a=this,b=a.config,c=n(b.axis_x_extent)?b.axis_x_extent(a.getXDomain(a.data.targets)):b.axis_x_extent;return a.isTimeSeries()&&(c=[a.parseDate(c[0]),a.parseDate(c[1])]),c},i.initZoom=function(){var a,b=this,c=b.d3,d=b.config;b.zoom=c.behavior.zoom().on("zoomstart",function(){a=c.event.sourceEvent,b.zoom.altDomain=c.event.sourceEvent.altKey?b.x.orgDomain():null,d.zoom_onzoomstart.call(b.api,c.event.sourceEvent)}).on("zoom",function(){b.redrawForZoom.call(b)}).on("zoomend",function(){var e=c.event.sourceEvent;e&&a.clientX===e.clientX&&a.clientY===e.clientY||(b.redrawEventRect(),b.updateZoom(),d.zoom_onzoomend.call(b.api,b.x.orgDomain()))}),b.zoom.scale=function(a){return d.axis_rotated?this.y(a):this.x(a)},b.zoom.orgScaleExtent=function(){var a=d.zoom_extent?d.zoom_extent:[1,10];return[a[0],Math.max(b.getMaxDataCount()/a[1],a[1])]},b.zoom.updateScaleExtent=function(){var a=t(b.x.orgDomain())/t(b.getZoomDomain()),c=this.orgScaleExtent();return this.scaleExtent([c[0]*a,c[1]*a]),this}},i.getZoomDomain=function(){var a=this,b=a.config,c=a.d3,d=c.min([a.orgXDomain[0],b.zoom_x_min]),e=c.max([a.orgXDomain[1],b.zoom_x_max]);return[d,e]},i.updateZoom=function(){var a=this,b=a.config.zoom_enabled?a.zoom:function(){};a.main.select("."+l.zoomRect).call(b).on("dblclick.zoom",null),a.main.selectAll("."+l.eventRect).call(b).on("dblclick.zoom",null)},i.redrawForZoom=function(){var a=this,b=a.d3,c=a.config,d=a.zoom,e=a.x;if(c.zoom_enabled&&0!==a.filterTargetsToShow(a.data.targets).length){if("mousemove"===b.event.sourceEvent.type&&d.altDomain)return e.domain(d.altDomain),void d.scale(e).updateScaleExtent();a.isCategorized()&&e.orgDomain()[0]===a.orgXDomain[0]&&e.domain([a.orgXDomain[0]-1e-10,e.orgDomain()[1]]),a.redraw({withTransition:!1,withY:c.zoom_rescale,withSubchart:!1,withEventRect:!1,withDimension:!1}),"mousemove"===b.event.sourceEvent.type&&(a.cancelClick=!0),c.zoom_onzoom.call(a.api,e.orgDomain())}},i.generateColor=function(){var a=this,b=a.config,c=a.d3,d=b.data_colors,e=v(b.color_pattern)?b.color_pattern:c.scale.category10().range(),f=b.data_color,g=[];return function(a){var b,c=a.id||a.data&&a.data.id||a;return d[c]instanceof Function?b=d[c](a):d[c]?b=d[c]:(g.indexOf(c)<0&&g.push(c),b=e[g.indexOf(c)%e.length],d[c]=b),f instanceof Function?f(b,a):b}},i.generateLevelColor=function(){var a=this,b=a.config,c=b.color_pattern,d=b.color_threshold,e="value"===d.unit,f=d.values&&d.values.length?d.values:[],g=d.max||100;return v(b.color_threshold)?function(a){var b,d,h=c[c.length-1];for(b=0;b<f.length;b++)if(d=e?a:100*a/g,d<f[b]){h=c[b];break}return h}:null},i.getYFormat=function(a){var b=this,c=a&&!b.hasType("gauge")?b.defaultArcValueFormat:b.yFormat,d=a&&!b.hasType("gauge")?b.defaultArcValueFormat:b.y2Format;return function(a,e,f){var g="y2"===b.axis.getId(f)?d:c;return g.call(b,a,e)}},i.yFormat=function(a){var b=this,c=b.config,d=c.axis_y_tick_format?c.axis_y_tick_format:b.defaultValueFormat;return d(a)},i.y2Format=function(a){var b=this,c=b.config,d=c.axis_y2_tick_format?c.axis_y2_tick_format:b.defaultValueFormat;return d(a)},i.defaultValueFormat=function(a){return m(a)?+a:""},i.defaultArcValueFormat=function(a,b){return(100*b).toFixed(1)+"%"},i.dataLabelFormat=function(a){var b,c=this,d=c.config.data_labels,e=function(a){return m(a)?+a:""};return b="function"==typeof d.format?d.format:"object"==typeof d.format?d.format[a]?d.format[a]===!0?e:d.format[a]:function(){return""}:e},i.hasCaches=function(a){for(var b=0;b<a.length;b++)if(!(a[b]in this.cache))return!1;return!0},i.addCache=function(a,b){this.cache[a]=this.cloneTarget(b)},i.getCaches=function(a){var b,c=[];for(b=0;b<a.length;b++)a[b]in this.cache&&c.push(this.cloneTarget(this.cache[a[b]]));return c};var l=i.CLASS={target:"c3-target",chart:"c3-chart",chartLine:"c3-chart-line",chartLines:"c3-chart-lines",chartBar:"c3-chart-bar",chartBars:"c3-chart-bars",chartText:"c3-chart-text",chartTexts:"c3-chart-texts",chartArc:"c3-chart-arc",chartArcs:"c3-chart-arcs",chartArcsTitle:"c3-chart-arcs-title",chartArcsBackground:"c3-chart-arcs-background",chartArcsGaugeUnit:"c3-chart-arcs-gauge-unit",chartArcsGaugeMax:"c3-chart-arcs-gauge-max",chartArcsGaugeMin:"c3-chart-arcs-gauge-min",selectedCircle:"c3-selected-circle",selectedCircles:"c3-selected-circles",eventRect:"c3-event-rect",eventRects:"c3-event-rects",eventRectsSingle:"c3-event-rects-single",eventRectsMultiple:"c3-event-rects-multiple",zoomRect:"c3-zoom-rect",brush:"c3-brush",focused:"c3-focused",defocused:"c3-defocused",region:"c3-region",regions:"c3-regions",title:"c3-title",tooltipContainer:"c3-tooltip-container",tooltip:"c3-tooltip",tooltipName:"c3-tooltip-name",shape:"c3-shape",shapes:"c3-shapes",line:"c3-line",lines:"c3-lines",bar:"c3-bar",bars:"c3-bars",circle:"c3-circle",circles:"c3-circles",arc:"c3-arc",arcs:"c3-arcs",area:"c3-area",areas:"c3-areas",empty:"c3-empty",text:"c3-text",texts:"c3-texts",gaugeValue:"c3-gauge-value",grid:"c3-grid",gridLines:"c3-grid-lines",xgrid:"c3-xgrid",xgrids:"c3-xgrids",xgridLine:"c3-xgrid-line",xgridLines:"c3-xgrid-lines",xgridFocus:"c3-xgrid-focus",ygrid:"c3-ygrid",ygrids:"c3-ygrids",ygridLine:"c3-ygrid-line",ygridLines:"c3-ygrid-lines",axis:"c3-axis",axisX:"c3-axis-x",axisXLabel:"c3-axis-x-label",axisY:"c3-axis-y",axisYLabel:"c3-axis-y-label",axisY2:"c3-axis-y2",axisY2Label:"c3-axis-y2-label",legendBackground:"c3-legend-background",legendItem:"c3-legend-item",legendItemEvent:"c3-legend-item-event",legendItemTile:"c3-legend-item-tile",legendItemHidden:"c3-legend-item-hidden",legendItemFocused:"c3-legend-item-focused",dragarea:"c3-dragarea",EXPANDED:"_expanded_",SELECTED:"_selected_",INCLUDED:"_included_"};i.generateClass=function(a,b){return" "+a+" "+a+this.getTargetSelectorSuffix(b)},i.classText=function(a){return this.generateClass(l.text,a.index)},i.classTexts=function(a){return this.generateClass(l.texts,a.id)},i.classShape=function(a){return this.generateClass(l.shape,a.index)},i.classShapes=function(a){return this.generateClass(l.shapes,a.id)},i.classLine=function(a){return this.classShape(a)+this.generateClass(l.line,a.id)},i.classLines=function(a){return this.classShapes(a)+this.generateClass(l.lines,a.id)},i.classCircle=function(a){return this.classShape(a)+this.generateClass(l.circle,a.index)},i.classCircles=function(a){return this.classShapes(a)+this.generateClass(l.circles,a.id)},i.classBar=function(a){return this.classShape(a)+this.generateClass(l.bar,a.index)},i.classBars=function(a){return this.classShapes(a)+this.generateClass(l.bars,a.id)},i.classArc=function(a){return this.classShape(a.data)+this.generateClass(l.arc,a.data.id)},i.classArcs=function(a){return this.classShapes(a.data)+this.generateClass(l.arcs,a.data.id)},i.classArea=function(a){return this.classShape(a)+this.generateClass(l.area,a.id)},i.classAreas=function(a){return this.classShapes(a)+this.generateClass(l.areas,a.id)},i.classRegion=function(a,b){return this.generateClass(l.region,b)+" "+("class"in a?a["class"]:"")},i.classEvent=function(a){return this.generateClass(l.eventRect,a.index)},i.classTarget=function(a){var b=this,c=b.config.data_classes[a],d="";return c&&(d=" "+l.target+"-"+c),b.generateClass(l.target,a)+d},i.classFocus=function(a){return this.classFocused(a)+this.classDefocused(a)},i.classFocused=function(a){return" "+(this.focusedTargetIds.indexOf(a.id)>=0?l.focused:"")},i.classDefocused=function(a){return" "+(this.defocusedTargetIds.indexOf(a.id)>=0?l.defocused:"")},i.classChartText=function(a){return l.chartText+this.classTarget(a.id)},i.classChartLine=function(a){return l.chartLine+this.classTarget(a.id)},i.classChartBar=function(a){return l.chartBar+this.classTarget(a.id)},i.classChartArc=function(a){return l.chartArc+this.classTarget(a.data.id)},i.getTargetSelectorSuffix=function(a){return a||0===a?("-"+a).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g,"-"):""},i.selectorTarget=function(a,b){return(b||"")+"."+l.target+this.getTargetSelectorSuffix(a)},i.selectorTargets=function(a,b){var c=this;return a=a||[],a.length?a.map(function(a){return c.selectorTarget(a,b)}):null},i.selectorLegend=function(a){return"."+l.legendItem+this.getTargetSelectorSuffix(a)},i.selectorLegends=function(a){var b=this;return a&&a.length?a.map(function(a){return b.selectorLegend(a)}):null};var m=i.isValue=function(a){return a||0===a},n=i.isFunction=function(a){return"function"==typeof a},o=i.isString=function(a){return"string"==typeof a},p=i.isUndefined=function(a){return"undefined"==typeof a},q=i.isDefined=function(a){return"undefined"!=typeof a},r=i.ceil10=function(a){return 10*Math.ceil(a/10)},s=i.asHalfPixel=function(a){return Math.ceil(a)+.5},t=i.diffDomain=function(a){return a[1]-a[0]},u=i.isEmpty=function(a){return"undefined"==typeof a||null===a||o(a)&&0===a.length||"object"==typeof a&&0===Object.keys(a).length},v=i.notEmpty=function(a){return!i.isEmpty(a)},w=i.getOption=function(a,b,c){return q(a[b])?a[b]:c},x=i.hasValue=function(a,b){var c=!1;return Object.keys(a).forEach(function(d){a[d]===b&&(c=!0)}),c},y=i.sanitise=function(a){return"string"==typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;"):a},z=i.getPathBox=function(a){var b=a.getBoundingClientRect(),c=[a.pathSegList.getItem(0),a.pathSegList.getItem(1)],d=c[0].x,e=Math.min(c[0].y,c[1].y);return{x:d,y:e,width:b.width,height:b.height}};h.focus=function(a){var b,c=this.internal;a=c.mapToTargetIds(a),b=c.svg.selectAll(c.selectorTargets(a.filter(c.isTargetToShow,c))),this.revert(),this.defocus(),b.classed(l.focused,!0).classed(l.defocused,!1),
2315 2315 c.hasArcType()&&c.expandArc(a),c.toggleFocusLegend(a,!0),c.focusedTargetIds=a,c.defocusedTargetIds=c.defocusedTargetIds.filter(function(b){return a.indexOf(b)<0})},h.defocus=function(a){var b,c=this.internal;a=c.mapToTargetIds(a),b=c.svg.selectAll(c.selectorTargets(a.filter(c.isTargetToShow,c))),b.classed(l.focused,!1).classed(l.defocused,!0),c.hasArcType()&&c.unexpandArc(a),c.toggleFocusLegend(a,!1),c.focusedTargetIds=c.focusedTargetIds.filter(function(b){return a.indexOf(b)<0}),c.defocusedTargetIds=a},h.revert=function(a){var b,c=this.internal;a=c.mapToTargetIds(a),b=c.svg.selectAll(c.selectorTargets(a)),b.classed(l.focused,!1).classed(l.defocused,!1),c.hasArcType()&&c.unexpandArc(a),c.config.legend_show&&(c.showLegend(a.filter(c.isLegendToShow.bind(c))),c.legend.selectAll(c.selectorLegends(a)).filter(function(){return c.d3.select(this).classed(l.legendItemFocused)}).classed(l.legendItemFocused,!1)),c.focusedTargetIds=[],c.defocusedTargetIds=[]},h.show=function(a,b){var c,d=this.internal;a=d.mapToTargetIds(a),b=b||{},d.removeHiddenTargetIds(a),c=d.svg.selectAll(d.selectorTargets(a)),c.transition().style("opacity",1,"important").call(d.endall,function(){c.style("opacity",null).style("opacity",1)}),b.withLegend&&d.showLegend(a),d.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},h.hide=function(a,b){var c,d=this.internal;a=d.mapToTargetIds(a),b=b||{},d.addHiddenTargetIds(a),c=d.svg.selectAll(d.selectorTargets(a)),c.transition().style("opacity",0,"important").call(d.endall,function(){c.style("opacity",null).style("opacity",0)}),b.withLegend&&d.hideLegend(a),d.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0})},h.toggle=function(a,b){var c=this,d=this.internal;d.mapToTargetIds(a).forEach(function(a){d.isTargetToShow(a)?c.hide(a,b):c.show(a,b)})},h.zoom=function(a){var b=this.internal;return a&&(b.isTimeSeries()&&(a=a.map(function(a){return b.parseDate(a)})),b.brush.extent(a),b.redraw({withUpdateXDomain:!0,withY:b.config.zoom_rescale}),b.config.zoom_onzoom.call(this,b.x.orgDomain())),b.brush.extent()},h.zoom.enable=function(a){var b=this.internal;b.config.zoom_enabled=a,b.updateAndRedraw()},h.unzoom=function(){var a=this.internal;a.brush.clear().update(),a.redraw({withUpdateXDomain:!0})},h.zoom.max=function(a){var b=this.internal,c=b.config,d=b.d3;return 0===a||a?void(c.zoom_x_max=d.max([b.orgXDomain[1],a])):c.zoom_x_max},h.zoom.min=function(a){var b=this.internal,c=b.config,d=b.d3;return 0===a||a?void(c.zoom_x_min=d.min([b.orgXDomain[0],a])):c.zoom_x_min},h.zoom.range=function(a){return arguments.length?(q(a.max)&&this.domain.max(a.max),void(q(a.min)&&this.domain.min(a.min))):{max:this.domain.max(),min:this.domain.min()}},h.load=function(a){var b=this.internal,c=b.config;return a.xs&&b.addXs(a.xs),"names"in a&&h.data.names.bind(this)(a.names),"classes"in a&&Object.keys(a.classes).forEach(function(b){c.data_classes[b]=a.classes[b]}),"categories"in a&&b.isCategorized()&&(c.axis_x_categories=a.categories),"axes"in a&&Object.keys(a.axes).forEach(function(b){c.data_axes[b]=a.axes[b]}),"colors"in a&&Object.keys(a.colors).forEach(function(b){c.data_colors[b]=a.colors[b]}),"cacheIds"in a&&b.hasCaches(a.cacheIds)?void b.load(b.getCaches(a.cacheIds),a.done):void("unload"in a?b.unload(b.mapToTargetIds("boolean"==typeof a.unload&&a.unload?null:a.unload),function(){b.loadFromArgs(a)}):b.loadFromArgs(a))},h.unload=function(a){var b=this.internal;a=a||{},a instanceof Array?a={ids:a}:"string"==typeof a&&(a={ids:[a]}),b.unload(b.mapToTargetIds(a.ids),function(){b.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0,withLegend:!0}),a.done&&a.done()})},h.flow=function(a){var b,c,d,e,f,g,h,i,j=this.internal,k=[],l=j.getMaxDataCount(),n=0,o=0;if(a.json)c=j.convertJsonToData(a.json,a.keys);else if(a.rows)c=j.convertRowsToData(a.rows);else{if(!a.columns)return;c=j.convertColumnsToData(a.columns)}b=j.convertDataToTargets(c,!0),j.data.targets.forEach(function(a){var c,d,e=!1;for(c=0;c<b.length;c++)if(a.id===b[c].id){for(e=!0,a.values[a.values.length-1]&&(o=a.values[a.values.length-1].index+1),n=b[c].values.length,d=0;n>d;d++)b[c].values[d].index=o+d,j.isTimeSeries()||(b[c].values[d].x=o+d);a.values=a.values.concat(b[c].values),b.splice(c,1);break}e||k.push(a.id)}),j.data.targets.forEach(function(a){var b,c;for(b=0;b<k.length;b++)if(a.id===k[b])for(o=a.values[a.values.length-1].index+1,c=0;n>c;c++)a.values.push({id:a.id,index:o+c,x:j.isTimeSeries()?j.getOtherTargetX(o+c):o+c,value:null})}),j.data.targets.length&&b.forEach(function(a){var b,c=[];for(b=j.data.targets[0].values[0].index;o>b;b++)c.push({id:a.id,index:b,x:j.isTimeSeries()?j.getOtherTargetX(b):b,value:null});a.values.forEach(function(a){a.index+=o,j.isTimeSeries()||(a.x+=o)}),a.values=c.concat(a.values)}),j.data.targets=j.data.targets.concat(b),d=j.getMaxDataCount(),f=j.data.targets[0],g=f.values[0],q(a.to)?(n=0,i=j.isTimeSeries()?j.parseDate(a.to):a.to,f.values.forEach(function(a){a.x<i&&n++})):q(a.length)&&(n=a.length),l?1===l&&j.isTimeSeries()&&(h=(f.values[f.values.length-1].x-g.x)/2,e=[new Date(+g.x-h),new Date(+g.x+h)],j.updateXDomain(null,!0,!0,!1,e)):(h=j.isTimeSeries()?f.values.length>1?f.values[f.values.length-1].x-g.x:g.x-j.getXDomain(j.data.targets)[0]:1,e=[g.x-h,g.x],j.updateXDomain(null,!0,!0,!1,e)),j.updateTargets(j.data.targets),j.redraw({flow:{index:g.index,length:n,duration:m(a.duration)?a.duration:j.config.transition_duration,done:a.done,orgDataCount:l},withLegend:!0,withTransition:l>1,withTrimXDomain:!1,withUpdateXAxis:!0})},i.generateFlow=function(a){var b=this,c=b.config,d=b.d3;return function(){var e,f,g,h=a.targets,i=a.flow,j=a.drawBar,k=a.drawLine,m=a.drawArea,n=a.cx,o=a.cy,p=a.xv,q=a.xForText,r=a.yForText,s=a.duration,u=1,v=i.index,w=i.length,x=b.getValueOnIndex(b.data.targets[0].values,v),y=b.getValueOnIndex(b.data.targets[0].values,v+w),z=b.x.domain(),A=i.duration||s,B=i.done||function(){},C=b.generateWait(),D=b.xgrid||d.selectAll([]),E=b.xgridLines||d.selectAll([]),F=b.mainRegion||d.selectAll([]),G=b.mainText||d.selectAll([]),H=b.mainBar||d.selectAll([]),I=b.mainLine||d.selectAll([]),J=b.mainArea||d.selectAll([]),K=b.mainCircle||d.selectAll([]);b.flowing=!0,b.data.targets.forEach(function(a){a.values.splice(0,w)}),g=b.updateXDomain(h,!0,!0),b.updateXGrid&&b.updateXGrid(!0),i.orgDataCount?e=1===i.orgDataCount||(x&&x.x)===(y&&y.x)?b.x(z[0])-b.x(g[0]):b.isTimeSeries()?b.x(z[0])-b.x(g[0]):b.x(x.x)-b.x(y.x):1!==b.data.targets[0].values.length?e=b.x(z[0])-b.x(g[0]):b.isTimeSeries()?(x=b.getValueOnIndex(b.data.targets[0].values,0),y=b.getValueOnIndex(b.data.targets[0].values,b.data.targets[0].values.length-1),e=b.x(x.x)-b.x(y.x)):e=t(g)/2,u=t(z)/t(g),f="translate("+e+",0) scale("+u+",1)",b.hideXGridFocus(),d.transition().ease("linear").duration(A).each(function(){C.add(b.axes.x.transition().call(b.xAxis)),C.add(H.transition().attr("transform",f)),C.add(I.transition().attr("transform",f)),C.add(J.transition().attr("transform",f)),C.add(K.transition().attr("transform",f)),C.add(G.transition().attr("transform",f)),C.add(F.filter(b.isRegionOnX).transition().attr("transform",f)),C.add(D.transition().attr("transform",f)),C.add(E.transition().attr("transform",f))}).call(C,function(){var a,d=[],e=[],f=[];if(w){for(a=0;w>a;a++)d.push("."+l.shape+"-"+(v+a)),e.push("."+l.text+"-"+(v+a)),f.push("."+l.eventRect+"-"+(v+a));b.svg.selectAll("."+l.shapes).selectAll(d).remove(),b.svg.selectAll("."+l.texts).selectAll(e).remove(),b.svg.selectAll("."+l.eventRects).selectAll(f).remove(),b.svg.select("."+l.xgrid).remove()}D.attr("transform",null).attr(b.xgridAttr),E.attr("transform",null),E.select("line").attr("x1",c.axis_rotated?0:p).attr("x2",c.axis_rotated?b.width:p),E.select("text").attr("x",c.axis_rotated?b.width:0).attr("y",p),H.attr("transform",null).attr("d",j),I.attr("transform",null).attr("d",k),J.attr("transform",null).attr("d",m),K.attr("transform",null).attr("cx",n).attr("cy",o),G.attr("transform",null).attr("x",q).attr("y",r).style("fill-opacity",b.opacityForText.bind(b)),F.attr("transform",null),F.select("rect").filter(b.isRegionOnX).attr("x",b.regionX.bind(b)).attr("width",b.regionWidth.bind(b)),c.interaction_enabled&&b.redrawEventRect(),B(),b.flowing=!1})}},h.selected=function(a){var b=this.internal,c=b.d3;return c.merge(b.main.selectAll("."+l.shapes+b.getTargetSelectorSuffix(a)).selectAll("."+l.shape).filter(function(){return c.select(this).classed(l.SELECTED)}).map(function(a){return a.map(function(a){var b=a.__data__;return b.data?b.data:b})}))},h.select=function(a,b,c){var d=this.internal,e=d.d3,f=d.config;f.data_selection_enabled&&d.main.selectAll("."+l.shapes).selectAll("."+l.shape).each(function(g,h){var i=e.select(this),j=g.data?g.data.id:g.id,k=d.getToggle(this,g).bind(d),m=f.data_selection_grouped||!a||a.indexOf(j)>=0,n=!b||b.indexOf(h)>=0,o=i.classed(l.SELECTED);i.classed(l.line)||i.classed(l.area)||(m&&n?f.data_selection_isselectable(g)&&!o&&k(!0,i.classed(l.SELECTED,!0),g,h):q(c)&&c&&o&&k(!1,i.classed(l.SELECTED,!1),g,h))})},h.unselect=function(a,b){var c=this.internal,d=c.d3,e=c.config;e.data_selection_enabled&&c.main.selectAll("."+l.shapes).selectAll("."+l.shape).each(function(f,g){var h=d.select(this),i=f.data?f.data.id:f.id,j=c.getToggle(this,f).bind(c),k=e.data_selection_grouped||!a||a.indexOf(i)>=0,m=!b||b.indexOf(g)>=0,n=h.classed(l.SELECTED);h.classed(l.line)||h.classed(l.area)||k&&m&&e.data_selection_isselectable(f)&&n&&j(!1,h.classed(l.SELECTED,!1),f,g)})},h.transform=function(a,b){var c=this.internal,d=["pie","donut"].indexOf(a)>=0?{withTransform:!0}:null;c.transformTo(b,a,d)},i.transformTo=function(a,b,c){var d=this,e=!d.hasArcType(),f=c||{withTransitionForAxis:e};f.withTransitionForTransform=!1,d.transiting=!1,d.setTargetType(a,b),d.updateTargets(d.data.targets),d.updateAndRedraw(f)},h.groups=function(a){var b=this.internal,c=b.config;return p(a)?c.data_groups:(c.data_groups=a,b.redraw(),c.data_groups)},h.xgrids=function(a){var b=this.internal,c=b.config;return a?(c.grid_x_lines=a,b.redrawWithoutRescale(),c.grid_x_lines):c.grid_x_lines},h.xgrids.add=function(a){var b=this.internal;return this.xgrids(b.config.grid_x_lines.concat(a?a:[]))},h.xgrids.remove=function(a){var b=this.internal;b.removeGridLines(a,!0)},h.ygrids=function(a){var b=this.internal,c=b.config;return a?(c.grid_y_lines=a,b.redrawWithoutRescale(),c.grid_y_lines):c.grid_y_lines},h.ygrids.add=function(a){var b=this.internal;return this.ygrids(b.config.grid_y_lines.concat(a?a:[]))},h.ygrids.remove=function(a){var b=this.internal;b.removeGridLines(a,!1)},h.regions=function(a){var b=this.internal,c=b.config;return a?(c.regions=a,b.redrawWithoutRescale(),c.regions):c.regions},h.regions.add=function(a){var b=this.internal,c=b.config;return a?(c.regions=c.regions.concat(a),b.redrawWithoutRescale(),c.regions):c.regions},h.regions.remove=function(a){var b,c,d,e=this.internal,f=e.config;return a=a||{},b=e.getOption(a,"duration",f.transition_duration),c=e.getOption(a,"classes",[l.region]),d=e.main.select("."+l.regions).selectAll(c.map(function(a){return"."+a})),(b?d.transition().duration(b):d).style("opacity",0).remove(),f.regions=f.regions.filter(function(a){var b=!1;return a["class"]?(a["class"].split(" ").forEach(function(a){c.indexOf(a)>=0&&(b=!0)}),!b):!0}),f.regions},h.data=function(a){var b=this.internal.data.targets;return"undefined"==typeof a?b:b.filter(function(b){return[].concat(a).indexOf(b.id)>=0})},h.data.shown=function(a){return this.internal.filterTargetsToShow(this.data(a))},h.data.values=function(a){var b,c=null;return a&&(b=this.data(a),c=b[0]?b[0].values.map(function(a){return a.value}):null),c},h.data.names=function(a){return this.internal.clearLegendItemTextBoxCache(),this.internal.updateDataAttributes("names",a)},h.data.colors=function(a){return this.internal.updateDataAttributes("colors",a)},h.data.axes=function(a){return this.internal.updateDataAttributes("axes",a)},h.category=function(a,b){var c=this.internal,d=c.config;return arguments.length>1&&(d.axis_x_categories[a]=b,c.redraw()),d.axis_x_categories[a]},h.categories=function(a){var b=this.internal,c=b.config;return arguments.length?(c.axis_x_categories=a,b.redraw(),c.axis_x_categories):c.axis_x_categories},h.color=function(a){var b=this.internal;return b.color(a)},h.x=function(a){var b=this.internal;return arguments.length&&(b.updateTargetX(b.data.targets,a),b.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),b.data.xs},h.xs=function(a){var b=this.internal;return arguments.length&&(b.updateTargetXs(b.data.targets,a),b.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})),b.data.xs},h.axis=function(){},h.axis.labels=function(a){var b=this.internal;arguments.length&&(Object.keys(a).forEach(function(c){b.axis.setLabelText(c,a[c])}),b.axis.updateLabels())},h.axis.max=function(a){var b=this.internal,c=b.config;return arguments.length?("object"==typeof a?(m(a.x)&&(c.axis_x_max=a.x),m(a.y)&&(c.axis_y_max=a.y),m(a.y2)&&(c.axis_y2_max=a.y2)):c.axis_y_max=c.axis_y2_max=a,void b.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})):{x:c.axis_x_max,y:c.axis_y_max,y2:c.axis_y2_max}},h.axis.min=function(a){var b=this.internal,c=b.config;return arguments.length?("object"==typeof a?(m(a.x)&&(c.axis_x_min=a.x),m(a.y)&&(c.axis_y_min=a.y),m(a.y2)&&(c.axis_y2_min=a.y2)):c.axis_y_min=c.axis_y2_min=a,void b.redraw({withUpdateOrgXDomain:!0,withUpdateXDomain:!0})):{x:c.axis_x_min,y:c.axis_y_min,y2:c.axis_y2_min}},h.axis.range=function(a){return arguments.length?(q(a.max)&&this.axis.max(a.max),void(q(a.min)&&this.axis.min(a.min))):{max:this.axis.max(),min:this.axis.min()}},h.legend=function(){},h.legend.show=function(a){var b=this.internal;b.showLegend(b.mapToTargetIds(a)),b.updateAndRedraw({withLegend:!0})},h.legend.hide=function(a){var b=this.internal;b.hideLegend(b.mapToTargetIds(a)),b.updateAndRedraw({withLegend:!0})},h.resize=function(a){var b=this.internal,c=b.config;c.size_width=a?a.width:null,c.size_height=a?a.height:null,this.flush()},h.flush=function(){var a=this.internal;a.updateAndRedraw({withLegend:!0,withTransition:!1,withTransitionForTransform:!1})},h.destroy=function(){var b=this.internal;if(a.clearInterval(b.intervalForObserveInserted),void 0!==b.resizeTimeout&&a.clearTimeout(b.resizeTimeout),a.detachEvent)a.detachEvent("onresize",b.resizeFunction);else if(a.removeEventListener)a.removeEventListener("resize",b.resizeFunction);else{var c=a.onresize;c&&c.add&&c.remove&&c.remove(b.resizeFunction)}return b.selectChart.classed("c3",!1).html(""),Object.keys(b).forEach(function(a){b[a]=null}),null},h.tooltip=function(){},h.tooltip.show=function(a){var b,c,d=this.internal;a.mouse&&(c=a.mouse),a.data?d.isMultipleX()?(c=[d.x(a.data.x),d.getYScale(a.data.id)(a.data.value)],b=null):b=m(a.data.index)?a.data.index:d.getIndexByX(a.data.x):"undefined"!=typeof a.x?b=d.getIndexByX(a.x):"undefined"!=typeof a.index&&(b=a.index),d.dispatchEvent("mouseover",b,c),d.dispatchEvent("mousemove",b,c),d.config.tooltip_onshow.call(d,a.data)},h.tooltip.hide=function(){this.internal.dispatchEvent("mouseout",0),this.internal.config.tooltip_onhide.call(this)};var A;i.isSafari=function(){var b=a.navigator.userAgent;return b.indexOf("Safari")>=0&&b.indexOf("Chrome")<0},i.isChrome=function(){var b=a.navigator.userAgent;return b.indexOf("Chrome")>=0},Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e}),function(){"SVGPathSeg"in a||(a.SVGPathSeg=function(a,b,c){this.pathSegType=a,this.pathSegTypeAsLetter=b,this._owningPathSegList=c},SVGPathSeg.PATHSEG_UNKNOWN=0,SVGPathSeg.PATHSEG_CLOSEPATH=1,SVGPathSeg.PATHSEG_MOVETO_ABS=2,SVGPathSeg.PATHSEG_MOVETO_REL=3,SVGPathSeg.PATHSEG_LINETO_ABS=4,SVGPathSeg.PATHSEG_LINETO_REL=5,SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS=6,SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL=7,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS=8,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL=9,SVGPathSeg.PATHSEG_ARC_ABS=10,SVGPathSeg.PATHSEG_ARC_REL=11,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS=12,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL=13,SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS=14,SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL=15,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS=16,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL=17,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS=18,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL=19,SVGPathSeg.prototype._segmentChanged=function(){this._owningPathSegList&&this._owningPathSegList.segmentChanged(this)},a.SVGPathSegClosePath=function(a){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CLOSEPATH,"z",a)},SVGPathSegClosePath.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegClosePath.prototype.toString=function(){return"[object SVGPathSegClosePath]"},SVGPathSegClosePath.prototype._asPathString=function(){return this.pathSegTypeAsLetter},SVGPathSegClosePath.prototype.clone=function(){return new SVGPathSegClosePath(void 0)},a.SVGPathSegMovetoAbs=function(a,b,c){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_MOVETO_ABS,"M",a),this._x=b,this._y=c},SVGPathSegMovetoAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegMovetoAbs.prototype.toString=function(){return"[object SVGPathSegMovetoAbs]"},SVGPathSegMovetoAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegMovetoAbs.prototype.clone=function(){return new SVGPathSegMovetoAbs(void 0,this._x,this._y)},Object.defineProperty(SVGPathSegMovetoAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegMovetoAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegMovetoRel=function(a,b,c){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_MOVETO_REL,"m",a),this._x=b,this._y=c},SVGPathSegMovetoRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegMovetoRel.prototype.toString=function(){return"[object SVGPathSegMovetoRel]"},SVGPathSegMovetoRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegMovetoRel.prototype.clone=function(){return new SVGPathSegMovetoRel(void 0,this._x,this._y)},Object.defineProperty(SVGPathSegMovetoRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegMovetoRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegLinetoAbs=function(a,b,c){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_ABS,"L",a),this._x=b,this._y=c},SVGPathSegLinetoAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoAbs.prototype.toString=function(){return"[object SVGPathSegLinetoAbs]"},SVGPathSegLinetoAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegLinetoAbs.prototype.clone=function(){return new SVGPathSegLinetoAbs(void 0,this._x,this._y)},Object.defineProperty(SVGPathSegLinetoAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegLinetoAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegLinetoRel=function(a,b,c){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_REL,"l",a),this._x=b,this._y=c},SVGPathSegLinetoRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoRel.prototype.toString=function(){return"[object SVGPathSegLinetoRel]"},SVGPathSegLinetoRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegLinetoRel.prototype.clone=function(){return new SVGPathSegLinetoRel(void 0,this._x,this._y)},Object.defineProperty(SVGPathSegLinetoRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegLinetoRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoCubicAbs=function(a,b,c,d,e,f,g){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS,"C",a),this._x=b,this._y=c,this._x1=d,this._y1=e,this._x2=f,this._y2=g},SVGPathSegCurvetoCubicAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicAbs]"},SVGPathSegCurvetoCubicAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicAbs.prototype.clone=function(){return new SVGPathSegCurvetoCubicAbs(void 0,this._x,this._y,this._x1,this._y1,this._x2,this._y2)},Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"x1",{get:function(){return this._x1},set:function(a){this._x1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"y1",{get:function(){return this._y1},set:function(a){this._y1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"x2",{get:function(){return this._x2},set:function(a){this._x2=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicAbs.prototype,"y2",{get:function(){return this._y2},set:function(a){this._y2=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoCubicRel=function(a,b,c,d,e,f,g){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL,"c",a),this._x=b,this._y=c,this._x1=d,this._y1=e,this._x2=f,this._y2=g},SVGPathSegCurvetoCubicRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicRel.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicRel]"},SVGPathSegCurvetoCubicRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicRel.prototype.clone=function(){return new SVGPathSegCurvetoCubicRel(void 0,this._x,this._y,this._x1,this._y1,this._x2,this._y2)},Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"x1",{get:function(){return this._x1},set:function(a){this._x1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"y1",{get:function(){return this._y1},set:function(a){this._y1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"x2",{get:function(){return this._x2},set:function(a){this._x2=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicRel.prototype,"y2",{get:function(){return this._y2},set:function(a){this._y2=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoQuadraticAbs=function(a,b,c,d,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS,"Q",a),this._x=b,this._y=c,this._x1=d,this._y1=e},SVGPathSegCurvetoQuadraticAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticAbs]"},SVGPathSegCurvetoQuadraticAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticAbs.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticAbs(void 0,this._x,this._y,this._x1,this._y1)},Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"x1",{get:function(){return this._x1},set:function(a){this._x1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticAbs.prototype,"y1",{get:function(){return this._y1},set:function(a){this._y1=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoQuadraticRel=function(a,b,c,d,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL,"q",a),this._x=b,this._y=c,this._x1=d,this._y1=e},SVGPathSegCurvetoQuadraticRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticRel.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticRel]"},SVGPathSegCurvetoQuadraticRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticRel.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticRel(void 0,this._x,this._y,this._x1,this._y1)},Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"x1",{get:function(){return this._x1},set:function(a){this._x1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticRel.prototype,"y1",{get:function(){return this._y1},set:function(a){this._y1=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegArcAbs=function(a,b,c,d,e,f,g,h){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_ARC_ABS,"A",a),this._x=b,this._y=c,this._r1=d,this._r2=e,this._angle=f,this._largeArcFlag=g,this._sweepFlag=h},SVGPathSegArcAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegArcAbs.prototype.toString=function(){return"[object SVGPathSegArcAbs]"},SVGPathSegArcAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._r1+" "+this._r2+" "+this._angle+" "+(this._largeArcFlag?"1":"0")+" "+(this._sweepFlag?"1":"0")+" "+this._x+" "+this._y},SVGPathSegArcAbs.prototype.clone=function(){return new SVGPathSegArcAbs(void 0,this._x,this._y,this._r1,this._r2,this._angle,this._largeArcFlag,this._sweepFlag)},Object.defineProperty(SVGPathSegArcAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"r1",{get:function(){return this._r1},set:function(a){this._r1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"r2",{get:function(){return this._r2},set:function(a){this._r2=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"angle",{get:function(){return this._angle},set:function(a){this._angle=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"largeArcFlag",{get:function(){return this._largeArcFlag},set:function(a){this._largeArcFlag=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcAbs.prototype,"sweepFlag",{get:function(){return this._sweepFlag},set:function(a){this._sweepFlag=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegArcRel=function(a,b,c,d,e,f,g,h){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_ARC_REL,"a",a),this._x=b,this._y=c,this._r1=d,this._r2=e,this._angle=f,this._largeArcFlag=g,this._sweepFlag=h},SVGPathSegArcRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegArcRel.prototype.toString=function(){return"[object SVGPathSegArcRel]"},SVGPathSegArcRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._r1+" "+this._r2+" "+this._angle+" "+(this._largeArcFlag?"1":"0")+" "+(this._sweepFlag?"1":"0")+" "+this._x+" "+this._y},SVGPathSegArcRel.prototype.clone=function(){return new SVGPathSegArcRel(void 0,this._x,this._y,this._r1,this._r2,this._angle,this._largeArcFlag,this._sweepFlag)},Object.defineProperty(SVGPathSegArcRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"r1",{get:function(){return this._r1},set:function(a){this._r1=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"r2",{get:function(){return this._r2},set:function(a){this._r2=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"angle",{get:function(){return this._angle},set:function(a){this._angle=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"largeArcFlag",{get:function(){return this._largeArcFlag},set:function(a){this._largeArcFlag=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegArcRel.prototype,"sweepFlag",{get:function(){return this._sweepFlag},set:function(a){this._sweepFlag=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegLinetoHorizontalAbs=function(a,b){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS,"H",a),this._x=b},SVGPathSegLinetoHorizontalAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoHorizontalAbs.prototype.toString=function(){return"[object SVGPathSegLinetoHorizontalAbs]"},SVGPathSegLinetoHorizontalAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x},SVGPathSegLinetoHorizontalAbs.prototype.clone=function(){return new SVGPathSegLinetoHorizontalAbs(void 0,this._x)},Object.defineProperty(SVGPathSegLinetoHorizontalAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegLinetoHorizontalRel=function(a,b){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL,"h",a),this._x=b},SVGPathSegLinetoHorizontalRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoHorizontalRel.prototype.toString=function(){return"[object SVGPathSegLinetoHorizontalRel]"},SVGPathSegLinetoHorizontalRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x},SVGPathSegLinetoHorizontalRel.prototype.clone=function(){return new SVGPathSegLinetoHorizontalRel(void 0,this._x)},Object.defineProperty(SVGPathSegLinetoHorizontalRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegLinetoVerticalAbs=function(a,b){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS,"V",a),this._y=b},SVGPathSegLinetoVerticalAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoVerticalAbs.prototype.toString=function(){return"[object SVGPathSegLinetoVerticalAbs]"},SVGPathSegLinetoVerticalAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._y},SVGPathSegLinetoVerticalAbs.prototype.clone=function(){return new SVGPathSegLinetoVerticalAbs(void 0,this._y)},Object.defineProperty(SVGPathSegLinetoVerticalAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegLinetoVerticalRel=function(a,b){
2316 2316 SVGPathSeg.call(this,SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL,"v",a),this._y=b},SVGPathSegLinetoVerticalRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegLinetoVerticalRel.prototype.toString=function(){return"[object SVGPathSegLinetoVerticalRel]"},SVGPathSegLinetoVerticalRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._y},SVGPathSegLinetoVerticalRel.prototype.clone=function(){return new SVGPathSegLinetoVerticalRel(void 0,this._y)},Object.defineProperty(SVGPathSegLinetoVerticalRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoCubicSmoothAbs=function(a,b,c,d,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS,"S",a),this._x=b,this._y=c,this._x2=d,this._y2=e},SVGPathSegCurvetoCubicSmoothAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicSmoothAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicSmoothAbs]"},SVGPathSegCurvetoCubicSmoothAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicSmoothAbs.prototype.clone=function(){return new SVGPathSegCurvetoCubicSmoothAbs(void 0,this._x,this._y,this._x2,this._y2)},Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"x2",{get:function(){return this._x2},set:function(a){this._x2=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothAbs.prototype,"y2",{get:function(){return this._y2},set:function(a){this._y2=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoCubicSmoothRel=function(a,b,c,d,e){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL,"s",a),this._x=b,this._y=c,this._x2=d,this._y2=e},SVGPathSegCurvetoCubicSmoothRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoCubicSmoothRel.prototype.toString=function(){return"[object SVGPathSegCurvetoCubicSmoothRel]"},SVGPathSegCurvetoCubicSmoothRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y},SVGPathSegCurvetoCubicSmoothRel.prototype.clone=function(){return new SVGPathSegCurvetoCubicSmoothRel(void 0,this._x,this._y,this._x2,this._y2)},Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"x2",{get:function(){return this._x2},set:function(a){this._x2=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoCubicSmoothRel.prototype,"y2",{get:function(){return this._y2},set:function(a){this._y2=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoQuadraticSmoothAbs=function(a,b,c){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS,"T",a),this._x=b,this._y=c},SVGPathSegCurvetoQuadraticSmoothAbs.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticSmoothAbs.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticSmoothAbs]"},SVGPathSegCurvetoQuadraticSmoothAbs.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticSmoothAbs.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticSmoothAbs(void 0,this._x,this._y)},Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothAbs.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),a.SVGPathSegCurvetoQuadraticSmoothRel=function(a,b,c){SVGPathSeg.call(this,SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL,"t",a),this._x=b,this._y=c},SVGPathSegCurvetoQuadraticSmoothRel.prototype=Object.create(SVGPathSeg.prototype),SVGPathSegCurvetoQuadraticSmoothRel.prototype.toString=function(){return"[object SVGPathSegCurvetoQuadraticSmoothRel]"},SVGPathSegCurvetoQuadraticSmoothRel.prototype._asPathString=function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y},SVGPathSegCurvetoQuadraticSmoothRel.prototype.clone=function(){return new SVGPathSegCurvetoQuadraticSmoothRel(void 0,this._x,this._y)},Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype,"x",{get:function(){return this._x},set:function(a){this._x=a,this._segmentChanged()},enumerable:!0}),Object.defineProperty(SVGPathSegCurvetoQuadraticSmoothRel.prototype,"y",{get:function(){return this._y},set:function(a){this._y=a,this._segmentChanged()},enumerable:!0}),SVGPathElement.prototype.createSVGPathSegClosePath=function(){return new SVGPathSegClosePath(void 0)},SVGPathElement.prototype.createSVGPathSegMovetoAbs=function(a,b){return new SVGPathSegMovetoAbs(void 0,a,b)},SVGPathElement.prototype.createSVGPathSegMovetoRel=function(a,b){return new SVGPathSegMovetoRel(void 0,a,b)},SVGPathElement.prototype.createSVGPathSegLinetoAbs=function(a,b){return new SVGPathSegLinetoAbs(void 0,a,b)},SVGPathElement.prototype.createSVGPathSegLinetoRel=function(a,b){return new SVGPathSegLinetoRel(void 0,a,b)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs=function(a,b,c,d,e,f){return new SVGPathSegCurvetoCubicAbs(void 0,a,b,c,d,e,f)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel=function(a,b,c,d,e,f){return new SVGPathSegCurvetoCubicRel(void 0,a,b,c,d,e,f)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs=function(a,b,c,d){return new SVGPathSegCurvetoQuadraticAbs(void 0,a,b,c,d)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel=function(a,b,c,d){return new SVGPathSegCurvetoQuadraticRel(void 0,a,b,c,d)},SVGPathElement.prototype.createSVGPathSegArcAbs=function(a,b,c,d,e,f,g){return new SVGPathSegArcAbs(void 0,a,b,c,d,e,f,g)},SVGPathElement.prototype.createSVGPathSegArcRel=function(a,b,c,d,e,f,g){return new SVGPathSegArcRel(void 0,a,b,c,d,e,f,g)},SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs=function(a){return new SVGPathSegLinetoHorizontalAbs(void 0,a)},SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel=function(a){return new SVGPathSegLinetoHorizontalRel(void 0,a)},SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs=function(a){return new SVGPathSegLinetoVerticalAbs(void 0,a)},SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel=function(a){return new SVGPathSegLinetoVerticalRel(void 0,a)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs=function(a,b,c,d){return new SVGPathSegCurvetoCubicSmoothAbs(void 0,a,b,c,d)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel=function(a,b,c,d){return new SVGPathSegCurvetoCubicSmoothRel(void 0,a,b,c,d)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs=function(a,b){return new SVGPathSegCurvetoQuadraticSmoothAbs(void 0,a,b)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel=function(a,b){return new SVGPathSegCurvetoQuadraticSmoothRel(void 0,a,b)}),"SVGPathSegList"in a||(a.SVGPathSegList=function(a){this._pathElement=a,this._list=this._parsePath(this._pathElement.getAttribute("d")),this._mutationObserverConfig={attributes:!0,attributeFilter:["d"]},this._pathElementMutationObserver=new MutationObserver(this._updateListFromPathMutations.bind(this)),this._pathElementMutationObserver.observe(this._pathElement,this._mutationObserverConfig)},Object.defineProperty(SVGPathSegList.prototype,"numberOfItems",{get:function(){return this._checkPathSynchronizedToList(),this._list.length},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"pathSegList",{get:function(){return this._pathSegList||(this._pathSegList=new SVGPathSegList(this)),this._pathSegList},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"normalizedPathSegList",{get:function(){return this.pathSegList},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"animatedPathSegList",{get:function(){return this.pathSegList},enumerable:!0}),Object.defineProperty(SVGPathElement.prototype,"animatedNormalizedPathSegList",{get:function(){return this.pathSegList},enumerable:!0}),SVGPathSegList.prototype._checkPathSynchronizedToList=function(){this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords())},SVGPathSegList.prototype._updateListFromPathMutations=function(a){if(this._pathElement){var b=!1;a.forEach(function(a){"d"==a.attributeName&&(b=!0)}),b&&(this._list=this._parsePath(this._pathElement.getAttribute("d")))}},SVGPathSegList.prototype._writeListToPath=function(){this._pathElementMutationObserver.disconnect(),this._pathElement.setAttribute("d",SVGPathSegList._pathSegArrayAsString(this._list)),this._pathElementMutationObserver.observe(this._pathElement,this._mutationObserverConfig)},SVGPathSegList.prototype.segmentChanged=function(a){this._writeListToPath()},SVGPathSegList.prototype.clear=function(){this._checkPathSynchronizedToList(),this._list.forEach(function(a){a._owningPathSegList=null}),this._list=[],this._writeListToPath()},SVGPathSegList.prototype.initialize=function(a){return this._checkPathSynchronizedToList(),this._list=[a],a._owningPathSegList=this,this._writeListToPath(),a},SVGPathSegList.prototype._checkValidIndex=function(a){if(isNaN(a)||0>a||a>=this.numberOfItems)throw"INDEX_SIZE_ERR"},SVGPathSegList.prototype.getItem=function(a){return this._checkPathSynchronizedToList(),this._checkValidIndex(a),this._list[a]},SVGPathSegList.prototype.insertItemBefore=function(a,b){return this._checkPathSynchronizedToList(),b>this.numberOfItems&&(b=this.numberOfItems),a._owningPathSegList&&(a=a.clone()),this._list.splice(b,0,a),a._owningPathSegList=this,this._writeListToPath(),a},SVGPathSegList.prototype.replaceItem=function(a,b){return this._checkPathSynchronizedToList(),a._owningPathSegList&&(a=a.clone()),this._checkValidIndex(b),this._list[b]=a,a._owningPathSegList=this,this._writeListToPath(),a},SVGPathSegList.prototype.removeItem=function(a){this._checkPathSynchronizedToList(),this._checkValidIndex(a);var b=this._list[a];return this._list.splice(a,1),this._writeListToPath(),b},SVGPathSegList.prototype.appendItem=function(a){return this._checkPathSynchronizedToList(),a._owningPathSegList&&(a=a.clone()),this._list.push(a),a._owningPathSegList=this,this._writeListToPath(),a},SVGPathSegList._pathSegArrayAsString=function(a){var b="",c=!0;return a.forEach(function(a){c?(c=!1,b+=a._asPathString()):b+=" "+a._asPathString()}),b},SVGPathSegList.prototype._parsePath=function(a){if(!a||0==a.length)return[];var b=this,c=function(){this.pathSegList=[]};c.prototype.appendSegment=function(a){this.pathSegList.push(a)};var d=function(a){this._string=a,this._currentIndex=0,this._endIndex=this._string.length,this._previousCommand=SVGPathSeg.PATHSEG_UNKNOWN,this._skipOptionalSpaces()};d.prototype._isCurrentSpace=function(){var a=this._string[this._currentIndex];return" ">=a&&(" "==a||"\n"==a||" "==a||"\r"==a||"\f"==a)},d.prototype._skipOptionalSpaces=function(){for(;this._currentIndex<this._endIndex&&this._isCurrentSpace();)this._currentIndex++;return this._currentIndex<this._endIndex},d.prototype._skipOptionalSpacesOrDelimiter=function(){return this._currentIndex<this._endIndex&&!this._isCurrentSpace()&&","!=this._string.charAt(this._currentIndex)?!1:(this._skipOptionalSpaces()&&this._currentIndex<this._endIndex&&","==this._string.charAt(this._currentIndex)&&(this._currentIndex++,this._skipOptionalSpaces()),this._currentIndex<this._endIndex)},d.prototype.hasMoreData=function(){return this._currentIndex<this._endIndex},d.prototype.peekSegmentType=function(){var a=this._string[this._currentIndex];return this._pathSegTypeFromChar(a)},d.prototype._pathSegTypeFromChar=function(a){switch(a){case"Z":case"z":return SVGPathSeg.PATHSEG_CLOSEPATH;case"M":return SVGPathSeg.PATHSEG_MOVETO_ABS;case"m":return SVGPathSeg.PATHSEG_MOVETO_REL;case"L":return SVGPathSeg.PATHSEG_LINETO_ABS;case"l":return SVGPathSeg.PATHSEG_LINETO_REL;case"C":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS;case"c":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL;case"Q":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS;case"q":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL;case"A":return SVGPathSeg.PATHSEG_ARC_ABS;case"a":return SVGPathSeg.PATHSEG_ARC_REL;case"H":return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS;case"h":return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL;case"V":return SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS;case"v":return SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL;case"S":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS;case"s":return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL;case"T":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS;case"t":return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL;default:return SVGPathSeg.PATHSEG_UNKNOWN}},d.prototype._nextCommandHelper=function(a,b){return("+"==a||"-"==a||"."==a||a>="0"&&"9">=a)&&b!=SVGPathSeg.PATHSEG_CLOSEPATH?b==SVGPathSeg.PATHSEG_MOVETO_ABS?SVGPathSeg.PATHSEG_LINETO_ABS:b==SVGPathSeg.PATHSEG_MOVETO_REL?SVGPathSeg.PATHSEG_LINETO_REL:b:SVGPathSeg.PATHSEG_UNKNOWN},d.prototype.initialCommandIsMoveTo=function(){if(!this.hasMoreData())return!0;var a=this.peekSegmentType();return a==SVGPathSeg.PATHSEG_MOVETO_ABS||a==SVGPathSeg.PATHSEG_MOVETO_REL},d.prototype._parseNumber=function(){var a=0,b=0,c=1,d=0,e=1,f=1,g=this._currentIndex;if(this._skipOptionalSpaces(),this._currentIndex<this._endIndex&&"+"==this._string.charAt(this._currentIndex)?this._currentIndex++:this._currentIndex<this._endIndex&&"-"==this._string.charAt(this._currentIndex)&&(this._currentIndex++,e=-1),!(this._currentIndex==this._endIndex||(this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")&&"."!=this._string.charAt(this._currentIndex))){for(var h=this._currentIndex;this._currentIndex<this._endIndex&&this._string.charAt(this._currentIndex)>="0"&&this._string.charAt(this._currentIndex)<="9";)this._currentIndex++;if(this._currentIndex!=h)for(var i=this._currentIndex-1,j=1;i>=h;)b+=j*(this._string.charAt(i--)-"0"),j*=10;if(this._currentIndex<this._endIndex&&"."==this._string.charAt(this._currentIndex)){if(this._currentIndex++,this._currentIndex>=this._endIndex||this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")return;for(;this._currentIndex<this._endIndex&&this._string.charAt(this._currentIndex)>="0"&&this._string.charAt(this._currentIndex)<="9";)d+=(this._string.charAt(this._currentIndex++)-"0")*(c*=.1)}if(this._currentIndex!=g&&this._currentIndex+1<this._endIndex&&("e"==this._string.charAt(this._currentIndex)||"E"==this._string.charAt(this._currentIndex))&&"x"!=this._string.charAt(this._currentIndex+1)&&"m"!=this._string.charAt(this._currentIndex+1)){if(this._currentIndex++,"+"==this._string.charAt(this._currentIndex)?this._currentIndex++:"-"==this._string.charAt(this._currentIndex)&&(this._currentIndex++,f=-1),this._currentIndex>=this._endIndex||this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")return;for(;this._currentIndex<this._endIndex&&this._string.charAt(this._currentIndex)>="0"&&this._string.charAt(this._currentIndex)<="9";)a*=10,a+=this._string.charAt(this._currentIndex)-"0",this._currentIndex++}var k=b+d;if(k*=e,a&&(k*=Math.pow(10,f*a)),g!=this._currentIndex)return this._skipOptionalSpacesOrDelimiter(),k}},d.prototype._parseArcFlag=function(){if(!(this._currentIndex>=this._endIndex)){var a=!1,b=this._string.charAt(this._currentIndex++);if("0"==b)a=!1;else{if("1"!=b)return;a=!0}return this._skipOptionalSpacesOrDelimiter(),a}},d.prototype.parseSegment=function(){var a=this._string[this._currentIndex],c=this._pathSegTypeFromChar(a);if(c==SVGPathSeg.PATHSEG_UNKNOWN){if(this._previousCommand==SVGPathSeg.PATHSEG_UNKNOWN)return null;if(c=this._nextCommandHelper(a,this._previousCommand),c==SVGPathSeg.PATHSEG_UNKNOWN)return null}else this._currentIndex++;switch(this._previousCommand=c,c){case SVGPathSeg.PATHSEG_MOVETO_REL:return new SVGPathSegMovetoRel(b,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_MOVETO_ABS:return new SVGPathSegMovetoAbs(b,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_REL:return new SVGPathSegLinetoRel(b,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_ABS:return new SVGPathSegLinetoAbs(b,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:return new SVGPathSegLinetoHorizontalRel(b,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:return new SVGPathSegLinetoHorizontalAbs(b,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:return new SVGPathSegLinetoVerticalRel(b,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:return new SVGPathSegLinetoVerticalAbs(b,this._parseNumber());case SVGPathSeg.PATHSEG_CLOSEPATH:return this._skipOptionalSpaces(),new SVGPathSegClosePath(b);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL:var d={x1:this._parseNumber(),y1:this._parseNumber(),x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicRel(b,d.x,d.y,d.x1,d.y1,d.x2,d.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS:var d={x1:this._parseNumber(),y1:this._parseNumber(),x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicAbs(b,d.x,d.y,d.x1,d.y1,d.x2,d.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL:var d={x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicSmoothRel(b,d.x,d.y,d.x2,d.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:var d={x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicSmoothAbs(b,d.x,d.y,d.x2,d.y2);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL:var d={x1:this._parseNumber(),y1:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoQuadraticRel(b,d.x,d.y,d.x1,d.y1);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS:var d={x1:this._parseNumber(),y1:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoQuadraticAbs(b,d.x,d.y,d.x1,d.y1);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:return new SVGPathSegCurvetoQuadraticSmoothRel(b,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:return new SVGPathSegCurvetoQuadraticSmoothAbs(b,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_ARC_REL:var d={x1:this._parseNumber(),y1:this._parseNumber(),arcAngle:this._parseNumber(),arcLarge:this._parseArcFlag(),arcSweep:this._parseArcFlag(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegArcRel(b,d.x,d.y,d.x1,d.y1,d.arcAngle,d.arcLarge,d.arcSweep);case SVGPathSeg.PATHSEG_ARC_ABS:var d={x1:this._parseNumber(),y1:this._parseNumber(),arcAngle:this._parseNumber(),arcLarge:this._parseArcFlag(),arcSweep:this._parseArcFlag(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegArcAbs(b,d.x,d.y,d.x1,d.y1,d.arcAngle,d.arcLarge,d.arcSweep);default:throw"Unknown path seg type."}};var e=new c,f=new d(a);if(!f.initialCommandIsMoveTo())return[];for(;f.hasMoreData();){var g=f.parseSegment();if(!g)return[];e.appendSegment(g)}return e.pathSegList})}(),"function"==typeof define&&define.amd?define("c3",["d3"],function(){return k}):"undefined"!=typeof exports&&"undefined"!=typeof module?module.exports=k:a.c3=k}(window);
2317 2317 ;/**
2318 2318 * @version 2.1.8
2319 2319 * @license MIT
2320 2320 */
2321 2321 !function(t,e){"use strict";t.module("smart-table",[]).run(["$templateCache",function(t){t.put("template/smart-table/pagination.html",'<nav ng-if="numPages && pages.length >= 2"><ul class="pagination"><li ng-repeat="page in pages" ng-class="{active: page==currentPage}"><a href="javascript: void(0);" ng-click="selectPage(page)">{{page}}</a></li></ul></nav>')}]),t.module("smart-table").constant("stConfig",{pagination:{template:"template/smart-table/pagination.html",itemsByPage:10,displayedPages:5},search:{delay:400,inputEvent:"input"},select:{mode:"single",selectedClass:"st-selected"},sort:{ascentClass:"st-sort-ascent",descentClass:"st-sort-descent",descendingFirst:!1,skipNatural:!1,delay:300},pipe:{delay:100}}),t.module("smart-table").controller("stTableController",["$scope","$parse","$filter","$attrs",function(a,n,s,i){function r(t){return t?[].concat(t):[]}function l(){b=r(o(a)),v===!0&&S.pipe()}function c(t,e){if(-1!=e.indexOf(".")){var a=e.split("."),s=a.pop(),i=a.join("."),r=n(i)(t);delete r[s],0==Object.keys(r).length&&c(t,i)}else delete t[e]}var o,u,p,g=i.stTable,d=n(g),f=d.assign,m=s("orderBy"),h=s("filter"),b=r(d(a)),P={sort:{},search:{},pagination:{start:0,totalItemCount:0}},v=!0,S=this;i.stSafeSrc&&(o=n(i.stSafeSrc),a.$watch(function(){var t=o(a);return t&&t.length?t[0]:e},function(t,e){t!==e&&l()}),a.$watch(function(){var t=o(a);return t?t.length:0},function(t){t!==b.length&&l()}),a.$watch(function(){return o(a)},function(t,e){t!==e&&(P.pagination.start=0,l())})),this.sortBy=function(e,a){return P.sort.predicate=e,P.sort.reverse=a===!0,t.isFunction(e)?P.sort.functionName=e.name:delete P.sort.functionName,P.pagination.start=0,this.pipe()},this.search=function(e,a){var s=P.search.predicateObject||{},i=a?a:"$";return e=t.isString(e)?e.trim():e,n(i).assign(s,e),e||c(s,i),P.search.predicateObject=s,P.pagination.start=0,this.pipe()},this.pipe=function(){var t,n=P.pagination;u=P.search.predicateObject?h(b,P.search.predicateObject):b,P.sort.predicate&&(u=m(u,P.sort.predicate,P.sort.reverse)),n.totalItemCount=u.length,n.number!==e&&(n.numberOfPages=u.length>0?Math.ceil(u.length/n.number):1,n.start=n.start>=u.length?(n.numberOfPages-1)*n.number:n.start,t=u.slice(n.start,n.start+parseInt(n.number))),f(a,t||u)},this.select=function(t,n){var s=r(d(a)),i=s.indexOf(t);-1!==i&&("single"===n?(t.isSelected=t.isSelected!==!0,p&&(p.isSelected=!1),p=t.isSelected===!0?t:e):s[i].isSelected=!s[i].isSelected)},this.slice=function(t,e){return P.pagination.start=t,P.pagination.number=e,this.pipe()},this.tableState=function(){return P},this.getFilteredCollection=function(){return u||b},this.setFilterFunction=function(t){h=s(t)},this.setSortFunction=function(t){m=s(t)},this.preventPipeOnWatch=function(){v=!1}}]).directive("stTable",function(){return{restrict:"A",controller:"stTableController",link:function(t,e,a,n){a.stSetFilter&&n.setFilterFunction(a.stSetFilter),a.stSetSort&&n.setSortFunction(a.stSetSort)}}}),t.module("smart-table").directive("stSearch",["stConfig","$timeout","$parse",function(t,e,a){return{require:"^stTable",link:function(n,s,i,r){var l=r,c=null,o=i.stDelay||t.search.delay,u=i.stInputEvent||t.search.inputEvent;i.$observe("stSearch",function(t,e){var a=s[0].value;t!==e&&a&&(r.tableState().search={},l.search(a,t))}),n.$watch(function(){return r.tableState().search},function(t){var e=i.stSearch||"$";t.predicateObject&&a(e)(t.predicateObject)!==s[0].value&&(s[0].value=a(e)(t.predicateObject)||"")},!0),s.bind(u,function(t){t=t.originalEvent||t,null!==c&&e.cancel(c),c=e(function(){l.search(t.target.value,i.stSearch||""),c=null},o)})}}}]),t.module("smart-table").directive("stSelectRow",["stConfig",function(t){return{restrict:"A",require:"^stTable",scope:{row:"=stSelectRow"},link:function(e,a,n,s){var i=n.stSelectMode||t.select.mode;a.bind("click",function(){e.$apply(function(){s.select(e.row,i)})}),e.$watch("row.isSelected",function(e){e===!0?a.addClass(t.select.selectedClass):a.removeClass(t.select.selectedClass)})}}}]),t.module("smart-table").directive("stSort",["stConfig","$parse","$timeout",function(a,n,s){return{restrict:"A",require:"^stTable",link:function(i,r,l,c){function o(){P?d=0===d?2:d-1:d++;var e;p=t.isFunction(g(i))||t.isArray(g(i))?g(i):l.stSort,d%3===0&&!!b!=!0?(d=0,c.tableState().sort={},c.tableState().pagination.start=0,e=c.pipe.bind(c)):e=c.sortBy.bind(c,p,d%2===0),null!==v&&s.cancel(v),0>S?e():v=s(e,S)}var u,p=l.stSort,g=n(p),d=0,f=l.stClassAscent||a.sort.ascentClass,m=l.stClassDescent||a.sort.descentClass,h=[f,m],b=l.stSkipNatural!==e?l.stSkipNatural:a.sort.skipNatural,P=l.stDescendingFirst!==e?l.stDescendingFirst:a.sort.descendingFirst,v=null,S=l.stDelay||a.sort.delay;l.stSortDefault&&(u=i.$eval(l.stSortDefault)!==e?i.$eval(l.stSortDefault):l.stSortDefault),r.bind("click",function(){p&&i.$apply(o)}),u&&(d="reverse"===u?1:0,o()),i.$watch(function(){return c.tableState().sort},function(t){t.predicate!==p?(d=0,r.removeClass(f).removeClass(m)):(d=t.reverse===!0?2:1,r.removeClass(h[d%2]).addClass(h[d-1]))},!0)}}}]),t.module("smart-table").directive("stPagination",["stConfig",function(t){return{restrict:"EA",require:"^stTable",scope:{stItemsByPage:"=?",stDisplayedPages:"=?",stPageChange:"&"},templateUrl:function(e,a){return a.stTemplate?a.stTemplate:t.pagination.template},link:function(e,a,n,s){function i(){var t,a,n=s.tableState().pagination,i=1,r=e.currentPage;for(e.totalItemCount=n.totalItemCount,e.currentPage=Math.floor(n.start/n.number)+1,i=Math.max(i,e.currentPage-Math.abs(Math.floor(e.stDisplayedPages/2))),t=i+e.stDisplayedPages,t>n.numberOfPages&&(t=n.numberOfPages+1,i=Math.max(1,t-e.stDisplayedPages)),e.pages=[],e.numPages=n.numberOfPages,a=i;t>a;a++)e.pages.push(a);r!==e.currentPage&&e.stPageChange({newPage:e.currentPage})}e.stItemsByPage=e.stItemsByPage?+e.stItemsByPage:t.pagination.itemsByPage,e.stDisplayedPages=e.stDisplayedPages?+e.stDisplayedPages:t.pagination.displayedPages,e.currentPage=1,e.pages=[],e.$watch(function(){return s.tableState().pagination},i,!0),e.$watch("stItemsByPage",function(t,a){t!==a&&e.selectPage(1)}),e.$watch("stDisplayedPages",i),e.selectPage=function(t){t>0&&t<=e.numPages&&s.slice((t-1)*e.stItemsByPage,e.stItemsByPage)},s.tableState().pagination.number||s.slice(0,e.stItemsByPage)}}}]),t.module("smart-table").directive("stPipe",["stConfig","$timeout",function(e,a){return{require:"stTable",scope:{stPipe:"="},link:{pre:function(n,s,i,r){var l=null;t.isFunction(n.stPipe)&&(r.preventPipeOnWatch(),r.pipe=function(){return null!==l&&a.cancel(l),l=a(function(){n.stPipe(r.tableState(),r)},e.pipe.delay)})},post:function(t,e,a,n){n.pipe()}}}}])}(angular);
2322 2322 //# sourceMappingURL=smart-table.min.js.map
2323 2323
2324 2324 ;"use strict";angular.module("mentio",[]).directive("mentio",["mentioUtil","$document","$compile","$log","$timeout",function(e,t,n,r,i){return{restrict:"A",scope:{macros:"=mentioMacros",search:"&mentioSearch",select:"&mentioSelect",items:"=mentioItems",typedTerm:"=mentioTypedTerm",altId:"=mentioId",iframeElement:"=mentioIframeElement",requireLeadingSpace:"=mentioRequireLeadingSpace",selectNotFound:"=mentioSelectNotFound",trimTerm:"=mentioTrimTerm",ngModel:"="},controller:["$scope","$timeout","$attrs",function(n,r,i){n.query=function(e,t){var r=n.triggerCharMap[e];(void 0===n.trimTerm||n.trimTerm)&&(t=t.trim()),r.showMenu(),r.search({term:t}),r.typedTerm=t},n.defaultSearch=function(e){var t=[];angular.forEach(n.items,function(n){n.label.toUpperCase().indexOf(e.term.toUpperCase())>=0&&t.push(n)}),n.localItems=t},n.bridgeSearch=function(e){var t=i.mentioSearch?n.search:n.defaultSearch;t({term:e})},n.defaultSelect=function(e){return n.defaultTriggerChar+e.item.label},n.bridgeSelect=function(e){var t=i.mentioSelect?n.select:n.defaultSelect;return t({item:e})},n.setTriggerText=function(e){n.syncTriggerText&&(n.typedTerm=void 0===n.trimTerm||n.trimTerm?e.trim():e)},n.context=function(){return n.iframeElement?{iframe:n.iframeElement}:void 0},n.replaceText=function(t,i){if(n.hideAll(),e.replaceTriggerText(n.context(),n.targetElement,n.targetElementPath,n.targetElementSelectedOffset,n.triggerCharSet,t,n.requireLeadingSpace,i),!i&&(n.setTriggerText(""),angular.element(n.targetElement).triggerHandler("change"),n.isContentEditable())){n.contentEditableMenuPasted=!0;var o=r(function(){n.contentEditableMenuPasted=!1},200);n.$on("$destroy",function(){r.cancel(o)})}},n.hideAll=function(){for(var e in n.triggerCharMap)n.triggerCharMap.hasOwnProperty(e)&&n.triggerCharMap[e].hideMenu()},n.getActiveMenuScope=function(){for(var e in n.triggerCharMap)if(n.triggerCharMap.hasOwnProperty(e)&&n.triggerCharMap[e].visible)return n.triggerCharMap[e];return null},n.selectActive=function(){for(var e in n.triggerCharMap)n.triggerCharMap.hasOwnProperty(e)&&n.triggerCharMap[e].visible&&n.triggerCharMap[e].selectActive()},n.isActive=function(){for(var e in n.triggerCharMap)if(n.triggerCharMap.hasOwnProperty(e)&&n.triggerCharMap[e].visible)return!0;return!1},n.isContentEditable=function(){return"INPUT"!==n.targetElement.nodeName&&"TEXTAREA"!==n.targetElement.nodeName},n.replaceMacro=function(t,i){i?e.replaceMacroText(n.context(),n.targetElement,n.targetElementPath,n.targetElementSelectedOffset,n.macros,n.macros[t]):(n.replacingMacro=!0,n.timer=r(function(){e.replaceMacroText(n.context(),n.targetElement,n.targetElementPath,n.targetElementSelectedOffset,n.macros,n.macros[t]),angular.element(n.targetElement).triggerHandler("change"),n.replacingMacro=!1},300),n.$on("$destroy",function(){r.cancel(n.timer)}))},n.addMenu=function(e){e.parentScope&&n.triggerCharMap.hasOwnProperty(e.triggerChar)||(n.triggerCharMap[e.triggerChar]=e,void 0===n.triggerCharSet&&(n.triggerCharSet=[]),n.triggerCharSet.push(e.triggerChar),e.setParent(n))},n.$on("menuCreated",function(e,t){(void 0!==i.id||void 0!==i.mentioId)&&(i.id===t.targetElement||void 0!==i.mentioId&&n.altId===t.targetElement)&&n.addMenu(t.scope)}),t.on("click",function(){n.isActive()&&n.$apply(function(){n.hideAll()})}),t.on("keydown keypress paste",function(e){var t=n.getActiveMenuScope();t&&((9===e.which||13===e.which)&&(e.preventDefault(),t.selectActive()),27===e.which&&(e.preventDefault(),t.$apply(function(){t.hideMenu()})),40===e.which&&(e.preventDefault(),t.$apply(function(){t.activateNextItem()}),t.adjustScroll(1)),38===e.which&&(e.preventDefault(),t.$apply(function(){t.activatePreviousItem()}),t.adjustScroll(-1)),(37===e.which||39===e.which)&&e.preventDefault())})}],link:function(t,o,a){function c(e){function n(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()}var r=t.getActiveMenuScope();if(r){if(9===e.which||13===e.which)return n(e),r.selectActive(),!1;if(27===e.which)return n(e),r.$apply(function(){r.hideMenu()}),!1;if(40===e.which)return n(e),r.$apply(function(){r.activateNextItem()}),r.adjustScroll(1),!1;if(38===e.which)return n(e),r.$apply(function(){r.activatePreviousItem()}),r.adjustScroll(-1),!1;if(37===e.which||39===e.which)return n(e),!1}}if(t.triggerCharMap={},t.targetElement=o,a.$set("autocomplete","off"),a.mentioItems){t.localItems=[],t.parentScope=t;var l=a.mentioSearch?' mentio-items="items"':' mentio-items="localItems"';t.defaultTriggerChar=a.mentioTriggerChar?t.$eval(a.mentioTriggerChar):"@";var s='<mentio-menu mentio-search="bridgeSearch(term)" mentio-select="bridgeSelect(item)"'+l;a.mentioTemplateUrl&&(s=s+' mentio-template-url="'+a.mentioTemplateUrl+'"'),s=s+" mentio-trigger-char=\"'"+t.defaultTriggerChar+'\'" mentio-parent-scope="parentScope"/>';var m=n(s),u=m(t);o.parent().append(u),t.$on("$destroy",function(){u.remove()})}a.mentioTypedTerm&&(t.syncTriggerText=!0),t.$watch("iframeElement",function(e){if(e){var n=e.contentWindow.document;n.addEventListener("click",function(){t.isActive()&&t.$apply(function(){t.hideAll()})}),n.addEventListener("keydown",c,!0),t.$on("$destroy",function(){n.removeEventListener("keydown",c)})}}),t.$watch("ngModel",function(n){if(n&&""!==n||t.isActive()){if(void 0===t.triggerCharSet)return void r.error("Error, no mentio-items attribute was provided, and no separate mentio-menus were specified. Nothing to do.");if(t.contentEditableMenuPasted)return void(t.contentEditableMenuPasted=!1);t.replacingMacro&&(i.cancel(t.timer),t.replacingMacro=!1);var o=t.isActive(),a=t.isContentEditable(),c=e.getTriggerInfo(t.context(),t.triggerCharSet,t.requireLeadingSpace,o);if(void 0!==c&&(!o||o&&(a&&c.mentionTriggerChar===t.currentMentionTriggerChar||!a&&c.mentionPosition===t.currentMentionPosition)))c.mentionSelectedElement&&(t.targetElement=c.mentionSelectedElement,t.targetElementPath=c.mentionSelectedPath,t.targetElementSelectedOffset=c.mentionSelectedOffset),t.setTriggerText(c.mentionText),t.currentMentionPosition=c.mentionPosition,t.currentMentionTriggerChar=c.mentionTriggerChar,t.query(c.mentionTriggerChar,c.mentionText);else{var l=t.typedTerm;t.setTriggerText(""),t.hideAll();var s=e.getMacroMatch(t.context(),t.macros);if(void 0!==s)t.targetElement=s.macroSelectedElement,t.targetElementPath=s.macroSelectedPath,t.targetElementSelectedOffset=s.macroSelectedOffset,t.replaceMacro(s.macroText,s.macroHasTrailingSpace);else if(t.selectNotFound&&l&&""!==l){var m=t.triggerCharMap[t.currentMentionTriggerChar];if(m){var u=m.select({item:{label:l}});"function"==typeof u.then?u.then(t.replaceText):t.replaceText(u,!0)}}}}})}}}]).directive("mentioMenu",["mentioUtil","$rootScope","$log","$window","$document",function(e,t,n,r,i){return{restrict:"E",scope:{search:"&mentioSearch",select:"&mentioSelect",items:"=mentioItems",triggerChar:"=mentioTriggerChar",forElem:"=mentioFor",parentScope:"=mentioParentScope"},templateUrl:function(e,t){return void 0!==t.mentioTemplateUrl?t.mentioTemplateUrl:"mentio-menu.tpl.html"},controller:["$scope",function(e){e.visible=!1,this.activate=e.activate=function(t){e.activeItem=t},this.isActive=e.isActive=function(t){return e.activeItem===t},this.selectItem=e.selectItem=function(t){var n=e.select({item:t});"function"==typeof n.then?n.then(e.parentMentio.replaceText):e.parentMentio.replaceText(n)},e.activateNextItem=function(){var t=e.items.indexOf(e.activeItem);this.activate(e.items[(t+1)%e.items.length])},e.activatePreviousItem=function(){var t=e.items.indexOf(e.activeItem);this.activate(e.items[0===t?e.items.length-1:t-1])},e.isFirstItemActive=function(){var t=e.items.indexOf(e.activeItem);return 0===t},e.isLastItemActive=function(){var t=e.items.indexOf(e.activeItem);return t===e.items.length-1},e.selectActive=function(){e.selectItem(e.activeItem)},e.isVisible=function(){return e.visible},e.showMenu=function(){e.visible||(e.requestVisiblePendingSearch=!0)},e.setParent=function(t){e.parentMentio=t,e.targetElement=t.targetElement}}],link:function(o,a){if(a[0].parentNode.removeChild(a[0]),i[0].body.appendChild(a[0]),o.menuElement=a,o.parentScope)o.parentScope.addMenu(o);else{if(!o.forElem)return void n.error("mentio-menu requires a target element in tbe mentio-for attribute");if(!o.triggerChar)return void n.error("mentio-menu requires a trigger char");t.$broadcast("menuCreated",{targetElement:o.forElem,scope:o})}angular.element(r).bind("resize",function(){if(o.isVisible()){var t=[];t.push(o.triggerChar),e.popUnderMention(o.parentMentio.context(),t,a,o.requireLeadingSpace)}}),o.$watch("items",function(e){e&&e.length>0?(o.activate(e[0]),!o.visible&&o.requestVisiblePendingSearch&&(o.visible=!0,o.requestVisiblePendingSearch=!1)):o.hideMenu()}),o.$watch("isVisible()",function(t){if(t){var n=[];n.push(o.triggerChar),e.popUnderMention(o.parentMentio.context(),n,a,o.requireLeadingSpace)}}),o.parentMentio.$on("$destroy",function(){a.remove()}),o.hideMenu=function(){o.visible=!1,a.css("display","none")},o.adjustScroll=function(e){var t=a[0],n=t.querySelector("ul"),r=t.querySelector("[mentio-menu-item].active")||t.querySelector("[data-mentio-menu-item].active");return o.isFirstItemActive()?n.scrollTop=0:o.isLastItemActive()?n.scrollTop=n.scrollHeight:void(1===e?n.scrollTop+=r.offsetHeight:n.scrollTop-=r.offsetHeight)}}}}]).directive("mentioMenuItem",function(){return{restrict:"A",scope:{item:"=mentioMenuItem"},require:"^mentioMenu",link:function(e,t,n,r){e.$watch(function(){return r.isActive(e.item)},function(e){e?t.addClass("active"):t.removeClass("active")}),t.bind("mouseenter",function(){e.$apply(function(){r.activate(e.item)})}),t.bind("click",function(){return r.selectItem(e.item),!1})}}}).filter("unsafe",["$sce",function(e){return function(t){return e.trustAsHtml(t)}}]).filter("mentioHighlight",function(){function e(e){return e.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(t,n,r){if(n){var i=r?'<span class="'+r+'">$&</span>':"<strong>$&</strong>";return(""+t).replace(new RegExp(e(n),"gi"),i)}return t}}),angular.module("mentio").factory("mentioUtil",["$window","$location","$anchorScroll","$timeout",function(e,t,n,r){function i(e,t,n,i){var c,l=h(e,t,i,!1);void 0!==l?(c=a(e)?b(e,v(e).activeElement,l.mentionPosition):S(e,l.mentionPosition),n.css({top:c.top+"px",left:c.left+"px",position:"absolute",zIndex:1e4,display:"block"}),r(function(){o(e,n)},0)):n.css({display:"none"})}function o(t,n){for(var r,i=20,o=100,a=n[0];void 0===r||0===r.height;)if(r=a.getBoundingClientRect(),0===r.height&&(a=a.childNodes[0],void 0===a||!a.getBoundingClientRect))return;var c=r.top,l=c+r.height;if(0>c)e.scrollTo(0,e.pageYOffset+r.top-i);else if(l>e.innerHeight){var s=e.pageYOffset+r.top-i;s-e.pageYOffset>o&&(s=e.pageYOffset+o);var m=e.pageYOffset-(e.innerHeight-l);m>s&&(m=s),e.scrollTo(0,m)}}function a(e){var t=v(e).activeElement;if(null!==t){var n=t.nodeName,r=t.getAttribute("type");return"INPUT"===n&&"text"===r||"TEXTAREA"===n}return!1}function c(e,t,n,r){var i,o=t;if(n)for(var a=0;a<n.length;a++){if(o=o.childNodes[n[a]],void 0===o)return;for(;o.length<r;)r-=o.length,o=o.nextSibling;0!==o.childNodes.length||o.length||(o=o.previousSibling)}var c=p(e);i=v(e).createRange(),i.setStart(o,r),i.setEnd(o,r),i.collapse(!0);try{c.removeAllRanges()}catch(l){}c.addRange(i),t.focus()}function l(e,t,n,r){var i,o;o=p(e),i=v(e).createRange(),i.setStart(o.anchorNode,n),i.setEnd(o.anchorNode,r),i.deleteContents();var a=v(e).createElement("div");a.innerHTML=t;for(var c,l,s=v(e).createDocumentFragment();c=a.firstChild;)l=s.appendChild(c);i.insertNode(s),l&&(i=i.cloneRange(),i.setStartAfter(l),i.collapse(!0),o.removeAllRanges(),o.addRange(i))}function s(e,t,n,r){var i=t.nodeName;"INPUT"===i||"TEXTAREA"===i?t!==v(e).activeElement&&t.focus():c(e,t,n,r)}function m(e,t,n,r,i,o){s(e,t,n,r);var c=d(e,i);if(c.macroHasTrailingSpace&&(c.macroText=c.macroText+"Β ",o+="Β "),void 0!==c){var m=v(e).activeElement;if(a(e)){var u=c.macroPosition,g=c.macroPosition+c.macroText.length;m.value=m.value.substring(0,u)+o+m.value.substring(g,m.value.length),m.selectionStart=u+o.length,m.selectionEnd=u+o.length}else l(e,o,c.macroPosition,c.macroPosition+c.macroText.length)}}function u(e,t,n,r,i,o,c,m){s(e,t,n,r);var u=h(e,i,c,!0,m);if(void 0!==u)if(a()){var g=v(e).activeElement;o+=" ";var d=u.mentionPosition,f=u.mentionPosition+u.mentionText.length+1;g.value=g.value.substring(0,d)+o+g.value.substring(f,g.value.length),g.selectionStart=d+o.length,g.selectionEnd=d+o.length}else o+="Β ",l(e,o,u.mentionPosition,u.mentionPosition+u.mentionText.length+1)}function g(e,t){if(null===t.parentNode)return 0;for(var n=0;n<t.parentNode.childNodes.length;n++){var r=t.parentNode.childNodes[n];if(r===t)return n}}function d(e,t){var n,r,i=[];if(a(e))n=v(e).activeElement;else{var o=f(e);o&&(n=o.selected,i=o.path,r=o.offset)}var c=T(e);if(void 0!==c&&null!==c){var l,s=!1;if(c.length>0&&("Β "===c.charAt(c.length-1)||" "===c.charAt(c.length-1))&&(s=!0,c=c.substring(0,c.length-1)),angular.forEach(t,function(e,t){var o=c.toUpperCase().lastIndexOf(t.toUpperCase());if(o>=0&&t.length+o===c.length){var a=o-1;(0===o||"Β "===c.charAt(a)||" "===c.charAt(a))&&(l={macroPosition:o,macroText:t,macroSelectedElement:n,macroSelectedPath:i,macroSelectedOffset:r,macroHasTrailingSpace:s})}}),l)return l}}function f(e){var t,n=p(e),r=n.anchorNode,i=[];if(null!=r){for(var o,a=r.contentEditable;null!==r&&"true"!==a;)o=g(e,r),i.push(o),r=r.parentNode,null!==r&&(a=r.contentEditable);return i.reverse(),t=n.getRangeAt(0).startOffset,{selected:r,path:i,offset:t}}}function h(e,t,n,r,i){var o,c,l;if(a(e))o=v(e).activeElement;else{var s=f(e);s&&(o=s.selected,c=s.path,l=s.offset)}var m=T(e);if(void 0!==m&&null!==m){var u,g=-1;if(t.forEach(function(e){var t=m.lastIndexOf(e);t>g&&(g=t,u=e)}),g>=0&&(0===g||!n||/[\xA0\s]/g.test(m.substring(g-1,g)))){var d=m.substring(g+1,m.length);u=m.substring(g,g+1);var h=d.substring(0,1),p=d.length>0&&(" "===h||"Β "===h);if(i&&(d=d.trim()),!p&&(r||!/[\xA0\s]/g.test(d)))return{mentionPosition:g,mentionText:d,mentionSelectedElement:o,mentionSelectedPath:c,mentionSelectedOffset:l,mentionTriggerChar:u}}}}function p(e){return e?e.iframe.contentWindow.getSelection():window.getSelection()}function v(e){return e?e.iframe.contentWindow.document:document}function T(e){var t;if(a(e)){var n=v(e).activeElement,r=n.selectionStart;t=n.value.substring(0,r)}else{var i=p(e).anchorNode;if(null!=i){var o=i.textContent,c=p(e).getRangeAt(0).startOffset;c>=0&&(t=o.substring(0,c))}}return t}function S(e,t){var n,r,i="ο»Ώ",o="sel_"+(new Date).getTime()+"_"+Math.random().toString().substr(2),a=p(e),c=a.getRangeAt(0);r=v(e).createRange(),r.setStart(a.anchorNode,t),r.setEnd(a.anchorNode,t),r.collapse(!1),n=v(e).createElement("span"),n.id=o,n.appendChild(v(e).createTextNode(i)),r.insertNode(n),a.removeAllRanges(),a.addRange(c);var l={left:0,top:n.offsetHeight};return E(e,n,l),n.parentNode.removeChild(n),l}function E(e,t,n){for(var r=t,i=e?e.iframe:null;r;)n.left+=r.offsetLeft+r.clientLeft,n.top+=r.offsetTop+r.clientTop,r=r.offsetParent,!r&&i&&(r=i,i=null);for(r=t,i=e?e.iframe:null;r!==v().body;)r.scrollTop&&r.scrollTop>0&&(n.top-=r.scrollTop),r.scrollLeft&&r.scrollLeft>0&&(n.left-=r.scrollLeft),r=r.parentNode,!r&&i&&(r=i,i=null)}function b(e,t,n){var r=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing"],i=null!==window.mozInnerScreenX,o=v(e).createElement("div");o.id="input-textarea-caret-position-mirror-div",v(e).body.appendChild(o);var a=o.style,c=window.getComputedStyle?getComputedStyle(t):t.currentStyle;a.whiteSpace="pre-wrap","INPUT"!==t.nodeName&&(a.wordWrap="break-word"),a.position="absolute",a.visibility="hidden",r.forEach(function(e){a[e]=c[e]}),i?(a.width=parseInt(c.width)-2+"px",t.scrollHeight>parseInt(c.height)&&(a.overflowY="scroll")):a.overflow="hidden",o.textContent=t.value.substring(0,n),"INPUT"===t.nodeName&&(o.textContent=o.textContent.replace(/\s/g,"Β "));var l=v(e).createElement("span");l.textContent=t.value.substring(n)||".",o.appendChild(l);var s={top:l.offsetTop+parseInt(c.borderTopWidth)+parseInt(c.fontSize),left:l.offsetLeft+parseInt(c.borderLeftWidth)};return E(e,t,s),v(e).body.removeChild(o),s}return{popUnderMention:i,replaceMacroText:m,replaceTriggerText:u,getMacroMatch:d,getTriggerInfo:h,selectElement:c,getTextAreaOrInputUnderlinePosition:b,getTextPrecedingCurrentSelection:T,getContentEditableSelectedPath:f,getNodePositionInParent:g,getContentEditableCaretPosition:S,pasteHtml:l,resetSelection:s,scrollIntoView:o}}]),angular.module("mentio").run(["$templateCache",function(e){e.put("mentio-menu.tpl.html",'<style>\n.scrollable-menu {\n height: auto;\n max-height: 300px;\n overflow: auto;\n}\n\n.menu-highlighted {\n font-weight: bold;\n}\n</style>\n<ul class="dropdown-menu scrollable-menu" style="display:block">\n <li mentio-menu-item="item" ng-repeat="item in items track by $index">\n <a class="text-primary" ng-bind-html="item.label | mentioHighlight:typedTerm:\'menu-highlighted\' | unsafe"></a>\n </li>\n</ul>')}]);
2325 2325 ;moment.defaultFormat = 'YYYY-MM-DDTHH:mm';
2326 2326
2327 2327 ;// MIT License:
2328 2328 //
2329 2329 // Copyright (c) 2010-2012, Joe Walnes
2330 2330 //
2331 2331 // Permission is hereby granted, free of charge, to any person obtaining a copy
2332 2332 // of this software and associated documentation files (the "Software"), to deal
2333 2333 // in the Software without restriction, including without limitation the rights
2334 2334 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2335 2335 // copies of the Software, and to permit persons to whom the Software is
2336 2336 // furnished to do so, subject to the following conditions:
2337 2337 //
2338 2338 // The above copyright notice and this permission notice shall be included in
2339 2339 // all copies or substantial portions of the Software.
2340 2340 //
2341 2341 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2342 2342 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2343 2343 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2344 2344 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2345 2345 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2346 2346 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2347 2347 // THE SOFTWARE.
2348 2348
2349 2349 /**
2350 2350 * This behaves like a WebSocket in every way, except if it fails to connect,
2351 2351 * or it gets disconnected, it will repeatedly poll until it succesfully connects
2352 2352 * again.
2353 2353 *
2354 2354 * It is API compatible, so when you have:
2355 2355 * ws = new WebSocket('ws://....');
2356 2356 * you can replace with:
2357 2357 * ws = new ReconnectingWebSocket('ws://....');
2358 2358 *
2359 2359 * The event stream will typically look like:
2360 2360 * onconnecting
2361 2361 * onopen
2362 2362 * onmessage
2363 2363 * onmessage
2364 2364 * onclose // lost connection
2365 2365 * onconnecting
2366 2366 * onopen // sometime later...
2367 2367 * onmessage
2368 2368 * onmessage
2369 2369 * etc...
2370 2370 *
2371 2371 * It is API compatible with the standard WebSocket API.
2372 2372 *
2373 2373 * Latest version: https://github.com/joewalnes/reconnecting-websocket/
2374 2374 * - Joe Walnes
2375 2375 */
2376 2376 function ReconnectingWebSocket(url, protocols) {
2377 2377 protocols = protocols || [];
2378 2378
2379 2379 // These can be altered by calling code.
2380 2380 this.debug = false;
2381 2381 this.reconnectInterval = 1000;
2382 2382 this.timeoutInterval = 2000;
2383 2383
2384 2384 var self = this;
2385 2385 var ws;
2386 2386 var forcedClose = false;
2387 2387 var timedOut = false;
2388 2388
2389 2389 this.url = url;
2390 2390 this.protocols = protocols;
2391 2391 this.readyState = WebSocket.CONNECTING;
2392 2392 this.URL = url; // Public API
2393 2393
2394 2394 this.onopen = function(event) {
2395 2395 };
2396 2396
2397 2397 this.onclose = function(event) {
2398 2398 };
2399 2399
2400 2400 this.onconnecting = function(event) {
2401 2401 };
2402 2402
2403 2403 this.onmessage = function(event) {
2404 2404 };
2405 2405
2406 2406 this.onerror = function(event) {
2407 2407 };
2408 2408
2409 2409 function connect(reconnectAttempt) {
2410 2410 ws = new WebSocket(url, protocols);
2411 2411
2412 2412 self.onconnecting();
2413 2413 if (self.debug || ReconnectingWebSocket.debugAll) {
2414 2414 console.debug('ReconnectingWebSocket', 'attempt-connect', url);
2415 2415 }
2416 2416
2417 2417 var localWs = ws;
2418 2418 var timeout = setTimeout(function() {
2419 2419 if (self.debug || ReconnectingWebSocket.debugAll) {
2420 2420 console.debug('ReconnectingWebSocket', 'connection-timeout', url);
2421 2421 }
2422 2422 timedOut = true;
2423 2423 localWs.close();
2424 2424 timedOut = false;
2425 2425 }, self.timeoutInterval);
2426 2426
2427 2427 ws.onopen = function(event) {
2428 2428 clearTimeout(timeout);
2429 2429 if (self.debug || ReconnectingWebSocket.debugAll) {
2430 2430 console.debug('ReconnectingWebSocket', 'onopen', url);
2431 2431 }
2432 2432 self.readyState = WebSocket.OPEN;
2433 2433 reconnectAttempt = false;
2434 2434 self.onopen(event);
2435 2435 };
2436 2436
2437 2437 ws.onclose = function(event) {
2438 2438 clearTimeout(timeout);
2439 2439 ws = null;
2440 2440 if (forcedClose) {
2441 2441 self.readyState = WebSocket.CLOSED;
2442 2442 self.onclose(event);
2443 2443 } else {
2444 2444 self.readyState = WebSocket.CONNECTING;
2445 2445 self.onconnecting();
2446 2446 if (!reconnectAttempt && !timedOut) {
2447 2447 if (self.debug || ReconnectingWebSocket.debugAll) {
2448 2448 console.debug('ReconnectingWebSocket', 'onclose', url);
2449 2449 }
2450 2450 self.onclose(event);
2451 2451 }
2452 2452 setTimeout(function() {
2453 2453 connect(true);
2454 2454 }, self.reconnectInterval);
2455 2455 }
2456 2456 };
2457 2457 ws.onmessage = function(event) {
2458 2458 if (self.debug || ReconnectingWebSocket.debugAll) {
2459 2459 console.debug('ReconnectingWebSocket', 'onmessage', url, event.data);
2460 2460 }
2461 2461 self.onmessage(event);
2462 2462 };
2463 2463 ws.onerror = function(event) {
2464 2464 if (self.debug || ReconnectingWebSocket.debugAll) {
2465 2465 console.debug('ReconnectingWebSocket', 'onerror', url, event);
2466 2466 }
2467 2467 self.onerror(event);
2468 2468 };
2469 2469 }
2470 2470 connect(url);
2471 2471
2472 2472 this.send = function(data) {
2473 2473 if (ws) {
2474 2474 if (self.debug || ReconnectingWebSocket.debugAll) {
2475 2475 console.debug('ReconnectingWebSocket', 'send', url, data);
2476 2476 }
2477 2477 return ws.send(data);
2478 2478 } else {
2479 2479 throw 'INVALID_STATE_ERR : Pausing to reconnect websocket';
2480 2480 }
2481 2481 };
2482 2482
2483 2483 this.close = function() {
2484 2484 if (ws) {
2485 2485 forcedClose = true;
2486 2486 ws.close();
2487 2487 }
2488 2488 };
2489 2489
2490 2490 /**
2491 2491 * Additional public API method to refresh the connection if still open (close, re-open).
2492 2492 * For example, if the app suspects bad data / missed heart beats, it can try to refresh.
2493 2493 */
2494 2494 this.refresh = function() {
2495 2495 if (ws) {
2496 2496 ws.close();
2497 2497 }
2498 2498 };
2499 2499 }
2500 2500
2501 2501 /**
2502 2502 * Setting this to true is the equivalent of setting all instances of ReconnectingWebSocket.debug to true.
2503 2503 */
2504 2504 ReconnectingWebSocket.debugAll = false;
2505 2505
2506 2506
2507 2507 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
2508 2508 // #
2509 2509 // # This program is free software: you can redistribute it and/or modify
2510 2510 // # it under the terms of the GNU Affero General Public License, version 3
2511 2511 // # (only), as published by the Free Software Foundation.
2512 2512 // #
2513 2513 // # This program is distributed in the hope that it will be useful,
2514 2514 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
2515 2515 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2516 2516 // # GNU General Public License for more details.
2517 2517 // #
2518 2518 // # You should have received a copy of the GNU Affero General Public License
2519 2519 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
2520 2520 // #
2521 2521 // # This program is dual-licensed. If you wish to learn more about the
2522 2522 // # AppEnlight Enterprise Edition, including its added features, Support
2523 2523 // # services, and proprietary license terms, please see
2524 2524 // # https://rhodecode.com/licenses/
2525 2525
2526 2526 if (!String.prototype.trim) {
2527 2527 String.prototype.trim = function () {
2528 2528 return this.replace(/^\s+|\s+$/g, '');
2529 2529 };
2530 2530
2531 2531 String.prototype.ltrim = function () {
2532 2532 return this.replace(/^\s+/, '');
2533 2533 };
2534 2534
2535 2535 String.prototype.rtrim = function () {
2536 2536 return this.replace(/\s+$/, '');
2537 2537 };
2538 2538
2539 2539 String.prototype.fulltrim = function () {
2540 2540 return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, '').replace(/\s+/g, ' ');
2541 2541 };
2542 2542 }
2543 2543
2544 2544 function decodeEncodedJSON (input){
2545 2545 try{
2546 2546 var val = JSON.parse(input);
2547 2547 delete doc;
2548 2548 return val;
2549 2549 }catch(exc){
2550 2550
2551 2551 delete doc;
2552 2552 }
2553 2553 }
2554 2554
2555 2555 function parseTagsToSearch(searchParams) {
2556 2556 var params = {};
2557 2557 _.each(searchParams.tags, function (t) {
2558 2558 if (!_.has(params, t.type)) {
2559 2559 params[t.type] = [];
2560 2560 }
2561 2561 params[t.type].push(t.value);
2562 2562 });
2563 2563 if (searchParams.page > 1){
2564 2564 params.page = searchParams.page;
2565 2565 }
2566 2566 return params;
2567 2567 }
2568 2568
2569 2569 function parseSearchToTags(search) {
2570 2570 var config = {page: 1, tags: [], type:''};
2571 2571 _.each(_.pairs(search), function (obj) {
2572 2572 if (_.isArray(obj[1])) {
2573 2573 _.each(obj[1], function (obj2) {
2574 2574 config.tags.push({type: obj[0], value: obj2});
2575 2575 })
2576 2576 } else {
2577 2577 if (obj[0] == 'page') {
2578 2578 config.page = obj[1];
2579 2579 }
2580 2580 else if (obj[0] == 'type') {
2581 2581 config.type = obj[1];
2582 2582 }
2583 2583 else {
2584 2584 config.tags.push({type: obj[0], value: obj[1]});
2585 2585 }
2586 2586
2587 2587 }
2588 2588 });
2589 2589 return config;
2590 2590 }
2591 2591
2592 2592
2593 2593 /* returns ISO date string from UTC now - timespan */
2594 2594 function timeSpanToStartDate(timeSpan){
2595 2595 var amount = Number(timeSpan.slice(0,-1));
2596 2596 var unit = timeSpan.slice(-1);
2597 2597 return moment.utc().subtract(amount, unit).format();
2598 2598 }
2599 2599
2600 2600 /* Sets server validation messages on form using angular machinery +
2601 2601 * custom key holding actual error messages */
2602 2602 function setServerValidation(form, errors){
2603 2603
2604 2604 if (typeof form.ae_validation === 'undefined'){
2605 2605 form.ae_validation = {};
2606 2606
2607 2607 }
2608 2608 for (var key in form.ae_validation){
2609 2609 form.ae_validation[key] = [];
2610 2610
2611 2611 }
2612 2612
2613 2613
2614 2614 for (var key in form){
2615 2615 if (key[0] !== '$' && key !== 'ae_validation'){
2616 2616 form[key].$setValidity('ae_validation', true);
2617 2617 }
2618 2618 }
2619 2619 if (typeof errors !== undefined){
2620 2620 for (var key in errors){
2621 2621 if (typeof form[key] !== 'undefined'){
2622 2622 form[key].$setValidity('ae_validation', false);
2623 2623 }
2624 2624 // handle wtforms and colander errors based on
2625 2625 // whether we have list of erors or a single error in a key
2626 2626 if (angular.isArray(errors[key])){
2627 2627 form.ae_validation[key] = errors[key];
2628 2628 }
2629 2629 else{
2630 2630 form.ae_validation[key] = [errors[key]];
2631 2631 }
2632 2632 }
2633 2633 }
2634 2634 return form;
2635 2635 }
2636 2636
2637 2637 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
2638 2638 // #
2639 2639 // # This program is free software: you can redistribute it and/or modify
2640 2640 // # it under the terms of the GNU Affero General Public License, version 3
2641 2641 // # (only), as published by the Free Software Foundation.
2642 2642 // #
2643 2643 // # This program is distributed in the hope that it will be useful,
2644 2644 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
2645 2645 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2646 2646 // # GNU General Public License for more details.
2647 2647 // #
2648 2648 // # You should have received a copy of the GNU Affero General Public License
2649 2649 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
2650 2650 // #
2651 2651 // # This program is dual-licensed. If you wish to learn more about the
2652 2652 // # AppEnlight Enterprise Edition, including its added features, Support
2653 2653 // # services, and proprietary license terms, please see
2654 2654 // # https://rhodecode.com/licenses/
2655 2655
2656 2656 'use strict';
2657 2657
2658 2658 // Declare app level module which depends on filters, and services
2659 2659 angular.module('appenlight.base', [
2660 2660 'ngRoute',
2661 2661 'ui.router',
2662 2662 'ui.router.router',
2663 2663 'underscore',
2664 2664 'ui.bootstrap',
2665 2665 'ngResource',
2666 2666 'ngAnimate',
2667 2667 'ngCookies',
2668 2668 'smart-table',
2669 2669 'angular-toArrayFilter',
2670 2670 'mentio'
2671 2671 ]);
2672 2672
2673 2673 angular.module('appenlight.filters', []);
2674 2674 angular.module('appenlight.templates', []);
2675 2675 angular.module('appenlight.controllers', [
2676 2676 'appenlight.base'
2677 2677 ]);
2678 2678 angular.module('appenlight.components', [
2679 2679 'appenlight.components.channelstream',
2680 2680 'appenlight.components.appenlightApp',
2681 'appenlight.components.appenlightHeader'
2681 'appenlight.components.appenlightHeader',
2682 'appenlight.components.indexDashboardView'
2682 2683 ]);
2683 2684 angular.module('appenlight.directives', [
2684 2685 'appenlight.directives.c3chart',
2685 2686 'appenlight.directives.confirmValidate',
2686 2687 'appenlight.directives.focus',
2687 2688 'appenlight.directives.formErrors',
2688 2689 'appenlight.directives.humanFormat',
2689 2690 'appenlight.directives.isoToRelativeTime',
2690 2691 'appenlight.directives.permissionsForm',
2691 2692 'appenlight.directives.smallReportGroupList',
2692 2693 'appenlight.directives.smallReportList',
2693 2694 'appenlight.directives.pluginConfig',
2694 2695 'appenlight.directives.recursive',
2695 2696 'appenlight.directives.reportAlertAction',
2696 2697 'appenlight.directives.postProcessAction',
2697 2698 'appenlight.directives.rule',
2698 2699 'appenlight.directives.ruleReadOnly'
2699 2700 ]);
2700 2701 angular.module('appenlight.services', [
2701 2702 'appenlight.services.chartResultParser',
2702 2703 'appenlight.services.resources',
2703 2704 'appenlight.services.stateHolder',
2704 2705 'appenlight.services.typeAheadTagHelper',
2705 2706 'appenlight.services.UUIDProvider'
2706 2707 ]).value('version', '0.1');
2707 2708
2708 2709
2709 2710 var pluginsToLoad = _.map(decodeEncodedJSON(window.AE.plugins),
2710 2711 function(item){
2711 2712 return item.config.angular_module
2712 2713 });
2713 2714
2714 2715 angular.module('appenlight.plugins', pluginsToLoad);
2715 2716
2716 2717 var app = angular.module('appenlight', [
2717 2718 'appenlight.base',
2718 2719 'appenlight.config',
2719 2720 'appenlight.templates',
2720 2721 'appenlight.filters',
2721 2722 'appenlight.services',
2722 2723 'appenlight.directives',
2723 2724 'appenlight.controllers',
2724 2725 'appenlight.components',
2725 2726 'appenlight.plugins'
2726 2727 ]);
2727 2728
2728 2729 // needs manual execution because of plugin files
2729 2730 function kickstartAE(initialUserData) {
2730 2731 app.config(['$httpProvider', '$uibTooltipProvider', '$locationProvider', function ($httpProvider, $uibTooltipProvider, $locationProvider) {
2731 2732 $locationProvider.html5Mode(true);
2732 2733 $httpProvider.interceptors.push(['$q', '$rootScope', '$timeout', 'stateHolder', function ($q, $rootScope, $timeout, stateHolder) {
2733 2734 return {
2734 2735 'response': function (response) {
2735 2736 var flashMessages = angular.fromJson(response.headers('x-flash-messages'));
2736 2737 if (flashMessages && flashMessages.length > 0) {
2737 2738 stateHolder.flashMessages.extend(flashMessages);
2738 2739 }
2739 2740 return response;
2740 2741 },
2741 2742 'responseError': function (rejection) {
2742 2743 if (rejection.status > 299 && rejection.status !== 422) {
2743 2744 stateHolder.flashMessages.extend([{
2744 2745 msg: 'Response status code: ' + rejection.status + ', "' + rejection.statusText + '", url: ' + rejection.config.url,
2745 2746 type: 'error'
2746 2747 }]);
2747 2748 }
2748 2749 if (rejection.status == 0) {
2749 2750 stateHolder.flashMessages.extend([{
2750 2751 msg: 'Response timeout',
2751 2752 type: 'error'
2752 2753 }]);
2753 2754 }
2754 2755 var flashMessages = angular.fromJson(rejection.headers('x-flash-messages'));
2755 2756 if (flashMessages && flashMessages.length > 0) {
2756 2757 stateHolder.flashMessages.extend(flashMessages);
2757 2758 }
2758 2759
2759 2760 return $q.reject(rejection);
2760 2761 }
2761 2762 }
2762 2763 }]);
2763 2764
2764 2765 $uibTooltipProvider.options({appendToBody: true});
2765 2766
2766 2767 }]);
2767 2768
2768 2769
2769 2770 app.config(function ($provide) {
2770 2771 $provide.decorator("$exceptionHandler", function ($delegate) {
2771 2772 return function (exception, cause) {
2772 2773 $delegate(exception, cause);
2773 2774 if (typeof AppEnlight !== 'undefined') {
2774 2775 AppEnlight.grabError(exception);
2775 2776 }
2776 2777 };
2777 2778 });
2778 2779 });
2779 2780
2780 2781 app.run(['$rootScope', '$timeout', 'stateHolder', '$state', '$location', '$transitions', '$window', 'AeConfig',
2781 2782 function ($rootScope, $timeout, stateHolder, $state, $location, $transitions, $window, AeConfig) {
2782 2783 if (initialUserData){
2783 2784 stateHolder.AeUser.update(initialUserData);
2784 2785 }
2785 2786 $rootScope.$state = $state;
2786 2787 $rootScope.stateHolder = stateHolder;
2787 2788 $rootScope.flash = stateHolder.flashMessages.list;
2788 2789 $rootScope.closeAlert = stateHolder.flashMessages.closeAlert;
2789 2790 $rootScope.AeConfig = AeConfig;
2790 2791
2791 2792 var transitionApp = function($transition$, $state) {
2792 2793 // redirect user to /register unless its one of open views
2793 2794 var isGuestState = [
2794 2795 'report.view_detail',
2795 2796 'report.view_group',
2796 2797 'dashboard.view'
2797 2798 ].indexOf($transition$.to().name) !== -1;
2798 2799
2799 2800 var path = $window.location.pathname;
2800 2801 // strip trailing slash
2801 2802 if (path.substr(path.length - 1) === '/') {
2802 2803 path = path.substr(0, path.length - 1);
2803 2804 }
2804 2805 var isOpenView = false;
2805 2806 var openViews = [
2806 2807 AeConfig.urls.otherRoutes.lostPassword,
2807 2808 AeConfig.urls.otherRoutes.lostPasswordGenerate
2808 2809 ];
2809 2810
2810 2811 _.each(openViews, function (url) {
2811 2812 var url = '/' + url.split('/').slice(3).join('/');
2812 2813 if (url === path) {
2813 2814 isOpenView = true;
2814 2815 }
2815 2816 });
2816 2817 if (stateHolder.AeUser.id === null && !isGuestState && !isOpenView) {
2817 2818 if (window.location.toString().indexOf(AeConfig.urls.otherRoutes.register) === -1) {
2818 2819
2819 2820 var newLocation = AeConfig.urls.otherRoutes.register + '?came_from=' + encodeURIComponent(window.location);
2820 2821 // fix infinite digest here
2821 2822 $rootScope.$on('$locationChangeStart',
2822 2823 function(event, toState, toParams, fromState, fromParams, options){
2823 2824 event.preventDefault();
2824 2825 $window.location = newLocation;
2825 2826 });
2826 2827 $window.location = newLocation;
2827 2828 return false;
2828 2829 }
2829 2830 return false;
2830 2831 }
2831 2832 return true;
2832 2833 };
2833 2834 $transitions.onBefore({}, transitionApp);
2834 2835
2835 2836 }]);
2836 2837 }
2837 2838
2838 2839 ;angular.module('appenlight.templates').run(['$templateCache', function($templateCache) {
2839 2840 'use strict';
2840 2841
2841 2842 $templateCache.put('components/appenlight-app/appenlight-app.html',
2842 2843 "<channelstream config=\"AeConfig\"></channelstream>\n" +
2843 2844 "<appenlight-header></appenlight-header>\n" +
2844 2845 "<div id=\"outer-content\">\n" +
2845 2846 " <div ui-view class=\"container\"></div>\n" +
2846 2847 "</div>\n"
2847 2848 );
2848 2849
2849 2850
2850 2851 $templateCache.put('components/appenlight-header/appenlight-header.html',
2851 2852 "<!-- Fixed navbar -->\n" +
2852 2853 "<div id=\"top-navbar\" class=\"navbar navbar-default navbar-fixed-top\" role=\"navigation\">\n" +
2853 2854 " <div class=\"pattern\">\n" +
2854 2855 " <div class=\"container\">\n" +
2855 2856 " <div class=\"navbar-header pull-left\">\n" +
2856 2857 " <a data-ui-sref=\"front_dashboard\" class=\"navbar-brand\">\n" +
2857 2858 " <div id=\"logo-normal\" class=\"hidden-sm hidden-xs\"></div>\n" +
2858 2859 " <div id=\"logo-icon\" class=\"visible-sm visible-xs\"></div>\n" +
2859 2860 " </a>\n" +
2860 2861 " </div>\n" +
2861 2862 "\n" +
2862 2863 " <div class=\"container-fluid\">\n" +
2863 2864 " <div>\n" +
2864 2865 " <ul class=\"nav navbar-nav navbar-right\" ng-if=\"$ctrl.stateHolder.AeUser.id !== null\">\n" +
2865 2866 " <li id=\"user-notifications\" class=\"dropdown ng-cloak\" data-uib-dropdown>\n" +
2866 2867 "\n" +
2867 2868 " <a class=\"dropdown-toggle\" data-uib-dropdown-toggle>\n" +
2868 2869 " <span class=\"badge\">{{$ctrl.assignedReports.length}}</span>\n" +
2869 2870 " <span class=\"fa fa-envelope-o\"></span>\n" +
2870 2871 " </a>\n" +
2871 2872 " <ul class=\"dropdown-menu\">\n" +
2872 2873 " <li role=\"presentation\" class=\"dropdown-header\">Assigned reports</li>\n" +
2873 2874 " <li data-ng-repeat=\"report in $ctrl.assignedReports\" role=\"presentation\">\n" +
2874 2875 " <a href=\"{{report.front_url}}\" role=\"menuitem\" tabindex=\"-1\">\n" +
2875 2876 " <small>{{ report.error || 'Slow Report: ' + report.view_name |truncate:65}}</small>\n" +
2876 2877 " </a>\n" +
2877 2878 "\n" +
2878 2879 " </li>\n" +
2879 2880 " <li data-ng-if=\"$ctrl.assignedReports.length == 0\"><a><small>No reports</small></a></li>\n" +
2880 2881 " </ul>\n" +
2881 2882 " </li>\n" +
2882 2883 " <li id=\"alert-notifications\" class=\"dropdown ng-cloak\" data-uib-dropdown auto-close=\"outsideClick\">\n" +
2883 2884 " <a class=\"dropdown-toggle\" data-uib-dropdown-toggle>\n" +
2884 2885 " <span class=\"badge {{ activeEvents ? 'danger' : '' }}\">{{$ctrl.activeEvents}}</span>\n" +
2885 2886 " <span class=\"fa fa-bell-o\"></span></a>\n" +
2886 2887 " <ul class=\"dropdown-menu\">\n" +
2887 2888 " <li role=\"presentation\" class=\"dropdown-header\">\n" +
2888 2889 " <a data-ui-sref=\"events\" class=\"btn btn-xs btn-default\">Show me more</a></li>\n" +
2889 2890 " <li role=\"presentation\" class=\"dropdown-header\">Latest events</li>\n" +
2890 2891 " <li data-ng-repeat=\"event in $ctrl.latestEvents\" role=\"presentation\">\n" +
2891 2892 " <a data-ng-click=\"$ctrl.clickedEvent(event)\"><small class=\"resource-name\">For {{ event.resource_name }}</small><br/>\n" +
2892 2893 " <small>{{ event.text |truncate:65}}</small><br/>\n" +
2893 2894 " <small class=\"date\" data-uib-tooltip=\"{{event.start_date}}\">created: <iso-to-relative-time time=\"{{event.start_date}}\"/></small>\n" +
2894 2895 " <small class=\"date\" data-ng-show=\"event.end_date\" data-uib-tooltip=\"{{event.end_date}}\">closed: <iso-to-relative-time time=\"{{event.end_date}}\"/></small>\n" +
2895 2896 " </a>\n" +
2896 2897 " </li>\n" +
2897 2898 " <li data-ng-if=\"$ctrl.latestEvents.length == 0\"><a><small>No events</small></a></li>\n" +
2898 2899 " </ul>\n" +
2899 2900 " </li>\n" +
2900 2901 "\n" +
2901 2902 " <li id=\"dashboards\" class=\"dropdown\" data-uib-dropdown>\n" +
2902 2903 " <a class=\"dropdown-toggle\" data-uib-dropdown-toggle tooltip-placement=\"bottom\" data-uib-tooltip=\"Dashboards\">\n" +
2903 2904 " <span class=\"fa fa-bar-chart-o \"></span></a>\n" +
2904 2905 " <ul class=\"dropdown-menu\">\n" +
2905 2906 " <li role=\"presentation\"><a data-ui-sref=\"front_dashboard\">Main dashboard</a></li>\n" +
2906 2907 " <li role=\"presentation\" ng-repeat=\"item in $ctrl.AeConfig.topNav.menu_dashboards_items\">\n" +
2907 2908 " <a data-ui-sref=\"{{ item.sref }}\">{{ item.label }}</a>\n" +
2908 2909 " </li>\n" +
2909 2910 " </ul>\n" +
2910 2911 " </li>\n" +
2911 2912 "\n" +
2912 2913 " <li class=\"dropdown\" data-uib-dropdown>\n" +
2913 2914 " <a class=\"dropdown-toggle\" data-uib-dropdown-toggle tooltip-placement=\"bottom\" data-uib-tooltip=\"Reports\">\n" +
2914 2915 " <span class=\"fa fa-exclamation-triangle\"></span></a>\n" +
2915 2916 " <ul class=\"dropdown-menu\">\n" +
2916 2917 " <li role=\"presentation\">\n" +
2917 2918 " <a data-ui-sref=\"report.list({resource:$ctrl.stateHolder.resource})\">Error Reports</a>\n" +
2918 2919 " </li>\n" +
2919 2920 " <li role=\"presentation\">\n" +
2920 2921 " <a data-ui-sref=\"report.list_slow({resource:$ctrl.stateHolder.resource})\">Slowness Reports</a>\n" +
2921 2922 " </li>\n" +
2922 2923 "\n" +
2923 2924 " </ul>\n" +
2924 2925 " </li>\n" +
2925 2926 "\n" +
2926 2927 " <li>\n" +
2927 2928 " <a data-ui-sref=\"logs({resource:$ctrl.stateHolder.resource})\" data-uib-tooltip=\"Logs\" tooltip-placement=\"bottom\"><span class=\"fa fa-list-alt \"></span></a></li>\n" +
2928 2929 " <li>\n" +
2929 2930 " <a data-ui-sref=\"user\" data-uib-tooltip=\"Settings\" tooltip-placement=\"bottom\"><span class=\"fa fa-cog \"></span></a>\n" +
2930 2931 " </li>\n" +
2931 2932 " <li class=\"dropdown\" data-uib-dropdown data-ng-if=\"$ctrl.AeConfig.topNav.menu_admin_items.length\">\n" +
2932 2933 " <a class=\"dropdown-toggle\" data-uib-dropdown-toggle tooltip-placement=\"bottom\" data-uib-tooltip=\"Admin Settings\">\n" +
2933 2934 " <span class=\"fa fa-wrench\"></span></a>\n" +
2934 2935 " <ul class=\"dropdown-menu\">\n" +
2935 2936 " <li role=\"presentation\" ng-repeat=\"item in $ctrl.AeConfig.topNav.menu_admin_items\">\n" +
2936 2937 " <a data-ui-sref=\"{{ item.sref }}\">{{ item.label }}</a>\n" +
2937 2938 " </li>\n" +
2938 2939 " </ul>\n" +
2939 2940 " </li>\n" +
2940 2941 " <li><a href=\"{{ $ctrl.AeConfig.urls.otherRoutes.signOut }}\" target=\"_self\"\n" +
2941 2942 " data-uib-tooltip=\"Sign out\" tooltip-placement=\"bottom\">\n" +
2942 2943 " <span class=\"fa fa-power-off \"></span></a></li>\n" +
2943 2944 " </ul>\n" +
2944 2945 " <ul class=\"nav navbar-nav pull-right\" ng-if=\"$ctrl.stateHolder.AeUser.id === null\">\n" +
2945 2946 " <li><a href=\"{{ $ctrl.AeConfig.urls.otherRoutes.register }}\" target=\"_self\" class=\"btn btn-orange\">Sign In</a></li>\n" +
2946 2947 " </ul>\n" +
2947 2948 " </div><!-- /.navbar-collapse -->\n" +
2948 2949 " </div><!-- /.container-fluid -->\n" +
2949 2950 " </div>\n" +
2950 2951 " </div>\n" +
2951 2952 "</div>\n"
2952 2953 );
2953 2954
2954 2955
2955 $templateCache.put('directives/permissions/permissions.html',
2956 "<div class=\"panel panel-default\">\n" +
2957 " <div class=\"panel-heading\">\n" +
2958 " <h3 class=\"panel-title\">Permissions</h3>\n" +
2959 " </div>\n" +
2960 " <div class=\"panel-body\">\n" +
2961 " <p>Here you can <strong>set permissions</strong> for others to access your app data.</p>\n" +
2962 "\n" +
2963 " <p>For example you can let other staff member view or alter error reports.</p>\n" +
2956 $templateCache.put('components/views/index-dashboard/index-dashboard.html',
2957 "<style type=\"text/css\">\n" +
2958 " #metrics_chart .c3-line {\n" +
2959 " stroke-width: 0px;\n" +
2960 " }\n" +
2964 2961 "\n" +
2965 " <div ng-if=\"permissions.possibleGroups.length > 0\">\n" +
2966 " <h3>Group permissions</h3>\n" +
2962 " #metrics_chart .c3-area {\n" +
2963 " stroke-width: 0;\n" +
2964 " opacity: 0.75;\n" +
2965 " }\n" +
2966 "</style>\n" +
2967 2967 "\n" +
2968 " <ul class=\"list-group\">\n" +
2969 " <li ng-repeat=\"perm in permissions.currentPermissions.group\" class=\"animate-repeat list-group-item\">\n" +
2970 " <strong>{{ perm.self.group_name }}</strong>\n" +
2971 " <div ng-repeat=\"perm_name in perm.permissions\" class=\"pull-right animate-repeat m-l-1\">\n" +
2972 " <span ng-if=\"perm_name == '__all_permissions__'\">Resource owner</span>\n" +
2973 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\" ng-if=\"perm_name != '__all_permissions__'\">\n" +
2974 " <a class=\"btn btn-danger btn-xs\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> {{ perm_name }}</a>\n" +
2975 " <ul class=\"dropdown-menu\">\n" +
2976 " <li><a>No</a></li>\n" +
2977 " <li><a ng-click=\"permissions.removeGroupPermission(perm_name, perm)\">Yes</a></li>\n" +
2978 " </ul>\n" +
2979 " </span>\n" +
2980 " </div>\n" +
2981 " </li>\n" +
2982 " </ul>\n" +
2968 "<div class=\"row\">\n" +
2969 " <div class=\"col-sm-12 dashboard\" id=\"content\">\n" +
2970 " <div ng-if=\"!$ctrl.stateHolder.AeUser.applications.length\">\n" +
2983 2971 "\n" +
2984 " <form name=\"add_permission\" class=\"form-inline\" ng-submit=\"permissions.setGroupPermission()\">\n" +
2985 " <div class=\"form-group\">\n" +
2986 " <select class=\"form-control\" ng-model=\"permissions.form.selectedGroup\" ng-options=\"g.id as g.group_name for g in permissions.possibleGroups\"></select>\n" +
2987 " </div>\n" +
2988 " <div class=\"form-group\">\n" +
2989 " <span ng-repeat=\"permission in permissions.possiblePermissions\">\n" +
2990 " <input type=\"checkbox\" ng-model=\"permissions.form.selectedGroupPermissions[permission]\"> {{ permission }}\n" +
2991 " </span>\n" +
2992 " </div>\n" +
2993 " <div class=\"form-group\">\n" +
2994 " <button class=\"btn btn-info\"><span class=\"fa fa-user\"></span> Give permission</button>\n" +
2995 " </div>\n" +
2996 " </form>\n" +
2972 " <div ng-include=\"'templates/quickstart.html'\"></div>\n" +
2997 2973 "\n" +
2998 2974 " </div>\n" +
2999 2975 "\n" +
3000 " <h3>User permissions</h3>\n" +
3001 " <div>\n" +
3002 " <ul class=\"list-group\">\n" +
3003 " <li ng-repeat=\"perm in permissions.currentPermissions.user\" class=\"animate-repeat list-group-item\">\n" +
3004 " <strong>{{ perm.self.user_name }}</strong>\n" +
3005 " <div ng-repeat=\"perm_name in perm.permissions\" class=\"pull-right animate-repeat m-l-1\">\n" +
3006 " <span ng-if=\"perm_name == '__all_permissions__'\">Resource owner</span>\n" +
3007 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\" ng-if=\"perm_name != '__all_permissions__'\">\n" +
3008 " <a class=\"btn btn-danger btn-xs\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> {{ perm_name }}</a>\n" +
3009 " <ul class=\"dropdown-menu\">\n" +
3010 " <li><a>No</a></li>\n" +
3011 " <li><a ng-click=\"permissions.removeUserPermission(perm_name,perm)\">Yes</a></li>\n" +
3012 " </ul>\n" +
3013 " </span>\n" +
3014 " </div>\n" +
3015 " </li>\n" +
3016 " </ul>\n" +
3017 " </div>\n" +
3018 " <div>\n" +
3019 " <p>First enter username or full email of person you want to give access to (the person needs to be <strong>already registered in AppEnlight</strong>)</p>\n" +
2976 " <div ng-if=\"$ctrl.stateHolder.AeUser.applications.length\">\n" +
3020 2977 "\n" +
3021 " <form name=\"add_permission\" class=\"form-inline\" ng-submit=\"permissions.setUserPermission()\">\n" +
3022 " <div class=\"form-group\">\n" +
3023 " <input type=\"text\" class=\"autocomplete form-control\" placeholder=\"Search for user/email\" ng-model=\"permissions.form.autocompleteUser\"\n" +
3024 " uib-typeahead=\"u.user for u in permissions.searchUsers($viewValue) | limitTo:8\" typeahead-loading=\"permissions.searchingUsers\" typeahead-wait-ms=\"250\"\n" +
3025 " typeahead-template-url=\"templates/directives/user_search_type_ahead.html\"\n" +
3026 " />\n" +
3027 " </div>\n" +
3028 " <div class=\"form-group\">\n" +
3029 " <span ng-repeat=\"permission in permissions.possiblePermissions\">\n" +
3030 " <input type=\"checkbox\" ng-model=\"permissions.form.selectedUserPermissions[permission]\"> {{ permission }}\n" +
3031 " </span>\n" +
3032 " </div>\n" +
3033 " <div class=\"form-group\">\n" +
3034 " <button class=\"btn btn-info\" ng-disabled=\"!permissions.form.autocompleteUser\"><span class=\"fa fa-user\"></span> Give permission</button>\n" +
3035 " </div>\n" +
3036 " </form>\n" +
3037 " </div>\n" +
3038 " </div>\n" +
3039 "</div>\n"
3040 );
3041
3042
3043 $templateCache.put('directives/plugin_config/plugin_config.html',
3044 "<div ng-repeat=\"tmpl in plugin_ctrlr.inclusions track by $index\">\n" +
3045 " <div><strong>Plugin: {{tmpl.name}}</strong></div>\n" +
3046 " <ng-include src=\"tmpl.template\"></ng-include>\n" +
3047 " <hr/>\n" +
3048 "</div>\n"
3049 );
3050
3051
3052 $templateCache.put('directives/postprocess_action/postprocess_action.html',
3053 "<div class=\"panel panel-default action\">\n" +
3054 " <div class=\"panel-body form-inline\">\n" +
3055 " <div class=\"pull-right\">\n" +
3056 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3057 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3058 " <ul class=\"dropdown-menu\">\n" +
3059 " <li><a>No</a></li>\n" +
3060 " <li><a ng-click=\"ctrl.deleteAction(ctrl.action)\">Yes</a></li>\n" +
3061 " </ul>\n" +
3062 " </span>\n" +
3063 " </div>\n" +
2978 " <div class=\"row\">\n" +
2979 " <div class=\"col-sm-6\">\n" +
2980 " <div class=\"panel panel-default\">\n" +
2981 " <div class=\"panel-body\">\n" +
2982 " <form class=\"graph-type form-inline\">\n" +
2983 " <select ng-model=\"$ctrl.resource\" ng-options=\"r.resource_id as r.resource_name for r in $ctrl.stateHolder.AeUser.applications\" ng-change=\"$ctrl.updateSearchParams()\"\n" +
2984 " class=\"SelectField form-control input-sm slim-input\"></select>\n" +
3064 2985 "\n" +
3065 " <div class=\"form-group\">\n" +
3066 " <label>Action</label>\n" +
2986 " <select class=\"SelectField form-control input-sm slim-input\" ng-model=\"$ctrl.timeSpan\"\n" +
2987 " ng-options=\"i as i.label for i in $ctrl.timeOptions | objectToOrderedArray:'minutes'\" ng-change=\"$ctrl.updateSearchParams()\"\n" +
2988 " class=\"SelectField\"></select>\n" +
3067 2989 "\n" +
3068 " <div class=\"form-group\">\n" +
3069 " <select class=\"form-control\" ng-model=\"ctrl.action.new_value\" ng-options=\"f[0] as f[1] for f in ctrl.possibleActions\" ng-change=\"ctrl.setDirty()\"></select>\n" +
3070 " </div>\n" +
3071 2990 "\n" +
3072 " <a class=\"btn btn-success\" ng-if=\"ctrl.action.dirty\" ng-click=\"ctrl.saveAction()\"><span class=\"fa fa-save\"></span> &nbsp;Save changes</a>\n" +
2991 " <div class=\"btn-group\">\n" +
2992 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"$ctrl.graphType.selected\" ng-change=\"$ctrl.updateSearchParams()\"\n" +
2993 " uib-btn-radio=\"'requests_graphs'\" data-uib-tooltip=\"Requests per second\">\n" +
2994 " <span class=\"fa fa-line-chart\"></span>\n" +
2995 " </button>\n" +
2996 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"$ctrl.graphType.selected\" ng-change=\"$ctrl.updateSearchParams()\"\n" +
2997 " uib-btn-radio=\"'response_graphs'\" data-uib-tooltip=\"Average response time\">\n" +
2998 " <span class=\"fa fa-random\"></span>\n" +
2999 " </button>\n" +
3000 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"$ctrl.graphType.selected\" ng-change=\"$ctrl.updateSearchParams()\"\n" +
3001 " uib-btn-radio=\"'metrics_graphs'\" data-uib-tooltip=\"Time spent per request\">\n" +
3002 " <span class=\"fa fa-bar-chart-o\"></span>\n" +
3003 " </button>\n" +
3004 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"$ctrl.graphType.selected\" ng-change=\"$ctrl.updateSearchParams()\"\n" +
3005 " uib-btn-radio=\"'report_graphs'\" data-uib-tooltip=\"Errors\">\n" +
3006 " <span class=\"fa fa-exclamation-triangle\"></span>\n" +
3007 " </button>\n" +
3008 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"$ctrl.graphType.selected\" ng-change=\"$ctrl.updateSearchParams()\"\n" +
3009 " uib-btn-radio=\"'slow_report_graphs'\" data-uib-tooltip=\"Slow reports\">\n" +
3010 " <span class=\"fa fa-clock-o\"></span>\n" +
3011 " </button>\n" +
3012 " </div>\n" +
3013 " </form>\n" +
3014 " <div class=\"clearfix\"></div>\n" +
3073 3015 "\n" +
3074 " </div>\n" +
3075 " <hr/>\n" +
3076 " <p>Meeting following criteria:</p>\n" +
3077 " <form-errors errors=\"ctrl.errors\"></form-errors>\n" +
3078 " {{ctrl.rule}}\n" +
3079 " <rule rule=\"ctrl.action.rule\" rule-definitions=\"ctrl.ruleDefinitions\" parent-rule=\"null\" parent-obj=\"ctrl.action\"></rule>\n" +
3080 " </div>\n" +
3081 "</div>\n"
3082 );
3083
3084
3085 $templateCache.put('directives/report_alert_action/report_alert_action.html',
3086 "<div class=\"panel panel-default action\">\n" +
3087 " <div class=\"panel-body form-inline\">\n" +
3088 " <div class=\"pull-right\">\n" +
3089 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3090 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3091 " <ul class=\"dropdown-menu\">\n" +
3092 " <li><a>No</a></li>\n" +
3093 " <li><a ng-click=\"ctrl.deleteAction(ctrl.actions, ctrl.action)\">Yes</a></li>\n" +
3094 " </ul>\n" +
3095 " </span>\n" +
3096 " </div>\n" +
3016 " <p ng-if=\"$ctrl.loading.series != false\" class=\"text-center\">\n" +
3017 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
3018 " </p>\n" +
3097 3019 "\n" +
3098 " <div class=\"form-group\">\n" +
3099 " <label>Applies to</label>\n" +
3100 " <select class=\"form-control\" ng-model=\"ctrl.action.resource_id\" ng-options=\"f.resource_id as f.resource_name for f in ctrl.applications\" ng-change=\"ctrl.setDirty()\">\n" +
3101 " <option value=\"\">All Resources</option>\n" +
3102 " </select>\n" +
3103 " </div>\n" +
3104 " <div class=\"form-group\">\n" +
3105 " <label>Notify</label>\n" +
3106 " <select class=\"form-control\" ng-model=\"ctrl.action.action\" ng-change=\"ctrl.setDirty()\" ng-options=\"f[0] as f[1] for f in ctrl.possibleNotifications\"></select>\n" +
3020 " <div ng-if=\"$ctrl.loading.series == false\">\n" +
3021 " <div ng-if=\"$ctrl.graphType.selected == 'requests_graphs'\">\n" +
3022 " <c3chart data-domid=\"reponse_chart\" data-data=\"$ctrl.requestsChartData\" data-config=\"$ctrl.requestsChartConfig\" update=\"true\">\n" +
3023 " </c3chart>\n" +
3024 " </div>\n" +
3107 3025 "\n" +
3108 " <a class=\"btn btn-success\" ng-if=\"ctrl.action.dirty\" ng-click=\"ctrl.saveAction()\"><span class=\"fa fa-save\"></span> &nbsp;Save changes</a>\n" +
3026 " <div ng-if=\"$ctrl.graphType.selected == 'response_graphs'\">\n" +
3027 " <c3chart data-domid=\"reponse_chart\" data-data=\"$ctrl.responseChartData\" data-config=\"$ctrl.responseChartConfig\" update=\"true\">\n" +
3028 " </c3chart>\n" +
3029 " </div>\n" +
3109 3030 "\n" +
3110 " </div>\n" +
3111 " <div>\n" +
3112 " <p><strong>Channels:</strong></p>\n" +
3113 " <ul class=\"list-group\">\n" +
3114 " <li class=\"list-group-item\" ng-repeat=\"channel in ctrl.action.channels\">\n" +
3115 " <strong>{{channel.channel_visible_value}}</strong>\n" +
3116 " <div class=\"pull-right\">\n" +
3117 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3118 " <a class=\"btn btn-danger btn-xs\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3119 " <ul class=\"dropdown-menu\">\n" +
3120 " <li><a>No</a></li>\n" +
3121 " <li><a ng-click=\"ctrl.unBindChannel(channel)\">Yes</a></li>\n" +
3122 " </ul>\n" +
3123 " </span>\n" +
3124 " </div>\n" +
3125 " </li>\n" +
3126 " </ul>\n" +
3127 " <div class=\"form-group\" ng-if=\"ctrl.possibleChannels.length\">\n" +
3128 " <select class=\"form-control\" ng-model=\"ctrl.channelToBind\" ng-options=\"c as c.channel_visible_value for c in ctrl.possibleChannels |filter: c.supports_report_alerting\"></select>\n" +
3129 " <a class=\"btn btn-info\" ng-click=\"ctrl.bindChannel(channel, ctrl.action)\"><span class=\"fa fa-plus-circle\"></span> Add Channel</a>\n" +
3130 " </div>\n" +
3131 " <div class=\"alert alert-danger\" ng-if=\"!ctrl.possibleChannels.length\">\n" +
3132 " <span class=\"fa fa-exclamation-triangle \"></span>You need to create an alert channel before you can assign it to your rule.\n" +
3133 " </div>\n" +
3031 " <div ng-if=\"$ctrl.graphType.selected == 'metrics_graphs'\">\n" +
3032 " <c3chart data-domid=\"metrics_chart\" data-data=\"$ctrl.metricsChartData\" data-config=\"$ctrl.metricsChartConfig\" update=\"true\">\n" +
3033 " </c3chart>\n" +
3034 " </div>\n" +
3035 " <div ng-if=\"$ctrl.graphType.selected == 'report_graphs'\">\n" +
3036 " <c3chart data-domid=\"reports_chart\" data-data=\"$ctrl.reportChartData\" data-config=\"$ctrl.reportChartConfig\" update=\"true\">\n" +
3037 " </c3chart>\n" +
3038 " </div>\n" +
3134 3039 "\n" +
3135 " </div>\n" +
3136 " <hr/>\n" +
3137 " <p>Meeting following criteria:</p>\n" +
3138 " <form-errors errors=\"ctrl.errors\"></form-errors>\n" +
3139 " <rule rule=\"ctrl.action.rule\" rule-definitions=\"ctrl.ruleDefinitions\" parent-rule=\"null\" parent-obj=\"ctrl.action\"></rule>\n" +
3140 " </div>\n" +
3141 "</div>\n"
3142 );
3143
3144
3145 $templateCache.put('directives/rule_read_only/rule_read_only.html',
3146 "<div class=\"rule-read-only\">\n" +
3040 " <div ng-if=\"$ctrl.graphType.selected == 'slow_report_graphs'\">\n" +
3041 " <c3chart data-domid=\"slow_reports_chart\" data-data=\"$ctrl.reportSlowChartData\" data-config=\"$ctrl.reportSlowChartConfig\" update=\"true\">\n" +
3042 " </c3chart>\n" +
3043 " </div>\n" +
3147 3044 "\n" +
3148 " <span class=\"form-group\">\n" +
3149 " {{rule_ctrlr.readOnlyPossibleFields[rule_ctrlr.rule.field]}}\n" +
3150 " </span>\n" +
3045 " <p ng-if=\"$ctrl.graphType.selected == 'requests_graphs'\" class=\"text-center\">\n" +
3046 " <small>Average requests per second from all servers</small>\n" +
3047 " </p>\n" +
3151 3048 "\n" +
3152 " <span ng-if=\"rule_ctrlr.rule.field != '__AND__' && rule_ctrlr.rule.field !='__OR__' && rule_ctrlr.rule.field !='__NOT__'\">\n" +
3153 " is {{rule_ctrlr.ruleDefinitions.allOps[rule_ctrlr.rule.op]}} {{rule_ctrlr.rule.value}}\n" +
3154 " </span>\n" +
3049 " <p ng-if=\"$ctrl.graphType.selected == 'response_graphs'\" class=\"text-center\">\n" +
3050 " <small>Average response time from all servers</small>\n" +
3051 " </p>\n" +
3155 3052 "\n" +
3156 " <span ng-if=\"rule_ctrlr.rule.field == '__AND__' || rule_ctrlr.rule.field =='__OR__' || rule_ctrlr.rule.field =='__NOT__'\">\n" +
3157 " <p ng-if=\"parent\"><strong>Subrules</strong></p>\n" +
3158 " <div ng-repeat=\"subrule in rule_ctrlr.rule.rules\" class=\"m-l-2\">\n" +
3053 " <p ng-if=\"$ctrl.graphType.selected == 'metrics_graphs'\" class=\"text-center\">\n" +
3054 " <small>Aggregated average time spent per request - broken to layers</small>\n" +
3055 " </p>\n" +
3159 3056 "\n" +
3160 " <div class=\"panel panel-default\">\n" +
3161 " <div class=\"panel-body form-inline\">\n" +
3162 " <recursive>\n" +
3163 " <rule-read-only rule=\"subrule\" rule-definitions=\"rule_ctrlr.ruleDefinitions\" parent-rule=\"null\" parent-obj=\"rule_ctrlr.parentObj\"></rule-read-only>\n" +
3164 " </recursive>\n" +
3165 " </div>\n" +
3166 " </div>\n" +
3167 " </div>\n" +
3057 " <p ng-if=\"$ctrl.graphType.selected == 'report_graphs'\" class=\"text-center\">\n" +
3058 " <small>Aggregated reports sent by your application</small>\n" +
3059 " </p>\n" +
3168 3060 "\n" +
3169 " </span>\n" +
3170 "</div>\n"
3171 );
3172
3173
3174 $templateCache.put('directives/rule/rule.html',
3175 "<div class=\"rule form-inline\">\n" +
3176 "\n" +
3177 " <div class=\"form-group\">\n" +
3178 " <select class=\"form-control\"\n" +
3179 " ng-model=\"rule_ctrlr.rule.field\"\n" +
3180 " ng-change=\"rule_ctrlr.fieldChange()\"\n" +
3181 " ng-options=\"key as label for (key, label) in rule_ctrlr.ruleDefinitions.possibleFields\"></select>\n" +
3182 " </div>\n" +
3061 " <p ng-if=\"$ctrl.graphType.selected == 'slow_report_graphs'\" class=\"text-center\">\n" +
3062 " <small>Aggregated slow reports sent by your application</small>\n" +
3063 " </p>\n" +
3064 " </div>\n" +
3065 " </div>\n" +
3066 " </div>\n" +
3067 " </div>\n" +
3183 3068 "\n" +
3184 " <div ng-if=\"rule_ctrlr.rule.field != '__AND__' && rule_ctrlr.rule.field !='__OR__' && rule_ctrlr.rule.field !='__NOT__'\" class=\"form-group\">\n" +
3185 3069 "\n" +
3186 " <select ng-model=\"rule_ctrlr.rule.op\" class=\"form-control\"\n" +
3187 " ng-change=\"rule_ctrlr.setDirty()\"\n" +
3188 " ng-options=\"op as rule_ctrlr.ruleDefinitions.allOps[op] for op in rule_ctrlr.ruleDefinitions.fieldOps[rule_ctrlr.rule.field]\">\n" +
3189 " </select>\n" +
3070 " <div class=\"col-sm-6\">\n" +
3190 3071 "\n" +
3191 " <input type=\"text\" placeholder=\"Value\" ng-model=\"rule_ctrlr.rule.value\" ng-change=\"rule_ctrlr.setDirty()\" class=\"form-control\">\n" +
3072 " <div id=\"server-container\">\n" +
3192 3073 "\n" +
3193 " </div>\n" +
3074 " <div ng-if=\"$ctrl.loading.apdex==false\" class=\"text-center m-b-1\">\n" +
3194 3075 "\n" +
3195 " <span ng-if=\"rule_ctrlr.rule.field == '__AND__' || rule_ctrlr.rule.field =='__OR__' || rule_ctrlr.rule.field =='__NOT__'\">\n" +
3196 " <p ng-if=\"parent\"><strong>Subrules</strong></p>\n" +
3197 " <div ng-repeat=\"subrule in rule_ctrlr.rule.rules\" class=\"m-l-2\">\n" +
3198 " <div class=\"panel panel-default\">\n" +
3199 " <div class=\"panel-body form-inline\">\n" +
3200 " <recursive>\n" +
3201 " <rule rule=\"subrule\" rule-definitions=\"rule_ctrlr.ruleDefinitions\" parent-rule=\"rule_ctrlr.rule\" parent-obj=\"rule_ctrlr.parentObj\"></rule>\n" +
3202 " </recursive>\n" +
3203 " </div>\n" +
3204 " </div>\n" +
3205 " </div>\n" +
3076 " <a data-ui-sref=\"report.list({resource:$ctrl.resource, start_date:$ctrl.startDateFilter})\" class=\"combined-stat text-center\" id=\"error-rate\">\n" +
3077 " <small>Exceptions</small>\n" +
3078 " <br/>\n" +
3079 " <strong>{{ $ctrl.exceptions|numberToThousands}}</strong>\n" +
3080 " <span class=\"fa fa-chevron-right\"></span>\n" +
3081 " </a><!--\n" +
3206 3082 "\n" +
3207 " <span ng-if=\"(rule_ctrlr.config.disable_subrules == false) == false\" class=\"btn btn-info\" ng-click=\"rule_ctrlr.add()\"><span class=\"fa fa-plus-circle\"></span> Add rule</span>\n" +
3083 " --><a data-ui-sref=\"report.list_slow({resource:$ctrl.resource, min_duration:4, start_date:$ctrl.startDateFilter})\" class=\"combined-stat text-center\" id=\"frustrating-requests\" data-uib-tooltip=\"Requests over 4s\">\n" +
3084 " <small>Frustrating req.</small>\n" +
3085 " <br/>\n" +
3086 " <strong>{{$ctrl.frustratingRequests|numberToThousands}}</strong>\n" +
3087 " <span class=\"fa fa-chevron-right\"></span>\n" +
3088 " </a><!--\n" +
3208 3089 "\n" +
3209 " </span>\n" +
3210 " <div class=\"pull-right\" ng-if=\"rule_ctrlr.parentRule\">\n" +
3211 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3212 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3213 " <ul class=\"dropdown-menu\">\n" +
3214 " <li><a>No</a></li>\n" +
3215 " <li><a ng-click=\"rule_ctrlr.deleteRule(rule_ctrlr.parentRule, rule_ctrlr.rule)\">Yes</a></li>\n" +
3216 " </ul>\n" +
3217 " </span>\n" +
3218 " </div>\n" +
3219 "</div>\n"
3220 );
3221
3222
3223 $templateCache.put('templates/admin/applications/applications_list.html',
3224 "<ng-include src=\"'templates/loader.html'\" ng-if=\"applications.loading.applications\"></ng-include>\n" +
3090 " --><a data-ui-sref=\"report.list_slow({resource:$ctrl.resource, min_duration:1, max_duration:4, start_date:$ctrl.startDateFilter})\" class=\"combined-stat text-center\" id=\"tolerated-requests\"\n" +
3091 " data-uib-tooltip=\"Requests under 4s\">\n" +
3092 " <small>Tolerated req.</small>\n" +
3093 " <br/>\n" +
3094 " <strong>{{$ctrl.toleratedRequests|numberToThousands}}</strong>\n" +
3095 " <span class=\"fa fa-chevron-right\"></span>\n" +
3096 " </a><!--\n" +
3097 " \n" +
3098 " --><a class=\"combined-stat text-center\" id=\"satisfying-requests\" data-uib-tooltip=\"Requests under 1s\">\n" +
3099 " <small>Satisfying req.</small>\n" +
3100 " <br/>\n" +
3101 " <strong>{{$ctrl.satisfyingRequests|numberToThousands}}</strong>\n" +
3102 " </a><!--\n" +
3225 3103 "\n" +
3226 "<div class=\"panel panel-default\" ng-if=\"!applications.loading.applications\">\n" +
3227 " <div class=\"panel-heading\">\n" +
3104 " --><a data-ui-sref=\"uptime({resource:$ctrl.resource})\" class=\"combined-stat text-center\" id=\"uptime-stats\" data-uib-tooltip=\"Uptime\">\n" +
3105 " <small>Uptime</small>\n" +
3106 " <br/>\n" +
3107 " <strong>{{$ctrl.uptimeStats}}%</strong>\n" +
3108 " <span class=\"fa fa-chevron-right\"></span>\n" +
3109 " </a>\n" +
3228 3110 "\n" +
3229 " Currently active applications: {{applications.applications.length}}\n" +
3111 " <div class=\"clearfix\"></div>\n" +
3112 " </div>\n" +
3230 3113 "\n" +
3231 " </div>\n" +
3114 " <div id=\"apdex-rate\" class=\"m-b-1 panel panel-default\">\n" +
3115 " <table class=\"servers table table-striped\">\n" +
3116 " <thead>\n" +
3117 " <tr>\n" +
3118 " <th></th>\n" +
3119 " <th>Server</th>\n" +
3120 " <th>Apdex\n" +
3121 " <span class=\"fa fa-question-circle\"\n" +
3122 " data-uib-tooltip=\"Application Performance Index - measures viewer satisfaction based on response times and error rates\"></span>\n" +
3123 " </th>\n" +
3124 " <th>rpm</th>\n" +
3125 " <th>avg. response</th>\n" +
3126 " </tr>\n" +
3127 " </thead>\n" +
3128 " <tbody>\n" +
3129 " <tr ng-if=\"$ctrl.loading.apdex!=false\" class=\"text-center\">\n" +
3130 " <td colspan=\"5\"><span class=\"fa fa-cog fa-spin fa-5x loader\"></span></td>\n" +
3131 " </tr>\n" +
3132 " <tr ng-repeat=\"server in $ctrl.apdexStats\" class=\"{{ server | apdexValue }}\"\n" +
3133 " ng-if=\"$ctrl.loading.apdex==false\">\n" +
3134 " <td><span class=\"fa fa-hdd-o\"></span></td>\n" +
3135 " <td>\n" +
3136 " <small><strong>{{ server.name }}</strong></small>\n" +
3137 " </td>\n" +
3138 " <td class=\"apdex\">\n" +
3139 " <small><strong>{{ server.apdex }} %</strong></small>\n" +
3140 " </td>\n" +
3141 " <td>\n" +
3142 " <small><strong>{{ server.rpm }}rpm</strong></small>\n" +
3143 " </td>\n" +
3144 " <td>\n" +
3145 " <small><strong>{{ server.avg_response_time }}s</strong></small>\n" +
3146 " </td>\n" +
3147 " </tr>\n" +
3148 " </tbody>\n" +
3149 " </table>\n" +
3232 3150 "\n" +
3233 " <table st-table=\"displayedCollection\" st-safe-src=\"applications.applications\" class=\"table table-striped\">\n" +
3234 " <thead>\n" +
3235 " <tr>\n" +
3236 " <th st-sort=\"resource_name\"><a>Application name</a></th>\n" +
3237 " <th st-sort=\"owner_user_name\"><a>Owner User</a></th>\n" +
3238 " <th st-sort=\"owner_group_name\"><a>Owner Group</a></th>\n" +
3239 " <th class=\"options\"></th>\n" +
3240 " </tr>\n" +
3241 " <tr>\n" +
3242 " <th><input st-search=\"resource_name\" placeholder=\"search for application\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3243 " <th><input st-search=\"owner_user_name\" placeholder=\"search for user\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3244 " <th><input st-search=\"owner_group_name\" placeholder=\"search for group\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3245 " <th></th>\n" +
3246 " </tr>\n" +
3247 " </thead>\n" +
3248 " <tbody>\n" +
3151 " </div>\n" +
3152 " </div>\n" +
3249 3153 "\n" +
3250 " <tr ng-repeat=\"resource in displayedCollection track by resource.resource_id\">\n" +
3251 " <td> {{resource.resource_name}}</td>\n" +
3252 " <td>{{resource.owner_user_name}}</td>\n" +
3253 " <td>{{resource.owner_group_name}}</td>\n" +
3254 " <td>\n" +
3255 " <a class=\"btn btn-default btn-sm\" data-ui-sref=\"applications.update({resourceId:resource.resource_id})\" data-toggle=\"tooltip\" title=\"Update application\"><span class=\"fa fa-cog\"></span></a>\n" +
3256 " </td>\n" +
3257 " </tr>\n" +
3258 " <tfoot>\n" +
3259 " <tr>\n" +
3260 " <td colspan=\"4\" class=\"text-center\">\n" +
3261 " <div st-pagination=\"\" st-items-by-page=\"100\" st-displayed-pages=\"7\"></div>\n" +
3262 " </td>\n" +
3263 " </tr>\n" +
3264 " </tfoot>\n" +
3265 " </tbody>\n" +
3266 " </table>\n" +
3154 " </div>\n" +
3267 3155 "\n" +
3268 "</div>\n"
3269 );
3270
3271
3272 $templateCache.put('templates/admin/configs/edit.html',
3273 "<ng-include src=\"'templates/loader.html'\" ng-if=\"configs.loading.config\"></ng-include>\n" +
3274 3156 "\n" +
3275 "<div class=\"panel panel-default\" ng-show=\"!configs.loading.config\">\n" +
3276 " <div class=\"panel-heading\">\n" +
3277 " <h3 class=\"panel-title\">Basic Configuration</h3>\n" +
3278 " </div>\n" +
3279 " <div class=\"panel-body\">\n" +
3280 " <h2>Visual</h2>\n" +
3281 " <form class=\"form-horizontal\">\n" +
3282 " <div class=\"form-group\">\n" +
3283 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3284 " Footer HTML\n" +
3285 " </label>\n" +
3286 " <div class=\"col-sm-8 col-lg-9\">\n" +
3287 " <textarea class=\"form-control\" type=\"text\" ng-model=\"configs.configs.global.template_footer_html.value\" style=\"min-height: 150px\"></textarea>\n" +
3288 " </div>\n" +
3289 3157 " </div>\n" +
3290 " </form>\n" +
3291 3158 "\n" +
3292 " <h2>Functional</h2>\n" +
3159 " <div class=\"row\">\n" +
3160 " <div class=\"col-sm-6\">\n" +
3293 3161 "\n" +
3294 " <form class=\"form-horizontal\">\n" +
3295 " <div class=\"form-group\">\n" +
3296 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3297 " Show user groups to non-admin users\n" +
3298 " </label>\n" +
3299 " <div class=\"col-sm-8 col-lg-9\">\n" +
3300 " <button type=\"button\" class=\"btn btn-default\" ng-model=\"configs.configs.global.list_groups_to_non_admins.value\" uib-btn-checkbox>\n" +
3301 " Enable\n" +
3302 " </button>\n" +
3303 " </div>\n" +
3304 " </div>\n" +
3305 " </form>\n" +
3162 " <div class=\"panel panel-default\">\n" +
3163 " <div class=\"panel-heading position-relative\">\n" +
3164 " <h3 class=\"panel-title\"><span class=\"fa fa-exclamation-triangle\"></span> Newest errors (real-time)\n" +
3165 " </h3>\n" +
3166 " <a tooltip-append-to-body=\"true\" data-uib-tooltip=\"Play/Pause stream\" class=\"btn btn-primary btn-sm pause_stream\" ng-model=\"$ctrl.stream.paused\" uib-btn-checkbox>\n" +
3167 " <span class=\"fa {{stream.paused ? 'fa-play' : 'fa-pause'}}\"></span>\n" +
3168 " </a>\n" +
3169 " <a tooltip-append-to-body=\"true\" data-uib-tooltip=\"Limit reports to current application\" class=\"btn btn-primary btn-sm limit_stream\" ng-model=\"$ctrl.stream.filtered\" uib-btn-checkbox>\n" +
3170 " <span class=\"fa fa-lock\"></span>\n" +
3171 " </a>\n" +
3306 3172 "\n" +
3307 " <h2>Global Rate Limiting</h2>\n" +
3308 3173 "\n" +
3309 " <form class=\"form-horizontal\">\n" +
3310 " <div class=\"form-group\">\n" +
3311 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3312 " Ignore reports per minute/per application\n" +
3313 " </label>\n" +
3314 " <div class=\"col-sm-8 col-lg-9\">\n" +
3315 " <input class=\"form-control\" type=\"number\" ng-model=\"configs.configs.global.per_application_reports_rate_limit.value\" />\n" +
3316 " </div>\n" +
3317 " </div>\n" +
3174 " </div>\n" +
3175 " <div class=\"panel-body\">\n" +
3318 3176 "\n" +
3319 " <div class=\"form-group\">\n" +
3320 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3321 " Ignore logs per minute/per application\n" +
3322 " </label>\n" +
3323 " <div class=\"col-sm-8 col-lg-9\">\n" +
3324 " <input class=\"form-control\" type=\"number\" ng-model=\"configs.configs.global.per_application_logs_rate_limit.value\" />\n" +
3325 " </div>\n" +
3326 " </div>\n" +
3177 " <p ng-if=\"$ctrl.stream.reports.length === 0\">No new reports</p>\n" +
3327 3178 "\n" +
3328 " <div class=\"form-group\">\n" +
3329 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3330 " Ignore metrics per minute/per application\n" +
3331 " </label>\n" +
3332 " <div class=\"col-sm-8 col-lg-9\">\n" +
3333 " <input class=\"form-control\" type=\"number\" ng-model=\"configs.configs.global.per_application_metrics_rate_limit.value\" />\n" +
3179 " <div small-report-list reports=\"$ctrl.stream.reports\" applications=\"$ctrl.applications\"></div>\n" +
3180 " </div>\n" +
3181 " </div>\n" +
3334 3182 " </div>\n" +
3335 " </div>\n" +
3336 3183 "\n" +
3337 " </form>\n" +
3184 " <div class=\"col-sm-6\">\n" +
3338 3185 "\n" +
3339 " <hr/>\n" +
3186 " <div class=\"panel panel-default\">\n" +
3187 " <div class=\"panel-heading\">\n" +
3188 " <h3 class=\"panel-title\"><span class=\"fa fa-sort-amount-desc\"></span> Request breakdown over {{ $ctrl.timeSpan.label }}</h3>\n" +
3189 " </div>\n" +
3190 " <div class=\"panel-body\" id=\"view-breakdown-container\">\n" +
3191 " <p ng-if=\"$ctrl.loading.requestsBreakdown!=false\" class=\"text-center\">\n" +
3192 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
3193 " </p>\n" +
3340 3194 "\n" +
3341 " <a class=\"btn btn-primary\" ng-click=\"configs.save()\">Save configuration</a>\n" +
3342 " </div>\n" +
3195 " <div class=\"report-list\">\n" +
3196 " <div ng-if=\"$ctrl.loading.requestsBreakdown==false\" ng-repeat=\"view in $ctrl.requestsBreakdown\">\n" +
3197 " <div class=\"view-info\">\n" +
3198 " <div class=\"view-name\">\n" +
3199 " <div class=\"bar\" style=\"width: {{view.percentage}}%\">\n" +
3200 " </div>\n" +
3201 " </div>\n" +
3202 " <strong ng-if=\"view.latest_details.length\">\n" +
3203 " <a data-ui-sref=\"report.list_slow({view_name:view.view_name})\">{{view.view_name}}</a></strong>\n" +
3204 " <strong ng-if=\"!view.latest_details.length\">{{view.view_name}}</strong>\n" +
3343 3205 "\n" +
3344 "</div>\n" +
3206 " <div class=\"stats\">\n" +
3207 " <small>\n" +
3208 " avg. response <strong>{{view.avg_response}}s</strong> in\n" +
3209 " <span class=\"requests\"\n" +
3210 " data-uib-tooltip=\"Requests\"><strong>{{view.requests|numberToThousands}}</strong> requests</span>\n" +
3345 3211 "\n" +
3212 " <span ng-if=\"view.latest_details\">\n" +
3213 " &nbsp;&nbsp; Latest reports:\n" +
3214 " <a ng-repeat=\"d in view.latest_details\" target=\"_blank\" ui-sref=\"report.view_detail({groupId:d.group_id, reportId:d.report_id})\"> <strong>{{$index+1}}</strong></a>\n" +
3215 " </span>\n" +
3216 " </small>\n" +
3217 " </div>\n" +
3346 3218 "\n" +
3347 "<div class=\"panel panel-default\">\n" +
3348 " <div class=\"panel-heading\">\n" +
3349 " <h3 class=\"panel-title\">Plugin Configuration</h3>\n" +
3350 " </div>\n" +
3351 " <div class=\"panel-body\">\n" +
3352 " <plugin-config section=\"'admin.config'\">\n" +
3353 " </plugin-config>\n" +
3354 " </div>\n" +
3355 "</div>\n"
3356 );
3357
3358
3359 $templateCache.put('templates/admin/configs/parent_view.html',
3360 "<div ui-view></div>"
3361 );
3362
3363
3364 $templateCache.put('templates/admin/groups/groups_create.html',
3365 "<ng-include src=\"'templates/loader.html'\" ng-if=\"group.loading.group\"></ng-include>\n" +
3219 " </div>\n" +
3366 3220 "\n" +
3367 "<div ng-show=\"!group.loading.group\">\n" +
3221 " </div>\n" +
3222 " </div>\n" +
3368 3223 "\n" +
3369 " <div class=\"panel panel-default\">\n" +
3370 " <div class=\"panel-body\">\n" +
3371 " <form name=\"group.groupForm\" class=\"form-horizontal\" ng-submit=\"group.createGroup()\">\n" +
3372 " <div class=\"form-group\" id=\"row-group_name\">\n" +
3373 " <data-form-errors errors=\"group.groupForm.ae_validation.group_name\"></data-form-errors>\n" +
3374 " <label for=\"group_name\" id=\"label-group_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3375 " Group name\n" +
3376 " <span class=\"required\">*</span>\n" +
3377 " </label>\n" +
3378 " <div class=\"col-sm-8 col-lg-9\">\n" +
3379 " <input class=\"form-control\" id=\"group_name\" name=\"group_name\" type=\"text\" ng-model=\"group.group.group_name\">\n" +
3380 " </div>\n" +
3381 " </div>\n" +
3382 3224 "\n" +
3383 " <div class=\"form-group\" id=\"row-description\">\n" +
3384 " <data-form-errors errors=\"group.groupForm.ae_validation.description\"></data-form-errors>\n" +
3385 " <label for=\"description\" id=\"label-description\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3386 " Description\n" +
3387 " <span class=\"required\">*</span>\n" +
3388 " </label>\n" +
3389 " <div class=\"col-sm-8 col-lg-9\">\n" +
3390 " <input class=\"form-control\" id=\"description\" name=\"description\" type=\"text\" ng-model=\"group.group.description\">\n" +
3225 " </div>\n" +
3391 3226 " </div>\n" +
3392 " </div>\n" +
3393 "\n" +
3394 3227 "\n" +
3395 " <div class=\"form-group\" id=\"row-submit\">\n" +
3396 " <label for=\"submit\" id=\"label-submit\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3397 " </label>\n" +
3398 " <div class=\"col-sm-8 col-lg-9\">\n" +
3399 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"{{$state.params.groupId ? 'Update' : 'Add'}} Group\">\n" +
3400 " </div>\n" +
3401 3228 " </div>\n" +
3402 " </form>\n" +
3403 " </div>\n" +
3404 " </div>\n" +
3405 "\n" +
3406 3229 "\n" +
3407 " <div class=\"panel panel-default\" ng-if=\"group.group.id\">\n" +
3408 " <div class=\"panel-heading\">\n" +
3409 " <h3 class=\"panel-title\">Permissions summary</h3>\n" +
3410 " </div>\n" +
3411 " <div class=\"panel-body\">\n" +
3412 " <h3>Direct application permissions</h3>\n" +
3230 " </div>\n" +
3413 3231 "\n" +
3414 " <ul class=\"list-group\">\n" +
3415 " <li ng-repeat=\"perm in group.resourcePermissions.group.application\" class=\"animate-repeat list-group-item\">\n" +
3416 " <strong>{{ perm.self.resource_name }}</strong>\n" +
3232 " <div class=\"row\">\n" +
3233 " <div class=\"col-sm-6\">\n" +
3417 3234 "\n" +
3418 " <div class=\"pull-right\">\n" +
3235 " <div class=\"panel panel-default\">\n" +
3236 " <div class=\"panel-heading\">\n" +
3237 " <h3 class=\"panel-title\">\n" +
3238 " <span class=\"fa fa-exclamation-triangle\"></span> Report groups trending over {{ $ctrl.timeSpan.label }}\n" +
3239 " </h3>\n" +
3240 " </div>\n" +
3241 " <div class=\"panel-body\">\n" +
3242 " <p ng-if=\"$ctrl.loading.reports != false\" class=\"text-center\">\n" +
3243 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
3244 " </p>\n" +
3419 3245 "\n" +
3420 " <span class=\"btn btn-primary btn-xs m-r-1\" disabled ng-repeat=\"perm_name in perm.permissions\">{{ perm.self.owner ? 'Resource owner' : perm_name }}</span>\n" +
3246 " <p ng-if=\"$ctrl.trendingReports.length == 0 && $ctrl.loading.reports == false\">\n" +
3247 " No reports found\n" +
3248 " </p>\n" +
3421 3249 "\n" +
3422 " <a class=\"btn btn-default btn-xs\" data-uib-tooltip=\"Visit Application\" data-ui-sref=\"applications.update({resourceId:perm.self.resource_id})\">\n" +
3423 " <span class=\"fa fa-cog\"></span>\n" +
3424 " </a>\n" +
3250 " <div small-report-group-list groups=\"$ctrl.trendingReports\" applications=\"$ctrl.applications\" ng-if=\"$ctrl.loading.reports==false\"></div>\n" +
3251 " </div>\n" +
3425 3252 " </div>\n" +
3426 " </li>\n" +
3427 " </ul>\n" +
3428 3253 "\n" +
3429 " <h3>Direct dashboard permissions</h3>\n" +
3254 " </div>\n" +
3430 3255 "\n" +
3431 " <ul class=\"list-group\">\n" +
3432 " <li ng-repeat=\"perm in group.resourcePermissions.group.dashboard\" class=\"animate-repeat list-group-item\">\n" +
3433 " <strong>{{ perm.self.resource_name }}</strong>\n" +
3256 " <div class=\"col-sm-6\">\n" +
3434 3257 "\n" +
3435 " <div class=\"pull-right\">\n" +
3436 " <span class=\"btn btn-primary btn-xs m-r-1\" disabled ng-repeat=\"perm_name in perm.permissions\">{{ perm.self.owner ? 'Resource owner' : perm_name }}</span>\n" +
3437 3258 "\n" +
3438 " <a class=\"btn btn-default btn-xs\" data-uib-tooltip=\"Visit Dashboard\" data-ui-sref=\"dashboard.update({resourceId:perm.self.resource_id})\">\n" +
3439 " <span class=\"fa fa-cog\"></span>\n" +
3440 " </a>\n" +
3441 " </div>\n" +
3442 " </li>\n" +
3443 " </ul>\n" +
3259 " <div class=\"panel panel-default\">\n" +
3260 " <div class=\"panel-heading\">\n" +
3261 " <h3 class=\"panel-title\">\n" +
3262 " Most common slow calls over {{ $ctrl.timeSpan.label }}\n" +
3263 " </h3>\n" +
3264 " </div>\n" +
3265 " <div class=\"panel-body\">\n" +
3444 3266 "\n" +
3445 " </div>\n" +
3267 " <div ng-if=\"$ctrl.loading.slowCalls!=false\" class=\"text-center\">\n" +
3268 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
3269 " </div>\n" +
3446 3270 "\n" +
3447 " </div>\n" +
3271 " <table id=\"slow-statements\" ng-if=\"$ctrl.loading.slowCalls==false\">\n" +
3272 " <tbody>\n" +
3273 " <tr ng-repeat=\"call in $ctrl.slowCalls\">\n" +
3274 " <td class=\"occurences\">\n" +
3275 " <span class=\"occurences\" data-uib-tooltip=\"Occurences\">{{call.occurences|numberToThousands}}</span>\n" +
3276 " </td>\n" +
3277 " <td class=\"ellipsis\">\n" +
3278 " <small title=\"{{call.statement}}\" class=\"statement\">{{call.statement}}</small>\n" +
3279 " <br/>\n" +
3280 " <span class=\"type\">{{call.statement_type}}</span>\n" +
3281 " <span class=\"subtype\">{{call.statement_subtype}}</span>\n" +
3282 " <span class=\"duration\" data-uib-tooltip=\"Average duration\">{{call.total_duration/call.occurences|round:2}}s</span>\n" +
3283 " <span class=\"report-list\">\n" +
3284 " Latest reports:\n" +
3285 " <a ng-repeat=\"d in call.latest_details\" target=\"_blank\" ui-sref=\"report.view_detail({groupId:d.group_id, reportId:d.report_id})\"> <strong>{{$index+1}}</strong> </a>\n" +
3286 " </span>\n" +
3287 " </td>\n" +
3288 " </tr>\n" +
3289 " </tbody>\n" +
3290 " </table>\n" +
3448 3291 "\n" +
3449 3292 "\n" +
3450 " <div class=\"panel panel-default\" ng-if=\"group.group.id\">\n" +
3451 " <div class=\"panel-heading\">\n" +
3452 " <h3 class=\"panel-title\">User list</h3>\n" +
3453 " </div>\n" +
3454 " <div class=\"panel-body\">\n" +
3293 " </div>\n" +
3294 " </div>\n" +
3295 "\n" +
3455 3296 "\n" +
3456 " <form name=\"add_permission\" class=\"form-inline\" ng-submit=\"group.addUser()\">\n" +
3457 " <div class=\"form-group\">\n" +
3458 " <input placeholder=\"Username or email\" type=\"text\" class=\"autocomplete form-control\" ng-model=\"group.form.autocompleteUser\" uib-typeahead=\"u for u in group.searchUsers($viewValue) | limitTo:8\" typeahead-loading=\"searchingUsers\" typeahead-wait-ms=\"250\"/>\n" +
3459 " </div>\n" +
3460 " <div class=\"form-group\">\n" +
3461 " <button class=\"btn btn-info\" ng-disabled=\"!group.form.autocompleteUser\"><span class=\"fa fa-user\"></span> Add user</button>\n" +
3462 3297 " </div>\n" +
3463 " </form>\n" +
3464 3298 "\n" +
3299 " </div>\n" +
3465 3300 " </div>\n" +
3466 "\n" +
3467 " <table st-table=\"displayedCollection\" st-safe-src=\"group.users\" class=\"table table-striped\">\n" +
3468 " <thead>\n" +
3469 " <tr>\n" +
3470 " <th st-sort=\"user_name\"><a>Username</a></th>\n" +
3471 " <th st-sort=\"email\"><a>Email</a></th>\n" +
3472 " <th st-sort=\"status\"><a>Status</a></th>\n" +
3473 " <th st-sort=\"first_name\"><a>First Name</a></th>\n" +
3474 " <th st-sort=\"last_name\"><a>Last Name</a></th>\n" +
3475 " <th st-sort=\"last_login_date\"><a>Last login</a></th>\n" +
3476 " <th class=\"options\" style=\"width: 130px\"></th>\n" +
3477 " </tr>\n" +
3478 " <tr>\n" +
3479 " <th><input st-search=\"user_name\" placeholder=\"search for user name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3480 " <th><input st-search=\"email\" placeholder=\"search for email\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3481 " <th></th>\n" +
3482 " <th><input st-search=\"first_name\" placeholder=\"search for first name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3483 " <th><input st-search=\"last_name\" placeholder=\"search for last name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3484 " <th><input st-search=\"last_login_date\" placeholder=\"search for last name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3485 " <th></th>\n" +
3486 " </tr>\n" +
3487 " </thead>\n" +
3488 " <tbody>\n" +
3489 "\n" +
3490 " <tr ng-repeat=\"user in displayedCollection\">\n" +
3491 " <td><img src=\"{{user.gravatar_url}}\" class=\"avatar\"> {{user.user_name}}</td>\n" +
3492 " <td>{{user.email}}</td>\n" +
3493 " <td class=\"text-center\"><span class=\"fa\" ng-class=\"{'fa-check-circle':user.status, 'fa-times':!user.status}\"></span></td>\n" +
3494 " <td>{{user.first_name}}</td>\n" +
3495 " <td>{{user.last_name}}</td>\n" +
3496 " <td><span data-uib-tooltip=\"{{user.last_login_date}}\">{{user.last_login_date | isoToRelativeTime}}</span></td>\n" +
3497 " <td>\n" +
3498 " <a class=\"btn btn-default btn-sm\" data-ui-sref=\"admin.user.update({userId:user.id})\"><span class=\"fa fa-cog\"></span></a>\n" +
3499 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
3500 " <a class=\"btn btn-danger btn-sm\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3501 " <ul class=\"dropdown-menu\">\n" +
3502 " <li><a>No</a></li>\n" +
3503 " <li><a ng-click=\"group.removeUser(user)\">Yes</a></li>\n" +
3504 " </ul>\n" +
3505 " </span>\n" +
3506 " </tr>\n" +
3507 " <tfoot>\n" +
3508 " <tr>\n" +
3509 " <td colspan=\"7\" class=\"text-center\">\n" +
3510 " <div st-pagination=\"\" st-items-by-page=\"50\" st-displayed-pages=\"7\"></div>\n" +
3511 " </td>\n" +
3512 " </tr>\n" +
3513 " </tfoot>\n" +
3514 " </tbody>\n" +
3515 " </table>\n" +
3516 "\n" +
3517 3301 " </div>\n" +
3518 "\n" +
3519 "\n" +
3520 3302 "</div>\n"
3521 3303 );
3522 3304
3523 3305
3524 $templateCache.put('templates/admin/groups/groups_list.html',
3525 "<ng-include src=\"'templates/loader.html'\" ng-if=\"groups.loading.groups\"></ng-include>\n" +
3306 $templateCache.put('directives/permissions/permissions.html',
3307 "<div class=\"panel panel-default\">\n" +
3308 " <div class=\"panel-heading\">\n" +
3309 " <h3 class=\"panel-title\">Permissions</h3>\n" +
3310 " </div>\n" +
3311 " <div class=\"panel-body\">\n" +
3312 " <p>Here you can <strong>set permissions</strong> for others to access your app data.</p>\n" +
3526 3313 "\n" +
3527 "<div class=\"panel panel-default\" ng-show=\"!groups.loading.groups\">\n" +
3314 " <p>For example you can let other staff member view or alter error reports.</p>\n" +
3528 3315 "\n" +
3529 " <table st-table=\"displayedCollection\" st-safe-src=\"groups.groups\" class=\"table table-striped\">\n" +
3530 " <thead>\n" +
3531 " <tr>\n" +
3532 " <th st-sort=\"group_name\"><a>Group name</a></th>\n" +
3533 " <th st-sort=\"description\"><a>Description</a></th>\n" +
3534 " <th st-sort=\"members\"><a>Member count</a></th>\n" +
3535 " <th class=\"options\"></th>\n" +
3536 " </tr>\n" +
3537 " <tr>\n" +
3538 " <th><input st-search=\"group_name\" placeholder=\"search for group name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3539 " <th><input st-search=\"description\" placeholder=\"search for description\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3540 " <th></th>\n" +
3541 " <th></th>\n" +
3542 " </tr>\n" +
3543 " </thead>\n" +
3544 " <tbody>\n" +
3316 " <div ng-if=\"permissions.possibleGroups.length > 0\">\n" +
3317 " <h3>Group permissions</h3>\n" +
3545 3318 "\n" +
3546 " <tr ng-repeat=\"group in displayedCollection track by group.id\">\n" +
3547 " <td>{{group.group_name}}</td>\n" +
3548 " <td>{{group.description}}</td>\n" +
3549 " <td>{{group.member_count}}</td>\n" +
3550 " <td>\n" +
3551 " <a class=\"btn btn-default btn-sm\" data-ui-sref=\"admin.group.update({groupId:group.id})\"><span class=\"fa fa-cog\"></span></a>\n" +
3552 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
3553 " <a class=\"btn btn-danger btn-sm\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3319 " <ul class=\"list-group\">\n" +
3320 " <li ng-repeat=\"perm in permissions.currentPermissions.group\" class=\"animate-repeat list-group-item\">\n" +
3321 " <strong>{{ perm.self.group_name }}</strong>\n" +
3322 " <div ng-repeat=\"perm_name in perm.permissions\" class=\"pull-right animate-repeat m-l-1\">\n" +
3323 " <span ng-if=\"perm_name == '__all_permissions__'\">Resource owner</span>\n" +
3324 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\" ng-if=\"perm_name != '__all_permissions__'\">\n" +
3325 " <a class=\"btn btn-danger btn-xs\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> {{ perm_name }}</a>\n" +
3554 3326 " <ul class=\"dropdown-menu\">\n" +
3555 3327 " <li><a>No</a></li>\n" +
3556 " <li><a ng-click=\"groups.removeGroup(group)\">Yes</a></li>\n" +
3328 " <li><a ng-click=\"permissions.removeGroupPermission(perm_name, perm)\">Yes</a></li>\n" +
3557 3329 " </ul>\n" +
3558 3330 " </span>\n" +
3559 " </tr>\n" +
3560 " <tfoot>\n" +
3561 " <tr>\n" +
3562 " <td colspan=\"4\" class=\"text-center\">\n" +
3563 " <div st-pagination=\"\" st-items-by-page=\"100\" st-displayed-pages=\"7\"></div>\n" +
3564 " </td>\n" +
3565 " </tr>\n" +
3566 " </tfoot>\n" +
3567 " </tbody>\n" +
3568 " </table>\n" +
3331 " </div>\n" +
3332 " </li>\n" +
3333 " </ul>\n" +
3569 3334 "\n" +
3570 "</div>\n" +
3571 "\n"
3335 " <form name=\"add_permission\" class=\"form-inline\" ng-submit=\"permissions.setGroupPermission()\">\n" +
3336 " <div class=\"form-group\">\n" +
3337 " <select class=\"form-control\" ng-model=\"permissions.form.selectedGroup\" ng-options=\"g.id as g.group_name for g in permissions.possibleGroups\"></select>\n" +
3338 " </div>\n" +
3339 " <div class=\"form-group\">\n" +
3340 " <span ng-repeat=\"permission in permissions.possiblePermissions\">\n" +
3341 " <input type=\"checkbox\" ng-model=\"permissions.form.selectedGroupPermissions[permission]\"> {{ permission }}\n" +
3342 " </span>\n" +
3343 " </div>\n" +
3344 " <div class=\"form-group\">\n" +
3345 " <button class=\"btn btn-info\"><span class=\"fa fa-user\"></span> Give permission</button>\n" +
3346 " </div>\n" +
3347 " </form>\n" +
3348 "\n" +
3349 " </div>\n" +
3350 "\n" +
3351 " <h3>User permissions</h3>\n" +
3352 " <div>\n" +
3353 " <ul class=\"list-group\">\n" +
3354 " <li ng-repeat=\"perm in permissions.currentPermissions.user\" class=\"animate-repeat list-group-item\">\n" +
3355 " <strong>{{ perm.self.user_name }}</strong>\n" +
3356 " <div ng-repeat=\"perm_name in perm.permissions\" class=\"pull-right animate-repeat m-l-1\">\n" +
3357 " <span ng-if=\"perm_name == '__all_permissions__'\">Resource owner</span>\n" +
3358 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\" ng-if=\"perm_name != '__all_permissions__'\">\n" +
3359 " <a class=\"btn btn-danger btn-xs\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> {{ perm_name }}</a>\n" +
3360 " <ul class=\"dropdown-menu\">\n" +
3361 " <li><a>No</a></li>\n" +
3362 " <li><a ng-click=\"permissions.removeUserPermission(perm_name,perm)\">Yes</a></li>\n" +
3363 " </ul>\n" +
3364 " </span>\n" +
3365 " </div>\n" +
3366 " </li>\n" +
3367 " </ul>\n" +
3368 " </div>\n" +
3369 " <div>\n" +
3370 " <p>First enter username or full email of person you want to give access to (the person needs to be <strong>already registered in AppEnlight</strong>)</p>\n" +
3371 "\n" +
3372 " <form name=\"add_permission\" class=\"form-inline\" ng-submit=\"permissions.setUserPermission()\">\n" +
3373 " <div class=\"form-group\">\n" +
3374 " <input type=\"text\" class=\"autocomplete form-control\" placeholder=\"Search for user/email\" ng-model=\"permissions.form.autocompleteUser\"\n" +
3375 " uib-typeahead=\"u.user for u in permissions.searchUsers($viewValue) | limitTo:8\" typeahead-loading=\"permissions.searchingUsers\" typeahead-wait-ms=\"250\"\n" +
3376 " typeahead-template-url=\"templates/directives/user_search_type_ahead.html\"\n" +
3377 " />\n" +
3378 " </div>\n" +
3379 " <div class=\"form-group\">\n" +
3380 " <span ng-repeat=\"permission in permissions.possiblePermissions\">\n" +
3381 " <input type=\"checkbox\" ng-model=\"permissions.form.selectedUserPermissions[permission]\"> {{ permission }}\n" +
3382 " </span>\n" +
3383 " </div>\n" +
3384 " <div class=\"form-group\">\n" +
3385 " <button class=\"btn btn-info\" ng-disabled=\"!permissions.form.autocompleteUser\"><span class=\"fa fa-user\"></span> Give permission</button>\n" +
3386 " </div>\n" +
3387 " </form>\n" +
3388 " </div>\n" +
3389 " </div>\n" +
3390 "</div>\n"
3572 3391 );
3573 3392
3574 3393
3575 $templateCache.put('templates/admin/groups/parent_view.html',
3576 "<div ui-view></div>"
3394 $templateCache.put('directives/plugin_config/plugin_config.html',
3395 "<div ng-repeat=\"tmpl in plugin_ctrlr.inclusions track by $index\">\n" +
3396 " <div><strong>Plugin: {{tmpl.name}}</strong></div>\n" +
3397 " <ng-include src=\"tmpl.template\"></ng-include>\n" +
3398 " <hr/>\n" +
3399 "</div>\n"
3577 3400 );
3578 3401
3579 3402
3580 $templateCache.put('templates/admin/parent_view.html',
3581 "<div class=\"col-sm-3\" id=\"menu\">\n" +
3582 " <div class=\"panel panel-default\">\n" +
3583 " <div class=\"panel-heading\">Users and groups</div>\n" +
3584 " <ul class=\"list-group\">\n" +
3585 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.user.list\"> Users</a></li>\n" +
3586 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.user.create\"> Create user</a></li>\n" +
3587 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.group.list\"> Groups</a></li>\n" +
3588 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.group.create\"> Create group</a></li>\n" +
3589 " </ul>\n" +
3590 " </div>\n" +
3591 " <div class=\"panel panel-default\">\n" +
3592 " <div class=\"panel-heading\">Resources</div>\n" +
3593 " <ul class=\"list-group\">\n" +
3594 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.application.list\"> List applications</a></li>\n" +
3595 " </ul>\n" +
3596 " </div>\n" +
3403 $templateCache.put('directives/postprocess_action/postprocess_action.html',
3404 "<div class=\"panel panel-default action\">\n" +
3405 " <div class=\"panel-body form-inline\">\n" +
3406 " <div class=\"pull-right\">\n" +
3407 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3408 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3409 " <ul class=\"dropdown-menu\">\n" +
3410 " <li><a>No</a></li>\n" +
3411 " <li><a ng-click=\"ctrl.deleteAction(ctrl.action)\">Yes</a></li>\n" +
3412 " </ul>\n" +
3413 " </span>\n" +
3414 " </div>\n" +
3597 3415 "\n" +
3598 " <div class=\"panel panel-default\">\n" +
3599 " <div class=\"panel-heading\">System</div>\n" +
3600 " <ul class=\"list-group\">\n" +
3601 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.configs.list\"> Config variables</a></li>\n" +
3602 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.system\"> System</a></li>\n" +
3603 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.partitions\"> Partition Management</a></li>\n" +
3604 " </ul>\n" +
3605 " </div>\n" +
3606 "</div>\n" +
3416 " <div class=\"form-group\">\n" +
3417 " <label>Action</label>\n" +
3418 "\n" +
3419 " <div class=\"form-group\">\n" +
3420 " <select class=\"form-control\" ng-model=\"ctrl.action.new_value\" ng-options=\"f[0] as f[1] for f in ctrl.possibleActions\" ng-change=\"ctrl.setDirty()\"></select>\n" +
3421 " </div>\n" +
3607 3422 "\n" +
3423 " <a class=\"btn btn-success\" ng-if=\"ctrl.action.dirty\" ng-click=\"ctrl.saveAction()\"><span class=\"fa fa-save\"></span> &nbsp;Save changes</a>\n" +
3608 3424 "\n" +
3609 "<div class=\"col-sm-9\" ui-view></div>\n"
3425 " </div>\n" +
3426 " <hr/>\n" +
3427 " <p>Meeting following criteria:</p>\n" +
3428 " <form-errors errors=\"ctrl.errors\"></form-errors>\n" +
3429 " {{ctrl.rule}}\n" +
3430 " <rule rule=\"ctrl.action.rule\" rule-definitions=\"ctrl.ruleDefinitions\" parent-rule=\"null\" parent-obj=\"ctrl.action\"></rule>\n" +
3431 " </div>\n" +
3432 "</div>\n"
3610 3433 );
3611 3434
3612 3435
3613 $templateCache.put('templates/admin/partitions.html',
3614 "<ng-include src=\"'templates/loader.html'\" ng-if=\"partitions.loading.partitions\"></ng-include>\n" +
3436 $templateCache.put('directives/report_alert_action/report_alert_action.html',
3437 "<div class=\"panel panel-default action\">\n" +
3438 " <div class=\"panel-body form-inline\">\n" +
3439 " <div class=\"pull-right\">\n" +
3440 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3441 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3442 " <ul class=\"dropdown-menu\">\n" +
3443 " <li><a>No</a></li>\n" +
3444 " <li><a ng-click=\"ctrl.deleteAction(ctrl.actions, ctrl.action)\">Yes</a></li>\n" +
3445 " </ul>\n" +
3446 " </span>\n" +
3447 " </div>\n" +
3615 3448 "\n" +
3616 "<div ng-show=\"!partitions.loading.partitions\">\n" +
3449 " <div class=\"form-group\">\n" +
3450 " <label>Applies to</label>\n" +
3451 " <select class=\"form-control\" ng-model=\"ctrl.action.resource_id\" ng-options=\"f.resource_id as f.resource_name for f in ctrl.applications\" ng-change=\"ctrl.setDirty()\">\n" +
3452 " <option value=\"\">All Resources</option>\n" +
3453 " </select>\n" +
3454 " </div>\n" +
3455 " <div class=\"form-group\">\n" +
3456 " <label>Notify</label>\n" +
3457 " <select class=\"form-control\" ng-model=\"ctrl.action.action\" ng-change=\"ctrl.setDirty()\" ng-options=\"f[0] as f[1] for f in ctrl.possibleNotifications\"></select>\n" +
3458 "\n" +
3459 " <a class=\"btn btn-success\" ng-if=\"ctrl.action.dirty\" ng-click=\"ctrl.saveAction()\"><span class=\"fa fa-save\"></span> &nbsp;Save changes</a>\n" +
3617 3460 "\n" +
3618 " <div class=\"panel panel-default\">\n" +
3619 " <div class=\"panel-heading\">\n" +
3620 " DELETE Daily Partitions\n" +
3621 3461 " </div>\n" +
3462 " <div>\n" +
3463 " <p><strong>Channels:</strong></p>\n" +
3464 " <ul class=\"list-group\">\n" +
3465 " <li class=\"list-group-item\" ng-repeat=\"channel in ctrl.action.channels\">\n" +
3466 " <strong>{{channel.channel_visible_value}}</strong>\n" +
3467 " <div class=\"pull-right\">\n" +
3468 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3469 " <a class=\"btn btn-danger btn-xs\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3470 " <ul class=\"dropdown-menu\">\n" +
3471 " <li><a>No</a></li>\n" +
3472 " <li><a ng-click=\"ctrl.unBindChannel(channel)\">Yes</a></li>\n" +
3473 " </ul>\n" +
3474 " </span>\n" +
3475 " </div>\n" +
3476 " </li>\n" +
3477 " </ul>\n" +
3478 " <div class=\"form-group\" ng-if=\"ctrl.possibleChannels.length\">\n" +
3479 " <select class=\"form-control\" ng-model=\"ctrl.channelToBind\" ng-options=\"c as c.channel_visible_value for c in ctrl.possibleChannels |filter: c.supports_report_alerting\"></select>\n" +
3480 " <a class=\"btn btn-info\" ng-click=\"ctrl.bindChannel(channel, ctrl.action)\"><span class=\"fa fa-plus-circle\"></span> Add Channel</a>\n" +
3481 " </div>\n" +
3482 " <div class=\"alert alert-danger\" ng-if=\"!ctrl.possibleChannels.length\">\n" +
3483 " <span class=\"fa fa-exclamation-triangle \"></span>You need to create an alert channel before you can assign it to your rule.\n" +
3484 " </div>\n" +
3622 3485 "\n" +
3623 " <form name=\"partitions.dailyPartitionsForm\"\n" +
3624 " novalidate ng-submit=\"partitions.partitionsDelete('dailyPartitions')\"\n" +
3625 " class=\"form-inline\"\n" +
3626 " ng-class=\"{'has-error':partitions.dailyPartitionsForm.$invalid}\">\n" +
3486 " </div>\n" +
3487 " <hr/>\n" +
3488 " <p>Meeting following criteria:</p>\n" +
3489 " <form-errors errors=\"ctrl.errors\"></form-errors>\n" +
3490 " <rule rule=\"ctrl.action.rule\" rule-definitions=\"ctrl.ruleDefinitions\" parent-rule=\"null\" parent-obj=\"ctrl.action\"></rule>\n" +
3491 " </div>\n" +
3492 "</div>\n"
3493 );
3494
3495
3496 $templateCache.put('directives/rule_read_only/rule_read_only.html',
3497 "<div class=\"rule-read-only\">\n" +
3627 3498 "\n" +
3628 " <div class=\"panel-body\">\n" +
3499 " <span class=\"form-group\">\n" +
3500 " {{rule_ctrlr.readOnlyPossibleFields[rule_ctrlr.rule.field]}}\n" +
3501 " </span>\n" +
3629 3502 "\n" +
3630 " <input type=\"text\" name=\"confirm\"\n" +
3631 " placeholder=\"Enter CONFIRM to proceed\" class=\"form-control input-autosize\" confirm-validate required ng-model=\"partitions.dailyConfirm\">\n" +
3632 " <input type=\"submit\" class=\"btn btn-danger\" ng-disabled=\"partitions.dailyPartitionsForm.$invalid\">\n" +
3633 " <input type=\"checkbox\" ng-model=\"partitions.dailyChecked\" ng-change=\"partitions.setCheckedList('dailyPartitions')\"> Check All\n" +
3503 " <span ng-if=\"rule_ctrlr.rule.field != '__AND__' && rule_ctrlr.rule.field !='__OR__' && rule_ctrlr.rule.field !='__NOT__'\">\n" +
3504 " is {{rule_ctrlr.ruleDefinitions.allOps[rule_ctrlr.rule.op]}} {{rule_ctrlr.rule.value}}\n" +
3505 " </span>\n" +
3506 "\n" +
3507 " <span ng-if=\"rule_ctrlr.rule.field == '__AND__' || rule_ctrlr.rule.field =='__OR__' || rule_ctrlr.rule.field =='__NOT__'\">\n" +
3508 " <p ng-if=\"parent\"><strong>Subrules</strong></p>\n" +
3509 " <div ng-repeat=\"subrule in rule_ctrlr.rule.rules\" class=\"m-l-2\">\n" +
3634 3510 "\n" +
3511 " <div class=\"panel panel-default\">\n" +
3512 " <div class=\"panel-body form-inline\">\n" +
3513 " <recursive>\n" +
3514 " <rule-read-only rule=\"subrule\" rule-definitions=\"rule_ctrlr.ruleDefinitions\" parent-rule=\"null\" parent-obj=\"rule_ctrlr.parentObj\"></rule-read-only>\n" +
3515 " </recursive>\n" +
3516 " </div>\n" +
3635 3517 " </div>\n" +
3518 " </div>\n" +
3636 3519 "\n" +
3637 " <table class=\"table table-striped\">\n" +
3638 " <tr>\n" +
3639 " <th class=\"c1 date\">Date</th>\n" +
3640 " <th class=\"c2 indices\">Indices</th>\n" +
3641 " </tr>\n" +
3642 " <tr class=\"r{{$index}}\" ng-repeat=\"row in partitions.dailyPartitions\">\n" +
3643 " <td class=\"c1\">{{row[0]}}</td>\n" +
3644 " <td class=\"c2\">\n" +
3645 " <ul class=\"list-group\">\n" +
3646 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].elasticsearch\">\n" +
3647 " <input name=\"es_index\" type=\"checkbox\" ng-model=\"partition.checked\"> ES: {{partition.name}}\n" +
3648 " </li>\n" +
3649 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].pg\">\n" +
3650 " <input name=\"pg_index\" type=\"checkbox\" ng-model=\"partition.checked\"> PG: {{partition.name}}\n" +
3651 " </li>\n" +
3652 " </ul>\n" +
3653 " </td>\n" +
3654 " </tr>\n" +
3655 " </table>\n" +
3656 " </form>\n" +
3520 " </span>\n" +
3521 "</div>\n"
3522 );
3523
3524
3525 $templateCache.put('directives/rule/rule.html',
3526 "<div class=\"rule form-inline\">\n" +
3657 3527 "\n" +
3528 " <div class=\"form-group\">\n" +
3529 " <select class=\"form-control\"\n" +
3530 " ng-model=\"rule_ctrlr.rule.field\"\n" +
3531 " ng-change=\"rule_ctrlr.fieldChange()\"\n" +
3532 " ng-options=\"key as label for (key, label) in rule_ctrlr.ruleDefinitions.possibleFields\"></select>\n" +
3658 3533 " </div>\n" +
3659 3534 "\n" +
3660 " <div class=\"panel panel-default\">\n" +
3661 " <div class=\"panel-heading\">\n" +
3662 " DELETE Permanent Partitions\n" +
3663 " </div>\n" +
3535 " <div ng-if=\"rule_ctrlr.rule.field != '__AND__' && rule_ctrlr.rule.field !='__OR__' && rule_ctrlr.rule.field !='__NOT__'\" class=\"form-group\">\n" +
3664 3536 "\n" +
3665 " <form name=\"partitions.permanentPartitionsForm\" novalidate\n" +
3666 " ng-submit=\"partitions.partitionsDelete('permanentPartitions')\"\n" +
3667 " class=\"form-inline\"\n" +
3668 " ng-class=\"{'has-error':partitions.permanentPartitionsForm.$invalid}\">\n" +
3537 " <select ng-model=\"rule_ctrlr.rule.op\" class=\"form-control\"\n" +
3538 " ng-change=\"rule_ctrlr.setDirty()\"\n" +
3539 " ng-options=\"op as rule_ctrlr.ruleDefinitions.allOps[op] for op in rule_ctrlr.ruleDefinitions.fieldOps[rule_ctrlr.rule.field]\">\n" +
3540 " </select>\n" +
3669 3541 "\n" +
3542 " <input type=\"text\" placeholder=\"Value\" ng-model=\"rule_ctrlr.rule.value\" ng-change=\"rule_ctrlr.setDirty()\" class=\"form-control\">\n" +
3670 3543 "\n" +
3671 " <div class=\"panel-body\">\n" +
3544 " </div>\n" +
3672 3545 "\n" +
3673 " <div class=\"form-group\">\n" +
3674 " <input type=\"text\" name=\"confirm\"\n" +
3675 " placeholder=\"Enter CONFIRM to proceed\" class=\"form-control\" confirm-validate required ng-model=\"partitions.permConfirm\">\n" +
3676 " <input type=\"submit\" class=\"btn btn-danger\" ng-disabled=\"partitions.permanentPartitionsForm.$invalid\">\n" +
3677 " <input type=\"checkbox\" ng-model=\"partitions.permChecked\" ng-change=\"partitions.setCheckedList('permanentPartitions')\"> Check All\n" +
3546 " <span ng-if=\"rule_ctrlr.rule.field == '__AND__' || rule_ctrlr.rule.field =='__OR__' || rule_ctrlr.rule.field =='__NOT__'\">\n" +
3547 " <p ng-if=\"parent\"><strong>Subrules</strong></p>\n" +
3548 " <div ng-repeat=\"subrule in rule_ctrlr.rule.rules\" class=\"m-l-2\">\n" +
3549 " <div class=\"panel panel-default\">\n" +
3550 " <div class=\"panel-body form-inline\">\n" +
3551 " <recursive>\n" +
3552 " <rule rule=\"subrule\" rule-definitions=\"rule_ctrlr.ruleDefinitions\" parent-rule=\"rule_ctrlr.rule\" parent-obj=\"rule_ctrlr.parentObj\"></rule>\n" +
3553 " </recursive>\n" +
3678 3554 " </div>\n" +
3679 "\n" +
3680 3555 " </div>\n" +
3556 " </div>\n" +
3681 3557 "\n" +
3682 " <table class=\"table table-striped\">\n" +
3683 " <tr>\n" +
3684 " <th class=\"c1 date\">Date</th>\n" +
3685 " <th class=\"c2 indices\">Indices</th>\n" +
3686 " </tr>\n" +
3687 " <tr class=\"r{{$index}}\" ng-repeat=\"row in partitions.permanentPartitions\">\n" +
3688 " <td class=\"c1\">{{row[0]}}</td>\n" +
3689 " <td class=\"c2\">\n" +
3690 " <ul class=\"list-group\">\n" +
3691 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].elasticsearch\">\n" +
3692 " <input name=\"es_index\" type=\"checkbox\" ng-model=\"partition.checked\"> ES: {{partition.name}}\n" +
3693 " </li>\n" +
3694 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].pg\">\n" +
3695 " <input name=\"pg_index\" type=\"checkbox\" ng-model=\"partition.checked\"> PG: {{partition.name}}\n" +
3696 " </li>\n" +
3697 " </ul>\n" +
3698 " </td>\n" +
3699 " </tr>\n" +
3700 " </table>\n" +
3701 " </form>\n" +
3558 " <span ng-if=\"(rule_ctrlr.config.disable_subrules == false) == false\" class=\"btn btn-info\" ng-click=\"rule_ctrlr.add()\"><span class=\"fa fa-plus-circle\"></span> Add rule</span>\n" +
3559 "\n" +
3560 " </span>\n" +
3561 " <div class=\"pull-right\" ng-if=\"rule_ctrlr.parentRule\">\n" +
3562 " <span class=\"dropdown\" data-uib-dropdown>\n" +
3563 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3564 " <ul class=\"dropdown-menu\">\n" +
3565 " <li><a>No</a></li>\n" +
3566 " <li><a ng-click=\"rule_ctrlr.deleteRule(rule_ctrlr.parentRule, rule_ctrlr.rule)\">Yes</a></li>\n" +
3567 " </ul>\n" +
3568 " </span>\n" +
3569 " </div>\n" +
3570 "</div>\n"
3571 );
3572
3573
3574 $templateCache.put('templates/admin/applications/applications_list.html',
3575 "<ng-include src=\"'templates/loader.html'\" ng-if=\"applications.loading.applications\"></ng-include>\n" +
3576 "\n" +
3577 "<div class=\"panel panel-default\" ng-if=\"!applications.loading.applications\">\n" +
3578 " <div class=\"panel-heading\">\n" +
3579 "\n" +
3580 " Currently active applications: {{applications.applications.length}}\n" +
3702 3581 "\n" +
3703 3582 " </div>\n" +
3704 3583 "\n" +
3584 " <table st-table=\"displayedCollection\" st-safe-src=\"applications.applications\" class=\"table table-striped\">\n" +
3585 " <thead>\n" +
3586 " <tr>\n" +
3587 " <th st-sort=\"resource_name\"><a>Application name</a></th>\n" +
3588 " <th st-sort=\"owner_user_name\"><a>Owner User</a></th>\n" +
3589 " <th st-sort=\"owner_group_name\"><a>Owner Group</a></th>\n" +
3590 " <th class=\"options\"></th>\n" +
3591 " </tr>\n" +
3592 " <tr>\n" +
3593 " <th><input st-search=\"resource_name\" placeholder=\"search for application\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3594 " <th><input st-search=\"owner_user_name\" placeholder=\"search for user\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3595 " <th><input st-search=\"owner_group_name\" placeholder=\"search for group\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3596 " <th></th>\n" +
3597 " </tr>\n" +
3598 " </thead>\n" +
3599 " <tbody>\n" +
3600 "\n" +
3601 " <tr ng-repeat=\"resource in displayedCollection track by resource.resource_id\">\n" +
3602 " <td> {{resource.resource_name}}</td>\n" +
3603 " <td>{{resource.owner_user_name}}</td>\n" +
3604 " <td>{{resource.owner_group_name}}</td>\n" +
3605 " <td>\n" +
3606 " <a class=\"btn btn-default btn-sm\" data-ui-sref=\"applications.update({resourceId:resource.resource_id})\" data-toggle=\"tooltip\" title=\"Update application\"><span class=\"fa fa-cog\"></span></a>\n" +
3607 " </td>\n" +
3608 " </tr>\n" +
3609 " <tfoot>\n" +
3610 " <tr>\n" +
3611 " <td colspan=\"4\" class=\"text-center\">\n" +
3612 " <div st-pagination=\"\" st-items-by-page=\"100\" st-displayed-pages=\"7\"></div>\n" +
3613 " </td>\n" +
3614 " </tr>\n" +
3615 " </tfoot>\n" +
3616 " </tbody>\n" +
3617 " </table>\n" +
3618 "\n" +
3705 3619 "</div>\n"
3706 3620 );
3707 3621
3708 3622
3709 $templateCache.put('templates/admin/system.html',
3710 "<ng-include src=\"'templates/loader.html'\" ng-if=\"system.loading.system\"></ng-include>\n" +
3623 $templateCache.put('templates/admin/configs/edit.html',
3624 "<ng-include src=\"'templates/loader.html'\" ng-if=\"configs.loading.config\"></ng-include>\n" +
3711 3625 "\n" +
3712 "<div ng-if=\"system.loading.system == false\">\n" +
3713 " <div class=\"row\">\n" +
3714 " <div class=\"col-sm-12\">\n" +
3715 " <div class=\"panel panel-default\">\n" +
3716 " <div class=\"panel-heading\">\n" +
3717 " <h3 class=\"panel-title\">\n" +
3718 " System Info\n" +
3719 " </h3>\n" +
3626 "<div class=\"panel panel-default\" ng-show=\"!configs.loading.config\">\n" +
3627 " <div class=\"panel-heading\">\n" +
3628 " <h3 class=\"panel-title\">Basic Configuration</h3>\n" +
3629 " </div>\n" +
3630 " <div class=\"panel-body\">\n" +
3631 " <h2>Visual</h2>\n" +
3632 " <form class=\"form-horizontal\">\n" +
3633 " <div class=\"form-group\">\n" +
3634 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3635 " Footer HTML\n" +
3636 " </label>\n" +
3637 " <div class=\"col-sm-8 col-lg-9\">\n" +
3638 " <textarea class=\"form-control\" type=\"text\" ng-model=\"configs.configs.global.template_footer_html.value\" style=\"min-height: 150px\"></textarea>\n" +
3720 3639 " </div>\n" +
3721 " <div class=\"panel-body\">\n" +
3640 " </div>\n" +
3641 " </form>\n" +
3722 3642 "\n" +
3723 " <p><strong>System Load:</strong>\n" +
3724 " 1min: {{system.systemLoad[0]}}, 5min: {{system.systemLoad[1]}}, 15min: {{system.systemLoad[2]}}\n" +
3725 " </p>\n" +
3726 " <p><strong>Awaiting tasks:</strong>\n" +
3727 " <ul>\n" +
3728 " <li>reports: {{system.queueStats.waiting_reports}}</li>\n" +
3729 " <li>logs: {{system.queueStats.waiting_logs}}</li>\n" +
3730 " <li>metrics: {{system.queueStats.waiting_metrics}}</li>\n" +
3731 " <li>other: {{system.queueStats.waiting_other}}</li>\n" +
3732 " </ul>\n" +
3733 " </p>\n" +
3734 " <p><strong>Queue stats from last minute:</strong>\n" +
3735 " <ul>\n" +
3736 " <li>Processed reports: {{system.queueStats.processed_reports}}</li>\n" +
3737 " <li>Processed logs: {{system.queueStats.processed_logs}}</li>\n" +
3738 " <li>Processed metrics: {{system.queueStats.processed_metrics}}</li>\n" +
3739 " </ul>\n" +
3740 " </p>\n" +
3643 " <h2>Functional</h2>\n" +
3741 3644 "\n" +
3742 " <p><strong>Disks:</strong>\n" +
3743 " <ul>\n" +
3744 " <li ng-repeat=\"disk in system.disks\">\n" +
3745 " <strong>{{disk.device}}</strong> {{disk.free}}/{{disk.total}}, {{disk.percentage}}% used\n" +
3746 " </li>\n" +
3747 " </ul>\n" +
3748 " </p>\n" +
3645 " <form class=\"form-horizontal\">\n" +
3646 " <div class=\"form-group\">\n" +
3647 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3648 " Show user groups to non-admin users\n" +
3649 " </label>\n" +
3650 " <div class=\"col-sm-8 col-lg-9\">\n" +
3651 " <button type=\"button\" class=\"btn btn-default\" ng-model=\"configs.configs.global.list_groups_to_non_admins.value\" uib-btn-checkbox>\n" +
3652 " Enable\n" +
3653 " </button>\n" +
3654 " </div>\n" +
3655 " </div>\n" +
3656 " </form>\n" +
3749 3657 "\n" +
3750 " <p><strong>Process stats:</strong>\n" +
3751 " <ul>\n" +
3752 " <li>FD soft limits: {{system.selfInfo.fds.soft}}</li>\n" +
3753 " <li>FD hard limits: {{system.selfInfo.fds.hard}}</li>\n" +
3754 " <li>Memlock soft limits: {{system.selfInfo.memlock.soft}}</li>\n" +
3755 " <li>Memlock hard limits: {{system.selfInfo.memlock.hard}}</li>\n" +
3756 " </ul>\n" +
3757 " </p>\n" +
3658 " <h2>Global Rate Limiting</h2>\n" +
3758 3659 "\n" +
3660 " <form class=\"form-horizontal\">\n" +
3661 " <div class=\"form-group\">\n" +
3662 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3663 " Ignore reports per minute/per application\n" +
3664 " </label>\n" +
3665 " <div class=\"col-sm-8 col-lg-9\">\n" +
3666 " <input class=\"form-control\" type=\"number\" ng-model=\"configs.configs.global.per_application_reports_rate_limit.value\" />\n" +
3759 3667 " </div>\n" +
3760 3668 " </div>\n" +
3761 " </div>\n" +
3762 " </div>\n" +
3763 " <div class=\"row\">\n" +
3764 " <div class=\"col-sm-12\">\n" +
3765 "\n" +
3766 " <div class=\"panel panel-default\">\n" +
3767 " <div class=\"panel-body\">\n" +
3768 3669 "\n" +
3769 " <uib-tabset>\n" +
3770 " <uib-tab>\n" +
3771 " <uib-tab-heading>\n" +
3772 " Postgresql Tables\n" +
3773 " </uib-tab-heading>\n" +
3670 " <div class=\"form-group\">\n" +
3671 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3672 " Ignore logs per minute/per application\n" +
3673 " </label>\n" +
3674 " <div class=\"col-sm-8 col-lg-9\">\n" +
3675 " <input class=\"form-control\" type=\"number\" ng-model=\"configs.configs.global.per_application_logs_rate_limit.value\" />\n" +
3676 " </div>\n" +
3677 " </div>\n" +
3774 3678 "\n" +
3775 " <table class=\"table table-striped\">\n" +
3776 " <thead>\n" +
3777 " <tr>\n" +
3778 " <th class=\"c1 tablename\">Table name</th>\n" +
3779 " <th class=\"c2 size_human\">Size</th>\n" +
3780 " </tr>\n" +
3781 " </thead>\n" +
3782 " <tbody>\n" +
3783 " <tr class=\"r{{$index}}\" ng-repeat=\"row in system.DBtables\">\n" +
3784 " <td class=\"c1\">{{row.table_name}}</td>\n" +
3785 " <td class=\"c2\">{{row.size_human}}</td>\n" +
3786 " </tr>\n" +
3787 " </tbody>\n" +
3788 " </table>\n" +
3679 " <div class=\"form-group\">\n" +
3680 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
3681 " Ignore metrics per minute/per application\n" +
3682 " </label>\n" +
3683 " <div class=\"col-sm-8 col-lg-9\">\n" +
3684 " <input class=\"form-control\" type=\"number\" ng-model=\"configs.configs.global.per_application_metrics_rate_limit.value\" />\n" +
3685 " </div>\n" +
3686 " </div>\n" +
3789 3687 "\n" +
3790 " </uib-tab>\n" +
3688 " </form>\n" +
3791 3689 "\n" +
3792 " <uib-tab>\n" +
3793 " <uib-tab-heading>\n" +
3794 " Elasticsearch Indices\n" +
3795 " </uib-tab-heading>\n" +
3690 " <hr/>\n" +
3796 3691 "\n" +
3797 " <table class=\"table table-striped\">\n" +
3798 " <thead>\n" +
3799 " <tr>\n" +
3800 " <th class=\"c1 tablename\">Index name</th>\n" +
3801 " <th class=\"c2 size_human\">Size</th>\n" +
3802 " </tr>\n" +
3803 " </thead>\n" +
3804 " <tbody>\n" +
3805 " <tr class=\"r{{$index}}\" ng-repeat=\"row in system.ESIndices\">\n" +
3806 " <td class=\"c1\">{{row.name}}</td>\n" +
3807 " <td class=\"c2\">{{row.size_human}}</td>\n" +
3808 " </tr>\n" +
3809 " </tbody>\n" +
3810 " </table>\n" +
3692 " <a class=\"btn btn-primary\" ng-click=\"configs.save()\">Save configuration</a>\n" +
3693 " </div>\n" +
3811 3694 "\n" +
3812 " </uib-tab>\n" +
3695 "</div>\n" +
3813 3696 "\n" +
3814 " <uib-tab>\n" +
3815 " <uib-tab-heading>\n" +
3816 " Processes\n" +
3817 " </uib-tab-heading>\n" +
3818 3697 "\n" +
3819 " <table class=\"table table-striped\">\n" +
3820 " <thead>\n" +
3821 " <tr>\n" +
3822 " <th class=\"c1 tablename\">Owner</th>\n" +
3823 " <th class=\"c2 tablename\">PID</th>\n" +
3824 " <th class=\"c3 tablename\">CPU</th>\n" +
3825 " <th class=\"c4 tablename\">MEM</th>\n" +
3826 " <th class=\"c4 tablename\">Name</th>\n" +
3827 " </tr>\n" +
3828 " </thead>\n" +
3829 " <tbody>\n" +
3830 " <tr class=\"r{{$index}}\" ng-repeat-start=\"row in system.processInfo\">\n" +
3831 " <td class=\"c1\">{{row.owner}}</td>\n" +
3832 " <td class=\"c2\">{{row.pid}}</td>\n" +
3833 " <td class=\"c3\">{{row.cpu}}</td>\n" +
3834 " <td class=\"c4\">{{row.mem_usage}} ({{row.mem_percentage}}%)</td>\n" +
3835 " <td class=\"c5\"><strong>{{row.name}}</strong></td>\n" +
3836 " </tr>\n" +
3837 " <tr ng-repeat-end>\n" +
3838 " <td colspan=\"5\" class=\"word-wrap\">{{row.command}}</td>\n" +
3839 " </tr>\n" +
3840 " </tbody>\n" +
3841 " </table>\n" +
3842 "\n" +
3843 " </uib-tab>\n" +
3844 "\n" +
3845 " <uib-tab>\n" +
3846 " <uib-tab-heading>\n" +
3847 " Python packages\n" +
3848 " </uib-tab-heading>\n" +
3849 "\n" +
3850 " <table class=\"table\">\n" +
3851 " <tr ng-repeat=\"package in system.packages\">\n" +
3852 " <td>{{package.name}}</td>\n" +
3853 " <td>{{package.version}}</td>\n" +
3854 " </tr>\n" +
3855 " </table>\n" +
3856 " </p>\n" +
3857 "\n" +
3858 " </uib-tab>\n" +
3859 "\n" +
3860 " </uib-tabset>\n" +
3861 " </div>\n" +
3862 " </div>\n" +
3863 " </div>\n" +
3698 "<div class=\"panel panel-default\">\n" +
3699 " <div class=\"panel-heading\">\n" +
3700 " <h3 class=\"panel-title\">Plugin Configuration</h3>\n" +
3701 " </div>\n" +
3702 " <div class=\"panel-body\">\n" +
3703 " <plugin-config section=\"'admin.config'\">\n" +
3704 " </plugin-config>\n" +
3864 3705 " </div>\n" +
3865 3706 "</div>\n"
3866 3707 );
3867 3708
3868 3709
3869 $templateCache.put('templates/admin/users/parent_view.html',
3710 $templateCache.put('templates/admin/configs/parent_view.html',
3870 3711 "<div ui-view></div>"
3871 3712 );
3872 3713
3873 3714
3874 $templateCache.put('templates/admin/users/users_create.html',
3875 "<ng-include src=\"'templates/loader.html'\" ng-if=\"user.loading.user\"></ng-include>\n" +
3715 $templateCache.put('templates/admin/groups/groups_create.html',
3716 "<ng-include src=\"'templates/loader.html'\" ng-if=\"group.loading.group\"></ng-include>\n" +
3876 3717 "\n" +
3877 "<div ng-show=\"!user.loading.user\">\n" +
3718 "<div ng-show=\"!group.loading.group\">\n" +
3878 3719 "\n" +
3879 3720 " <div class=\"panel panel-default\">\n" +
3880 3721 " <div class=\"panel-body\">\n" +
3881 "\n" +
3882 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\" ng-if=\"user.user.id\">\n" +
3883 " <a class=\"btn btn-default\" data-uib-dropdown-toggle><span class=\"fa fa-user-secret\"></span> Re-login to user</a>\n" +
3884 " <ul class=\"dropdown-menu\">\n" +
3885 " <li><a>No</a></li>\n" +
3886 " <li><a ng-click=\"user.reloginUser(user)\">Yes</a></li>\n" +
3887 " </ul>\n" +
3888 " </span>\n" +
3889 "\n" +
3890 " <form name=\"user.profileForm\" class=\"form-horizontal\" ng-submit=\"user.createUser()\">\n" +
3891 " <div class=\"form-group\" id=\"row-user_name\">\n" +
3892 " <data-form-errors errors=\"user.profileForm.ae_validation.user_name\"></data-form-errors>\n" +
3893 " <label for=\"user_name\" id=\"label-user_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3894 " User name\n" +
3895 " <span class=\"required\">*</span>\n" +
3896 " </label>\n" +
3897 " <div class=\"col-sm-8 col-lg-9\">\n" +
3898 " <input class=\"form-control\" id=\"user_name\" name=\"user_name\" type=\"text\" ng-model=\"user.user.user_name\">\n" +
3899 " </div>\n" +
3900 " </div>\n" +
3901 "\n" +
3902 " <div class=\"form-group\" id=\"row-user_password\">\n" +
3903 " <data-form-errors errors=\"user.profileForm.ae_validation.user_password\"></data-form-errors>\n" +
3904 " <label for=\"user_password\" id=\"label-user_password\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3905 " Password\n" +
3722 " <form name=\"group.groupForm\" class=\"form-horizontal\" ng-submit=\"group.createGroup()\">\n" +
3723 " <div class=\"form-group\" id=\"row-group_name\">\n" +
3724 " <data-form-errors errors=\"group.groupForm.ae_validation.group_name\"></data-form-errors>\n" +
3725 " <label for=\"group_name\" id=\"label-group_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3726 " Group name\n" +
3906 3727 " <span class=\"required\">*</span>\n" +
3907 3728 " </label>\n" +
3908 3729 " <div class=\"col-sm-8 col-lg-9\">\n" +
3909 " <input class=\"form-control\" id=\"user_password\" name=\"user_password\" type=\"password\" ng-model=\"user.user.user_password\">\n" +
3910 "\n" +
3911 " <p class=\"m-t-1\"><a class=\"btn btn-info btn-sm\" ng-click=\"user.generatePassword()\"><span class=\"fa fa-lock\"></span> Generate password</a>\n" +
3912 " <span ng-show=\"user.gen_pass.length > 0\">(generated password: {{user.gen_pass}})</span>\n" +
3913 " </p>\n" +
3914 "\n" +
3730 " <input class=\"form-control\" id=\"group_name\" name=\"group_name\" type=\"text\" ng-model=\"group.group.group_name\">\n" +
3915 3731 " </div>\n" +
3916 3732 " </div>\n" +
3917 3733 "\n" +
3918 "\n" +
3919 " <div class=\"form-group\" id=\"row-email\">\n" +
3920 " <data-form-errors errors=\"user.profileForm.ae_validation.email\"></data-form-errors>\n" +
3921 " <label for=\"email\" id=\"label-email\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3922 " Email Address\n" +
3734 " <div class=\"form-group\" id=\"row-description\">\n" +
3735 " <data-form-errors errors=\"group.groupForm.ae_validation.description\"></data-form-errors>\n" +
3736 " <label for=\"description\" id=\"label-description\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3737 " Description\n" +
3923 3738 " <span class=\"required\">*</span>\n" +
3924 3739 " </label>\n" +
3925 3740 " <div class=\"col-sm-8 col-lg-9\">\n" +
3926 " <input class=\"form-control\" id=\"email\" name=\"email\" type=\"text\" ng-model=\"user.user.email\">\n" +
3927 " </div>\n" +
3928 " </div>\n" +
3929 "\n" +
3930 " <div class=\"form-group\" id=\"row-first_name\">\n" +
3931 " <data-form-errors errors=\"user.profileForm.ae_validation.first_name\"></data-form-errors>\n" +
3932 " <label for=\"first_name\" id=\"label-first_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3933 " First Name\n" +
3934 " </label>\n" +
3935 " <div class=\"col-sm-8 col-lg-9\">\n" +
3936 " <input class=\"form-control\" id=\"first_name\" name=\"first_name\" type=\"text\" ng-model=\"user.user.first_name\">\n" +
3937 " </div>\n" +
3938 " </div>\n" +
3939 " <div class=\"form-group\" id=\"row-last_name\">\n" +
3940 " <data-form-errors errors=\"user.profileForm.ae_validation.last_name\"></data-form-errors>\n" +
3941 " <label for=\"last_name\" id=\"label-last_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3942 " Last Name\n" +
3943 " </label>\n" +
3944 " <div class=\"col-sm-8 col-lg-9\">\n" +
3945 " <input class=\"form-control\" id=\"last_name\" name=\"last_name\" type=\"text\" ng-model=\"user.user.last_name\">\n" +
3741 " <input class=\"form-control\" id=\"description\" name=\"description\" type=\"text\" ng-model=\"group.group.description\">\n" +
3946 3742 " </div>\n" +
3947 3743 " </div>\n" +
3948 3744 "\n" +
3949 " <div class=\"form-group\" id=\"row-status\">\n" +
3950 " <data-form-errors errors=\"user.profileForm.ae_validation.status\"></data-form-errors>\n" +
3951 " <label for=\"status\" id=\"label-status\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3952 " Active\n" +
3953 " </label>\n" +
3954 " <div class=\"col-sm-8 col-lg-9\">\n" +
3955 " <input checked class=\"form-control\" id=\"status\" name=\"status\" type=\"checkbox\" ng-model=\"user.user.status\">\n" +
3956 " </div>\n" +
3957 " </div>\n" +
3958 3745 "\n" +
3959 3746 " <div class=\"form-group\" id=\"row-submit\">\n" +
3960 3747 " <label for=\"submit\" id=\"label-submit\" class=\"control-label col-sm-4 col-lg-3\">\n" +
3961 3748 " </label>\n" +
3962 3749 " <div class=\"col-sm-8 col-lg-9\">\n" +
3963 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"{{$state.params.userId ? 'Update' : 'Add'}} User\">\n" +
3750 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"{{$state.params.groupId ? 'Update' : 'Add'}} Group\">\n" +
3964 3751 " </div>\n" +
3965 3752 " </div>\n" +
3966 3753 " </form>\n" +
3967 3754 " </div>\n" +
3968 3755 " </div>\n" +
3969 3756 "\n" +
3970 3757 "\n" +
3971 " <div class=\"panel panel-default\" ng-if=\"user.user.id\">\n" +
3758 " <div class=\"panel panel-default\" ng-if=\"group.group.id\">\n" +
3972 3759 " <div class=\"panel-heading\">\n" +
3973 " <h3 class=\"panel-title\">Permission Summary</h3>\n" +
3760 " <h3 class=\"panel-title\">Permissions summary</h3>\n" +
3974 3761 " </div>\n" +
3975 3762 " <div class=\"panel-body\">\n" +
3976 3763 " <h3>Direct application permissions</h3>\n" +
3977 3764 "\n" +
3978 3765 " <ul class=\"list-group\">\n" +
3979 " <li ng-repeat=\"perm in user.resourcePermissions.user.application\" class=\"animate-repeat list-group-item\">\n" +
3766 " <li ng-repeat=\"perm in group.resourcePermissions.group.application\" class=\"animate-repeat list-group-item\">\n" +
3980 3767 " <strong>{{ perm.self.resource_name }}</strong>\n" +
3768 "\n" +
3981 3769 " <div class=\"pull-right\">\n" +
3982 3770 "\n" +
3983 3771 " <span class=\"btn btn-primary btn-xs m-r-1\" disabled ng-repeat=\"perm_name in perm.permissions\">{{ perm.self.owner ? 'Resource owner' : perm_name }}</span>\n" +
3984 3772 "\n" +
3985 3773 " <a class=\"btn btn-default btn-xs\" data-uib-tooltip=\"Visit Application\" data-ui-sref=\"applications.update({resourceId:perm.self.resource_id})\">\n" +
3986 3774 " <span class=\"fa fa-cog\"></span>\n" +
3987 3775 " </a>\n" +
3988 3776 " </div>\n" +
3989 3777 " </li>\n" +
3990 3778 " </ul>\n" +
3991 3779 "\n" +
3992 3780 " <h3>Direct dashboard permissions</h3>\n" +
3993 3781 "\n" +
3994 3782 " <ul class=\"list-group\">\n" +
3995 " <li ng-repeat=\"perm in user.resourcePermissions.user.dashboard\" class=\"animate-repeat list-group-item\">\n" +
3783 " <li ng-repeat=\"perm in group.resourcePermissions.group.dashboard\" class=\"animate-repeat list-group-item\">\n" +
3996 3784 " <strong>{{ perm.self.resource_name }}</strong>\n" +
3997 " <div class=\"pull-right\">\n" +
3998 3785 "\n" +
3786 " <div class=\"pull-right\">\n" +
3999 3787 " <span class=\"btn btn-primary btn-xs m-r-1\" disabled ng-repeat=\"perm_name in perm.permissions\">{{ perm.self.owner ? 'Resource owner' : perm_name }}</span>\n" +
4000 3788 "\n" +
4001 3789 " <a class=\"btn btn-default btn-xs\" data-uib-tooltip=\"Visit Dashboard\" data-ui-sref=\"dashboard.update({resourceId:perm.self.resource_id})\">\n" +
4002 3790 " <span class=\"fa fa-cog\"></span>\n" +
4003 3791 " </a>\n" +
4004 3792 " </div>\n" +
4005 3793 " </li>\n" +
4006 3794 " </ul>\n" +
4007 3795 "\n" +
4008 3796 " </div>\n" +
4009 3797 "\n" +
4010 3798 " </div>\n" +
4011 3799 "\n" +
4012 3800 "\n" +
4013 "</div>\n"
4014 );
4015
4016
4017 $templateCache.put('templates/admin/users/users_list.html',
4018 "<ng-include src=\"'templates/loader.html'\" ng-if=\"users.loading.users\"></ng-include>\n" +
4019 "\n" +
4020 "<div ng-show=\"!users.loading.users\">\n" +
4021 "\n" +
4022 " <div class=\"panel panel-default\">\n" +
4023 "\n" +
3801 " <div class=\"panel panel-default\" ng-if=\"group.group.id\">\n" +
4024 3802 " <div class=\"panel-heading\">\n" +
4025 " {{users.activeUsers}} active out of {{users.users.length}} users\n" +
3803 " <h3 class=\"panel-title\">User list</h3>\n" +
4026 3804 " </div>\n" +
3805 " <div class=\"panel-body\">\n" +
3806 "\n" +
3807 " <form name=\"add_permission\" class=\"form-inline\" ng-submit=\"group.addUser()\">\n" +
3808 " <div class=\"form-group\">\n" +
3809 " <input placeholder=\"Username or email\" type=\"text\" class=\"autocomplete form-control\" ng-model=\"group.form.autocompleteUser\" uib-typeahead=\"u for u in group.searchUsers($viewValue) | limitTo:8\" typeahead-loading=\"searchingUsers\" typeahead-wait-ms=\"250\"/>\n" +
3810 " </div>\n" +
3811 " <div class=\"form-group\">\n" +
3812 " <button class=\"btn btn-info\" ng-disabled=\"!group.form.autocompleteUser\"><span class=\"fa fa-user\"></span> Add user</button>\n" +
3813 " </div>\n" +
3814 " </form>\n" +
4027 3815 "\n" +
3816 " </div>\n" +
4028 3817 "\n" +
4029 " <table st-table=\"displayedCollection\" st-safe-src=\"users.users\" class=\"table table-striped\">\n" +
3818 " <table st-table=\"displayedCollection\" st-safe-src=\"group.users\" class=\"table table-striped\">\n" +
4030 3819 " <thead>\n" +
4031 3820 " <tr>\n" +
4032 " <th class=\"user_name\" st-sort=\"user_name\"><a>Username</a></th>\n" +
4033 " <th class=\"email\" st-sort=\"email\"><a>Email</a></th>\n" +
4034 " <th class=\"status\" st-sort=\"status\"><a>Status</a></th>\n" +
3821 " <th st-sort=\"user_name\"><a>Username</a></th>\n" +
3822 " <th st-sort=\"email\"><a>Email</a></th>\n" +
3823 " <th st-sort=\"status\"><a>Status</a></th>\n" +
4035 3824 " <th st-sort=\"first_name\"><a>First Name</a></th>\n" +
4036 3825 " <th st-sort=\"last_name\"><a>Last Name</a></th>\n" +
4037 3826 " <th st-sort=\"last_login_date\"><a>Last login</a></th>\n" +
4038 " <th class=\"options\"></th>\n" +
3827 " <th class=\"options\" style=\"width: 130px\"></th>\n" +
4039 3828 " </tr>\n" +
4040 3829 " <tr>\n" +
4041 3830 " <th><input st-search=\"user_name\" placeholder=\"search for user name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4042 3831 " <th><input st-search=\"email\" placeholder=\"search for email\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4043 3832 " <th></th>\n" +
4044 3833 " <th><input st-search=\"first_name\" placeholder=\"search for first name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4045 3834 " <th><input st-search=\"last_name\" placeholder=\"search for last name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4046 3835 " <th><input st-search=\"last_login_date\" placeholder=\"search for last name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4047 3836 " <th></th>\n" +
4048 3837 " </tr>\n" +
4049 3838 " </thead>\n" +
4050 3839 " <tbody>\n" +
4051 3840 "\n" +
4052 " <tr ng-repeat=\"user in displayedCollection track by user.id\">\n" +
3841 " <tr ng-repeat=\"user in displayedCollection\">\n" +
4053 3842 " <td><img src=\"{{user.gravatar_url}}\" class=\"avatar\"> {{user.user_name}}</td>\n" +
4054 " <td class=\"word-wrap small\">{{user.email}}</td>\n" +
3843 " <td>{{user.email}}</td>\n" +
4055 3844 " <td class=\"text-center\"><span class=\"fa\" ng-class=\"{'fa-check-circle':user.status, 'fa-times':!user.status}\"></span></td>\n" +
4056 " <td class=\"word-wrap small\">{{user.first_name}}</td>\n" +
4057 " <td class=\"word-wrap small\">{{user.last_name}}</td>\n" +
4058 " <td><span data-uib-tooltip=\"{{user.last_login_date}}\" class=\"small\">{{user.last_login_date | isoToRelativeTime}}</span></td>\n" +
3845 " <td>{{user.first_name}}</td>\n" +
3846 " <td>{{user.last_name}}</td>\n" +
3847 " <td><span data-uib-tooltip=\"{{user.last_login_date}}\">{{user.last_login_date | isoToRelativeTime}}</span></td>\n" +
4059 3848 " <td>\n" +
4060 3849 " <a class=\"btn btn-default btn-sm\" data-ui-sref=\"admin.user.update({userId:user.id})\"><span class=\"fa fa-cog\"></span></a>\n" +
4061 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
4062 " <a class=\"btn btn-danger btn-sm\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
4063 " <ul class=\"dropdown-menu\">\n" +
4064 " <li><a>No</a></li>\n" +
4065 " <li><a ng-click=\"users.removeUser(user)\">Yes</a></li>\n" +
4066 " </ul>\n" +
4067 " </span>\n" +
3850 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
3851 " <a class=\"btn btn-danger btn-sm\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3852 " <ul class=\"dropdown-menu\">\n" +
3853 " <li><a>No</a></li>\n" +
3854 " <li><a ng-click=\"group.removeUser(user)\">Yes</a></li>\n" +
3855 " </ul>\n" +
3856 " </span>\n" +
4068 3857 " </tr>\n" +
4069 3858 " <tfoot>\n" +
4070 3859 " <tr>\n" +
4071 " <td colspan=\"6\" class=\"text-center\">\n" +
4072 " <div st-pagination=\"\" st-items-by-page=\"100\" st-displayed-pages=\"7\"></div>\n" +
3860 " <td colspan=\"7\" class=\"text-center\">\n" +
3861 " <div st-pagination=\"\" st-items-by-page=\"50\" st-displayed-pages=\"7\"></div>\n" +
4073 3862 " </td>\n" +
4074 3863 " </tr>\n" +
4075 3864 " </tfoot>\n" +
4076 3865 " </tbody>\n" +
4077 3866 " </table>\n" +
4078 3867 "\n" +
4079 "\n" +
4080 3868 " </div>\n" +
4081 "</div>\n"
4082 );
4083
4084
4085 $templateCache.put('templates/applications/applications_purge_logs.html',
4086 "<ng-include src=\"'templates/loader.html'\" ng-if=\"applications_purge.loading.applications\"></ng-include>\n" +
4087 "\n" +
4088 "<div ng-show=\"!applications_purge.loading.applications\">\n" +
4089 " <div class=\"panel panel-default\">\n" +
4090 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4091 " <div class=\"panel-body\">\n" +
4092 "\n" +
4093 " <form method=\"post\" class=\"form-horizontal\" name=\"applications_purge.form\" ng-submit=\"applications_purge.purgeLogs()\">\n" +
4094 " <div class=\"form-group\">\n" +
4095 " <label class=\"control-label col-sm-3 col-lg-2\">Application:</label>\n" +
4096 "\n" +
4097 " <div class=\"col-sm-9 col-lg-10 form-inline\">\n" +
4098 " <select ng-model=\"applications_purge.selectedResource\" ng-change=\"applications_purge.getCommonKeys()\"\n" +
4099 " ng-options=\"r.resource_id as r.resource_name for r in applications_purge.applications\" class=\"form-control\"></select>\n" +
4100 " </div>\n" +
4101 " </div>\n" +
4102 "\n" +
4103 " <div class=\"form-group\">\n" +
4104 " <label class=\"control-label col-sm-3 col-lg-2\">Namespace:</label>\n" +
4105 "\n" +
4106 " <div class=\"col-sm-9 col-lg-10\">\n" +
4107 " <input type=\"text\" name=\"namespace\" ng-model=\"applications_purge.namespace\"\n" +
4108 " placeholder=\"Namespace to filter on\" uib-typeahead=\"ns for ns in applications_purge.commonNamespaces\"\n" +
4109 " class=\"form-control\">\n" +
4110 " </div>\n" +
4111 " </div>\n" +
4112 3869 "\n" +
4113 " <div class=\"form-group\">\n" +
4114 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
4115 "\n" +
4116 " <div class=\"col-sm-8 col-lg-9 \">\n" +
4117 " <input class=\"form-control btn btn-primary\" name=\"submit\" type=\"submit\" value=\"Purge logs meeting the criteria\">\n" +
4118 " </div>\n" +
4119 " </div>\n" +
4120 3870 "\n" +
4121 " </form>\n" +
4122 " </div>\n" +
4123 " </div>\n" +
4124 3871 "</div>\n"
4125 3872 );
4126 3873
4127 3874
4128 $templateCache.put('templates/applications/applications_update.html',
4129 "<ng-include src=\"'templates/loader.html'\" ng-if=\"application.loading.application\"></ng-include>\n" +
4130 "\n" +
4131 "<div ng-show=\"!application.loading.application\">\n" +
3875 $templateCache.put('templates/admin/groups/groups_list.html',
3876 "<ng-include src=\"'templates/loader.html'\" ng-if=\"groups.loading.groups\"></ng-include>\n" +
4132 3877 "\n" +
4133 " <div class=\"panel panel-default\">\n" +
4134 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4135 " <div class=\"panel-body\">\n" +
3878 "<div class=\"panel panel-default\" ng-show=\"!groups.loading.groups\">\n" +
4136 3879 "\n" +
4137 " <div class=\"row\" ng-show=\"application.resource.resource_id\">\n" +
4138 " <div class=\"col-sm-6\">\n" +
3880 " <table st-table=\"displayedCollection\" st-safe-src=\"groups.groups\" class=\"table table-striped\">\n" +
3881 " <thead>\n" +
3882 " <tr>\n" +
3883 " <th st-sort=\"group_name\"><a>Group name</a></th>\n" +
3884 " <th st-sort=\"description\"><a>Description</a></th>\n" +
3885 " <th st-sort=\"members\"><a>Member count</a></th>\n" +
3886 " <th class=\"options\"></th>\n" +
3887 " </tr>\n" +
3888 " <tr>\n" +
3889 " <th><input st-search=\"group_name\" placeholder=\"search for group name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3890 " <th><input st-search=\"description\" placeholder=\"search for description\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
3891 " <th></th>\n" +
3892 " <th></th>\n" +
3893 " </tr>\n" +
3894 " </thead>\n" +
3895 " <tbody>\n" +
4139 3896 "\n" +
4140 " <uib-tabset>\n" +
4141 " <uib-tab>\n" +
4142 " <uib-tab-heading>\n" +
4143 " API keys\n" +
4144 " </uib-tab-heading>\n" +
3897 " <tr ng-repeat=\"group in displayedCollection track by group.id\">\n" +
3898 " <td>{{group.group_name}}</td>\n" +
3899 " <td>{{group.description}}</td>\n" +
3900 " <td>{{group.member_count}}</td>\n" +
3901 " <td>\n" +
3902 " <a class=\"btn btn-default btn-sm\" data-ui-sref=\"admin.group.update({groupId:group.id})\"><span class=\"fa fa-cog\"></span></a>\n" +
3903 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
3904 " <a class=\"btn btn-danger btn-sm\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
3905 " <ul class=\"dropdown-menu\">\n" +
3906 " <li><a>No</a></li>\n" +
3907 " <li><a ng-click=\"groups.removeGroup(group)\">Yes</a></li>\n" +
3908 " </ul>\n" +
3909 " </span>\n" +
3910 " </tr>\n" +
3911 " <tfoot>\n" +
3912 " <tr>\n" +
3913 " <td colspan=\"4\" class=\"text-center\">\n" +
3914 " <div st-pagination=\"\" st-items-by-page=\"100\" st-displayed-pages=\"7\"></div>\n" +
3915 " </td>\n" +
3916 " </tr>\n" +
3917 " </tfoot>\n" +
3918 " </tbody>\n" +
3919 " </table>\n" +
4145 3920 "\n" +
4146 " <p><strong>PRIVATE API KEY:</strong></p>\n" +
4147 " <p>\n" +
4148 " <div class=\"well well-sm\">{{ application.resource.api_key }}</div>\n" +
4149 " </p>\n" +
4150 " <p><strong>PUBLIC API KEY</strong> (for javascript clients):</p>\n" +
4151 " <p>\n" +
4152 " <div class=\"well well-sm\">{{ application.resource.public_key }}</div>\n" +
4153 " </p>\n" +
4154 " <p><small>Your key will be used to identify to which application your data\n" +
4155 " belongs to please keep them private at all times.</small></p>\n" +
3921 "</div>\n" +
3922 "\n"
3923 );
3924
3925
3926 $templateCache.put('templates/admin/groups/parent_view.html',
3927 "<div ui-view></div>"
3928 );
3929
3930
3931 $templateCache.put('templates/admin/parent_view.html',
3932 "<div class=\"col-sm-3\" id=\"menu\">\n" +
3933 " <div class=\"panel panel-default\">\n" +
3934 " <div class=\"panel-heading\">Users and groups</div>\n" +
3935 " <ul class=\"list-group\">\n" +
3936 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.user.list\"> Users</a></li>\n" +
3937 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.user.create\"> Create user</a></li>\n" +
3938 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.group.list\"> Groups</a></li>\n" +
3939 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.group.create\"> Create group</a></li>\n" +
3940 " </ul>\n" +
3941 " </div>\n" +
3942 " <div class=\"panel panel-default\">\n" +
3943 " <div class=\"panel-heading\">Resources</div>\n" +
3944 " <ul class=\"list-group\">\n" +
3945 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.application.list\"> List applications</a></li>\n" +
3946 " </ul>\n" +
3947 " </div>\n" +
4156 3948 "\n" +
4157 " </uib-tab>\n" +
3949 " <div class=\"panel panel-default\">\n" +
3950 " <div class=\"panel-heading\">System</div>\n" +
3951 " <ul class=\"list-group\">\n" +
3952 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.configs.list\"> Config variables</a></li>\n" +
3953 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.system\"> System</a></li>\n" +
3954 " <li class=\"list-group-item\" ui-sref-active=\"active\"><a data-ui-sref=\"admin.partitions\"> Partition Management</a></li>\n" +
3955 " </ul>\n" +
3956 " </div>\n" +
3957 "</div>\n" +
4158 3958 "\n" +
4159 " <uib-tab>\n" +
4160 " <uib-tab-heading>\n" +
4161 " <span class=\"btn btn-danger btn-xs\"><span class=\"fa fa-exclamation-triangle\"></span></span> Regenerate API keys\n" +
4162 " </uib-tab-heading>\n" +
4163 " <p>Are you sure you want to regenerate API KEY for this application?</p>\n" +
4164 " <p>All client application keys will need to be updated.</p>\n" +
4165 " <form ng-submit=\"application.regenerateAPIKeys()\" name=\"application.regenerateAPIKeysForm\" class=\"form-inline\">\n" +
4166 " <data-form-errors errors=\"application.regenerateAPIKeysForm.ae_validation.password\"></data-form-errors>\n" +
4167 " <div class=\"form-group\">\n" +
4168 " <input type=\"password\" name=\"confirm\"\n" +
4169 " placeholder=\"Enter your password to proceed\" class=\"form-control\" ng-model=\"application.regenerateAPIKeysPassword\">\n" +
4170 " <input type=\"submit\" class=\"btn btn-danger\" value=\"Confirm\">\n" +
4171 " </div>\n" +
4172 " </form>\n" +
4173 " </uib-tab>\n" +
4174 " </uib-tabset>\n" +
4175 " </div>\n" +
4176 " <div class=\"col-sm-6 text-center\">\n" +
4177 " <h2 class=\"m-t-0\">How to connect your application?</h2>\n" +
4178 " <p>Visit our <a href=\"{{AeConfig.urls.docs}}\"><strong>developer documentation</strong></a> for step-by-step integration instructions.</p>\n" +
4179 " <div class=\"clearfix\"></div>\n" +
4180 " <p class=\"text-center\">\n" +
4181 " <a href=\"{{AeConfig.urls.docs}}\"><img src=\"/static/appenlight/images/logos/django_small.png\" alt=\"Django Logo\">\n" +
4182 " <img src=\"/static/appenlight/images/logos/pyramid_small.png\" alt=\"Pyramid Logo\">\n" +
4183 " <img src=\"/static/appenlight/images/logos/flask_small.png\" alt=\"Flask Logo\"></a>\n" +
4184 3959 "\n" +
4185 " <a href=\"{{AeConfig.urls.docs}}\"><img src=\"/static/appenlight/images/logos/js_small.png\" alt=\"Javascript Logo\">\n" +
4186 " <img src=\"/static/appenlight/images/logos/nodejs.png\" alt=\"Node.js\"></a>\n" +
4187 " <img src=\"/static/appenlight/images/logos/ruby_small.png\" alt=\"Ruby Logo\">\n" +
4188 " <img src=\"/static/appenlight/images/logos/php_small.png\" alt=\"PHP Logo\">\n" +
4189 " </a>\n" +
3960 "<div class=\"col-sm-9\" ui-view></div>\n"
3961 );
3962
3963
3964 $templateCache.put('templates/admin/partitions.html',
3965 "<ng-include src=\"'templates/loader.html'\" ng-if=\"partitions.loading.partitions\"></ng-include>\n" +
4190 3966 "\n" +
4191 " </p>\n" +
4192 " </div>\n" +
4193 " </div>\n" +
3967 "<div ng-show=\"!partitions.loading.partitions\">\n" +
4194 3968 "\n" +
4195 " <hr ng-show=\"application.resource.resource_id\">\n" +
3969 " <div class=\"panel panel-default\">\n" +
3970 " <div class=\"panel-heading\">\n" +
3971 " DELETE Daily Partitions\n" +
3972 " </div>\n" +
4196 3973 "\n" +
4197 " <form method=\"post\" class=\"form-horizontal\" name=\"application.BasicForm\" ng-submit=\"application.updateBasicForm()\" novalidate>\n" +
4198 " <div class=\"form-group\">\n" +
4199 " <data-form-errors errors=\"application.BasicForm.ae_validation.resource_name\"></data-form-errors>\n" +
4200 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4201 " Application name\n" +
4202 " <span class=\"required\">*</span>\n" +
4203 " </label>\n" +
3974 " <form name=\"partitions.dailyPartitionsForm\"\n" +
3975 " novalidate ng-submit=\"partitions.partitionsDelete('dailyPartitions')\"\n" +
3976 " class=\"form-inline\"\n" +
3977 " ng-class=\"{'has-error':partitions.dailyPartitionsForm.$invalid}\">\n" +
4204 3978 "\n" +
4205 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4206 " <input class=\"form-control\" name=\"resource_name\" placeholder=\"Application Name\" type=\"text\" ng-model=\"application.resource.resource_name\">\n" +
4207 " </div>\n" +
3979 " <div class=\"panel-body\">\n" +
4208 3980 "\n" +
3981 " <input type=\"text\" name=\"confirm\"\n" +
3982 " placeholder=\"Enter CONFIRM to proceed\" class=\"form-control input-autosize\" confirm-validate required ng-model=\"partitions.dailyConfirm\">\n" +
3983 " <input type=\"submit\" class=\"btn btn-danger\" ng-disabled=\"partitions.dailyPartitionsForm.$invalid\">\n" +
3984 " <input type=\"checkbox\" ng-model=\"partitions.dailyChecked\" ng-change=\"partitions.setCheckedList('dailyPartitions')\"> Check All\n" +
4209 3985 "\n" +
4210 " </div>\n" +
3986 " </div>\n" +
4211 3987 "\n" +
4212 " <div class=\"form-group\">\n" +
4213 " <data-form-errors errors=\"application.BasicForm.ae_validation.domains\"></data-form-errors>\n" +
4214 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4215 " Domain names for CORS headers\n" +
4216 " </label>\n" +
4217 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4218 " <textarea class=\"form-control\" name=\"domains\" ng-model=\"application.resource.domains\"></textarea>\n" +
4219 " <p class=\"description\">Required for Javascript error tracking (one line one domain, skip http:// part)</p>\n" +
4220 " </div>\n" +
3988 " <table class=\"table table-striped\">\n" +
3989 " <tr>\n" +
3990 " <th class=\"c1 date\">Date</th>\n" +
3991 " <th class=\"c2 indices\">Indices</th>\n" +
3992 " </tr>\n" +
3993 " <tr class=\"r{{$index}}\" ng-repeat=\"row in partitions.dailyPartitions\">\n" +
3994 " <td class=\"c1\">{{row[0]}}</td>\n" +
3995 " <td class=\"c2\">\n" +
3996 " <ul class=\"list-group\">\n" +
3997 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].elasticsearch\">\n" +
3998 " <input name=\"es_index\" type=\"checkbox\" ng-model=\"partition.checked\"> ES: {{partition.name}}\n" +
3999 " </li>\n" +
4000 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].pg\">\n" +
4001 " <input name=\"pg_index\" type=\"checkbox\" ng-model=\"partition.checked\"> PG: {{partition.name}}\n" +
4002 " </li>\n" +
4003 " </ul>\n" +
4004 " </td>\n" +
4005 " </tr>\n" +
4006 " </table>\n" +
4007 " </form>\n" +
4221 4008 "\n" +
4009 " </div>\n" +
4222 4010 "\n" +
4223 " </div>\n" +
4224 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4225 " <data-form-errors errors=\"application.BasicForm.ae_validation.default_grouping\"></data-form-errors>\n" +
4226 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4227 " Default grouping for errors\n" +
4228 " </label>\n" +
4229 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4230 " <select class=\"form-control\" name=\"default_grouping\" ng-model=\"application.resource.default_grouping\" ng-options=\"i[0] as i[1] for i in application.groupingOptions\"></select>\n" +
4231 " </div>\n" +
4011 " <div class=\"panel panel-default\">\n" +
4012 " <div class=\"panel-heading\">\n" +
4013 " DELETE Permanent Partitions\n" +
4014 " </div>\n" +
4232 4015 "\n" +
4233 " </div>\n" +
4234 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4235 " <data-form-errors errors=\"application.BasicForm.ae_validation.error_report_threshold\"></data-form-errors>\n" +
4236 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4237 " Alert on error reports\n" +
4238 " <span class=\"required\">*</span>\n" +
4239 " </label>\n" +
4240 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4241 " <input class=\"form-control\" name=\"error_report_threshold\" type=\"text\" ng-model=\"application.resource.error_report_threshold\">\n" +
4242 " <p class=\"description\">Application requires to send at least this amount of error reports per minute to open alert</p>\n" +
4243 " </div>\n" +
4244 " </div>\n" +
4245 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4246 " <data-form-errors errors=\"application.BasicForm.ae_validation.slow_report_threshold\"></data-form-errors>\n" +
4247 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4248 " Alert on slow reports\n" +
4249 " <span class=\"required\">*</span>\n" +
4250 " </label>\n" +
4016 " <form name=\"partitions.permanentPartitionsForm\" novalidate\n" +
4017 " ng-submit=\"partitions.partitionsDelete('permanentPartitions')\"\n" +
4018 " class=\"form-inline\"\n" +
4019 " ng-class=\"{'has-error':partitions.permanentPartitionsForm.$invalid}\">\n" +
4251 4020 "\n" +
4252 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4253 " <input class=\"form-control\" name=\"slow_report_threshold\" type=\"text\" ng-model=\"application.resource.slow_report_threshold\">\n" +
4254 " <p class=\"description\">Application requires to send at least this amount of slow reports per minute to open alert</p>\n" +
4255 " </div>\n" +
4256 " </div>\n" +
4257 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4258 " <data-form-errors errors=\"application.BasicForm.ae_validation.allow_permanent_storage\"></data-form-errors>\n" +
4259 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4260 " Permanent logs\n" +
4261 " </label>\n" +
4262 " <div class=\" col-sm-8 col-lg-9\">\n" +
4263 " <input class=\"form-control\" name=\"allow_permanent_storage\" type=\"checkbox\" ng-model=\"application.resource.allow_permanent_storage\">\n" +
4264 " <p class=\"description\">Allow permanent storage of logs in separate DB partitions (only administrator can enable this feature)</p>\n" +
4265 " </div>\n" +
4266 " </div>\n" +
4267 " <div class=\"form-group\">\n" +
4268 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4269 4021 "\n" +
4270 " </label>\n" +
4022 " <div class=\"panel-body\">\n" +
4271 4023 "\n" +
4272 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4273 " <input class=\"form-control btn btn-primary\" name=\"submit\" type=\"submit\" value=\"{{application.resource.resource_id? 'Update' : 'Create'}} Application\">\n" +
4274 " </div>\n" +
4275 " </div>\n" +
4276 " </form>\n" +
4277 " </div>\n" +
4278 " </div>\n" +
4024 " <div class=\"form-group\">\n" +
4025 " <input type=\"text\" name=\"confirm\"\n" +
4026 " placeholder=\"Enter CONFIRM to proceed\" class=\"form-control\" confirm-validate required ng-model=\"partitions.permConfirm\">\n" +
4027 " <input type=\"submit\" class=\"btn btn-danger\" ng-disabled=\"partitions.permanentPartitionsForm.$invalid\">\n" +
4028 " <input type=\"checkbox\" ng-model=\"partitions.permChecked\" ng-change=\"partitions.setCheckedList('permanentPartitions')\"> Check All\n" +
4029 " </div>\n" +
4279 4030 "\n" +
4280 " <div class=\"panel panel-default\" ng-show=\"application.resource.resource_id\">\n" +
4281 " <div class=\"panel-heading\">\n" +
4282 " <h3 class=\"panel-title\">Plugins</h3>\n" +
4283 " </div>\n" +
4284 " <div class=\"panel-body\">\n" +
4031 " </div>\n" +
4285 4032 "\n" +
4286 " <plugin-config resource=\"application.resource\"\n" +
4287 " section=\"'application.update'\"\n" +
4288 " ng-if=\"application.resource.resource_id\">\n" +
4289 " </plugin-config>\n" +
4033 " <table class=\"table table-striped\">\n" +
4034 " <tr>\n" +
4035 " <th class=\"c1 date\">Date</th>\n" +
4036 " <th class=\"c2 indices\">Indices</th>\n" +
4037 " </tr>\n" +
4038 " <tr class=\"r{{$index}}\" ng-repeat=\"row in partitions.permanentPartitions\">\n" +
4039 " <td class=\"c1\">{{row[0]}}</td>\n" +
4040 " <td class=\"c2\">\n" +
4041 " <ul class=\"list-group\">\n" +
4042 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].elasticsearch\">\n" +
4043 " <input name=\"es_index\" type=\"checkbox\" ng-model=\"partition.checked\"> ES: {{partition.name}}\n" +
4044 " </li>\n" +
4045 " <li class=\"list-group-item\" ng-repeat=\"partition in row[1].pg\">\n" +
4046 " <input name=\"pg_index\" type=\"checkbox\" ng-model=\"partition.checked\"> PG: {{partition.name}}\n" +
4047 " </li>\n" +
4048 " </ul>\n" +
4049 " </td>\n" +
4050 " </tr>\n" +
4051 " </table>\n" +
4052 " </form>\n" +
4290 4053 "\n" +
4291 " </div>\n" +
4292 4054 " </div>\n" +
4293 4055 "\n" +
4294 " <div class=\"panel panel-default m-t-1\" ng-show=\"application.resource.resource_id\">\n" +
4295 " <div class=\"panel-heading\">\n" +
4296 " <h3 class=\"panel-title\">API Testing</h3>\n" +
4297 " </div>\n" +
4298 " <div class=\"panel-body\">\n" +
4299 " <p>Please be sure to add at least one <a data-ui-sref=\"user.alert_channels.email\"><strong>email alert channel</strong></a> for your account.</p>\n" +
4300 " <p>This will enable AppEnlight to send you notification emails about errors inside your application.</p>\n" +
4301 " <p><strong>After this is done you can use this CURL commands to test APIs:</strong></p>\n" +
4302 " <p>(Please note that the data like execution times is semi randomly generated)</p>\n" +
4303 " <uib-tabset>\n" +
4304 " <uib-tab>\n" +
4305 " <uib-tab-heading>\n" +
4306 " Log API\n" +
4307 " </uib-tab-heading>\n" +
4308 "\n" +
4309 " <div class=\"codehilite\">\n" +
4310 " <pre class=\"m-a-0\">\n" +
4311 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/logs?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4312 " [\n" +
4313 " {\n" +
4314 " \"log_level\": \"WARNING\",\n" +
4315 " \"message\": \"OMG ValueError happened\",\n" +
4316 " \"namespace\": \"some.namespace.indicator\",\n" +
4317 " \"request_id\": \"SOME_UUID\",\n" +
4318 " \"permanent\": false,\n" +
4319 " \"primary_key\": \"random_key\",\n" +
4320 " \"server\": \"some.server.hostname\",\n" +
4321 " \"date\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4322 " \"tags\": [[\"tag1\",\"value\"], [\"tag2\", 5]]\n" +
4323 " },\n" +
4324 " {\n" +
4325 " \"log_level\": \"ERROR\",\n" +
4326 " \"message\": \"OMG ValueError happened2\",\n" +
4327 " \"namespace\": \"some.namespace.indicator\",\n" +
4328 " \"request_id\": \"SOME_UUID\",\n" +
4329 " \"permanent\": false,\n" +
4330 " \"server\": \"some.server.hostname\",\n" +
4331 " \"date\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\"\n" +
4332 " }\n" +
4333 " ]'\n" +
4334 " </pre>\n" +
4335 " </div>\n" +
4056 "</div>\n"
4057 );
4058
4059
4060 $templateCache.put('templates/admin/system.html',
4061 "<ng-include src=\"'templates/loader.html'\" ng-if=\"system.loading.system\"></ng-include>\n" +
4336 4062 "\n" +
4337 " </uib-tab>\n" +
4063 "<div ng-if=\"system.loading.system == false\">\n" +
4064 " <div class=\"row\">\n" +
4065 " <div class=\"col-sm-12\">\n" +
4066 " <div class=\"panel panel-default\">\n" +
4067 " <div class=\"panel-heading\">\n" +
4068 " <h3 class=\"panel-title\">\n" +
4069 " System Info\n" +
4070 " </h3>\n" +
4071 " </div>\n" +
4072 " <div class=\"panel-body\">\n" +
4338 4073 "\n" +
4339 " <uib-tab>\n" +
4340 " <uib-tab-heading>\n" +
4341 " Report API\n" +
4342 " </uib-tab-heading>\n" +
4074 " <p><strong>System Load:</strong>\n" +
4075 " 1min: {{system.systemLoad[0]}}, 5min: {{system.systemLoad[1]}}, 15min: {{system.systemLoad[2]}}\n" +
4076 " </p>\n" +
4077 " <p><strong>Awaiting tasks:</strong>\n" +
4078 " <ul>\n" +
4079 " <li>reports: {{system.queueStats.waiting_reports}}</li>\n" +
4080 " <li>logs: {{system.queueStats.waiting_logs}}</li>\n" +
4081 " <li>metrics: {{system.queueStats.waiting_metrics}}</li>\n" +
4082 " <li>other: {{system.queueStats.waiting_other}}</li>\n" +
4083 " </ul>\n" +
4084 " </p>\n" +
4085 " <p><strong>Queue stats from last minute:</strong>\n" +
4086 " <ul>\n" +
4087 " <li>Processed reports: {{system.queueStats.processed_reports}}</li>\n" +
4088 " <li>Processed logs: {{system.queueStats.processed_logs}}</li>\n" +
4089 " <li>Processed metrics: {{system.queueStats.processed_metrics}}</li>\n" +
4090 " </ul>\n" +
4091 " </p>\n" +
4343 4092 "\n" +
4344 " <div class=\"codehilite\">\n" +
4345 " <pre class=\"m-a-0\">\n" +
4346 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/reports?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4347 " [{\n" +
4348 " \"client\": \"your-client-name-python\",\n" +
4349 " \"language\": \"python\",\n" +
4350 " \"view_name\": \"views/foo:bar\",\n" +
4351 " \"server\": \"SERVERNAME/INSTANCENAME\",\n" +
4352 " \"priority\": 5,\n" +
4353 " \"error\": \"OMG ValueError happened\",\n" +
4354 " \"occurences\":1,\n" +
4355 " \"http_status\": 500,\n" +
4356 " \"tags\": [[\"tag1\",\"value\"], [\"tag2\", 5]],\n" +
4357 " \"username\": \"USER\",\n" +
4358 " \"url\": \"HTTP://SOMEURL\",\n" +
4359 " \"ip\": \"127.0.0.1\",\n" +
4360 " \"start_time\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4361 " \"end_time\": \"{{application.momentJs.utc().milliseconds(0).add(2, 'seconds').toISOString()}}\",\n" +
4362 " \"user_agent\": \"BROWSER_AGENT\",\n" +
4363 " \"extra\": [[\"message\",\"CUSTOM MESSAGE\"], [\"custom_value\", \"some payload\"]],\n" +
4364 " \"request_id\": \"SOME_UUID\",\n" +
4365 " \"request\": {\"REQUEST_METHOD\": \"GET\",\n" +
4366 " \"PATH_INFO\": \"/FOO/BAR\",\n" +
4367 " \"POST\": {\"FOO\":\"BAZ\",\"XXX\":\"YYY\"}\n" +
4368 " },\n" +
4369 " \"slow_calls\":[{\n" +
4370 " \"start\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4371 " \"end\": \"{{application.momentJs.utc().milliseconds(0).add(1, 'seconds').toISOString()}}\",\n" +
4372 " \"type\": \"sql\",\n" +
4373 " \"subtype\": \"postgresql\",\n" +
4374 " \"parameters\": [\"QPARAM1\",\"QPARAM2\",\"QPARAMX\"],\n" +
4375 " \"statement\": \"QUERY\"\n" +
4376 " }],\n" +
4377 " \"request_stats\": {\n" +
4378 " \"main\": 2.50779,\n" +
4379 " \"nosql\": 0.01008,\n" +
4380 " \"nosql_calls\": 17.0,\n" +
4381 " \"remote\": 0.0,\n" +
4382 " \"remote_calls\": 0.0,\n" +
4383 " \"sql\": 1,\n" +
4384 " \"sql_calls\": 1.0,\n" +
4385 " \"tmpl\": 0.0,\n" +
4386 " \"tmpl_calls\": 0.0,\n" +
4387 " \"custom\": 0.0,\n" +
4388 " \"custom_calls\": 0.0\n" +
4389 " },\n" +
4390 " \"traceback\": [\n" +
4391 " {\"cline\": \"return foo_bar_baz(1,2,3)\",\n" +
4392 " \"file\": \"somedir/somefile.py\",\n" +
4393 " \"fn\": \"somefunction\",\n" +
4394 " \"line\": 454,\n" +
4395 " \"vars\": [[\"a_list\",\n" +
4396 " [\"1\",2,\"4\",\"5\",6]],\n" +
4397 " [\"b\", {\"1\": \"2\", \"ccc\": \"ddd\", \"1\": \"a\"}],\n" +
4398 " [\"obj\", \"object object at 0x7f0030853dc0\"]]\n" +
4399 " },\n" +
4400 " {\"cline\": \"OMG ValueError happened\",\n" +
4401 " \"file\": \"\",\n" +
4402 " \"fn\": \"\",\n" +
4403 " \"line\": \"\",\n" +
4404 " \"vars\": []}\n" +
4405 " ]\n" +
4406 " }]'\n" +
4407 " </pre>\n" +
4408 " </div>\n" +
4093 " <p><strong>Disks:</strong>\n" +
4094 " <ul>\n" +
4095 " <li ng-repeat=\"disk in system.disks\">\n" +
4096 " <strong>{{disk.device}}</strong> {{disk.free}}/{{disk.total}}, {{disk.percentage}}% used\n" +
4097 " </li>\n" +
4098 " </ul>\n" +
4099 " </p>\n" +
4409 4100 "\n" +
4410 " </uib-tab>\n" +
4101 " <p><strong>Process stats:</strong>\n" +
4102 " <ul>\n" +
4103 " <li>FD soft limits: {{system.selfInfo.fds.soft}}</li>\n" +
4104 " <li>FD hard limits: {{system.selfInfo.fds.hard}}</li>\n" +
4105 " <li>Memlock soft limits: {{system.selfInfo.memlock.soft}}</li>\n" +
4106 " <li>Memlock hard limits: {{system.selfInfo.memlock.hard}}</li>\n" +
4107 " </ul>\n" +
4108 " </p>\n" +
4411 4109 "\n" +
4412 " <uib-tab>\n" +
4110 " </div>\n" +
4111 " </div>\n" +
4112 " </div>\n" +
4113 " </div>\n" +
4114 " <div class=\"row\">\n" +
4115 " <div class=\"col-sm-12\">\n" +
4413 4116 "\n" +
4414 " <uib-tab-heading>\n" +
4415 " Metrics API\n" +
4416 " </uib-tab-heading>\n" +
4117 " <div class=\"panel panel-default\">\n" +
4118 " <div class=\"panel-body\">\n" +
4417 4119 "\n" +
4418 " <div class=\"codehilite\">\n" +
4419 " <pre class=\"m-a-0\">\n" +
4420 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/general_metrics?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4421 " [{\n" +
4422 " \"namespace\": \"some.monitor\",\n" +
4423 " \"timestamp\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4424 " \"server_name\": \"server.name\",\n" +
4425 " \"tags\": [[\"value1\", 15.7], [\"value2\", 26]]}]'\n" +
4426 " </pre>\n" +
4427 " </div>\n" +
4120 " <uib-tabset>\n" +
4121 " <uib-tab>\n" +
4122 " <uib-tab-heading>\n" +
4123 " Postgresql Tables\n" +
4124 " </uib-tab-heading>\n" +
4428 4125 "\n" +
4429 " </uib-tab>\n" +
4126 " <table class=\"table table-striped\">\n" +
4127 " <thead>\n" +
4128 " <tr>\n" +
4129 " <th class=\"c1 tablename\">Table name</th>\n" +
4130 " <th class=\"c2 size_human\">Size</th>\n" +
4131 " </tr>\n" +
4132 " </thead>\n" +
4133 " <tbody>\n" +
4134 " <tr class=\"r{{$index}}\" ng-repeat=\"row in system.DBtables\">\n" +
4135 " <td class=\"c1\">{{row.table_name}}</td>\n" +
4136 " <td class=\"c2\">{{row.size_human}}</td>\n" +
4137 " </tr>\n" +
4138 " </tbody>\n" +
4139 " </table>\n" +
4430 4140 "\n" +
4431 " <uib-tab>\n" +
4141 " </uib-tab>\n" +
4432 4142 "\n" +
4433 " <uib-tab-heading>\n" +
4434 " Request Stats API\n" +
4435 " </uib-tab-heading>\n" +
4143 " <uib-tab>\n" +
4144 " <uib-tab-heading>\n" +
4145 " Elasticsearch Indices\n" +
4146 " </uib-tab-heading>\n" +
4436 4147 "\n" +
4437 " <div class=\"codehilite\">\n" +
4438 " <pre class=\"m-a-0\">\n" +
4439 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/request_stats?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4440 " [{\"server\": \"some.server.hostname\",\n" +
4441 " \"timestamp\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4442 " \"metrics\": [[\"dir/module:func\",\n" +
4443 " {\"custom\": 0.0,\n" +
4444 " \"custom_calls\": 0,\n" +
4445 " \"main\": 0.01664,\n" +
4446 " \"nosql\": 0.00061,\n" +
4447 " \"nosql_calls\": 23,\n" +
4448 " \"remote\": 0.0,\n" +
4449 " \"remote_calls\": 0,\n" +
4450 " \"requests\": 1,\n" +
4451 " \"sql\": 0.00105,\n" +
4452 " \"sql_calls\": 2,\n" +
4453 " \"tmpl\": 0.0,\n" +
4454 " \"tmpl_calls\": 0}],\n" +
4455 " [\"SomeView.function\",\n" +
4456 " {\"custom\": 0.0,\n" +
4457 " \"custom_calls\": 0,\n" +
4458 " \"main\": 0.647261,\n" +
4459 " \"nosql\": 0.306554,\n" +
4460 " \"nosql_calls\": 140,\n" +
4461 " \"remote\": 0.0,\n" +
4462 " \"remote_calls\": 0,\n" +
4463 " \"requests\": 28,\n" +
4464 " \"sql\": 0.0,\n" +
4465 " \"sql_calls\": 0,\n" +
4466 " \"tmpl\": 0.0,\n" +
4467 " \"tmpl_calls\": 0}]]\n" +
4468 " }]'\n" +
4469 " </pre>\n" +
4470 " </div>\n" +
4471 "\n" +
4472 " </uib-tab>\n" +
4473 "\n" +
4474 " </uib-tabset>\n" +
4475 "\n" +
4476 " </div>\n" +
4477 " </div>\n" +
4478 "\n" +
4479 " <permissions-form resource=\"application.resource\" current-permissions=\"application.resource.current_permissions\"\n" +
4480 " possible-permissions=\"application.resource.possible_permissions\" ng-if=\"application.resource.resource_id\"></permissions-form>\n" +
4148 " <table class=\"table table-striped\">\n" +
4149 " <thead>\n" +
4150 " <tr>\n" +
4151 " <th class=\"c1 tablename\">Index name</th>\n" +
4152 " <th class=\"c2 size_human\">Size</th>\n" +
4153 " </tr>\n" +
4154 " </thead>\n" +
4155 " <tbody>\n" +
4156 " <tr class=\"r{{$index}}\" ng-repeat=\"row in system.ESIndices\">\n" +
4157 " <td class=\"c1\">{{row.name}}</td>\n" +
4158 " <td class=\"c2\">{{row.size_human}}</td>\n" +
4159 " </tr>\n" +
4160 " </tbody>\n" +
4161 " </table>\n" +
4481 4162 "\n" +
4482 " <div class=\"panel panel-info\" ng-show=\"application.resource.resource_id\">\n" +
4483 " <div class=\"panel-heading\">\n" +
4484 " <h3 class=\"panel-title\">Postprocessing</h3>\n" +
4485 " </div>\n" +
4486 " <div class=\"panel-body\">\n" +
4487 " <p>This section allows you influence the rating of report groups - if rule is matched once its not executed anymore</p>\n" +
4163 " </uib-tab>\n" +
4488 4164 "\n" +
4489 " <p>\n" +
4490 " <a class=\"btn btn-info\" ng-click=\"application.addRule()\"><span class=\"fa fa-plus-circle\"></span> Add rule</a>\n" +
4491 " </p>\n" +
4165 " <uib-tab>\n" +
4166 " <uib-tab-heading>\n" +
4167 " Processes\n" +
4168 " </uib-tab-heading>\n" +
4492 4169 "\n" +
4493 " <post-process-action action=\"action\" resource=\"application.resource\" ng-repeat=\"action in application.resource.postprocessing_rules\"></post-process-action>\n" +
4494 " </div>\n" +
4495 " </div>\n" +
4170 " <table class=\"table table-striped\">\n" +
4171 " <thead>\n" +
4172 " <tr>\n" +
4173 " <th class=\"c1 tablename\">Owner</th>\n" +
4174 " <th class=\"c2 tablename\">PID</th>\n" +
4175 " <th class=\"c3 tablename\">CPU</th>\n" +
4176 " <th class=\"c4 tablename\">MEM</th>\n" +
4177 " <th class=\"c4 tablename\">Name</th>\n" +
4178 " </tr>\n" +
4179 " </thead>\n" +
4180 " <tbody>\n" +
4181 " <tr class=\"r{{$index}}\" ng-repeat-start=\"row in system.processInfo\">\n" +
4182 " <td class=\"c1\">{{row.owner}}</td>\n" +
4183 " <td class=\"c2\">{{row.pid}}</td>\n" +
4184 " <td class=\"c3\">{{row.cpu}}</td>\n" +
4185 " <td class=\"c4\">{{row.mem_usage}} ({{row.mem_percentage}}%)</td>\n" +
4186 " <td class=\"c5\"><strong>{{row.name}}</strong></td>\n" +
4187 " </tr>\n" +
4188 " <tr ng-repeat-end>\n" +
4189 " <td colspan=\"5\" class=\"word-wrap\">{{row.command}}</td>\n" +
4190 " </tr>\n" +
4191 " </tbody>\n" +
4192 " </table>\n" +
4496 4193 "\n" +
4497 " <div class=\"panel panel-danger\" ng-show=\"application.resource.resource_id\">\n" +
4498 " <div class=\"panel-heading\">\n" +
4499 " <h3 class=\"panel-title\">Administration</h3>\n" +
4500 " </div>\n" +
4501 " <div class=\"panel-body\">\n" +
4502 " <h2>Transfer ownership</h2>\n" +
4503 " <p>Please note that by transfering ownership you WILL lose access to the application data and new owner needs to give you access permission</p>\n" +
4504 " <div class=\"confirmation_form\" ng-submit=\"application.transferApplication()\">\n" +
4505 " <form class=\"form-horizontal\" name=\"application.formTransfer\">\n" +
4506 " <div class=\"form-group\">\n" +
4507 " <data-form-errors errors=\"application.formTransfer.ae_validation.password\"></data-form-errors>\n" +
4508 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4509 " Password\n" +
4510 " </label>\n" +
4511 " <div class=\"col-sm-8 col-lg-9\">\n" +
4512 " <input class=\"form-control\" name=\"password\" type=\"password\" ng-model=\"application.formTransferModel.password\">\n" +
4513 " </div>\n" +
4514 " </div>\n" +
4515 " <div class=\"form-group\">\n" +
4516 " <data-form-errors errors=\"application.formTransfer.ae_validation.user_name\"></data-form-errors>\n" +
4517 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4518 " New owners username\n" +
4519 " </label>\n" +
4520 " <div class=\"col-sm-8 col-lg-9\">\n" +
4521 " <input class=\"form-control\" name=\"user_name\" type=\"text\" ng-model=\"application.formTransferModel.user_name\">\n" +
4522 " </div>\n" +
4523 " </div>\n" +
4524 " <div class=\"form-group\">\n" +
4525 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4526 " </label>\n" +
4527 " <div class=\"col-sm-8 col-lg-9\">\n" +
4528 " <button class=\"btn btn-danger\">\n" +
4529 " <span class=\"fa fa-user-plus\"></span>\n" +
4530 " Transfer ownership of application\n" +
4531 " </button>\n" +
4532 " </div>\n" +
4533 " </div>\n" +
4534 " </form>\n" +
4535 " </div>\n" +
4194 " </uib-tab>\n" +
4536 4195 "\n" +
4537 " <hr/>\n" +
4196 " <uib-tab>\n" +
4197 " <uib-tab-heading>\n" +
4198 " Python packages\n" +
4199 " </uib-tab-heading>\n" +
4538 4200 "\n" +
4539 " <h2>Remove application</h2>\n" +
4540 " <p><strong>This operation will wipe out all data from database - there is no undo.</strong></p>\n" +
4201 " <table class=\"table\">\n" +
4202 " <tr ng-repeat=\"package in system.packages\">\n" +
4203 " <td>{{package.name}}</td>\n" +
4204 " <td>{{package.version}}</td>\n" +
4205 " </tr>\n" +
4206 " </table>\n" +
4207 " </p>\n" +
4541 4208 "\n" +
4542 " <div class=\"confirmation_form\">\n" +
4543 " <form class=\"form-horizontal\" name=\"application.formDelete\" ng-submit=\"application.deleteApplication()\">\n" +
4544 " <div class=\"form-group\">\n" +
4545 " <data-form-errors errors=\"application.formDelete.ae_validation.password\"></data-form-errors>\n" +
4546 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4547 " Password\n" +
4548 " </label>\n" +
4549 " <div class=\"col-sm-8 col-lg-9\">\n" +
4550 " <input class=\"form-control\" name=\"password\" type=\"password\" ng-model=\"application.formDeleteModel.password\">\n" +
4551 " </div>\n" +
4552 " </div>\n" +
4553 " <div class=\"form-group\">\n" +
4554 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4209 " </uib-tab>\n" +
4555 4210 "\n" +
4556 " </label>\n" +
4557 " <div class=\"col-sm-8 col-lg-9\">\n" +
4558 " <button class=\"btn btn-danger\">\n" +
4559 " <span class=\"fa fa-trash-o\"></span>\n" +
4560 " Delete my application\n" +
4561 " </button>\n" +
4562 " </div>\n" +
4563 " </div>\n" +
4564 " </form>\n" +
4211 " </uib-tabset>\n" +
4212 " </div>\n" +
4565 4213 " </div>\n" +
4566 4214 " </div>\n" +
4567 4215 " </div>\n" +
4568 4216 "</div>\n"
4569 4217 );
4570 4218
4571 4219
4572 $templateCache.put('templates/applications/breadcrumbs.html',
4573 "<ol class=\"breadcrumb\" ng-show=\"$state.includes('applications')\">\n" +
4574 " <li>Applications</li>\n" +
4575 " <li ng-show=\"$state.includes('applications.list')\" ng-class=\"{bold:$state.is('applications.list')}\">Owned applications</li>\n" +
4576 " <li ng-show=\"$state.includes('applications.update')\" ng-class=\"{bold:$state.is('applications.update')}\">Modify application</li>\n" +
4577 " <li ng-show=\"$state.includes('applications.integrations')\" ng-class=\"{bold:$state.includes('applications.integrations')}\">Integrations</li>\n" +
4578 " <li ng-show=\"$state.includes('applications.purge_logs')\" ng-class=\"{bold:$state.includes('applications.purge_logs')}\">Log Purging</li>\n" +
4579 "</ol>\n"
4220 $templateCache.put('templates/admin/users/parent_view.html',
4221 "<div ui-view></div>"
4580 4222 );
4581 4223
4582 4224
4583 $templateCache.put('templates/applications/integrations.html',
4584 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application && $state.is('applications.integrations')\"></ng-include>\n" +
4225 $templateCache.put('templates/admin/users/users_create.html',
4226 "<ng-include src=\"'templates/loader.html'\" ng-if=\"user.loading.user\"></ng-include>\n" +
4585 4227 "\n" +
4586 "<ui-view>\n" +
4587 " <div class=\"panel panel-default\" ng-show=\"!integrations.loading.application\">\n" +
4588 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4589 " <div class=\"panel-body\">\n" +
4228 "<div ng-show=\"!user.loading.user\">\n" +
4590 4229 "\n" +
4591 " <a class=\"btn btn-default integration\"\n" +
4592 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'bitbucket'})\">\n" +
4593 " <span class=\"fa fa-fw fa-bitbucket fa-3x pull-left\"></span>\n" +
4594 " <strong>Bitbucket</strong>\n" +
4230 " <div class=\"panel panel-default\">\n" +
4231 " <div class=\"panel-body\">\n" +
4595 4232 "\n" +
4596 " <p>Send issues and reports to Bitbucket</p>\n" +
4597 " </a>\n" +
4233 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\" ng-if=\"user.user.id\">\n" +
4234 " <a class=\"btn btn-default\" data-uib-dropdown-toggle><span class=\"fa fa-user-secret\"></span> Re-login to user</a>\n" +
4235 " <ul class=\"dropdown-menu\">\n" +
4236 " <li><a>No</a></li>\n" +
4237 " <li><a ng-click=\"user.reloginUser(user)\">Yes</a></li>\n" +
4238 " </ul>\n" +
4239 " </span>\n" +
4598 4240 "\n" +
4599 " <a class=\"btn btn-default integration\"\n" +
4600 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'campfire'})\">\n" +
4601 " <span class=\"fa fa-fw fa-comment fa-3x pull-left\"></span>\n" +
4602 " <strong>Campfire</strong>\n" +
4241 " <form name=\"user.profileForm\" class=\"form-horizontal\" ng-submit=\"user.createUser()\">\n" +
4242 " <div class=\"form-group\" id=\"row-user_name\">\n" +
4243 " <data-form-errors errors=\"user.profileForm.ae_validation.user_name\"></data-form-errors>\n" +
4244 " <label for=\"user_name\" id=\"label-user_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
4245 " User name\n" +
4246 " <span class=\"required\">*</span>\n" +
4247 " </label>\n" +
4248 " <div class=\"col-sm-8 col-lg-9\">\n" +
4249 " <input class=\"form-control\" id=\"user_name\" name=\"user_name\" type=\"text\" ng-model=\"user.user.user_name\">\n" +
4250 " </div>\n" +
4251 " </div>\n" +
4603 4252 "\n" +
4604 " <p>Receive reports and alerts in your Campfire rooms</p>\n" +
4605 " </a>\n" +
4253 " <div class=\"form-group\" id=\"row-user_password\">\n" +
4254 " <data-form-errors errors=\"user.profileForm.ae_validation.user_password\"></data-form-errors>\n" +
4255 " <label for=\"user_password\" id=\"label-user_password\" class=\"control-label col-sm-4 col-lg-3\">\n" +
4256 " Password\n" +
4257 " <span class=\"required\">*</span>\n" +
4258 " </label>\n" +
4259 " <div class=\"col-sm-8 col-lg-9\">\n" +
4260 " <input class=\"form-control\" id=\"user_password\" name=\"user_password\" type=\"password\" ng-model=\"user.user.user_password\">\n" +
4606 4261 "\n" +
4607 " <a class=\"btn btn-default integration\"\n" +
4608 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'flowdock'})\">\n" +
4609 " <span class=\"fa fa-fw fa-envelope fa-3x pull-left\"></span>\n" +
4610 " <strong>Flowdock</strong>\n" +
4262 " <p class=\"m-t-1\"><a class=\"btn btn-info btn-sm\" ng-click=\"user.generatePassword()\"><span class=\"fa fa-lock\"></span> Generate password</a>\n" +
4263 " <span ng-show=\"user.gen_pass.length > 0\">(generated password: {{user.gen_pass}})</span>\n" +
4264 " </p>\n" +
4611 4265 "\n" +
4612 " <p>Receive reports and alerts on your Flowdock team\n" +
4613 " inbox</p>\n" +
4614 " </a>\n" +
4266 " </div>\n" +
4267 " </div>\n" +
4615 4268 "\n" +
4616 " <a class=\"btn btn-default integration\"\n" +
4617 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'github'})\">\n" +
4618 " <span class=\"fa fa-fw fa-github fa-3x pull-left\"></span>\n" +
4619 " <strong>Github</strong>\n" +
4620 4269 "\n" +
4621 " <p>Send issues and reports to Github</p>\n" +
4622 " </a>\n" +
4270 " <div class=\"form-group\" id=\"row-email\">\n" +
4271 " <data-form-errors errors=\"user.profileForm.ae_validation.email\"></data-form-errors>\n" +
4272 " <label for=\"email\" id=\"label-email\" class=\"control-label col-sm-4 col-lg-3\">\n" +
4273 " Email Address\n" +
4274 " <span class=\"required\">*</span>\n" +
4275 " </label>\n" +
4276 " <div class=\"col-sm-8 col-lg-9\">\n" +
4277 " <input class=\"form-control\" id=\"email\" name=\"email\" type=\"text\" ng-model=\"user.user.email\">\n" +
4278 " </div>\n" +
4279 " </div>\n" +
4623 4280 "\n" +
4624 " <a class=\"btn btn-default integration\"\n" +
4625 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'hipchat'})\">\n" +
4626 " <span class=\"fa fa-fw fa-comment fa-3x pull-left\"></span>\n" +
4627 " <strong>HipChat</strong>\n" +
4628 "\n" +
4629 " <p>Receive reports and alerts in your Hipchat chanels</p>\n" +
4630 " </a>\n" +
4631 "\n" +
4632 " <a class=\"btn btn-default integration\"\n" +
4633 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'jira'})\">\n" +
4634 " <span class=\"fa fa-fw fa-ticket fa-3x pull-left\"></span>\n" +
4635 " <strong>Jira</strong>\n" +
4636 "\n" +
4637 " <p>Send issues and reports to Jira</p>\n" +
4638 " </a>\n" +
4639 "\n" +
4640 " <a class=\"btn btn-default integration\"\n" +
4641 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'slack'})\">\n" +
4642 " <span class=\"fa fa-fw fa-comment fa-3x pull-left\"></span>\n" +
4643 " <strong>Slack</strong>\n" +
4644 "\n" +
4645 " <p>Receive reports and alerts in your Slack chanels</p>\n" +
4646 " </a>\n" +
4281 " <div class=\"form-group\" id=\"row-first_name\">\n" +
4282 " <data-form-errors errors=\"user.profileForm.ae_validation.first_name\"></data-form-errors>\n" +
4283 " <label for=\"first_name\" id=\"label-first_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
4284 " First Name\n" +
4285 " </label>\n" +
4286 " <div class=\"col-sm-8 col-lg-9\">\n" +
4287 " <input class=\"form-control\" id=\"first_name\" name=\"first_name\" type=\"text\" ng-model=\"user.user.first_name\">\n" +
4288 " </div>\n" +
4289 " </div>\n" +
4290 " <div class=\"form-group\" id=\"row-last_name\">\n" +
4291 " <data-form-errors errors=\"user.profileForm.ae_validation.last_name\"></data-form-errors>\n" +
4292 " <label for=\"last_name\" id=\"label-last_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
4293 " Last Name\n" +
4294 " </label>\n" +
4295 " <div class=\"col-sm-8 col-lg-9\">\n" +
4296 " <input class=\"form-control\" id=\"last_name\" name=\"last_name\" type=\"text\" ng-model=\"user.user.last_name\">\n" +
4297 " </div>\n" +
4298 " </div>\n" +
4647 4299 "\n" +
4648 " <a class=\"btn btn-default integration\"\n" +
4649 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'webhooks'})\">\n" +
4650 " <span class=\"fa fa-fw fa-cloud-upload fa-3x pull-left\"></span>\n" +
4651 " <strong>Webhooks</strong>\n" +
4300 " <div class=\"form-group\" id=\"row-status\">\n" +
4301 " <data-form-errors errors=\"user.profileForm.ae_validation.status\"></data-form-errors>\n" +
4302 " <label for=\"status\" id=\"label-status\" class=\"control-label col-sm-4 col-lg-3\">\n" +
4303 " Active\n" +
4304 " </label>\n" +
4305 " <div class=\"col-sm-8 col-lg-9\">\n" +
4306 " <input checked class=\"form-control\" id=\"status\" name=\"status\" type=\"checkbox\" ng-model=\"user.user.status\">\n" +
4307 " </div>\n" +
4308 " </div>\n" +
4652 4309 "\n" +
4653 " <p>Notify third party API's of your reports and alerts</p>\n" +
4654 " </a>\n" +
4310 " <div class=\"form-group\" id=\"row-submit\">\n" +
4311 " <label for=\"submit\" id=\"label-submit\" class=\"control-label col-sm-4 col-lg-3\">\n" +
4312 " </label>\n" +
4313 " <div class=\"col-sm-8 col-lg-9\">\n" +
4314 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"{{$state.params.userId ? 'Update' : 'Add'}} User\">\n" +
4315 " </div>\n" +
4316 " </div>\n" +
4317 " </form>\n" +
4655 4318 " </div>\n" +
4656 4319 " </div>\n" +
4657 "</ui-view>\n"
4658 );
4659
4660
4661 $templateCache.put('templates/applications/integrations/bitbucket.html',
4662 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
4663 "\n" +
4664 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
4665 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4666 " <div class=\"panel-body\">\n" +
4667 "\n" +
4668 " <h1>Bitbucket Integration</h1>\n" +
4669 4320 "\n" +
4670 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
4671 " <div class=\"form-group\">\n" +
4672 4321 "\n" +
4673 " <label class=\"control-label col-sm-3 col-lg-2\">Repository</label>\n" +
4322 " <div class=\"panel panel-default\" ng-if=\"user.user.id\">\n" +
4323 " <div class=\"panel-heading\">\n" +
4324 " <h3 class=\"panel-title\">Permission Summary</h3>\n" +
4325 " </div>\n" +
4326 " <div class=\"panel-body\">\n" +
4327 " <h3>Direct application permissions</h3>\n" +
4674 4328 "\n" +
4675 " <div class=\"col-sm-8 col-lg-9\">\n" +
4329 " <ul class=\"list-group\">\n" +
4330 " <li ng-repeat=\"perm in user.resourcePermissions.user.application\" class=\"animate-repeat list-group-item\">\n" +
4331 " <strong>{{ perm.self.resource_name }}</strong>\n" +
4332 " <div class=\"pull-right\">\n" +
4676 4333 "\n" +
4677 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
4678 " <data-form-errors errors=\"integration.integrationForm.ae_validation.repo_name\"></data-form-errors>\n" +
4334 " <span class=\"btn btn-primary btn-xs m-r-1\" disabled ng-repeat=\"perm_name in perm.permissions\">{{ perm.self.owner ? 'Resource owner' : perm_name }}</span>\n" +
4679 4335 "\n" +
4680 " <div class=\"input-group\">\n" +
4681 " <div class=\"input-group-addon\">https://bitbucket.org/</div>\n" +
4682 " <input class=\"form-control\" ng-model=\"integration.config.user_name\" placeholder=\"user\" type=\"text\">\n" +
4683 " <div class=\"input-group-addon\">/</div>\n" +
4684 " <input class=\"form-control\" ng-model=\"integration.config.repo_name\" placeholder=\"repo_name\" type=\"text\">\n" +
4336 " <a class=\"btn btn-default btn-xs\" data-uib-tooltip=\"Visit Application\" data-ui-sref=\"applications.update({resourceId:perm.self.resource_id})\">\n" +
4337 " <span class=\"fa fa-cog\"></span>\n" +
4338 " </a>\n" +
4685 4339 " </div>\n" +
4340 " </li>\n" +
4341 " </ul>\n" +
4686 4342 "\n" +
4687 " </div>\n" +
4688 " </div>\n" +
4689 " <div class=\"form-group\">\n" +
4343 " <h3>Direct dashboard permissions</h3>\n" +
4690 4344 "\n" +
4691 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
4345 " <ul class=\"list-group\">\n" +
4346 " <li ng-repeat=\"perm in user.resourcePermissions.user.dashboard\" class=\"animate-repeat list-group-item\">\n" +
4347 " <strong>{{ perm.self.resource_name }}</strong>\n" +
4348 " <div class=\"pull-right\">\n" +
4692 4349 "\n" +
4693 " <div class=\"col-sm-8 col-lg-9\">\n" +
4694 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Use this repo\">\n" +
4695 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
4696 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
4697 " <ul class=\"dropdown-menu\">\n" +
4698 " <li><a>No</a></li>\n" +
4699 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
4700 " </ul>\n" +
4701 " </span>\n" +
4702 " </div>\n" +
4703 " </div>\n" +
4704 " </form>\n" +
4350 " <span class=\"btn btn-primary btn-xs m-r-1\" disabled ng-repeat=\"perm_name in perm.permissions\">{{ perm.self.owner ? 'Resource owner' : perm_name }}</span>\n" +
4705 4351 "\n" +
4706 " <p class=\"m-t-1\">Remember you first need to\n" +
4707 " <strong>\n" +
4708 " <a data-ui-sref=\"user.profile.identities\">authorize your user account</a></strong>\n" +
4709 " with Bitbucket before we can send issues on your behalf.</p>\n" +
4352 " <a class=\"btn btn-default btn-xs\" data-uib-tooltip=\"Visit Dashboard\" data-ui-sref=\"dashboard.update({resourceId:perm.self.resource_id})\">\n" +
4353 " <span class=\"fa fa-cog\"></span>\n" +
4354 " </a>\n" +
4355 " </div>\n" +
4356 " </li>\n" +
4357 " </ul>\n" +
4710 4358 "\n" +
4711 " <p>Every user will have to authorize AppEnlight to access Bitbucket to be able to post issues.</p>\n" +
4359 " </div>\n" +
4712 4360 "\n" +
4713 4361 " </div>\n" +
4362 "\n" +
4363 "\n" +
4714 4364 "</div>\n"
4715 4365 );
4716 4366
4717 4367
4718 $templateCache.put('templates/applications/integrations/campfire.html',
4719 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
4720 "\n" +
4721 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
4722 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4723 " <div class=\"panel-body\">\n" +
4724 " <h1>Campfire Integration</h1>\n" +
4725 "\n" +
4726 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
4368 $templateCache.put('templates/admin/users/users_list.html',
4369 "<ng-include src=\"'templates/loader.html'\" ng-if=\"users.loading.users\"></ng-include>\n" +
4727 4370 "\n" +
4728 " <div class=\"form-group\">\n" +
4371 "<div ng-show=\"!users.loading.users\">\n" +
4729 4372 "\n" +
4730 " <label class=\"control-label col-sm-3 col-lg-2\">Account name</label>\n" +
4731 " <div class=\"col-sm-8 col-lg-9\">\n" +
4732 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
4373 " <div class=\"panel panel-default\">\n" +
4733 4374 "\n" +
4734 " <div class=\"input-group\">\n" +
4735 " <div class=\"input-group-addon\">http://</div>\n" +
4736 " <input class=\"form-control\" ng-model=\"integration.config.account\" placeholder=\"account\">\n" +
4737 " <div class=\"input-group-addon\">.campfirenow.com</div>\n" +
4738 " </div>\n" +
4739 " </div>\n" +
4740 " </div>\n" +
4375 " <div class=\"panel-heading\">\n" +
4376 " {{users.activeUsers}} active out of {{users.users.length}} users\n" +
4377 " </div>\n" +
4741 4378 "\n" +
4742 " <div class=\"form-group\">\n" +
4743 " <label class=\"control-label col-sm-3 col-lg-2\">API Token</label>\n" +
4744 " <div class=\"col-sm-8 col-lg-9\">\n" +
4745 " <data-form-errors errors=\"integration.integrationForm.ae_validation.api_token\"></data-form-errors>\n" +
4746 " <input class=\"form-control\" ng-model=\"integration.config.api_token\" placeholder=\"Your API token\">\n" +
4747 " </div>\n" +
4748 " </div>\n" +
4749 4379 "\n" +
4750 " <div class=\"form-group\">\n" +
4751 " <label class=\"control-label col-sm-3 col-lg-2\">Room ID list</label>\n" +
4752 " <div class=\"col-sm-8 col-lg-9\">\n" +
4753 " <data-form-errors errors=\"integration.integrationForm.ae_validation.rooms\"></data-form-errors>\n" +
4754 " <input class=\"form-control\" ng-model=\"integration.config.rooms\" placeholder=\"Room ID list\">\n" +
4755 " <p>\n" +
4756 " <small>Room ID list separated by comma</small>\n" +
4757 " </p>\n" +
4758 " </div>\n" +
4759 " </div>\n" +
4760 " <div class=\"form-group\">\n" +
4761 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Connect to Campfire\">\n" +
4380 " <table st-table=\"displayedCollection\" st-safe-src=\"users.users\" class=\"table table-striped\">\n" +
4381 " <thead>\n" +
4382 " <tr>\n" +
4383 " <th class=\"user_name\" st-sort=\"user_name\"><a>Username</a></th>\n" +
4384 " <th class=\"email\" st-sort=\"email\"><a>Email</a></th>\n" +
4385 " <th class=\"status\" st-sort=\"status\"><a>Status</a></th>\n" +
4386 " <th st-sort=\"first_name\"><a>First Name</a></th>\n" +
4387 " <th st-sort=\"last_name\"><a>Last Name</a></th>\n" +
4388 " <th st-sort=\"last_login_date\"><a>Last login</a></th>\n" +
4389 " <th class=\"options\"></th>\n" +
4390 " </tr>\n" +
4391 " <tr>\n" +
4392 " <th><input st-search=\"user_name\" placeholder=\"search for user name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4393 " <th><input st-search=\"email\" placeholder=\"search for email\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4394 " <th></th>\n" +
4395 " <th><input st-search=\"first_name\" placeholder=\"search for first name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4396 " <th><input st-search=\"last_name\" placeholder=\"search for last name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4397 " <th><input st-search=\"last_login_date\" placeholder=\"search for last name\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
4398 " <th></th>\n" +
4399 " </tr>\n" +
4400 " </thead>\n" +
4401 " <tbody>\n" +
4762 4402 "\n" +
4403 " <tr ng-repeat=\"user in displayedCollection track by user.id\">\n" +
4404 " <td><img src=\"{{user.gravatar_url}}\" class=\"avatar\"> {{user.user_name}}</td>\n" +
4405 " <td class=\"word-wrap small\">{{user.email}}</td>\n" +
4406 " <td class=\"text-center\"><span class=\"fa\" ng-class=\"{'fa-check-circle':user.status, 'fa-times':!user.status}\"></span></td>\n" +
4407 " <td class=\"word-wrap small\">{{user.first_name}}</td>\n" +
4408 " <td class=\"word-wrap small\">{{user.last_name}}</td>\n" +
4409 " <td><span data-uib-tooltip=\"{{user.last_login_date}}\" class=\"small\">{{user.last_login_date | isoToRelativeTime}}</span></td>\n" +
4410 " <td>\n" +
4411 " <a class=\"btn btn-default btn-sm\" data-ui-sref=\"admin.user.update({userId:user.id})\"><span class=\"fa fa-cog\"></span></a>\n" +
4763 4412 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
4764 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
4413 " <a class=\"btn btn-danger btn-sm\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
4765 4414 " <ul class=\"dropdown-menu\">\n" +
4766 4415 " <li><a>No</a></li>\n" +
4767 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
4416 " <li><a ng-click=\"users.removeUser(user)\">Yes</a></li>\n" +
4768 4417 " </ul>\n" +
4769 4418 " </span>\n" +
4419 " </tr>\n" +
4420 " <tfoot>\n" +
4421 " <tr>\n" +
4422 " <td colspan=\"6\" class=\"text-center\">\n" +
4423 " <div st-pagination=\"\" st-items-by-page=\"100\" st-displayed-pages=\"7\"></div>\n" +
4424 " </td>\n" +
4425 " </tr>\n" +
4426 " </tfoot>\n" +
4427 " </tbody>\n" +
4428 " </table>\n" +
4770 4429 "\n" +
4771 " <div class=\"btn-group\" uib-dropdown>\n" +
4772 " <button id=\"single-button\" type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
4773 " Test integration <span class=\"caret\"></span>\n" +
4774 " </button>\n" +
4775 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
4776 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
4777 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
4778 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
4779 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
4780 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
4781 " </ul>\n" +
4782 " </div>\n" +
4783 "\n" +
4784 " </div>\n" +
4785 "\n" +
4786 " </form>\n" +
4787 4430 "\n" +
4788 4431 " </div>\n" +
4789 4432 "</div>\n"
4790 4433 );
4791 4434
4792 4435
4793 $templateCache.put('templates/applications/integrations/flowdock.html',
4794 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
4795 "\n" +
4796 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
4797 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4798 " <div class=\"panel-body\">\n" +
4436 $templateCache.put('templates/applications/applications_purge_logs.html',
4437 "<ng-include src=\"'templates/loader.html'\" ng-if=\"applications_purge.loading.applications\"></ng-include>\n" +
4799 4438 "\n" +
4800 " <h1>Flowdock Integration</h1>\n" +
4439 "<div ng-show=\"!applications_purge.loading.applications\">\n" +
4440 " <div class=\"panel panel-default\">\n" +
4441 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4442 " <div class=\"panel-body\">\n" +
4801 4443 "\n" +
4802 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
4803 "\n" +
4804 " <div class=\"form-group\">\n" +
4805 "\n" +
4806 " <label class=\"control-label col-sm-3 col-lg-2\">API Token</label>\n" +
4444 " <form method=\"post\" class=\"form-horizontal\" name=\"applications_purge.form\" ng-submit=\"applications_purge.purgeLogs()\">\n" +
4445 " <div class=\"form-group\">\n" +
4446 " <label class=\"control-label col-sm-3 col-lg-2\">Application:</label>\n" +
4807 4447 "\n" +
4808 " <div class=\"col-sm-8 col-lg-9\">\n" +
4809 " <data-form-errors errors=\"integration.integrationForm.ae_validation.api_token\"></data-form-errors>\n" +
4810 " <input class=\"form-control\" ng-model=\"integration.config.api_token\" placeholder=\"Your API token\" type=\"text\">\n" +
4448 " <div class=\"col-sm-9 col-lg-10 form-inline\">\n" +
4449 " <select ng-model=\"applications_purge.selectedResource\" ng-change=\"applications_purge.getCommonKeys()\"\n" +
4450 " ng-options=\"r.resource_id as r.resource_name for r in applications_purge.applications\" class=\"form-control\"></select>\n" +
4451 " </div>\n" +
4811 4452 " </div>\n" +
4812 4453 "\n" +
4454 " <div class=\"form-group\">\n" +
4455 " <label class=\"control-label col-sm-3 col-lg-2\">Namespace:</label>\n" +
4813 4456 "\n" +
4814 " </div>\n" +
4815 "\n" +
4816 " <div class=\"form-group\">\n" +
4817 "\n" +
4818 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
4819 "\n" +
4820 " <div class=\"col-sm-8 col-lg-9\">\n" +
4821 "\n" +
4822 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Connect to Flowdock\">\n" +
4823 "\n" +
4824 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
4825 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
4826 " <ul class=\"dropdown-menu\">\n" +
4827 " <li><a>No</a></li>\n" +
4828 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
4829 " </ul>\n" +
4830 " </span>\n" +
4831 " <div class=\"btn-group\" uib-dropdown>\n" +
4832 " <button id=\"single-button\" type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
4833 " Test integration <span class=\"caret\"></span>\n" +
4834 " </button>\n" +
4835 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
4836 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
4837 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
4838 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
4839 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
4840 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
4841 " </ul>\n" +
4457 " <div class=\"col-sm-9 col-lg-10\">\n" +
4458 " <input type=\"text\" name=\"namespace\" ng-model=\"applications_purge.namespace\"\n" +
4459 " placeholder=\"Namespace to filter on\" uib-typeahead=\"ns for ns in applications_purge.commonNamespaces\"\n" +
4460 " class=\"form-control\">\n" +
4842 4461 " </div>\n" +
4843 4462 " </div>\n" +
4844 " </div>\n" +
4845 4463 "\n" +
4464 " <div class=\"form-group\">\n" +
4465 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
4846 4466 "\n" +
4847 " </form>\n" +
4467 " <div class=\"col-sm-8 col-lg-9 \">\n" +
4468 " <input class=\"form-control btn btn-primary\" name=\"submit\" type=\"submit\" value=\"Purge logs meeting the criteria\">\n" +
4469 " </div>\n" +
4470 " </div>\n" +
4848 4471 "\n" +
4472 " </form>\n" +
4473 " </div>\n" +
4849 4474 " </div>\n" +
4850 4475 "</div>\n"
4851 4476 );
4852 4477
4853 4478
4854 $templateCache.put('templates/applications/integrations/github.html',
4855 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
4856 "\n" +
4857 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
4858 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4859 " <div class=\"panel-body\">\n" +
4479 $templateCache.put('templates/applications/applications_update.html',
4480 "<ng-include src=\"'templates/loader.html'\" ng-if=\"application.loading.application\"></ng-include>\n" +
4860 4481 "\n" +
4861 " <h1>Github Integration</h1>\n" +
4482 "<div ng-show=\"!application.loading.application\">\n" +
4862 4483 "\n" +
4863 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
4484 " <div class=\"panel panel-default\">\n" +
4485 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4486 " <div class=\"panel-body\">\n" +
4864 4487 "\n" +
4488 " <div class=\"row\" ng-show=\"application.resource.resource_id\">\n" +
4489 " <div class=\"col-sm-6\">\n" +
4865 4490 "\n" +
4866 " <div class=\"form-group\">\n" +
4491 " <uib-tabset>\n" +
4492 " <uib-tab>\n" +
4493 " <uib-tab-heading>\n" +
4494 " API keys\n" +
4495 " </uib-tab-heading>\n" +
4867 4496 "\n" +
4868 " <label class=\"control-label col-sm-3 col-lg-2\">Repository</label>\n" +
4497 " <p><strong>PRIVATE API KEY:</strong></p>\n" +
4498 " <p>\n" +
4499 " <div class=\"well well-sm\">{{ application.resource.api_key }}</div>\n" +
4500 " </p>\n" +
4501 " <p><strong>PUBLIC API KEY</strong> (for javascript clients):</p>\n" +
4502 " <p>\n" +
4503 " <div class=\"well well-sm\">{{ application.resource.public_key }}</div>\n" +
4504 " </p>\n" +
4505 " <p><small>Your key will be used to identify to which application your data\n" +
4506 " belongs to please keep them private at all times.</small></p>\n" +
4869 4507 "\n" +
4870 " <div class=\"col-sm-8 col-lg-9\">\n" +
4508 " </uib-tab>\n" +
4871 4509 "\n" +
4872 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
4873 " <data-form-errors errors=\"integration.integrationForm.ae_validation.repo_name\"></data-form-errors>\n" +
4510 " <uib-tab>\n" +
4511 " <uib-tab-heading>\n" +
4512 " <span class=\"btn btn-danger btn-xs\"><span class=\"fa fa-exclamation-triangle\"></span></span> Regenerate API keys\n" +
4513 " </uib-tab-heading>\n" +
4514 " <p>Are you sure you want to regenerate API KEY for this application?</p>\n" +
4515 " <p>All client application keys will need to be updated.</p>\n" +
4516 " <form ng-submit=\"application.regenerateAPIKeys()\" name=\"application.regenerateAPIKeysForm\" class=\"form-inline\">\n" +
4517 " <data-form-errors errors=\"application.regenerateAPIKeysForm.ae_validation.password\"></data-form-errors>\n" +
4518 " <div class=\"form-group\">\n" +
4519 " <input type=\"password\" name=\"confirm\"\n" +
4520 " placeholder=\"Enter your password to proceed\" class=\"form-control\" ng-model=\"application.regenerateAPIKeysPassword\">\n" +
4521 " <input type=\"submit\" class=\"btn btn-danger\" value=\"Confirm\">\n" +
4522 " </div>\n" +
4523 " </form>\n" +
4524 " </uib-tab>\n" +
4525 " </uib-tabset>\n" +
4526 " </div>\n" +
4527 " <div class=\"col-sm-6 text-center\">\n" +
4528 " <h2 class=\"m-t-0\">How to connect your application?</h2>\n" +
4529 " <p>Visit our <a href=\"{{AeConfig.urls.docs}}\"><strong>developer documentation</strong></a> for step-by-step integration instructions.</p>\n" +
4530 " <div class=\"clearfix\"></div>\n" +
4531 " <p class=\"text-center\">\n" +
4532 " <a href=\"{{AeConfig.urls.docs}}\"><img src=\"/static/appenlight/images/logos/django_small.png\" alt=\"Django Logo\">\n" +
4533 " <img src=\"/static/appenlight/images/logos/pyramid_small.png\" alt=\"Pyramid Logo\">\n" +
4534 " <img src=\"/static/appenlight/images/logos/flask_small.png\" alt=\"Flask Logo\"></a>\n" +
4874 4535 "\n" +
4875 " <div class=\"input-group\">\n" +
4876 " <div class=\"input-group-addon\">https://api.github.com/</div>\n" +
4877 " <input class=\"form-control\" ng-model=\"integration.config.user_name\" placeholder=\"user\" type=\"text\">\n" +
4878 " <div class=\"input-group-addon\">/</div>\n" +
4879 " <input class=\"form-control\" ng-model=\"integration.config.repo_name\" placeholder=\"repo_name\" type=\"text\">\n" +
4880 " </div>\n" +
4536 " <a href=\"{{AeConfig.urls.docs}}\"><img src=\"/static/appenlight/images/logos/js_small.png\" alt=\"Javascript Logo\">\n" +
4537 " <img src=\"/static/appenlight/images/logos/nodejs.png\" alt=\"Node.js\"></a>\n" +
4538 " <img src=\"/static/appenlight/images/logos/ruby_small.png\" alt=\"Ruby Logo\">\n" +
4539 " <img src=\"/static/appenlight/images/logos/php_small.png\" alt=\"PHP Logo\">\n" +
4540 " </a>\n" +
4881 4541 "\n" +
4542 " </p>\n" +
4882 4543 " </div>\n" +
4883 4544 " </div>\n" +
4884 4545 "\n" +
4885 " <div class=\"form-group\">\n" +
4546 " <hr ng-show=\"application.resource.resource_id\">\n" +
4886 4547 "\n" +
4887 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
4548 " <form method=\"post\" class=\"form-horizontal\" name=\"application.BasicForm\" ng-submit=\"application.updateBasicForm()\" novalidate>\n" +
4549 " <div class=\"form-group\">\n" +
4550 " <data-form-errors errors=\"application.BasicForm.ae_validation.resource_name\"></data-form-errors>\n" +
4551 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4552 " Application name\n" +
4553 " <span class=\"required\">*</span>\n" +
4554 " </label>\n" +
4888 4555 "\n" +
4889 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Use this repo\">\n" +
4556 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4557 " <input class=\"form-control\" name=\"resource_name\" placeholder=\"Application Name\" type=\"text\" ng-model=\"application.resource.resource_name\">\n" +
4558 " </div>\n" +
4890 4559 "\n" +
4891 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
4892 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
4893 " <ul class=\"dropdown-menu\">\n" +
4894 " <li><a>No</a></li>\n" +
4895 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
4896 " </ul>\n" +
4897 " </span>\n" +
4898 4560 "\n" +
4899 " </div>\n" +
4900 " </form>\n" +
4561 " </div>\n" +
4901 4562 "\n" +
4902 " <p class=\"m-t-1\">Remember you first need to\n" +
4903 " <strong>\n" +
4904 " <a data-ui-sref=\"user.profile.identities\">authorize your user account</a></strong>\n" +
4905 " with Github before we can send issues on your behalf.</p>\n" +
4563 " <div class=\"form-group\">\n" +
4564 " <data-form-errors errors=\"application.BasicForm.ae_validation.domains\"></data-form-errors>\n" +
4565 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4566 " Domain names for CORS headers\n" +
4567 " </label>\n" +
4568 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4569 " <textarea class=\"form-control\" name=\"domains\" ng-model=\"application.resource.domains\"></textarea>\n" +
4570 " <p class=\"description\">Required for Javascript error tracking (one line one domain, skip http:// part)</p>\n" +
4571 " </div>\n" +
4906 4572 "\n" +
4907 " <p>Every user will have to authorize AppEnlight to access Github to be able to post issues.</p>\n" +
4908 4573 "\n" +
4909 " <div class=\"panel panel-warning\">\n" +
4910 " <div class=\"panel-heading\">Private repository access</div>\n" +
4911 " <div class=\"panel-body\">\n" +
4912 " <p>If you need access to private repositories <a data-ui-sref=\"user.profile.identities\">profile page</a> allows you to require token including private repository permissions.</p>\n" +
4574 " </div>\n" +
4575 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4576 " <data-form-errors errors=\"application.BasicForm.ae_validation.default_grouping\"></data-form-errors>\n" +
4577 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4578 " Default grouping for errors\n" +
4579 " </label>\n" +
4580 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4581 " <select class=\"form-control\" name=\"default_grouping\" ng-model=\"application.resource.default_grouping\" ng-options=\"i[0] as i[1] for i in application.groupingOptions\"></select>\n" +
4582 " </div>\n" +
4913 4583 "\n" +
4914 " <p>Registration page OAuth does NOT give you token with private repository access permissions.</p>\n" +
4915 " </div>\n" +
4916 " </div>\n" +
4584 " </div>\n" +
4585 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4586 " <data-form-errors errors=\"application.BasicForm.ae_validation.error_report_threshold\"></data-form-errors>\n" +
4587 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4588 " Alert on error reports\n" +
4589 " <span class=\"required\">*</span>\n" +
4590 " </label>\n" +
4591 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4592 " <input class=\"form-control\" name=\"error_report_threshold\" type=\"text\" ng-model=\"application.resource.error_report_threshold\">\n" +
4593 " <p class=\"description\">Application requires to send at least this amount of error reports per minute to open alert</p>\n" +
4594 " </div>\n" +
4595 " </div>\n" +
4596 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4597 " <data-form-errors errors=\"application.BasicForm.ae_validation.slow_report_threshold\"></data-form-errors>\n" +
4598 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4599 " Alert on slow reports\n" +
4600 " <span class=\"required\">*</span>\n" +
4601 " </label>\n" +
4917 4602 "\n" +
4918 " </div>\n" +
4919 "</div>\n"
4920 );
4921
4922
4923 $templateCache.put('templates/applications/integrations/hipchat.html',
4924 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
4603 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4604 " <input class=\"form-control\" name=\"slow_report_threshold\" type=\"text\" ng-model=\"application.resource.slow_report_threshold\">\n" +
4605 " <p class=\"description\">Application requires to send at least this amount of slow reports per minute to open alert</p>\n" +
4606 " </div>\n" +
4607 " </div>\n" +
4608 " <div class=\"form-group\" ng-show=\"application.resource.resource_id\">\n" +
4609 " <data-form-errors errors=\"application.BasicForm.ae_validation.allow_permanent_storage\"></data-form-errors>\n" +
4610 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4611 " Permanent logs\n" +
4612 " </label>\n" +
4613 " <div class=\" col-sm-8 col-lg-9\">\n" +
4614 " <input class=\"form-control\" name=\"allow_permanent_storage\" type=\"checkbox\" ng-model=\"application.resource.allow_permanent_storage\">\n" +
4615 " <p class=\"description\">Allow permanent storage of logs in separate DB partitions (only administrator can enable this feature)</p>\n" +
4616 " </div>\n" +
4617 " </div>\n" +
4618 " <div class=\"form-group\">\n" +
4619 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4925 4620 "\n" +
4926 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
4927 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4928 " <div class=\"panel-body\">\n" +
4621 " </label>\n" +
4929 4622 "\n" +
4930 " <h1>Hipchat Integration</h1>\n" +
4623 " <div class=\" col-sm-8 col-lg-9 \">\n" +
4624 " <input class=\"form-control btn btn-primary\" name=\"submit\" type=\"submit\" value=\"{{application.resource.resource_id? 'Update' : 'Create'}} Application\">\n" +
4625 " </div>\n" +
4626 " </div>\n" +
4627 " </form>\n" +
4628 " </div>\n" +
4629 " </div>\n" +
4931 4630 "\n" +
4932 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
4631 " <div class=\"panel panel-default\" ng-show=\"application.resource.resource_id\">\n" +
4632 " <div class=\"panel-heading\">\n" +
4633 " <h3 class=\"panel-title\">Plugins</h3>\n" +
4634 " </div>\n" +
4635 " <div class=\"panel-body\">\n" +
4933 4636 "\n" +
4934 " <div class=\"form-group\">\n" +
4935 " <label class=\"control-label col-sm-3 col-lg-2\">API Token</label>\n" +
4637 " <plugin-config resource=\"application.resource\"\n" +
4638 " section=\"'application.update'\"\n" +
4639 " ng-if=\"application.resource.resource_id\">\n" +
4640 " </plugin-config>\n" +
4936 4641 "\n" +
4937 " <div class=\"col-sm-8 col-lg-9\">\n" +
4938 " <data-form-errors errors=\"integration.integrationForm.ae_validation.api_token\"></data-form-errors>\n" +
4939 " <input class=\"form-control\" ng-model=\"integration.config.api_token\" placeholder=\"Your API token\" type=\"text\">\n" +
4940 " </div>\n" +
4941 " </div>\n" +
4942 "\n" +
4943 " <div class=\"form-group\">\n" +
4944 "\n" +
4945 " <label class=\"control-label col-sm-3 col-lg-2\">Room ID list</label>\n" +
4642 " </div>\n" +
4643 " </div>\n" +
4946 4644 "\n" +
4947 " <div class=\"col-sm-8 col-lg-9\">\n" +
4948 " <data-form-errors errors=\"integration.integrationForm.ae_validation.rooms\"></data-form-errors>\n" +
4949 " <input class=\"form-control\" ng-model=\"integration.config.rooms\" placeholder=\"Room ID list\" type=\"text\">\n" +
4645 " <div class=\"panel panel-default m-t-1\" ng-show=\"application.resource.resource_id\">\n" +
4646 " <div class=\"panel-heading\">\n" +
4647 " <h3 class=\"panel-title\">API Testing</h3>\n" +
4648 " </div>\n" +
4649 " <div class=\"panel-body\">\n" +
4650 " <p>Please be sure to add at least one <a data-ui-sref=\"user.alert_channels.email\"><strong>email alert channel</strong></a> for your account.</p>\n" +
4651 " <p>This will enable AppEnlight to send you notification emails about errors inside your application.</p>\n" +
4652 " <p><strong>After this is done you can use this CURL commands to test APIs:</strong></p>\n" +
4653 " <p>(Please note that the data like execution times is semi randomly generated)</p>\n" +
4654 " <uib-tabset>\n" +
4655 " <uib-tab>\n" +
4656 " <uib-tab-heading>\n" +
4657 " Log API\n" +
4658 " </uib-tab-heading>\n" +
4950 4659 "\n" +
4951 " <p>\n" +
4952 " <small>Room ID list separated by comma</small>\n" +
4953 " </p>\n" +
4954 " </div>\n" +
4660 " <div class=\"codehilite\">\n" +
4661 " <pre class=\"m-a-0\">\n" +
4662 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/logs?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4663 " [\n" +
4664 " {\n" +
4665 " \"log_level\": \"WARNING\",\n" +
4666 " \"message\": \"OMG ValueError happened\",\n" +
4667 " \"namespace\": \"some.namespace.indicator\",\n" +
4668 " \"request_id\": \"SOME_UUID\",\n" +
4669 " \"permanent\": false,\n" +
4670 " \"primary_key\": \"random_key\",\n" +
4671 " \"server\": \"some.server.hostname\",\n" +
4672 " \"date\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4673 " \"tags\": [[\"tag1\",\"value\"], [\"tag2\", 5]]\n" +
4674 " },\n" +
4675 " {\n" +
4676 " \"log_level\": \"ERROR\",\n" +
4677 " \"message\": \"OMG ValueError happened2\",\n" +
4678 " \"namespace\": \"some.namespace.indicator\",\n" +
4679 " \"request_id\": \"SOME_UUID\",\n" +
4680 " \"permanent\": false,\n" +
4681 " \"server\": \"some.server.hostname\",\n" +
4682 " \"date\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\"\n" +
4683 " }\n" +
4684 " ]'\n" +
4685 " </pre>\n" +
4686 " </div>\n" +
4955 4687 "\n" +
4956 " </div>\n" +
4688 " </uib-tab>\n" +
4957 4689 "\n" +
4958 " <div class=\"form-group\">\n" +
4959 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
4960 " <div class=\"col-sm-8 col-lg-9\">\n" +
4961 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Connect to Hipchat\">\n" +
4962 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
4963 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
4964 " <ul class=\"dropdown-menu\">\n" +
4965 " <li><a>No</a></li>\n" +
4966 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
4967 " </ul>\n" +
4968 " </span>\n" +
4690 " <uib-tab>\n" +
4691 " <uib-tab-heading>\n" +
4692 " Report API\n" +
4693 " </uib-tab-heading>\n" +
4969 4694 "\n" +
4970 " <div class=\"btn-group\" uib-dropdown>\n" +
4971 " <button id=\"single-button\" type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
4972 " Test integration <span class=\"caret\"></span>\n" +
4973 " </button>\n" +
4974 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
4975 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
4976 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
4977 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
4978 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
4979 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
4980 " </ul>\n" +
4695 " <div class=\"codehilite\">\n" +
4696 " <pre class=\"m-a-0\">\n" +
4697 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/reports?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4698 " [{\n" +
4699 " \"client\": \"your-client-name-python\",\n" +
4700 " \"language\": \"python\",\n" +
4701 " \"view_name\": \"views/foo:bar\",\n" +
4702 " \"server\": \"SERVERNAME/INSTANCENAME\",\n" +
4703 " \"priority\": 5,\n" +
4704 " \"error\": \"OMG ValueError happened\",\n" +
4705 " \"occurences\":1,\n" +
4706 " \"http_status\": 500,\n" +
4707 " \"tags\": [[\"tag1\",\"value\"], [\"tag2\", 5]],\n" +
4708 " \"username\": \"USER\",\n" +
4709 " \"url\": \"HTTP://SOMEURL\",\n" +
4710 " \"ip\": \"127.0.0.1\",\n" +
4711 " \"start_time\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4712 " \"end_time\": \"{{application.momentJs.utc().milliseconds(0).add(2, 'seconds').toISOString()}}\",\n" +
4713 " \"user_agent\": \"BROWSER_AGENT\",\n" +
4714 " \"extra\": [[\"message\",\"CUSTOM MESSAGE\"], [\"custom_value\", \"some payload\"]],\n" +
4715 " \"request_id\": \"SOME_UUID\",\n" +
4716 " \"request\": {\"REQUEST_METHOD\": \"GET\",\n" +
4717 " \"PATH_INFO\": \"/FOO/BAR\",\n" +
4718 " \"POST\": {\"FOO\":\"BAZ\",\"XXX\":\"YYY\"}\n" +
4719 " },\n" +
4720 " \"slow_calls\":[{\n" +
4721 " \"start\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4722 " \"end\": \"{{application.momentJs.utc().milliseconds(0).add(1, 'seconds').toISOString()}}\",\n" +
4723 " \"type\": \"sql\",\n" +
4724 " \"subtype\": \"postgresql\",\n" +
4725 " \"parameters\": [\"QPARAM1\",\"QPARAM2\",\"QPARAMX\"],\n" +
4726 " \"statement\": \"QUERY\"\n" +
4727 " }],\n" +
4728 " \"request_stats\": {\n" +
4729 " \"main\": 2.50779,\n" +
4730 " \"nosql\": 0.01008,\n" +
4731 " \"nosql_calls\": 17.0,\n" +
4732 " \"remote\": 0.0,\n" +
4733 " \"remote_calls\": 0.0,\n" +
4734 " \"sql\": 1,\n" +
4735 " \"sql_calls\": 1.0,\n" +
4736 " \"tmpl\": 0.0,\n" +
4737 " \"tmpl_calls\": 0.0,\n" +
4738 " \"custom\": 0.0,\n" +
4739 " \"custom_calls\": 0.0\n" +
4740 " },\n" +
4741 " \"traceback\": [\n" +
4742 " {\"cline\": \"return foo_bar_baz(1,2,3)\",\n" +
4743 " \"file\": \"somedir/somefile.py\",\n" +
4744 " \"fn\": \"somefunction\",\n" +
4745 " \"line\": 454,\n" +
4746 " \"vars\": [[\"a_list\",\n" +
4747 " [\"1\",2,\"4\",\"5\",6]],\n" +
4748 " [\"b\", {\"1\": \"2\", \"ccc\": \"ddd\", \"1\": \"a\"}],\n" +
4749 " [\"obj\", \"object object at 0x7f0030853dc0\"]]\n" +
4750 " },\n" +
4751 " {\"cline\": \"OMG ValueError happened\",\n" +
4752 " \"file\": \"\",\n" +
4753 " \"fn\": \"\",\n" +
4754 " \"line\": \"\",\n" +
4755 " \"vars\": []}\n" +
4756 " ]\n" +
4757 " }]'\n" +
4758 " </pre>\n" +
4981 4759 " </div>\n" +
4982 4760 "\n" +
4983 " </div>\n" +
4984 " </div>\n" +
4761 " </uib-tab>\n" +
4985 4762 "\n" +
4986 " </form>\n" +
4763 " <uib-tab>\n" +
4987 4764 "\n" +
4988 " </div>\n" +
4989 "</div>\n"
4990 );
4991
4992
4993 $templateCache.put('templates/applications/integrations/jira.html',
4994 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
4765 " <uib-tab-heading>\n" +
4766 " Metrics API\n" +
4767 " </uib-tab-heading>\n" +
4995 4768 "\n" +
4996 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
4997 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4998 " <div class=\"panel-body\">\n" +
4769 " <div class=\"codehilite\">\n" +
4770 " <pre class=\"m-a-0\">\n" +
4771 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/general_metrics?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4772 " [{\n" +
4773 " \"namespace\": \"some.monitor\",\n" +
4774 " \"timestamp\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4775 " \"server_name\": \"server.name\",\n" +
4776 " \"tags\": [[\"value1\", 15.7], [\"value2\", 26]]}]'\n" +
4777 " </pre>\n" +
4778 " </div>\n" +
4999 4779 "\n" +
5000 " <h1>Jira Integration</h1>\n" +
4780 " </uib-tab>\n" +
5001 4781 "\n" +
5002 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
4782 " <uib-tab>\n" +
5003 4783 "\n" +
5004 " <div class=\"form-group\" id=\"row-host_name\">\n" +
4784 " <uib-tab-heading>\n" +
4785 " Request Stats API\n" +
4786 " </uib-tab-heading>\n" +
5005 4787 "\n" +
5006 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5007 " Server URL <span class=\"required\">*</span>\n" +
5008 " </label>\n" +
5009 " <div class=\"col-sm-8 col-lg-9\">\n" +
5010 " <data-form-errors errors=\"integration.integrationForm.ae_validation.host_name\"></data-form-errors>\n" +
5011 " <input class=\"form-control\" id=\"host_name\" name=\"host_name\" type=\"text\" ng-model=\"integration.config.host_name\">\n" +
4788 " <div class=\"codehilite\">\n" +
4789 " <pre class=\"m-a-0\">\n" +
4790 "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/request_stats?protocol_version=0.5\\&ampapi_key={{application.resource.api_key}} -d '\n" +
4791 " [{\"server\": \"some.server.hostname\",\n" +
4792 " \"timestamp\": \"{{application.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
4793 " \"metrics\": [[\"dir/module:func\",\n" +
4794 " {\"custom\": 0.0,\n" +
4795 " \"custom_calls\": 0,\n" +
4796 " \"main\": 0.01664,\n" +
4797 " \"nosql\": 0.00061,\n" +
4798 " \"nosql_calls\": 23,\n" +
4799 " \"remote\": 0.0,\n" +
4800 " \"remote_calls\": 0,\n" +
4801 " \"requests\": 1,\n" +
4802 " \"sql\": 0.00105,\n" +
4803 " \"sql_calls\": 2,\n" +
4804 " \"tmpl\": 0.0,\n" +
4805 " \"tmpl_calls\": 0}],\n" +
4806 " [\"SomeView.function\",\n" +
4807 " {\"custom\": 0.0,\n" +
4808 " \"custom_calls\": 0,\n" +
4809 " \"main\": 0.647261,\n" +
4810 " \"nosql\": 0.306554,\n" +
4811 " \"nosql_calls\": 140,\n" +
4812 " \"remote\": 0.0,\n" +
4813 " \"remote_calls\": 0,\n" +
4814 " \"requests\": 28,\n" +
4815 " \"sql\": 0.0,\n" +
4816 " \"sql_calls\": 0,\n" +
4817 " \"tmpl\": 0.0,\n" +
4818 " \"tmpl_calls\": 0}]]\n" +
4819 " }]'\n" +
4820 " </pre>\n" +
4821 " </div>\n" +
5012 4822 "\n" +
5013 " <p>\n" +
5014 " <small>https://servername.atlassian.net</small>\n" +
5015 " </p>\n" +
4823 " </uib-tab>\n" +
5016 4824 "\n" +
5017 " </div>\n" +
5018 " </div>\n" +
5019 " <div class=\"form-group\" id=\"row-user_name\">\n" +
4825 " </uib-tabset>\n" +
5020 4826 "\n" +
5021 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5022 " Username <span class=\"required\">*</span>\n" +
5023 " </label>\n" +
5024 " <div class=\"col-sm-8 col-lg-9\">\n" +
4827 " </div>\n" +
4828 " </div>\n" +
5025 4829 "\n" +
5026 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
5027 " <input class=\"form-control\" id=\"user_name\" name=\"user_name\" type=\"text\" ng-model=\"integration.config.user_name\">\n" +
4830 " <permissions-form resource=\"application.resource\" current-permissions=\"application.resource.current_permissions\"\n" +
4831 " possible-permissions=\"application.resource.possible_permissions\" ng-if=\"application.resource.resource_id\"></permissions-form>\n" +
5028 4832 "\n" +
5029 " <p>\n" +
5030 " <small>user@email.com</small>\n" +
5031 " </p>\n" +
4833 " <div class=\"panel panel-info\" ng-show=\"application.resource.resource_id\">\n" +
4834 " <div class=\"panel-heading\">\n" +
4835 " <h3 class=\"panel-title\">Postprocessing</h3>\n" +
4836 " </div>\n" +
4837 " <div class=\"panel-body\">\n" +
4838 " <p>This section allows you influence the rating of report groups - if rule is matched once its not executed anymore</p>\n" +
5032 4839 "\n" +
5033 " </div>\n" +
5034 " </div>\n" +
5035 " <div class=\"form-group\" id=\"row-password\">\n" +
4840 " <p>\n" +
4841 " <a class=\"btn btn-info\" ng-click=\"application.addRule()\"><span class=\"fa fa-plus-circle\"></span> Add rule</a>\n" +
4842 " </p>\n" +
5036 4843 "\n" +
5037 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5038 " Password <span class=\"required\">*</span>\n" +
5039 " </label>\n" +
5040 " <div class=\"col-sm-8 col-lg-9\">\n" +
5041 " <data-form-errors errors=\"integration.integrationForm.ae_validation.password\"></data-form-errors>\n" +
5042 " <input class=\"form-control\" id=\"password\" name=\"password\" type=\"password\" ng-model=\"integration.config.password\">\n" +
5043 " </div>\n" +
5044 " </div>\n" +
5045 " <div class=\"form-group\" id=\"row-project\">\n" +
4844 " <post-process-action action=\"action\" resource=\"application.resource\" ng-repeat=\"action in application.resource.postprocessing_rules\"></post-process-action>\n" +
4845 " </div>\n" +
4846 " </div>\n" +
5046 4847 "\n" +
5047 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5048 " Project key <span class=\"required\">*</span>\n" +
5049 " </label>\n" +
5050 " <div class=\"col-sm-8 col-lg-9\">\n" +
5051 " <data-form-errors errors=\"integration.integrationForm.ae_validation.project\"></data-form-errors>\n" +
5052 " <input class=\"form-control\" id=\"project\" name=\"project\" type=\"text\" ng-model=\"integration.config.project\">\n" +
5053 " </div>\n" +
4848 " <div class=\"panel panel-danger\" ng-show=\"application.resource.resource_id\">\n" +
4849 " <div class=\"panel-heading\">\n" +
4850 " <h3 class=\"panel-title\">Administration</h3>\n" +
4851 " </div>\n" +
4852 " <div class=\"panel-body\">\n" +
4853 " <h2>Transfer ownership</h2>\n" +
4854 " <p>Please note that by transfering ownership you WILL lose access to the application data and new owner needs to give you access permission</p>\n" +
4855 " <div class=\"confirmation_form\" ng-submit=\"application.transferApplication()\">\n" +
4856 " <form class=\"form-horizontal\" name=\"application.formTransfer\">\n" +
4857 " <div class=\"form-group\">\n" +
4858 " <data-form-errors errors=\"application.formTransfer.ae_validation.password\"></data-form-errors>\n" +
4859 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4860 " Password\n" +
4861 " </label>\n" +
4862 " <div class=\"col-sm-8 col-lg-9\">\n" +
4863 " <input class=\"form-control\" name=\"password\" type=\"password\" ng-model=\"application.formTransferModel.password\">\n" +
4864 " </div>\n" +
4865 " </div>\n" +
4866 " <div class=\"form-group\">\n" +
4867 " <data-form-errors errors=\"application.formTransfer.ae_validation.user_name\"></data-form-errors>\n" +
4868 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4869 " New owners username\n" +
4870 " </label>\n" +
4871 " <div class=\"col-sm-8 col-lg-9\">\n" +
4872 " <input class=\"form-control\" name=\"user_name\" type=\"text\" ng-model=\"application.formTransferModel.user_name\">\n" +
4873 " </div>\n" +
4874 " </div>\n" +
4875 " <div class=\"form-group\">\n" +
4876 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4877 " </label>\n" +
4878 " <div class=\"col-sm-8 col-lg-9\">\n" +
4879 " <button class=\"btn btn-danger\">\n" +
4880 " <span class=\"fa fa-user-plus\"></span>\n" +
4881 " Transfer ownership of application\n" +
4882 " </button>\n" +
4883 " </div>\n" +
4884 " </div>\n" +
4885 " </form>\n" +
5054 4886 " </div>\n" +
5055 " <div class=\"form-group\" id=\"row-submit\">\n" +
5056 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5057 " <div class=\"col-sm-8 col-lg-9\">\n" +
5058 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"Setup Jira\">\n" +
5059 4887 "\n" +
5060 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5061 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5062 " <ul class=\"dropdown-menu\">\n" +
5063 " <li><a>No</a></li>\n" +
5064 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5065 " </ul>\n" +
5066 " </span>\n" +
5067 " </div>\n" +
5068 " </div>\n" +
4888 " <hr/>\n" +
5069 4889 "\n" +
5070 " </form>\n" +
4890 " <h2>Remove application</h2>\n" +
4891 " <p><strong>This operation will wipe out all data from database - there is no undo.</strong></p>\n" +
5071 4892 "\n" +
4893 " <div class=\"confirmation_form\">\n" +
4894 " <form class=\"form-horizontal\" name=\"application.formDelete\" ng-submit=\"application.deleteApplication()\">\n" +
4895 " <div class=\"form-group\">\n" +
4896 " <data-form-errors errors=\"application.formDelete.ae_validation.password\"></data-form-errors>\n" +
4897 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
4898 " Password\n" +
4899 " </label>\n" +
4900 " <div class=\"col-sm-8 col-lg-9\">\n" +
4901 " <input class=\"form-control\" name=\"password\" type=\"password\" ng-model=\"application.formDeleteModel.password\">\n" +
4902 " </div>\n" +
4903 " </div>\n" +
4904 " <div class=\"form-group\">\n" +
4905 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
5072 4906 "\n" +
4907 " </label>\n" +
4908 " <div class=\"col-sm-8 col-lg-9\">\n" +
4909 " <button class=\"btn btn-danger\">\n" +
4910 " <span class=\"fa fa-trash-o\"></span>\n" +
4911 " Delete my application\n" +
4912 " </button>\n" +
4913 " </div>\n" +
4914 " </div>\n" +
4915 " </form>\n" +
4916 " </div>\n" +
4917 " </div>\n" +
5073 4918 " </div>\n" +
5074 4919 "</div>\n"
5075 4920 );
5076 4921
5077 4922
5078 $templateCache.put('templates/applications/integrations/slack.html',
4923 $templateCache.put('templates/applications/breadcrumbs.html',
4924 "<ol class=\"breadcrumb\" ng-show=\"$state.includes('applications')\">\n" +
4925 " <li>Applications</li>\n" +
4926 " <li ng-show=\"$state.includes('applications.list')\" ng-class=\"{bold:$state.is('applications.list')}\">Owned applications</li>\n" +
4927 " <li ng-show=\"$state.includes('applications.update')\" ng-class=\"{bold:$state.is('applications.update')}\">Modify application</li>\n" +
4928 " <li ng-show=\"$state.includes('applications.integrations')\" ng-class=\"{bold:$state.includes('applications.integrations')}\">Integrations</li>\n" +
4929 " <li ng-show=\"$state.includes('applications.purge_logs')\" ng-class=\"{bold:$state.includes('applications.purge_logs')}\">Log Purging</li>\n" +
4930 "</ol>\n"
4931 );
4932
4933
4934 $templateCache.put('templates/applications/integrations.html',
4935 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application && $state.is('applications.integrations')\"></ng-include>\n" +
4936 "\n" +
4937 "<ui-view>\n" +
4938 " <div class=\"panel panel-default\" ng-show=\"!integrations.loading.application\">\n" +
4939 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
4940 " <div class=\"panel-body\">\n" +
4941 "\n" +
4942 " <a class=\"btn btn-default integration\"\n" +
4943 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'bitbucket'})\">\n" +
4944 " <span class=\"fa fa-fw fa-bitbucket fa-3x pull-left\"></span>\n" +
4945 " <strong>Bitbucket</strong>\n" +
4946 "\n" +
4947 " <p>Send issues and reports to Bitbucket</p>\n" +
4948 " </a>\n" +
4949 "\n" +
4950 " <a class=\"btn btn-default integration\"\n" +
4951 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'campfire'})\">\n" +
4952 " <span class=\"fa fa-fw fa-comment fa-3x pull-left\"></span>\n" +
4953 " <strong>Campfire</strong>\n" +
4954 "\n" +
4955 " <p>Receive reports and alerts in your Campfire rooms</p>\n" +
4956 " </a>\n" +
4957 "\n" +
4958 " <a class=\"btn btn-default integration\"\n" +
4959 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'flowdock'})\">\n" +
4960 " <span class=\"fa fa-fw fa-envelope fa-3x pull-left\"></span>\n" +
4961 " <strong>Flowdock</strong>\n" +
4962 "\n" +
4963 " <p>Receive reports and alerts on your Flowdock team\n" +
4964 " inbox</p>\n" +
4965 " </a>\n" +
4966 "\n" +
4967 " <a class=\"btn btn-default integration\"\n" +
4968 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'github'})\">\n" +
4969 " <span class=\"fa fa-fw fa-github fa-3x pull-left\"></span>\n" +
4970 " <strong>Github</strong>\n" +
4971 "\n" +
4972 " <p>Send issues and reports to Github</p>\n" +
4973 " </a>\n" +
4974 "\n" +
4975 " <a class=\"btn btn-default integration\"\n" +
4976 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'hipchat'})\">\n" +
4977 " <span class=\"fa fa-fw fa-comment fa-3x pull-left\"></span>\n" +
4978 " <strong>HipChat</strong>\n" +
4979 "\n" +
4980 " <p>Receive reports and alerts in your Hipchat chanels</p>\n" +
4981 " </a>\n" +
4982 "\n" +
4983 " <a class=\"btn btn-default integration\"\n" +
4984 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'jira'})\">\n" +
4985 " <span class=\"fa fa-fw fa-ticket fa-3x pull-left\"></span>\n" +
4986 " <strong>Jira</strong>\n" +
4987 "\n" +
4988 " <p>Send issues and reports to Jira</p>\n" +
4989 " </a>\n" +
4990 "\n" +
4991 " <a class=\"btn btn-default integration\"\n" +
4992 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'slack'})\">\n" +
4993 " <span class=\"fa fa-fw fa-comment fa-3x pull-left\"></span>\n" +
4994 " <strong>Slack</strong>\n" +
4995 "\n" +
4996 " <p>Receive reports and alerts in your Slack chanels</p>\n" +
4997 " </a>\n" +
4998 "\n" +
4999 " <a class=\"btn btn-default integration\"\n" +
5000 " data-ui-sref=\"applications.integrations.edit({resourceId:integrations.resource.resource_id, integration:'webhooks'})\">\n" +
5001 " <span class=\"fa fa-fw fa-cloud-upload fa-3x pull-left\"></span>\n" +
5002 " <strong>Webhooks</strong>\n" +
5003 "\n" +
5004 " <p>Notify third party API's of your reports and alerts</p>\n" +
5005 " </a>\n" +
5006 " </div>\n" +
5007 " </div>\n" +
5008 "</ui-view>\n"
5009 );
5010
5011
5012 $templateCache.put('templates/applications/integrations/bitbucket.html',
5079 5013 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5080 5014 "\n" +
5081 5015 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5082 5016 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5083 5017 " <div class=\"panel-body\">\n" +
5084 5018 "\n" +
5085 " <h1>Slack Integration</h1>\n" +
5019 " <h1>Bitbucket Integration</h1>\n" +
5086 5020 "\n" +
5087 5021 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5088 "\n" +
5089 5022 " <div class=\"form-group\">\n" +
5090 5023 "\n" +
5091 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5092 " API Token <span class=\"required\">*</span>\n" +
5093 " </label>\n" +
5024 " <label class=\"control-label col-sm-3 col-lg-2\">Repository</label>\n" +
5025 "\n" +
5094 5026 " <div class=\"col-sm-8 col-lg-9\">\n" +
5095 " <data-form-errors errors=\"integration.integrationForm.ae_validation.webhook_url\"></data-form-errors>\n" +
5096 " <input class=\"form-control\" ng-model=\"integration.config.webhook_url\" placeholder=\"Webhook URL\" type=\"webhook_url\">\n" +
5027 "\n" +
5028 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
5029 " <data-form-errors errors=\"integration.integrationForm.ae_validation.repo_name\"></data-form-errors>\n" +
5030 "\n" +
5031 " <div class=\"input-group\">\n" +
5032 " <div class=\"input-group-addon\">https://bitbucket.org/</div>\n" +
5033 " <input class=\"form-control\" ng-model=\"integration.config.user_name\" placeholder=\"user\" type=\"text\">\n" +
5034 " <div class=\"input-group-addon\">/</div>\n" +
5035 " <input class=\"form-control\" ng-model=\"integration.config.repo_name\" placeholder=\"repo_name\" type=\"text\">\n" +
5036 " </div>\n" +
5037 "\n" +
5097 5038 " </div>\n" +
5098 5039 " </div>\n" +
5099 "\n" +
5100 5040 " <div class=\"form-group\">\n" +
5101 5041 "\n" +
5102 5042 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5103 " <div class=\"col-sm-8 col-lg-9\">\n" +
5104 " <input type=\"submit\" class=\"btn btn-primary\"\n" +
5105 " value=\"Connect to Slack\">\n" +
5106 5043 "\n" +
5044 " <div class=\"col-sm-8 col-lg-9\">\n" +
5045 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Use this repo\">\n" +
5107 5046 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5108 5047 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5109 5048 " <ul class=\"dropdown-menu\">\n" +
5110 5049 " <li><a>No</a></li>\n" +
5111 5050 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5112 5051 " </ul>\n" +
5113 5052 " </span>\n" +
5114 "\n" +
5115 " <div class=\"btn-group\" uib-dropdown>\n" +
5116 " <button type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
5117 " Test integration <span class=\"caret\"></span>\n" +
5118 " </button>\n" +
5119 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
5120 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
5121 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
5122 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
5123 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
5124 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
5125 " </ul>\n" +
5126 " </div>\n" +
5127 5053 " </div>\n" +
5128 5054 " </div>\n" +
5129 5055 " </form>\n" +
5130 5056 "\n" +
5057 " <p class=\"m-t-1\">Remember you first need to\n" +
5058 " <strong>\n" +
5059 " <a data-ui-sref=\"user.profile.identities\">authorize your user account</a></strong>\n" +
5060 " with Bitbucket before we can send issues on your behalf.</p>\n" +
5061 "\n" +
5062 " <p>Every user will have to authorize AppEnlight to access Bitbucket to be able to post issues.</p>\n" +
5063 "\n" +
5131 5064 " </div>\n" +
5132 5065 "</div>\n"
5133 5066 );
5134 5067
5135 5068
5136 $templateCache.put('templates/applications/integrations/webhooks.html',
5069 $templateCache.put('templates/applications/integrations/campfire.html',
5137 5070 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5138 5071 "\n" +
5139 5072 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5140 5073 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5141 5074 " <div class=\"panel-body\">\n" +
5142 "\n" +
5143 " <h1>Webhooks Integration</h1>\n" +
5075 " <h1>Campfire Integration</h1>\n" +
5144 5076 "\n" +
5145 5077 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5146 " <div class=\"form-group\" id=\"row-reports_webhook\">\n" +
5147 5078 "\n" +
5148 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5149 " Reports webhook <span class=\"required\">*</span>\n" +
5150 " </label>\n" +
5151 " <div class=\"col-sm-8 col-lg-9\">\n" +
5152 " <data-form-errors errors=\"integration.integrationForm.ae_validation.reports_webhook\"></data-form-errors>\n" +
5153 " <input class=\"form-control\" id=\"reports_webhook\" name=\"reports_webhook\" type=\"text\" ng-model=\"integration.config.reports_webhook\">\n" +
5154 " </div>\n" +
5155 " </div>\n" +
5156 " <div class=\"form-group\" id=\"row-alerts_webhook\">\n" +
5079 " <div class=\"form-group\">\n" +
5157 5080 "\n" +
5158 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5159 " Alerts webhook <span class=\"required\">*</span>\n" +
5160 " </label>\n" +
5081 " <label class=\"control-label col-sm-3 col-lg-2\">Account name</label>\n" +
5161 5082 " <div class=\"col-sm-8 col-lg-9\">\n" +
5162 " <data-form-errors errors=\"integration.integrationForm.ae_validation.alerts_webhook\"></data-form-errors>\n" +
5163 " <input class=\"form-control StringField None\" id=\"alerts_webhook\" name=\"alerts_webhook\" type=\"text\" ng-model=\"integration.config.alerts_webhook\">\n" +
5164 " </div>\n" +
5083 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
5165 5084 "\n" +
5085 " <div class=\"input-group\">\n" +
5086 " <div class=\"input-group-addon\">http://</div>\n" +
5087 " <input class=\"form-control\" ng-model=\"integration.config.account\" placeholder=\"account\">\n" +
5088 " <div class=\"input-group-addon\">.campfirenow.com</div>\n" +
5089 " </div>\n" +
5090 " </div>\n" +
5091 " </div>\n" +
5166 5092 "\n" +
5093 " <div class=\"form-group\">\n" +
5094 " <label class=\"control-label col-sm-3 col-lg-2\">API Token</label>\n" +
5095 " <div class=\"col-sm-8 col-lg-9\">\n" +
5096 " <data-form-errors errors=\"integration.integrationForm.ae_validation.api_token\"></data-form-errors>\n" +
5097 " <input class=\"form-control\" ng-model=\"integration.config.api_token\" placeholder=\"Your API token\">\n" +
5098 " </div>\n" +
5167 5099 " </div>\n" +
5168 " <div class=\"form-group\" id=\"row-submit\">\n" +
5169 5100 "\n" +
5170 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5101 " <div class=\"form-group\">\n" +
5102 " <label class=\"control-label col-sm-3 col-lg-2\">Room ID list</label>\n" +
5171 5103 " <div class=\"col-sm-8 col-lg-9\">\n" +
5172 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"Setup webhooks\">\n" +
5173 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5174 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5175 " <ul class=\"dropdown-menu\">\n" +
5176 " <li><a>No</a></li>\n" +
5177 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5178 " </ul>\n" +
5179 " </span>\n" +
5104 " <data-form-errors errors=\"integration.integrationForm.ae_validation.rooms\"></data-form-errors>\n" +
5105 " <input class=\"form-control\" ng-model=\"integration.config.rooms\" placeholder=\"Room ID list\">\n" +
5106 " <p>\n" +
5107 " <small>Room ID list separated by comma</small>\n" +
5108 " </p>\n" +
5180 5109 " </div>\n" +
5181 5110 " </div>\n" +
5182 " </form>\n" +
5183 " </div>\n" +
5184 "</div>\n"
5185 );
5186
5187
5188 $templateCache.put('templates/applications/list.html',
5189 "<ng-include src=\"'templates/loader.html'\" ng-if=\"applications.loading.applications\"></ng-include>\n" +
5111 " <div class=\"form-group\">\n" +
5112 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Connect to Campfire\">\n" +
5190 5113 "\n" +
5191 "<div class=\"panel panel-default\" ng-show=\"!applications.loading.applications\">\n" +
5192 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5193 " <div class=\"panel-body\" ng-if=\"applications.applications.length === 0 \">\n" +
5114 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5115 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5116 " <ul class=\"dropdown-menu\">\n" +
5117 " <li><a>No</a></li>\n" +
5118 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5119 " </ul>\n" +
5120 " </span>\n" +
5194 5121 "\n" +
5195 " <p>You have to create a new application first.</p>\n" +
5122 " <div class=\"btn-group\" uib-dropdown>\n" +
5123 " <button id=\"single-button\" type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
5124 " Test integration <span class=\"caret\"></span>\n" +
5125 " </button>\n" +
5126 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
5127 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
5128 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
5129 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
5130 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
5131 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
5132 " </ul>\n" +
5133 " </div>\n" +
5196 5134 "\n" +
5197 " </div>\n" +
5135 " </div>\n" +
5198 5136 "\n" +
5199 " <table class=\"table table-striped\" ng-if=\"applications.applications.length > 0\">\n" +
5200 " <thead>\n" +
5201 " <tr>\n" +
5202 " <th class=\"resource_name\">Resource Name</th>\n" +
5203 " <th class=\"domains\">Domains</th>\n" +
5204 " <th class=\"options\">Options</th>\n" +
5205 " </tr>\n" +
5206 " </thead>\n" +
5207 " <tbody>\n" +
5208 " <tr class=\"r{{$index+1}}\" ng-repeat=\"application in applications.applications\">\n" +
5209 " <td>{{application.resource_name}}</td>\n" +
5210 " <td>{{application.domains}}</td>\n" +
5211 " <td class=\"options\">\n" +
5212 " <a class=\"btn btn-default\" data-ui-sref=\"applications.update({resourceId:application.resource_id})\" data-toggle=\"tooltip\" title=\"Update application\"><span class=\"fa fa-cog\"></span> Update</a>\n" +
5213 " <a class=\"btn btn-default\" data-ui-sref=\"applications.integrations({resourceId:application.resource_id})\" data-toggle=\"tooltip\" title=\"Manage Integrations\"><span class=\"fa fa-wrench\"></span> Integrations</a>\n" +
5214 " </td>\n" +
5215 " </tr>\n" +
5216 " </tbody>\n" +
5217 " </table>\n" +
5137 " </form>\n" +
5218 5138 "\n" +
5139 " </div>\n" +
5219 5140 "</div>\n"
5220 5141 );
5221 5142
5222 5143
5223 $templateCache.put('templates/applications/parent_view.html',
5224 "<div class=\"row application-management\">\n" +
5225 " <div class=\"col-sm-3\" id=\"menu\">\n" +
5226 " <div ng-include=\"'templates/user/menu.html'\"></div>\n" +
5227 " </div>\n" +
5144 $templateCache.put('templates/applications/integrations/flowdock.html',
5145 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5228 5146 "\n" +
5229 " <div class=\"col-sm-9\" ui-view></div>\n" +
5147 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5148 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5149 " <div class=\"panel-body\">\n" +
5230 5150 "\n" +
5231 "</div>\n"
5232 );
5233
5234
5235 $templateCache.put('templates/dashboard.html',
5236 "<style type=\"text/css\">\n" +
5237 " #metrics_chart .c3-line {\n" +
5238 " stroke-width: 0px;\n" +
5239 " }\n" +
5151 " <h1>Flowdock Integration</h1>\n" +
5240 5152 "\n" +
5241 " #metrics_chart .c3-area {\n" +
5242 " stroke-width: 0;\n" +
5243 " opacity: 0.75;\n" +
5244 " }\n" +
5153 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5245 5154 "\n" +
5155 " <div class=\"form-group\">\n" +
5246 5156 "\n" +
5247 "</style>\n" +
5157 " <label class=\"control-label col-sm-3 col-lg-2\">API Token</label>\n" +
5248 5158 "\n" +
5249 "<div class=\"row\">\n" +
5250 " <div class=\"col-sm-12 dashboard\" id=\"content\">\n" +
5251 " <div ng-if=\"!index.stateHolder.AeUser.applications.length\">\n" +
5159 " <div class=\"col-sm-8 col-lg-9\">\n" +
5160 " <data-form-errors errors=\"integration.integrationForm.ae_validation.api_token\"></data-form-errors>\n" +
5161 " <input class=\"form-control\" ng-model=\"integration.config.api_token\" placeholder=\"Your API token\" type=\"text\">\n" +
5162 " </div>\n" +
5252 5163 "\n" +
5253 " <div ng-include=\"'templates/quickstart.html'\"></div>\n" +
5254 5164 "\n" +
5255 " </div>\n" +
5165 " </div>\n" +
5166 "\n" +
5167 " <div class=\"form-group\">\n" +
5256 5168 "\n" +
5257 " <div ng-if=\"index.stateHolder.AeUser.applications.length\">\n" +
5169 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5258 5170 "\n" +
5259 " <div class=\"row\">\n" +
5260 " <div class=\"col-sm-6\">\n" +
5261 " <div class=\"panel panel-default\">\n" +
5262 " <div class=\"panel-body\">\n" +
5263 " <form class=\"graph-type form-inline\">\n" +
5264 " <select ng-model=\"index.resource\" ng-options=\"r.resource_id as r.resource_name for r in index.stateHolder.AeUser.applications\" ng-change=\"index.updateSearchParams()\"\n" +
5265 " class=\"SelectField form-control input-sm slim-input\"></select>\n" +
5171 " <div class=\"col-sm-8 col-lg-9\">\n" +
5266 5172 "\n" +
5267 " <select class=\"SelectField form-control input-sm slim-input\" ng-model=\"index.timeSpan\"\n" +
5268 " ng-options=\"i as i.label for i in index.timeOptions | objectToOrderedArray:'minutes'\" ng-change=\"index.updateSearchParams()\"\n" +
5269 " class=\"SelectField\"></select>\n" +
5173 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Connect to Flowdock\">\n" +
5270 5174 "\n" +
5175 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5176 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5177 " <ul class=\"dropdown-menu\">\n" +
5178 " <li><a>No</a></li>\n" +
5179 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5180 " </ul>\n" +
5181 " </span>\n" +
5182 " <div class=\"btn-group\" uib-dropdown>\n" +
5183 " <button id=\"single-button\" type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
5184 " Test integration <span class=\"caret\"></span>\n" +
5185 " </button>\n" +
5186 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
5187 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
5188 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
5189 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
5190 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
5191 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
5192 " </ul>\n" +
5193 " </div>\n" +
5194 " </div>\n" +
5195 " </div>\n" +
5271 5196 "\n" +
5272 " <div class=\"btn-group\">\n" +
5273 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"index.graphType.selected\" ng-change=\"index.updateSearchParams()\"\n" +
5274 " uib-btn-radio=\"'requests_graphs'\" data-uib-tooltip=\"Requests per second\">\n" +
5275 " <span class=\"fa fa-line-chart\"></span>\n" +
5276 " </button>\n" +
5277 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"index.graphType.selected\" ng-change=\"index.updateSearchParams()\"\n" +
5278 " uib-btn-radio=\"'response_graphs'\" data-uib-tooltip=\"Average response time\">\n" +
5279 " <span class=\"fa fa-random\"></span>\n" +
5280 " </button>\n" +
5281 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"index.graphType.selected\" ng-change=\"index.updateSearchParams()\"\n" +
5282 " uib-btn-radio=\"'metrics_graphs'\" data-uib-tooltip=\"Time spent per request\">\n" +
5283 " <span class=\"fa fa-bar-chart-o\"></span>\n" +
5284 " </button>\n" +
5285 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"index.graphType.selected\" ng-change=\"index.updateSearchParams()\"\n" +
5286 " uib-btn-radio=\"'report_graphs'\" data-uib-tooltip=\"Errors\">\n" +
5287 " <span class=\"fa fa-exclamation-triangle\"></span>\n" +
5288 " </button>\n" +
5289 " <button type=\"button\" class=\"btn btn-primary btn-sm\" ng-model=\"index.graphType.selected\" ng-change=\"index.updateSearchParams()\"\n" +
5290 " uib-btn-radio=\"'slow_report_graphs'\" data-uib-tooltip=\"Slow reports\">\n" +
5291 " <span class=\"fa fa-clock-o\"></span>\n" +
5292 " </button>\n" +
5293 " </div>\n" +
5294 " </form>\n" +
5295 " <div class=\"clearfix\"></div>\n" +
5296 5197 "\n" +
5297 " <p ng-if=\"index.loading.series != false\" class=\"text-center\">\n" +
5298 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
5299 " </p>\n" +
5198 " </form>\n" +
5300 5199 "\n" +
5301 " <div ng-if=\"index.loading.series == false\">\n" +
5302 " <div ng-if=\"index.graphType.selected == 'requests_graphs'\">\n" +
5303 " <c3chart data-domid=\"reponse_chart\" data-data=\"index.requestsChartData\" data-config=\"index.requestsChartConfig\" update=\"true\">\n" +
5304 " </c3chart>\n" +
5305 " </div>\n" +
5200 " </div>\n" +
5201 "</div>\n"
5202 );
5203
5204
5205 $templateCache.put('templates/applications/integrations/github.html',
5206 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5306 5207 "\n" +
5307 " <div ng-if=\"index.graphType.selected == 'response_graphs'\">\n" +
5308 " <c3chart data-domid=\"reponse_chart\" data-data=\"index.responseChartData\" data-config=\"index.responseChartConfig\" update=\"true\">\n" +
5309 " </c3chart>\n" +
5310 " </div>\n" +
5208 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5209 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5210 " <div class=\"panel-body\">\n" +
5311 5211 "\n" +
5312 " <div ng-if=\"index.graphType.selected == 'metrics_graphs'\">\n" +
5313 " <c3chart data-domid=\"metrics_chart\" data-data=\"index.metricsChartData\" data-config=\"index.metricsChartConfig\" update=\"true\">\n" +
5314 " </c3chart>\n" +
5315 " </div>\n" +
5316 " <div ng-if=\"index.graphType.selected == 'report_graphs'\">\n" +
5317 " <c3chart data-domid=\"reports_chart\" data-data=\"index.reportChartData\" data-config=\"index.reportChartConfig\" update=\"true\">\n" +
5318 " </c3chart>\n" +
5319 " </div>\n" +
5212 " <h1>Github Integration</h1>\n" +
5320 5213 "\n" +
5321 " <div ng-if=\"index.graphType.selected == 'slow_report_graphs'\">\n" +
5322 " <c3chart data-domid=\"slow_reports_chart\" data-data=\"index.reportSlowChartData\" data-config=\"index.reportSlowChartConfig\" update=\"true\">\n" +
5323 " </c3chart>\n" +
5324 " </div>\n" +
5214 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5325 5215 "\n" +
5326 " <p ng-if=\"index.graphType.selected == 'requests_graphs'\" class=\"text-center\">\n" +
5327 " <small>Average requests per second from all servers</small>\n" +
5328 " </p>\n" +
5329 5216 "\n" +
5330 " <p ng-if=\"index.graphType.selected == 'response_graphs'\" class=\"text-center\">\n" +
5331 " <small>Average response time from all servers</small>\n" +
5332 " </p>\n" +
5217 " <div class=\"form-group\">\n" +
5333 5218 "\n" +
5334 " <p ng-if=\"index.graphType.selected == 'metrics_graphs'\" class=\"text-center\">\n" +
5335 " <small>Aggregated average time spent per request - broken to layers</small>\n" +
5336 " </p>\n" +
5219 " <label class=\"control-label col-sm-3 col-lg-2\">Repository</label>\n" +
5337 5220 "\n" +
5338 " <p ng-if=\"index.graphType.selected == 'report_graphs'\" class=\"text-center\">\n" +
5339 " <small>Aggregated reports sent by your application</small>\n" +
5340 " </p>\n" +
5221 " <div class=\"col-sm-8 col-lg-9\">\n" +
5341 5222 "\n" +
5342 " <p ng-if=\"index.graphType.selected == 'slow_report_graphs'\" class=\"text-center\">\n" +
5343 " <small>Aggregated slow reports sent by your application</small>\n" +
5344 " </p>\n" +
5345 " </div>\n" +
5346 " </div>\n" +
5223 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
5224 " <data-form-errors errors=\"integration.integrationForm.ae_validation.repo_name\"></data-form-errors>\n" +
5225 "\n" +
5226 " <div class=\"input-group\">\n" +
5227 " <div class=\"input-group-addon\">https://api.github.com/</div>\n" +
5228 " <input class=\"form-control\" ng-model=\"integration.config.user_name\" placeholder=\"user\" type=\"text\">\n" +
5229 " <div class=\"input-group-addon\">/</div>\n" +
5230 " <input class=\"form-control\" ng-model=\"integration.config.repo_name\" placeholder=\"repo_name\" type=\"text\">\n" +
5347 5231 " </div>\n" +
5232 "\n" +
5348 5233 " </div>\n" +
5234 " </div>\n" +
5349 5235 "\n" +
5236 " <div class=\"form-group\">\n" +
5350 5237 "\n" +
5351 " <div class=\"col-sm-6\">\n" +
5238 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5352 5239 "\n" +
5353 " <div id=\"server-container\">\n" +
5240 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Use this repo\">\n" +
5354 5241 "\n" +
5355 " <div ng-if=\"index.loading.apdex==false\" class=\"text-center m-b-1\">\n" +
5242 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5243 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5244 " <ul class=\"dropdown-menu\">\n" +
5245 " <li><a>No</a></li>\n" +
5246 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5247 " </ul>\n" +
5248 " </span>\n" +
5356 5249 "\n" +
5357 " <a data-ui-sref=\"report.list({resource:index.resource, start_date:index.startDateFilter})\" class=\"combined-stat text-center\" id=\"error-rate\">\n" +
5358 " <small>Exceptions</small>\n" +
5359 " <br/>\n" +
5360 " <strong>{{ index.exceptions|numberToThousands}}</strong>\n" +
5361 " <span class=\"fa fa-chevron-right\"></span>\n" +
5362 " </a><!--\n" +
5250 " </div>\n" +
5251 " </form>\n" +
5363 5252 "\n" +
5364 " --><a data-ui-sref=\"report.list_slow({resource:index.resource, min_duration:4, start_date:index.startDateFilter})\" class=\"combined-stat text-center\" id=\"frustrating-requests\" data-uib-tooltip=\"Requests over 4s\">\n" +
5365 " <small>Frustrating req.</small>\n" +
5366 " <br/>\n" +
5367 " <strong>{{index.frustratingRequests|numberToThousands}}</strong>\n" +
5368 " <span class=\"fa fa-chevron-right\"></span>\n" +
5369 " </a><!--\n" +
5253 " <p class=\"m-t-1\">Remember you first need to\n" +
5254 " <strong>\n" +
5255 " <a data-ui-sref=\"user.profile.identities\">authorize your user account</a></strong>\n" +
5256 " with Github before we can send issues on your behalf.</p>\n" +
5370 5257 "\n" +
5371 " --><a data-ui-sref=\"report.list_slow({resource:index.resource, min_duration:1, max_duration:4, start_date:index.startDateFilter})\" class=\"combined-stat text-center\" id=\"tolerated-requests\"\n" +
5372 " data-uib-tooltip=\"Requests under 4s\">\n" +
5373 " <small>Tolerated req.</small>\n" +
5374 " <br/>\n" +
5375 " <strong>{{index.toleratedRequests|numberToThousands}}</strong>\n" +
5376 " <span class=\"fa fa-chevron-right\"></span>\n" +
5377 " </a><!--\n" +
5378 " \n" +
5379 " --><a class=\"combined-stat text-center\" id=\"satisfying-requests\" data-uib-tooltip=\"Requests under 1s\">\n" +
5380 " <small>Satisfying req.</small>\n" +
5381 " <br/>\n" +
5382 " <strong>{{index.satisfyingRequests|numberToThousands}}</strong>\n" +
5383 " </a><!--\n" +
5258 " <p>Every user will have to authorize AppEnlight to access Github to be able to post issues.</p>\n" +
5384 5259 "\n" +
5385 " --><a data-ui-sref=\"uptime({resource:index.resource})\" class=\"combined-stat text-center\" id=\"uptime-stats\" data-uib-tooltip=\"Uptime\">\n" +
5386 " <small>Uptime</small>\n" +
5387 " <br/>\n" +
5388 " <strong>{{index.uptimeStats}}%</strong>\n" +
5389 " <span class=\"fa fa-chevron-right\"></span>\n" +
5390 " </a>\n" +
5260 " <div class=\"panel panel-warning\">\n" +
5261 " <div class=\"panel-heading\">Private repository access</div>\n" +
5262 " <div class=\"panel-body\">\n" +
5263 " <p>If you need access to private repositories <a data-ui-sref=\"user.profile.identities\">profile page</a> allows you to require token including private repository permissions.</p>\n" +
5391 5264 "\n" +
5392 " <div class=\"clearfix\"></div>\n" +
5393 " </div>\n" +
5265 " <p>Registration page OAuth does NOT give you token with private repository access permissions.</p>\n" +
5266 " </div>\n" +
5267 " </div>\n" +
5394 5268 "\n" +
5395 " <div id=\"apdex-rate\" class=\"m-b-1 panel panel-default\">\n" +
5396 " <table class=\"servers table table-striped\">\n" +
5397 " <thead>\n" +
5398 " <tr>\n" +
5399 " <th></th>\n" +
5400 " <th>Server</th>\n" +
5401 " <th>Apdex\n" +
5402 " <span class=\"fa fa-question-circle\"\n" +
5403 " data-uib-tooltip=\"Application Performance Index - measures viewer satisfaction based on response times and error rates\"></span>\n" +
5404 " </th>\n" +
5405 " <th>rpm</th>\n" +
5406 " <th>avg. response</th>\n" +
5407 " </tr>\n" +
5408 " </thead>\n" +
5409 " <tbody>\n" +
5410 " <tr ng-if=\"index.loading.apdex!=false\" class=\"text-center\">\n" +
5411 " <td colspan=\"5\"><span class=\"fa fa-cog fa-spin fa-5x loader\"></span></td>\n" +
5412 " </tr>\n" +
5413 " <tr ng-repeat=\"server in index.apdexStats\" class=\"{{ server | apdexValue }}\"\n" +
5414 " ng-if=\"index.loading.apdex==false\">\n" +
5415 " <td><span class=\"fa fa-hdd-o\"></span></td>\n" +
5416 " <td>\n" +
5417 " <small><strong>{{ server.name }}</strong></small>\n" +
5418 " </td>\n" +
5419 " <td class=\"apdex\">\n" +
5420 " <small><strong>{{ server.apdex }} %</strong></small>\n" +
5421 " </td>\n" +
5422 " <td>\n" +
5423 " <small><strong>{{ server.rpm }}rpm</strong></small>\n" +
5424 " </td>\n" +
5425 " <td>\n" +
5426 " <small><strong>{{ server.avg_response_time }}s</strong></small>\n" +
5427 " </td>\n" +
5428 " </tr>\n" +
5429 " </tbody>\n" +
5430 " </table>\n" +
5269 " </div>\n" +
5270 "</div>\n"
5271 );
5272
5273
5274 $templateCache.put('templates/applications/integrations/hipchat.html',
5275 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5431 5276 "\n" +
5432 " </div>\n" +
5433 " </div>\n" +
5277 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5278 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5279 " <div class=\"panel-body\">\n" +
5434 5280 "\n" +
5435 " </div>\n" +
5281 " <h1>Hipchat Integration</h1>\n" +
5282 "\n" +
5283 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5436 5284 "\n" +
5285 " <div class=\"form-group\">\n" +
5286 " <label class=\"control-label col-sm-3 col-lg-2\">API Token</label>\n" +
5437 5287 "\n" +
5288 " <div class=\"col-sm-8 col-lg-9\">\n" +
5289 " <data-form-errors errors=\"integration.integrationForm.ae_validation.api_token\"></data-form-errors>\n" +
5290 " <input class=\"form-control\" ng-model=\"integration.config.api_token\" placeholder=\"Your API token\" type=\"text\">\n" +
5291 " </div>\n" +
5438 5292 " </div>\n" +
5439 5293 "\n" +
5440 " <div class=\"row\">\n" +
5441 " <div class=\"col-sm-6\">\n" +
5294 " <div class=\"form-group\">\n" +
5442 5295 "\n" +
5443 " <div class=\"panel panel-default\">\n" +
5444 " <div class=\"panel-heading position-relative\">\n" +
5445 " <h3 class=\"panel-title\"><span class=\"fa fa-exclamation-triangle\"></span> Newest errors (real-time)\n" +
5446 " </h3>\n" +
5447 " <a tooltip-append-to-body=\"true\" data-uib-tooltip=\"Play/Pause stream\" class=\"btn btn-primary btn-sm pause_stream\" ng-model=\"index.stream.paused\" uib-btn-checkbox>\n" +
5448 " <span class=\"fa {{stream.paused ? 'fa-play' : 'fa-pause'}}\"></span>\n" +
5449 " </a>\n" +
5450 " <a tooltip-append-to-body=\"true\" data-uib-tooltip=\"Limit reports to current application\" class=\"btn btn-primary btn-sm limit_stream\" ng-model=\"index.stream.filtered\" uib-btn-checkbox>\n" +
5451 " <span class=\"fa fa-lock\"></span>\n" +
5452 " </a>\n" +
5296 " <label class=\"control-label col-sm-3 col-lg-2\">Room ID list</label>\n" +
5453 5297 "\n" +
5298 " <div class=\"col-sm-8 col-lg-9\">\n" +
5299 " <data-form-errors errors=\"integration.integrationForm.ae_validation.rooms\"></data-form-errors>\n" +
5300 " <input class=\"form-control\" ng-model=\"integration.config.rooms\" placeholder=\"Room ID list\" type=\"text\">\n" +
5454 5301 "\n" +
5455 " </div>\n" +
5456 " <div class=\"panel-body\">\n" +
5302 " <p>\n" +
5303 " <small>Room ID list separated by comma</small>\n" +
5304 " </p>\n" +
5305 " </div>\n" +
5457 5306 "\n" +
5458 " <p ng-if=\"index.stream.reports.length === 0\">No new reports</p>\n" +
5307 " </div>\n" +
5459 5308 "\n" +
5460 " <div small-report-list reports=\"index.stream.reports\" applications=\"index.applications\"></div>\n" +
5461 " </div>\n" +
5309 " <div class=\"form-group\">\n" +
5310 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5311 " <div class=\"col-sm-8 col-lg-9\">\n" +
5312 " <input type=\"submit\" class=\"btn btn-primary\" value=\"Connect to Hipchat\">\n" +
5313 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5314 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5315 " <ul class=\"dropdown-menu\">\n" +
5316 " <li><a>No</a></li>\n" +
5317 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5318 " </ul>\n" +
5319 " </span>\n" +
5320 "\n" +
5321 " <div class=\"btn-group\" uib-dropdown>\n" +
5322 " <button id=\"single-button\" type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
5323 " Test integration <span class=\"caret\"></span>\n" +
5324 " </button>\n" +
5325 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
5326 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
5327 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
5328 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
5329 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
5330 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
5331 " </ul>\n" +
5462 5332 " </div>\n" +
5463 " </div>\n" +
5464 5333 "\n" +
5465 " <div class=\"col-sm-6\">\n" +
5334 " </div>\n" +
5335 " </div>\n" +
5466 5336 "\n" +
5467 " <div class=\"panel panel-default\">\n" +
5468 " <div class=\"panel-heading\">\n" +
5469 " <h3 class=\"panel-title\"><span class=\"fa fa-sort-amount-desc\"></span> Request breakdown over {{ index.timeSpan.label }}</h3>\n" +
5470 " </div>\n" +
5471 " <div class=\"panel-body\" id=\"view-breakdown-container\">\n" +
5472 " <p ng-if=\"index.loading.requestsBreakdown!=false\" class=\"text-center\">\n" +
5473 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
5474 " </p>\n" +
5337 " </form>\n" +
5475 5338 "\n" +
5476 " <div class=\"report-list\">\n" +
5477 " <div ng-if=\"index.loading.requestsBreakdown==false\" ng-repeat=\"view in index.requestsBreakdown\">\n" +
5478 " <div class=\"view-info\">\n" +
5479 " <div class=\"view-name\">\n" +
5480 " <div class=\"bar\" style=\"width: {{view.percentage}}%\">\n" +
5481 " </div>\n" +
5482 " </div>\n" +
5483 " <strong ng-if=\"view.latest_details.length\">\n" +
5484 " <a data-ui-sref=\"report.list_slow({view_name:view.view_name})\">{{view.view_name}}</a></strong>\n" +
5485 " <strong ng-if=\"!view.latest_details.length\">{{view.view_name}}</strong>\n" +
5339 " </div>\n" +
5340 "</div>\n"
5341 );
5342
5343
5344 $templateCache.put('templates/applications/integrations/jira.html',
5345 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5486 5346 "\n" +
5487 " <div class=\"stats\">\n" +
5488 " <small>\n" +
5489 " avg. response <strong>{{view.avg_response}}s</strong> in\n" +
5490 " <span class=\"requests\"\n" +
5491 " data-uib-tooltip=\"Requests\"><strong>{{view.requests|numberToThousands}}</strong> requests</span>\n" +
5347 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5348 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5349 " <div class=\"panel-body\">\n" +
5492 5350 "\n" +
5493 " <span ng-if=\"view.latest_details\">\n" +
5494 " &nbsp;&nbsp; Latest reports:\n" +
5495 " <a ng-repeat=\"d in view.latest_details\" target=\"_blank\" ui-sref=\"report.view_detail({groupId:d.group_id, reportId:d.report_id})\"> <strong>{{$index+1}}</strong></a>\n" +
5496 " </span>\n" +
5497 " </small>\n" +
5498 " </div>\n" +
5351 " <h1>Jira Integration</h1>\n" +
5499 5352 "\n" +
5500 " </div>\n" +
5353 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5501 5354 "\n" +
5502 " </div>\n" +
5503 " </div>\n" +
5355 " <div class=\"form-group\" id=\"row-host_name\">\n" +
5504 5356 "\n" +
5357 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5358 " Server URL <span class=\"required\">*</span>\n" +
5359 " </label>\n" +
5360 " <div class=\"col-sm-8 col-lg-9\">\n" +
5361 " <data-form-errors errors=\"integration.integrationForm.ae_validation.host_name\"></data-form-errors>\n" +
5362 " <input class=\"form-control\" id=\"host_name\" name=\"host_name\" type=\"text\" ng-model=\"integration.config.host_name\">\n" +
5505 5363 "\n" +
5506 " </div>\n" +
5507 " </div>\n" +
5364 " <p>\n" +
5365 " <small>https://servername.atlassian.net</small>\n" +
5366 " </p>\n" +
5508 5367 "\n" +
5509 5368 " </div>\n" +
5510 "\n" +
5511 5369 " </div>\n" +
5370 " <div class=\"form-group\" id=\"row-user_name\">\n" +
5512 5371 "\n" +
5513 " <div class=\"row\">\n" +
5514 " <div class=\"col-sm-6\">\n" +
5372 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5373 " Username <span class=\"required\">*</span>\n" +
5374 " </label>\n" +
5375 " <div class=\"col-sm-8 col-lg-9\">\n" +
5515 5376 "\n" +
5516 " <div class=\"panel panel-default\">\n" +
5517 " <div class=\"panel-heading\">\n" +
5518 " <h3 class=\"panel-title\">\n" +
5519 " <span class=\"fa fa-exclamation-triangle\"></span> Report groups trending over {{ index.timeSpan.label }}\n" +
5520 " </h3>\n" +
5521 " </div>\n" +
5522 " <div class=\"panel-body\">\n" +
5523 " <p ng-if=\"index.loading.reports != false\" class=\"text-center\">\n" +
5524 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
5525 " </p>\n" +
5377 " <data-form-errors errors=\"integration.integrationForm.ae_validation.user_name\"></data-form-errors>\n" +
5378 " <input class=\"form-control\" id=\"user_name\" name=\"user_name\" type=\"text\" ng-model=\"integration.config.user_name\">\n" +
5526 5379 "\n" +
5527 " <p ng-if=\"index.trendingReports.length == 0 && index.loading.reports == false\">\n" +
5528 " No reports found\n" +
5529 " </p>\n" +
5380 " <p>\n" +
5381 " <small>user@email.com</small>\n" +
5382 " </p>\n" +
5530 5383 "\n" +
5531 " <div small-report-group-list groups=\"index.trendingReports\" applications=\"index.applications\" ng-if=\"index.loading.reports==false\"></div>\n" +
5532 " </div>\n" +
5533 " </div>\n" +
5384 " </div>\n" +
5385 " </div>\n" +
5386 " <div class=\"form-group\" id=\"row-password\">\n" +
5534 5387 "\n" +
5388 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5389 " Password <span class=\"required\">*</span>\n" +
5390 " </label>\n" +
5391 " <div class=\"col-sm-8 col-lg-9\">\n" +
5392 " <data-form-errors errors=\"integration.integrationForm.ae_validation.password\"></data-form-errors>\n" +
5393 " <input class=\"form-control\" id=\"password\" name=\"password\" type=\"password\" ng-model=\"integration.config.password\">\n" +
5535 5394 " </div>\n" +
5395 " </div>\n" +
5396 " <div class=\"form-group\" id=\"row-project\">\n" +
5536 5397 "\n" +
5537 " <div class=\"col-sm-6\">\n" +
5398 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5399 " Project key <span class=\"required\">*</span>\n" +
5400 " </label>\n" +
5401 " <div class=\"col-sm-8 col-lg-9\">\n" +
5402 " <data-form-errors errors=\"integration.integrationForm.ae_validation.project\"></data-form-errors>\n" +
5403 " <input class=\"form-control\" id=\"project\" name=\"project\" type=\"text\" ng-model=\"integration.config.project\">\n" +
5404 " </div>\n" +
5405 " </div>\n" +
5406 " <div class=\"form-group\" id=\"row-submit\">\n" +
5407 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5408 " <div class=\"col-sm-8 col-lg-9\">\n" +
5409 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"Setup Jira\">\n" +
5538 5410 "\n" +
5411 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5412 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5413 " <ul class=\"dropdown-menu\">\n" +
5414 " <li><a>No</a></li>\n" +
5415 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5416 " </ul>\n" +
5417 " </span>\n" +
5418 " </div>\n" +
5419 " </div>\n" +
5539 5420 "\n" +
5540 " <div class=\"panel panel-default\">\n" +
5541 " <div class=\"panel-heading\">\n" +
5542 " <h3 class=\"panel-title\">\n" +
5543 " Most common slow calls over {{ index.timeSpan.label }}\n" +
5544 " </h3>\n" +
5545 " </div>\n" +
5546 " <div class=\"panel-body\">\n" +
5421 " </form>\n" +
5547 5422 "\n" +
5548 " <div ng-if=\"index.loading.slowCalls!=false\" class=\"text-center\">\n" +
5549 " <span class=\"fa fa-cog fa-spin fa-5x loader\"></span>\n" +
5550 " </div>\n" +
5551 5423 "\n" +
5552 " <table id=\"slow-statements\" ng-if=\"index.loading.slowCalls==false\">\n" +
5553 " <tbody>\n" +
5554 " <tr ng-repeat=\"call in index.slowCalls\">\n" +
5555 " <td class=\"occurences\">\n" +
5556 " <span class=\"occurences\" data-uib-tooltip=\"Occurences\">{{call.occurences|numberToThousands}}</span>\n" +
5557 " </td>\n" +
5558 " <td class=\"ellipsis\">\n" +
5559 " <small title=\"{{call.statement}}\" class=\"statement\">{{call.statement}}</small>\n" +
5560 " <br/>\n" +
5561 " <span class=\"type\">{{call.statement_type}}</span>\n" +
5562 " <span class=\"subtype\">{{call.statement_subtype}}</span>\n" +
5563 " <span class=\"duration\" data-uib-tooltip=\"Average duration\">{{call.total_duration/call.occurences|round:2}}s</span>\n" +
5564 " <span class=\"report-list\">\n" +
5565 " Latest reports:\n" +
5566 " <a ng-repeat=\"d in call.latest_details\" target=\"_blank\" ui-sref=\"report.view_detail({groupId:d.group_id, reportId:d.report_id})\"> <strong>{{$index+1}}</strong> </a>\n" +
5567 " </span>\n" +
5568 " </td>\n" +
5569 " </tr>\n" +
5570 " </tbody>\n" +
5571 " </table>\n" +
5424 " </div>\n" +
5425 "</div>\n"
5426 );
5427
5428
5429 $templateCache.put('templates/applications/integrations/slack.html',
5430 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5431 "\n" +
5432 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5433 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5434 " <div class=\"panel-body\">\n" +
5572 5435 "\n" +
5436 " <h1>Slack Integration</h1>\n" +
5573 5437 "\n" +
5574 " </div>\n" +
5438 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5439 "\n" +
5440 " <div class=\"form-group\">\n" +
5441 "\n" +
5442 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5443 " API Token <span class=\"required\">*</span>\n" +
5444 " </label>\n" +
5445 " <div class=\"col-sm-8 col-lg-9\">\n" +
5446 " <data-form-errors errors=\"integration.integrationForm.ae_validation.webhook_url\"></data-form-errors>\n" +
5447 " <input class=\"form-control\" ng-model=\"integration.config.webhook_url\" placeholder=\"Webhook URL\" type=\"webhook_url\">\n" +
5448 " </div>\n" +
5449 " </div>\n" +
5450 "\n" +
5451 " <div class=\"form-group\">\n" +
5452 "\n" +
5453 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5454 " <div class=\"col-sm-8 col-lg-9\">\n" +
5455 " <input type=\"submit\" class=\"btn btn-primary\"\n" +
5456 " value=\"Connect to Slack\">\n" +
5457 "\n" +
5458 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5459 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5460 " <ul class=\"dropdown-menu\">\n" +
5461 " <li><a>No</a></li>\n" +
5462 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5463 " </ul>\n" +
5464 " </span>\n" +
5465 "\n" +
5466 " <div class=\"btn-group\" uib-dropdown>\n" +
5467 " <button type=\"button\" class=\"btn btn-info\" uib-dropdown-toggle>\n" +
5468 " Test integration <span class=\"caret\"></span>\n" +
5469 " </button>\n" +
5470 " <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"single-button\">\n" +
5471 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('report_notification')\">Test report notification</a></li>\n" +
5472 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('error_alert')\">Test error alert</a></li>\n" +
5473 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('uptime_alert')\">Test uptime alert</a></li>\n" +
5474 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('chart_alert')\">Test chart alert</a></li>\n" +
5475 " <li role=\"menuitem\"><a ng-click=\"integration.testIntegration('daily_digest')\">Test daily digest</a></li>\n" +
5476 " </ul>\n" +
5575 5477 " </div>\n" +
5478 " </div>\n" +
5479 " </div>\n" +
5480 " </form>\n" +
5481 "\n" +
5482 " </div>\n" +
5483 "</div>\n"
5484 );
5485
5486
5487 $templateCache.put('templates/applications/integrations/webhooks.html',
5488 "<ng-include src=\"'templates/loader.html'\" ng-if=\"integrations.loading.application || integration.loading.integration\"></ng-include>\n" +
5489 "\n" +
5490 "<div class=\"panel panel-default\" ng-show=\"!integrations.loading.application && !integration.loading.integration\">\n" +
5491 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5492 " <div class=\"panel-body\">\n" +
5493 "\n" +
5494 " <h1>Webhooks Integration</h1>\n" +
5576 5495 "\n" +
5496 " <form name=\"integration.integrationForm\" ng-submit=\"integration.configureIntegration()\" class=\"form-horizontal\">\n" +
5497 " <div class=\"form-group\" id=\"row-reports_webhook\">\n" +
5498 "\n" +
5499 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5500 " Reports webhook <span class=\"required\">*</span>\n" +
5501 " </label>\n" +
5502 " <div class=\"col-sm-8 col-lg-9\">\n" +
5503 " <data-form-errors errors=\"integration.integrationForm.ae_validation.reports_webhook\"></data-form-errors>\n" +
5504 " <input class=\"form-control\" id=\"reports_webhook\" name=\"reports_webhook\" type=\"text\" ng-model=\"integration.config.reports_webhook\">\n" +
5505 " </div>\n" +
5506 " </div>\n" +
5507 " <div class=\"form-group\" id=\"row-alerts_webhook\">\n" +
5577 5508 "\n" +
5509 " <label class=\"control-label col-sm-3 col-lg-2\">\n" +
5510 " Alerts webhook <span class=\"required\">*</span>\n" +
5511 " </label>\n" +
5512 " <div class=\"col-sm-8 col-lg-9\">\n" +
5513 " <data-form-errors errors=\"integration.integrationForm.ae_validation.alerts_webhook\"></data-form-errors>\n" +
5514 " <input class=\"form-control StringField None\" id=\"alerts_webhook\" name=\"alerts_webhook\" type=\"text\" ng-model=\"integration.config.alerts_webhook\">\n" +
5578 5515 " </div>\n" +
5579 5516 "\n" +
5517 "\n" +
5580 5518 " </div>\n" +
5581 " </div>\n" +
5519 " <div class=\"form-group\" id=\"row-submit\">\n" +
5520 "\n" +
5521 " <label class=\"control-label col-sm-3 col-lg-2\"></label>\n" +
5522 " <div class=\"col-sm-8 col-lg-9\">\n" +
5523 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"Setup webhooks\">\n" +
5524 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5525 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove Integration</a>\n" +
5526 " <ul class=\"dropdown-menu\">\n" +
5527 " <li><a>No</a></li>\n" +
5528 " <li><a ng-click=\"integration.removeIntegration()\">Yes</a></li>\n" +
5529 " </ul>\n" +
5530 " </span>\n" +
5531 " </div>\n" +
5532 " </div>\n" +
5533 " </form>\n" +
5534 " </div>\n" +
5535 "</div>\n"
5536 );
5537
5538
5539 $templateCache.put('templates/applications/list.html',
5540 "<ng-include src=\"'templates/loader.html'\" ng-if=\"applications.loading.applications\"></ng-include>\n" +
5541 "\n" +
5542 "<div class=\"panel panel-default\" ng-show=\"!applications.loading.applications\">\n" +
5543 " <div class=\"panel-heading\" ng-include=\"'templates/applications/breadcrumbs.html'\"></div>\n" +
5544 " <div class=\"panel-body\" ng-if=\"applications.applications.length === 0 \">\n" +
5545 "\n" +
5546 " <p>You have to create a new application first.</p>\n" +
5547 "\n" +
5548 " </div>\n" +
5549 "\n" +
5550 " <table class=\"table table-striped\" ng-if=\"applications.applications.length > 0\">\n" +
5551 " <thead>\n" +
5552 " <tr>\n" +
5553 " <th class=\"resource_name\">Resource Name</th>\n" +
5554 " <th class=\"domains\">Domains</th>\n" +
5555 " <th class=\"options\">Options</th>\n" +
5556 " </tr>\n" +
5557 " </thead>\n" +
5558 " <tbody>\n" +
5559 " <tr class=\"r{{$index+1}}\" ng-repeat=\"application in applications.applications\">\n" +
5560 " <td>{{application.resource_name}}</td>\n" +
5561 " <td>{{application.domains}}</td>\n" +
5562 " <td class=\"options\">\n" +
5563 " <a class=\"btn btn-default\" data-ui-sref=\"applications.update({resourceId:application.resource_id})\" data-toggle=\"tooltip\" title=\"Update application\"><span class=\"fa fa-cog\"></span> Update</a>\n" +
5564 " <a class=\"btn btn-default\" data-ui-sref=\"applications.integrations({resourceId:application.resource_id})\" data-toggle=\"tooltip\" title=\"Manage Integrations\"><span class=\"fa fa-wrench\"></span> Integrations</a>\n" +
5565 " </td>\n" +
5566 " </tr>\n" +
5567 " </tbody>\n" +
5568 " </table>\n" +
5569 "\n" +
5570 "</div>\n"
5571 );
5572
5573
5574 $templateCache.put('templates/applications/parent_view.html',
5575 "<div class=\"row application-management\">\n" +
5576 " <div class=\"col-sm-3\" id=\"menu\">\n" +
5577 " <div ng-include=\"'templates/user/menu.html'\"></div>\n" +
5582 5578 " </div>\n" +
5579 "\n" +
5580 " <div class=\"col-sm-9\" ui-view></div>\n" +
5581 "\n" +
5583 5582 "</div>\n"
5584 5583 );
5585 5584
5586 5585
5587 5586 $templateCache.put('templates/directives/search_type_ahead.html',
5588 5587 "<a>\n" +
5589 5588 " <span class=\"tag\" ng-show=\"match.model.tag\">{{match.model.tag}}</span>\n" +
5590 5589 " <span class=\"tag\" ng-show=\"!match.model.tag\">{{match.label}}</span>\n" +
5591 5590 " <span ng-show=\"match.model.example\">-</span> <span class=\"example\">{{match.model.example}}</span>\n" +
5592 5591 " <div class=\"description\">{{match.model.description}}</div>\n" +
5593 5592 "\n" +
5594 5593 "</a>\n"
5595 5594 );
5596 5595
5597 5596
5598 5597 $templateCache.put('templates/directives/user_search_type_ahead.html',
5599 5598 "<a>\n" +
5600 5599 " <span>{{match.label}}</span> -\n" +
5601 5600 " <span class=\"color-secondary\">{{match.model.name}}</span>\n" +
5602 5601 "</a>\n"
5603 5602 );
5604 5603
5605 5604
5606 5605 $templateCache.put('templates/events.html',
5607 5606 "<div class=\"panel panel-default\">\n" +
5608 5607 " <div class=\"panel-body\">\n" +
5609 5608 "\n" +
5610 5609 " <h1>Event history</h1>\n" +
5611 5610 "\n" +
5612 5611 " <table class=\"table table-striped event-table\">\n" +
5613 5612 " <tr ng-repeat=\"event in events.events track by event.id\">\n" +
5614 5613 " <td class=\"text-center icons\">\n" +
5615 5614 " <span ng-if=\"event.event_type === 1\" class=\"fa fa-exclamation-triangle fa-2x\" style=\"color:orangered\"></span>\n" +
5616 5615 " <span ng-if=\"event.event_type === 3\" class=\"fa fa-clock-o fa-2x\" style=\"color:darkorange\"></span>\n" +
5617 5616 " <span ng-if=\"event.event_type === 7\" class=\"fa fa-question-circle fa-2x\" style=\"color:dimgrey\"></span>\n" +
5618 5617 " <span ng-if=\"event.event_type === 9\" class=\"fa fa-line-chart fa-2x\" style=\"color:green\"></span>\n" +
5619 5618 " </td>\n" +
5620 5619 " <td>\n" +
5621 5620 " <p>For <strong>{{ event.resource_name }}</strong></p>\n" +
5622 5621 "\n" +
5623 5622 " <p>{{ event.text }}</p>\n" +
5624 5623 " <small class=\"date\" data-uib-tooltip=\"{{event.start_date}}\"> created:\n" +
5625 5624 " <iso-to-relative-time time=\"{{event.start_date}}\"/>\n" +
5626 5625 " </small>\n" +
5627 5626 " <small class=\"date\" ng-show=\"event.end_date\" data-uib-tooltip=\"{{event.end_date}}\"> | closed:\n" +
5628 5627 " <iso-to-relative-time time=\"{{event.end_date}}\"/>\n" +
5629 5628 " </small>\n" +
5630 5629 " </td>\n" +
5631 5630 " <td class=\"options\">\n" +
5632 5631 "\n" +
5633 5632 " <span class=\"dropdown pull-right\" ng-if=\"event.status === 1\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
5634 5633 " <a class=\"dropdown-toggle btn btn-danger\" data-uib-dropdown-toggle>\n" +
5635 5634 " <span class=\"fa fa-exclamation-circle\"></span>\n" +
5636 5635 " </a>\n" +
5637 5636 " <ul class=\"dropdown-menu\">\n" +
5638 5637 " <li>\n" +
5639 5638 " <a ng-click=\"events.closeEvent(event)\">Close event</a>\n" +
5640 5639 " <a>Do nothing</a>\n" +
5641 5640 " </li>\n" +
5642 5641 " </ul>\n" +
5643 5642 " </span>\n" +
5644 5643 "\n" +
5645 5644 " </td>\n" +
5646 5645 " </tr>\n" +
5647 5646 " </table>\n" +
5648 5647 " </div>\n" +
5649 5648 "</div>\n"
5650 5649 );
5651 5650
5652 5651
5653 5652 $templateCache.put('templates/integrations/bitbucket.html',
5654 5653 " <div class=\"modal-header\">\n" +
5655 5654 " <h3 class=\"m-t-0\">Add issue to Bitbucket</h3>\n" +
5656 5655 " </div>\n" +
5657 5656 " <div class=\"modal-body\">\n" +
5658 5657 " <div class=\"alert alert-danger\" ng-repeat=\"msg in ctrl.error_messages\">{{msg}}</div>\n" +
5659 5658 " <div class=\"text-center\" ng-show=\"ctrl.loading\">\n" +
5660 5659 " <span class=\"fa fa-cog fa-spin fa-5x loader m-a-4\"></span>\n" +
5661 5660 " </div>\n" +
5662 5661 "\n" +
5663 5662 " <form role=\"form\" ng-show=\"!ctrl.loading\">\n" +
5664 5663 " <div class=\"form-group\">\n" +
5665 5664 " <label for=\"issue_title\">Issue Title</label>\n" +
5666 5665 " <input type=\"text\" class=\"form-control\" id=\"issue_title\" placeholder=\"Issue title\" ng-model=\"ctrl.form.title\">\n" +
5667 5666 " </div>\n" +
5668 5667 " <div class=\"form-group row\">\n" +
5669 5668 " <div class=\"col-sm-6\">\n" +
5670 5669 " <label for=\"issue_priority\">Priority</label>\n" +
5671 5670 " <select class=\"form-control\" id=\"issue_priority\" ng-options=\"s for s in ctrl.priorities\" ng-model=\"ctrl.form.priority\"></select>\n" +
5672 5671 " </div>\n" +
5673 5672 "\n" +
5674 5673 " <div class=\"col-sm-6\">\n" +
5675 5674 " <label for=\"issue_responsible\">Assignee</label>\n" +
5676 5675 " <select class=\"form-control\" id=\"issue_responsible\" ng-options=\"a.user for a in ctrl.assignees\" ng-model=\"ctrl.form.responsible\"></select>\n" +
5677 5676 " </div>\n" +
5678 5677 " </div>\n" +
5679 5678 " <div class=\"form-group\">\n" +
5680 5679 " <label for=\"issue_content\">Description</label>\n" +
5681 5680 " <textarea id=\"issue_content\" class=\"form-control\" ng-model=\"ctrl.form.content\" style=\"min-height: 100px\"></textarea>\n" +
5682 5681 " </div>\n" +
5683 5682 " </form>\n" +
5684 5683 "\n" +
5685 5684 " </div>\n" +
5686 5685 " <div class=\"modal-footer\">\n" +
5687 5686 " <button class=\"btn btn-primary\" ng-click=\"ctrl.ok()\">Add issue</button>\n" +
5688 5687 " <button class=\"btn btn-warning\" ng-click=\"ctrl.cancel()\">Cancel</button>\n" +
5689 5688 " </div>\n"
5690 5689 );
5691 5690
5692 5691
5693 5692 $templateCache.put('templates/integrations/github.html',
5694 5693 " <div class=\"modal-header\">\n" +
5695 5694 " <h3 class=\"m-t-0\">Add issue to Github</h3>\n" +
5696 5695 " </div>\n" +
5697 5696 " <div class=\"modal-body\">\n" +
5698 5697 " <div class=\"alert alert-danger\" ng-repeat=\"msg in ctrl.error_messages\">{{msg}}</div>\n" +
5699 5698 "\n" +
5700 5699 " <div class=\"text-center\" ng-show=\"ctrl.loading\">\n" +
5701 5700 " <span class=\"fa fa-cog fa-spin fa-5x loader m-a-4\"></span>\n" +
5702 5701 " </div>\n" +
5703 5702 "\n" +
5704 5703 " <form role=\"form\" ng-show=\"!ctrl.loading\">\n" +
5705 5704 " <div class=\"form-group\">\n" +
5706 5705 " <label for=\"issue_title\">Issue Title</label>\n" +
5707 5706 " <input type=\"text\" class=\"form-control\" id=\"issue_title\" placeholder=\"Issue title\" ng-model=\"ctrl.form.title\">\n" +
5708 5707 " </div>\n" +
5709 5708 " <div class=\"form-group row\">\n" +
5710 5709 " <div class=\"col-sm-6\">\n" +
5711 5710 " <label for=\"issue_status\">Tag</label>\n" +
5712 5711 " <select class=\"form-control\" id=\"issue_status\" ng-options=\"s for s in ctrl.statuses\" ng-model=\"ctrl.form.status\"></select>\n" +
5713 5712 " </div>\n" +
5714 5713 "\n" +
5715 5714 " <div class=\"col-sm-6\">\n" +
5716 5715 " <label for=\"issue_responsible\">Assignee</label>\n" +
5717 5716 " <select class=\"form-control\" id=\"issue_responsible\" ng-options=\"a.user for a in ctrl.assignees\" ng-model=\"ctrl.form.responsible\"></select>\n" +
5718 5717 " </div>\n" +
5719 5718 " </div>\n" +
5720 5719 " <div class=\"form-group\">\n" +
5721 5720 " <label for=\"issue_description\">Description</label>\n" +
5722 5721 " <textarea id=\"issue_description\" class=\"form-control\" ng-model=\"ctrl.form.content\" style=\"min-height: 100px\"></textarea>\n" +
5723 5722 " </div>\n" +
5724 5723 " </form>\n" +
5725 5724 "\n" +
5726 5725 " </div>\n" +
5727 5726 " <div class=\"modal-footer\">\n" +
5728 5727 " <button class=\"btn btn-primary\" ng-click=\"ctrl.ok()\">Add issue</button>\n" +
5729 5728 " <button class=\"btn btn-warning\" ng-click=\"ctrl.cancel()\">Cancel</button>\n" +
5730 5729 " </div>\n"
5731 5730 );
5732 5731
5733 5732
5734 5733 $templateCache.put('templates/integrations/jira.html',
5735 5734 " <div class=\"modal-header\">\n" +
5736 5735 " <h3 class=\"m-t-0\">Add issue to Jira</h3>\n" +
5737 5736 " </div>\n" +
5738 5737 " <div class=\"modal-body\">\n" +
5739 5738 " <div class=\"alert alert-danger\" ng-repeat=\"msg in ctrl.error_messages\">{{msg}}</div>\n" +
5740 5739 " <div class=\"text-center\" ng-show=\"ctrl.loading\">\n" +
5741 5740 " <span class=\"fa fa-cog fa-spin fa-5x loader m-a-4\"></span>\n" +
5742 5741 " </div>\n" +
5743 5742 "\n" +
5744 5743 " <form role=\"form\" ng-show=\"!ctrl.loading\">\n" +
5745 5744 " <div class=\"form-group\">\n" +
5746 5745 " <label for=\"issue_title\">Issue Title</label>\n" +
5747 5746 " <input type=\"text\" class=\"form-control\" id=\"issue_title\" placeholder=\"Issue title\" ng-model=\"ctrl.form.title\">\n" +
5748 5747 " </div>\n" +
5749 5748 "\n" +
5750 5749 " <div class=\"form-group\">\n" +
5751 5750 " <label for=\"issue_type\">Issue Type</label>\n" +
5752 5751 " <select class=\"form-control\" id=\"issue_type\" ng-options=\"i.name for i in ctrl.issue_types\" ng-model=\"ctrl.form.issue_type\"></select>\n" +
5753 5752 " </div>\n" +
5754 5753 " <div class=\"form-group row\">\n" +
5755 5754 " <div class=\"col-sm-6\">\n" +
5756 5755 " <label for=\"issue_priority\">Priority</label>\n" +
5757 5756 " <select class=\"form-control\" id=\"issue_priority\" ng-options=\"s.name for s in ctrl.priorities\" ng-model=\"ctrl.form.priority\"></select>\n" +
5758 5757 " </div>\n" +
5759 5758 "\n" +
5760 5759 " <div class=\"col-sm-6\">\n" +
5761 5760 " <label for=\"issue_responsible\">Assignee</label>\n" +
5762 5761 " <select class=\"form-control\" id=\"issue_responsible\" ng-options=\"a.name for a in ctrl.assignees\" ng-model=\"ctrl.form.responsible\"></select>\n" +
5763 5762 " </div>\n" +
5764 5763 " </div>\n" +
5765 5764 " <div class=\"form-group\">\n" +
5766 5765 " <label for=\"issue_content\">Description</label>\n" +
5767 5766 " <textarea id=\"issue_content\" class=\"form-control\" ng-model=\"ctrl.form.content\" style=\"min-height: 100px\"></textarea>\n" +
5768 5767 " </div>\n" +
5769 5768 " </form>\n" +
5770 5769 "\n" +
5771 5770 " </div>\n" +
5772 5771 " <div class=\"modal-footer\">\n" +
5773 5772 " <button class=\"btn btn-primary\" ng-click=\"ctrl.ok()\">Add issue</button>\n" +
5774 5773 " <button class=\"btn btn-warning\" ng-click=\"ctrl.cancel()\">Cancel</button>\n" +
5775 5774 " </div>\n"
5776 5775 );
5777 5776
5778 5777
5779 5778 $templateCache.put('templates/loader.html',
5780 5779 "<div class=\"text-center\">\n" +
5781 5780 " <span class=\"fa fa-cog fa-spin fa-5x m-a-4\"></span>\n" +
5782 5781 "</div>\n"
5783 5782 );
5784 5783
5785 5784
5786 5785 $templateCache.put('templates/logs.html',
5787 5786 "<ng-include src=\"'templates/loader.html'\" ng-if=\"logs.isLoading.logs\"></ng-include>\n" +
5788 5787 "\n" +
5789 5788 "<div ng-if=\"logs.isLoading.logs === false\">\n" +
5790 5789 "\n" +
5791 5790 " <p class=\"search-params\">\n" +
5792 5791 " <strong>Search params:</strong>\n" +
5793 5792 " <span ng-repeat=\"tag in logs.searchParams.tags\" class=\"tag\">\n" +
5794 5793 " <strong>{{tag.type}}</strong>\n" +
5795 5794 " {{ tag.type == 'resource' ? logs.applications[tag.value].resource_name : tag.value }}\n" +
5796 5795 "\n" +
5797 5796 " <a ng-click=\"logs.removeSearchTag(tag)\"><span class=\"fa fa-times\"></span></a>\n" +
5798 5797 " </span>\n" +
5799 5798 " </p>\n" +
5800 5799 "\n" +
5801 5800 " <p>\n" +
5802 5801 "\n" +
5803 5802 " <script type=\"text/ng-template\" id=\"SearchTypeAheadUrl.html\">\n" +
5804 5803 "\n" +
5805 5804 " </script>\n" +
5806 5805 "\n" +
5807 5806 " <form class=\"form\">\n" +
5808 5807 " <div class=\"typeahead-tags\">\n" +
5809 5808 " <input type=\"text\" id=\"typeAhead\" ng-model=\"logs.filterTypeAhead\" placeholder=\"Start typing to filter logs for events, filter by servers, namespaces, levels.\"\n" +
5810 5809 " ng-keydown=\"logs.typeAheadTag($event)\"\n" +
5811 5810 " uib-typeahead=\"tag as tag.text for tag in logs.filterTypeAheadOptions | filter:$viewValue:logs.aheadFilter\"\n" +
5812 5811 " typeahead-min-length=\"1\" class=\"form-control\"\n" +
5813 5812 " typeahead-template-url=\"templates/directives/search_type_ahead.html\">\n" +
5814 5813 " </div>\n" +
5815 5814 " </form>\n" +
5816 5815 "\n" +
5817 5816 " <div class=\"well animate-show position-absolute increse-zindex\" ng-if=\"logs.showDatePicker\" ng-model=\"logs.pickerDate\" ng-change=\"logs.pickerDateChanged()\">\n" +
5818 5817 " <uib-datepicker></uib-datepicker>\n" +
5819 5818 " </div>\n" +
5820 5819 "\n" +
5821 5820 " </p>\n" +
5822 5821 "\n" +
5823 5822 " <div class=\"panel\">\n" +
5824 5823 "\n" +
5825 5824 " <div class=\"panel-body\">\n" +
5826 5825 " <c3chart data-domid=\"log_events_chart\" data-data=\"logs.logEventsChartData\" data-config=\"logs.logEventsChartConfig\">\n" +
5827 5826 " </c3chart>\n" +
5828 5827 " </div>\n" +
5829 5828 " </div>\n" +
5830 5829 "\n" +
5831 5830 "\n" +
5832 5831 " <div class=\"text-center\">\n" +
5833 5832 " <uib-pagination total-items=\"logs.itemCount\" items-per-page=\"logs.itemsPerPage\" ng-model=\"logs.page\" max-size=\"10\"\n" +
5834 5833 " ng-change=\"logs.paginationChange()\"\n" +
5835 5834 " class=\"pagination pagination-sm\" boundary-links=\"true\" direction-links=\"false\"></uib-pagination>\n" +
5836 5835 " </div>\n" +
5837 5836 "\n" +
5838 5837 " <div class=\"panel panel-default\">\n" +
5839 5838 "\n" +
5840 5839 " <table class=\"table table-striped log-list\">\n" +
5841 5840 " <caption>Logs</caption>\n" +
5842 5841 " <thead>\n" +
5843 5842 " <tr>\n" +
5844 5843 " <th class=\"c1 resource\">Application</th>\n" +
5845 5844 " <th class=\"c2 message\">Message</th>\n" +
5846 5845 " <th class=\"c3 when\">When</th>\n" +
5847 5846 " </tr>\n" +
5848 5847 " </thead>\n" +
5849 5848 " <tbody>\n" +
5850 5849 " <tr ng-repeat=\"log in logs.logsPage track by log.log_id\" class=\"{{$odd ? 'odd' : 'even'}}\">\n" +
5851 5850 " <td class=\"c1\">\n" +
5852 5851 " <a class=\"tag application\" ng-click=\"logs.addSearchTag({type:'resource', value:log.resource_id})\">\n" +
5853 5852 " <span class=\"name\">{{log.resource_name}}</span></a>\n" +
5854 5853 " </td>\n" +
5855 5854 " <td class=\"c2\">\n" +
5856 5855 " <a class=\"tag {{log.log_level|lowercase}}\" ng-click=\"logs.addSearchTag({type:'level', value:log.log_level})\">\n" +
5857 5856 " <span class=\"name\">level:</span> {{log.log_level}}</a>\n" +
5858 5857 " <a class=\"tag\" ng-click=\"logs.addSearchTag({type:'namespace', value:log.namespace})\">\n" +
5859 5858 " <span class=\"name\">namespace:</span> {{log.namespace}}</a>\n" +
5860 5859 " <a ng-repeat=\"(tag, value) in log.tags\" class=\"tag\" ng-click=\"logs.addSearchTag({type:tag, value:value})\">\n" +
5861 5860 " <span class=\"name\">{{tag}}:</span> {{value}}</a>\n" +
5862 5861 " <div class=\"log\">{{log.message}}</div>\n" +
5863 5862 " </td>\n" +
5864 5863 " <td class=\"c3 when\">\n" +
5865 5864 " <a ng-click=\"logs.filterId(log)\" data-uib-tooltip=\"{{log.timestamp}}\">\n" +
5866 5865 " <iso-to-relative-time time=\"{{log.timestamp}}\"/>\n" +
5867 5866 " </a>\n" +
5868 5867 " </td>\n" +
5869 5868 " </tr>\n" +
5870 5869 "\n" +
5871 5870 " </tbody>\n" +
5872 5871 " </table>\n" +
5873 5872 "\n" +
5874 5873 " </div>\n" +
5875 5874 "\n" +
5876 5875 " <div class=\"text-center\">\n" +
5877 5876 " <uib-pagination total-items=\"logs.itemCount\" items-per-page=\"logs.itemsPerPage\" ng-model=\"logs.page\" max-size=\"10\"\n" +
5878 5877 " ng-change=\"logs.paginationChange()\"\n" +
5879 5878 " class=\"pagination pagination-sm\" boundary-links=\"true\" direction-links=\"false\"></uib-pagination>\n" +
5880 5879 " </div>\n" +
5881 5880 "\n" +
5882 5881 "</div>\n"
5883 5882 );
5884 5883
5885 5884
5886 5885 $templateCache.put('templates/quickstart.html',
5887 5886 "<h2>AppEnlight quickstart</h2>\n" +
5888 5887 "\n" +
5889 5888 "<p>\n" +
5890 5889 " <span class=\"point\">1</span>\n" +
5891 5890 " For AppEnlight to operate, you need to\n" +
5892 5891 " <a data-ui-sref=\"applications.update({resourceId:'new'})\" target=\"_blank\"><strong>create an app profile</strong></a> that allows\n" +
5893 5892 " you to\n" +
5894 5893 " obtain an <strong>API key</strong> that one of the clients can use.\n" +
5895 5894 "</p>\n" +
5896 5895 "\n" +
5897 5896 "<div class=\"clear\"></div>\n" +
5898 5897 "<hr/>\n" +
5899 5898 "\n" +
5900 5899 "<p>\n" +
5901 5900 " <span class=\"point\">2</span>\n" +
5902 5901 " It is a good idea to configure an\n" +
5903 5902 " <a data-ui-sref=\"user.alert_channels.email\" target=\"_blank\">\n" +
5904 5903 " <strong>email alert channel</strong></a> that you can use to receive\n" +
5905 5904 " notifications about events that happen in your application.\n" +
5906 5905 "</p>\n" +
5907 5906 "\n" +
5908 5907 "<p>\n" +
5909 5908 " It can be the same email account you used to register withing AppEnlight -\n" +
5910 5909 " although we often recommend using a separate <em>errors@...</em> account\n" +
5911 5910 " designated for alert notifications.\n" +
5912 5911 "</p>\n" +
5913 5912 "\n" +
5914 5913 "<div class=\"clear\"></div>\n" +
5915 5914 "<hr/>\n" +
5916 5915 "\n" +
5917 5916 "<p>\n" +
5918 5917 " <span class=\"point\">3</span>\n" +
5919 5918 " In order for your application to stream meaningful information, you will need to\n" +
5920 5919 " integrate a compatible client for your language of choice.\n" +
5921 5920 "</p>\n" +
5922 5921 "\n" +
5923 5922 "<p>Head over to the <a href=\"{{AeConfig.urls.docs}}\" target=\"_blank\">\n" +
5924 5923 " <strong>developers section</strong></a> for information on currently available\n" +
5925 5924 " clients that you can plug into your software</p>\n"
5926 5925 );
5927 5926
5928 5927
5929 5928 $templateCache.put('templates/register.html',
5930 5929 ""
5931 5930 );
5932 5931
5933 5932
5934 5933 $templateCache.put('templates/reports/list_slow.html',
5935 5934 "<ng-include src=\"'templates/loader.html'\" ng-if=\"reports_list.is_loading\"></ng-include>\n" +
5936 5935 "\n" +
5937 5936 "<div ng-if=\"reports_list.is_loading === false\">\n" +
5938 5937 "\n" +
5939 5938 " <p class=\"search-params\">\n" +
5940 5939 " <strong>Search params:</strong>\n" +
5941 5940 " <span ng-repeat=\"tag in reports_list.searchParams.tags\" class=\"tag\">\n" +
5942 5941 " <strong>{{tag.type}}</strong>\n" +
5943 5942 " {{ tag.type == 'resource' ? reports_list.applications[tag.value].resource_name : tag.value }}\n" +
5944 5943 "\n" +
5945 5944 " <a ng-click=\"reports_list.removeSearchTag(tag)\"><span class=\"fa fa-times\"></span></a>\n" +
5946 5945 " </span>\n" +
5947 5946 " </p>\n" +
5948 5947 "\n" +
5949 5948 " <p>\n" +
5950 5949 "\n" +
5951 5950 " <form class=\"form\">\n" +
5952 5951 " <div class=\"typeahead-tags\">\n" +
5953 5952 " <input type=\"text\" id=\"typeAhead\" ng-model=\"reports_list.filterTypeAhead\" placeholder=\"Start typing to filter slowness reports - filter by tags, average response time, priority or other properties.\"\n" +
5954 5953 " ng-keydown=\"reports_list.typeAheadTag($event)\"\n" +
5955 5954 " uib-typeahead=\"tag as tag.text for tag in reports_list.filterTypeAheadOptions | filter:$viewValue:aheadFilter\"\n" +
5956 5955 " typeahead-min-length=\"1\" class=\"form-control\"\n" +
5957 5956 " typeahead-template-url=\"templates/directives/search_type_ahead.html\">\n" +
5958 5957 " </div>\n" +
5959 5958 " </form>\n" +
5960 5959 "\n" +
5961 5960 "\n" +
5962 5961 " <div class=\"well position-absolute increse-zindex\" ng-show=\"reports_list.showDatePicker\" ng-model=\"reports_list.pickerDate\" ng-change=\"reports_list.pickerDateChanged()\"\n" +
5963 5962 " class=\"animate-show\">\n" +
5964 5963 " <uib-datepicker></uib-datepicker>\n" +
5965 5964 " </div>\n" +
5966 5965 "\n" +
5967 5966 " </p>\n" +
5968 5967 "\n" +
5969 5968 "\n" +
5970 5969 " <div class=\"text-center\">\n" +
5971 5970 " <uib-pagination total-items=\"reports_list.itemCount\" items-per-page=\"reports_list.itemsPerPage\" ng-model=\"reports_list.page\" max-size=\"10\"\n" +
5972 5971 " class=\"pagination pagination-sm\" boundary-links=\"true\" direction-links=\"false\"\n" +
5973 5972 " ng-change=\"reports_list.paginationChange()\"\n" +
5974 5973 " ng-show=\"!reports_list.is_loading\"></uib-pagination>\n" +
5975 5974 " </div>\n" +
5976 5975 "\n" +
5977 5976 "\n" +
5978 5977 " <div class=\"panel panel-default\">\n" +
5979 5978 " <!-- Default panel contents -->\n" +
5980 5979 "\n" +
5981 5980 " <table class=\"table table-striped report-list\" ng-show=\"!reports_list.is_loading\">\n" +
5982 5981 " <caption>Slow Request Reports</caption>\n" +
5983 5982 " <thead>\n" +
5984 5983 " <tr>\n" +
5985 5984 " <td class=\"c1 ordering occurences\">#</td>\n" +
5986 5985 " <td class=\"c2 average_duration\">Avg. duration</td>\n" +
5987 5986 " <td class=\"c3 application\">Application</td>\n" +
5988 5987 " <td class=\"c5 when\">When <input type=\"checkbox\" ng-model=\"reports_list.notRelativeTime\"\n" +
5989 5988 " ng-change=\"reports_list.changeRelativeTime()\"\n" +
5990 5989 " title=\"Tick to see UTC time instead relative\"></td>\n" +
5991 5990 " <td class=\"c6 error_type\">Location</td>\n" +
5992 5991 " </tr>\n" +
5993 5992 " </thead>\n" +
5994 5993 " <tbody>\n" +
5995 5994 " <tr ng-repeat=\"report in reports_list.reportsPage track by report.id\">\n" +
5996 5995 " <td class=\"c1 occurences\">\n" +
5997 5996 " <span class=\"priority-{{report.group.priority}}\" data-uib-tooltip=\"Report priority\">{{report.group.priority}}</span>\n" +
5998 5997 " <span class=\"count {{report.presentation.className}}\" data-uib-tooltip=\"{{report.presentation.tooltip}}\">\n" +
5999 5998 " {{report.group.occurences|numberToThousands}}\n" +
6000 5999 " </span>\n" +
6001 6000 " </td>\n" +
6002 6001 " <td class=\"c2 average_duration\">{{report.group.average_duration.toFixed(3)}}s</td>\n" +
6003 6002 " <td class=\"c3 application\">\n" +
6004 6003 " <div class=\"app_name\">{{report.resource_name}}</div>\n" +
6005 6004 " <span class=\"server\">@{{report.tags.server_name}}</span></td>\n" +
6006 6005 " <td class=\"c4 when\">\n" +
6007 6006 " <span ng-show=\"!reports_list.notRelativeTime\"><span data-uib-tooltip=\"{{report.group.last_timestamp}}\"><iso-to-relative-time\n" +
6008 6007 " time=\"{{report.group.last_timestamp}}\"/></span>\n" +
6009 6008 " </span>\n" +
6010 6009 " <span ng-show=\"reports_list.notRelativeTime\">{{report.group.last_timestamp.replace('T', ' ').slice(0,16)}}</span>\n" +
6011 6010 " </td>\n" +
6012 6011 " <td class=\"c5 report ellipsis\">\n" +
6013 6012 " <a ui-sref=\"report.view_detail({groupId:report.group.id, reportId:report.id})\">{{ report.tags.view_name || report.url_path}} </span></a></td>\n" +
6014 6013 " </td>\n" +
6015 6014 " </tr>\n" +
6016 6015 "\n" +
6017 6016 " </tbody>\n" +
6018 6017 " </table>\n" +
6019 6018 "\n" +
6020 6019 " </div>\n" +
6021 6020 "\n" +
6022 6021 " <div class=\"text-center\">\n" +
6023 6022 " <uib-pagination total-items=\"reports_list.itemCount\" items-per-page=\"reports_list.itemsPerPage\" ng-model=\"reports_list.page\" max-size=\"10\"\n" +
6024 6023 " class=\"pagination pagination-sm\" boundary-links=\"true\" direction-links=\"false\"\n" +
6025 6024 " ng-change=\"reports_list.paginationChange()\"\n" +
6026 6025 " ng-show=\"!reports_list.is_loading\"></uib-pagination>\n" +
6027 6026 " </div>\n" +
6028 6027 "\n" +
6029 6028 "</div>\n"
6030 6029 );
6031 6030
6032 6031
6033 6032 $templateCache.put('templates/reports/list.html',
6034 6033 "<ng-include src=\"'templates/loader.html'\" ng-if=\"reports_list.is_loading\"></ng-include>\n" +
6035 6034 "\n" +
6036 6035 "<div ng-if=\"reports_list.is_loading === false\">\n" +
6037 6036 "\n" +
6038 6037 " <p class=\"search-params\">\n" +
6039 6038 " <strong>Search params:</strong>\n" +
6040 6039 " <span ng-repeat=\"tag in reports_list.searchParams.tags\" class=\"tag\">\n" +
6041 6040 " <strong>{{tag.type}}</strong>\n" +
6042 6041 " {{ tag.type == 'resource' ? reports_list.applications[tag.value].resource_name : tag.value }}\n" +
6043 6042 "\n" +
6044 6043 " <a ng-click=\"reports_list.removeSearchTag(tag)\"><span class=\"fa fa-times\"></span></a>\n" +
6045 6044 " </span>\n" +
6046 6045 " </p>\n" +
6047 6046 "\n" +
6048 6047 " <form class=\"form\">\n" +
6049 6048 " <div class=\"typeahead-tags\">\n" +
6050 6049 " <input type=\"text\" id=\"typeAhead\" ng-model=\"reports_list.filterTypeAhead\" placeholder=\"Start typing to filter reports - filter by tags, exception, priority or other properties.\"\n" +
6051 6050 " ng-keydown=\"reports_list.typeAheadTag($event)\"\n" +
6052 6051 " uib-typeahead=\"tag as tag.text for tag in reports_list.filterTypeAheadOptions | filter:$viewValue:aheadFilter\"\n" +
6053 6052 " typeahead-min-length=\"1\" class=\"form-control\"\n" +
6054 6053 " typeahead-template-url=\"templates/directives/search_type_ahead.html\">\n" +
6055 6054 " </div>\n" +
6056 6055 " </form>\n" +
6057 6056 "\n" +
6058 6057 "\n" +
6059 6058 " <div class=\"well position-absolute increse-zindex\" ng-show=\"reports_list.showDatePicker\" ng-model=\"reports_list.pickerDate\" ng-change=\"reports_list.pickerDateChanged()\"\n" +
6060 6059 " class=\"animate-show\">\n" +
6061 6060 " <uib-datepicker></uib-datepicker>\n" +
6062 6061 " </div>\n" +
6063 6062 "\n" +
6064 6063 " </p>\n" +
6065 6064 "\n" +
6066 6065 "\n" +
6067 6066 " <div class=\"text-center\">\n" +
6068 6067 " <uib-pagination total-items=\"reports_list.itemCount\" items-per-page=\"reports_list.itemsPerPage\" ng-model=\"reports_list.page\" max-size=\"10\"\n" +
6069 6068 " class=\"pagination pagination-sm\" boundary-links=\"true\" direction-links=\"false\"\n" +
6070 6069 " ng-change=\"reports_list.paginationChange()\"\n" +
6071 6070 " ng-show=\"!reports_list.is_loading\"></uib-pagination>\n" +
6072 6071 " </div>\n" +
6073 6072 "\n" +
6074 6073 " <div class=\"panel panel-default\">\n" +
6075 6074 " <!-- Default panel contents -->\n" +
6076 6075 "\n" +
6077 6076 " <table class=\"table table-striped report-list\" ng-show=\"!reports_list.is_loading\">\n" +
6078 6077 " <caption>Reports</caption>\n" +
6079 6078 " <thead>\n" +
6080 6079 " <tr>\n" +
6081 6080 " <th class=\"c1 ordering occurences\">#</th>\n" +
6082 6081 " <th class=\"c2 application\">Application</th>\n" +
6083 6082 " <th class=\"c4 when\">When <input type=\"checkbox\" ng-model=\"reports_list.notRelativeTime\"\n" +
6084 6083 " ng-change=\"reports_list.changeRelativeTime()\"\n" +
6085 6084 " title=\"Tick to see UTC time instead relative\"></th>\n" +
6086 6085 " <th class=\"c5 error_type\">Error</th>\n" +
6087 6086 " </tr>\n" +
6088 6087 " </thead>\n" +
6089 6088 " <tbody>\n" +
6090 6089 " <tr ng-repeat=\"report in reports_list.reportsPage track by report.id\">\n" +
6091 6090 " <td class=\"c1 occurences\">\n" +
6092 6091 " <span class=\"priority-{{report.group.priority}}\" data-uib-tooltip=\"Report priority\">{{report.group.priority}}</span>\n" +
6093 6092 " <span class=\"count {{report.presentation.className}}\" data-uib-tooltip=\"{{report.presentation.tooltip}}\">\n" +
6094 6093 " {{report.group.occurences|numberToThousands}}\n" +
6095 6094 " </span>\n" +
6096 6095 " </td>\n" +
6097 6096 " <td class=\"c2 application\">\n" +
6098 6097 " <div class=\"app_name\">{{report.resource_name}}</div>\n" +
6099 6098 " <span class=\"server\">@{{report.tags.server_name}}</span></td>\n" +
6100 6099 " <td class=\"c3 when\">\n" +
6101 6100 " <span ng-show=\"!reports_list.notRelativeTime\"><span data-uib-tooltip=\"{{report.group.last_timestamp}}\"><iso-to-relative-time\n" +
6102 6101 " time=\"{{report.group.last_timestamp}}\"/></span>\n" +
6103 6102 " </span>\n" +
6104 6103 " <span ng-show=\"reports_list.notRelativeTime\">{{report.group.last_timestamp.replace('T', ' ').slice(0,16)}}</span>\n" +
6105 6104 " </td>\n" +
6106 6105 " <td class=\"c4 report ellipsis\"><a ui-sref=\"report.view_detail({groupId:report.group.id, reportId:report.id})\" title=\"{{report.error}}\">{{report.error || 'Unknown Exception'}}</a> <br/>\n" +
6107 6106 " <span class=\"url\">{{ report.tags.view_name || report.url_path}}</td>\n" +
6108 6107 " </tr>\n" +
6109 6108 "\n" +
6110 6109 " </tbody>\n" +
6111 6110 " </table>\n" +
6112 6111 " </div>\n" +
6113 6112 "\n" +
6114 6113 "\n" +
6115 6114 " <div class=\"text-center\">\n" +
6116 6115 " <uib-pagination total-items=\"reports_list.itemCount\" items-per-page=\"reports_list.itemsPerPage\" ng-model=\"reports_list.page\" max-size=\"10\"\n" +
6117 6116 " class=\"pagination pagination-sm\" boundary-links=\"true\" direction-links=\"false\"\n" +
6118 6117 " ng-change=\"reports_list.paginationChange()\"\n" +
6119 6118 " ng-show=\"!reports_list.is_loading\"></uib-pagination>\n" +
6120 6119 " </div>\n" +
6121 6120 "\n" +
6122 6121 "</div>\n"
6123 6122 );
6124 6123
6125 6124
6126 6125 $templateCache.put('templates/reports/parent_view.html',
6127 6126 "<div ui-view></div>"
6128 6127 );
6129 6128
6130 6129
6131 6130 $templateCache.put('templates/reports/small_report_group_list.html',
6132 6131 "<table class=\"errors-small-list\">\n" +
6133 6132 " <tr ng-repeat=\"report_group in groups track by report_group.id\" class=\"animate-repeat\">\n" +
6134 6133 " <td class=\"c1 occurences\"><span class=\"occurences\" data-uib-tooltip=\"occurences\">{{ report_group.occurences|numberToThousands }}</span></td>\n" +
6135 6134 " <td class=\"ellipsis c2 report_group\">\n" +
6136 6135 " <a ui-sref=\"report.view_detail({groupId:report_group.id, reportId:report_group.last_report})\" title=\"{{report_group.error}}\" class=\"error-type\">\n" +
6137 6136 " {{ report_group.error || \"Slow Report\"}}</a>\n" +
6138 6137 " <br/>\n" +
6139 6138 " <span ng-show=\"report_group.summed_duration\" class=\"duration\" data-uib-tooltip=\"Average duration\">{{report_group.summed_duration/report_group.occurences|round:2}}s</span>\n" +
6140 6139 " <span class=\"url\">{{ report_group.view_name || report_group.url_path}}</span>\n" +
6141 6140 " </td>\n" +
6142 6141 " <td class=\"info\">\n" +
6143 6142 " <strong ng-show=\"report_group.resource_id\">@{{applications[report_group.resource_id].resource_name}}</strong><br/>\n" +
6144 6143 " <span class=\"date\">{{report_group.last_timestamp | isoToRelativeTime}}</span>\n" +
6145 6144 " </td>\n" +
6146 6145 " </tr>\n" +
6147 6146 "</table>\n"
6148 6147 );
6149 6148
6150 6149
6151 6150 $templateCache.put('templates/reports/small_report_list.html',
6152 6151 "<table class=\"errors-small-list\">\n" +
6153 6152 " <tr ng-repeat=\"report in reports track by $index\" ng-show=\"reports.length > 0\" class=\"animate-repeat\">\n" +
6154 6153 " <td class=\"c1 occurences\"><span class=\"occurences\" data-uib-tooltip=\"occurences\">{{ report.group.occurences|numberToThousands }}</span></td>\n" +
6155 6154 " <td class=\"ellipsis c2 report\">\n" +
6156 6155 " <a ui-sref=\"report.view_detail({groupId:report.group_id, reportId:report.report_id})\" title=\"{{report.error}}\" class=\"error-type\">\n" +
6157 6156 " {{ report.error || \"Slow Report\"}}</a>\n" +
6158 6157 " <br/>\n" +
6159 6158 " <span ng-show=\"report.group.summed_duration\" class=\"duration\" data-uib-tooltip=\"Average duration\">{{report.group.summed_duration/report.group.occurences|round:2}}s</span>\n" +
6160 6159 " <span class=\"url\">{{ report.view_name || report.url_path}}</span>\n" +
6161 6160 " </td>\n" +
6162 6161 " <td class=\"info\">\n" +
6163 6162 " <strong ng-show=\"report.resource_id\">@{{applications[report.resource_id].resource_name}}</strong><br/>\n" +
6164 6163 " <span class=\"date\">{{report.last_timestamp | isoToRelativeTime}}</span>\n" +
6165 6164 " </td>\n" +
6166 6165 " </tr>\n" +
6167 6166 "</table>\n"
6168 6167 );
6169 6168
6170 6169
6171 6170 $templateCache.put('templates/reports/view.html',
6172 6171 "<script type=\"text/ng-template\" id=\"slow_call.html\">\n" +
6173 6172 " <table class=\"report-table\">\n" +
6174 6173 " <tr>\n" +
6175 6174 " <td class=\"table-label\">Type</td>\n" +
6176 6175 " <td class=\"data\"><strong>{{call.type}}\n" +
6177 6176 " ({{call.subtype}})\n" +
6178 6177 " </strong></td>\n" +
6179 6178 " </tr>\n" +
6180 6179 " <tr>\n" +
6181 6180 " <td class=\"table-label\">Duration</td>\n" +
6182 6181 " <td class=\"data\"><strong class=\"textColor_1\">{{call.duration}}</strong></td>\n" +
6183 6182 " </tr>\n" +
6184 6183 " <tr>\n" +
6185 6184 " <td class=\"table-label\">Start Time</td>\n" +
6186 6185 " <td class=\"data\">{{call.timestamp}}</td>\n" +
6187 6186 " </tr>\n" +
6188 6187 " <tr>\n" +
6189 6188 " <td class=\"table-label\">Statement</td>\n" +
6190 6189 " <td class=\"data\">\n" +
6191 6190 " <pre class=\"word-wrap\">{{call.statement}}</pre>\n" +
6192 6191 " </td>\n" +
6193 6192 " </tr>\n" +
6194 6193 " <tr ng-if=\"call.location\">\n" +
6195 6194 " <td class=\"table-label\">Location</td>\n" +
6196 6195 " <td class=\"data\">{{call.location}}</td>\n" +
6197 6196 " </tr>\n" +
6198 6197 " <tr>\n" +
6199 6198 " <td class=\"table-label\">Parameters</td>\n" +
6200 6199 " <td class=\"\">\n" +
6201 6200 " <div class=\"var-listing\" human-format vars=\"call.parameters\"></div>\n" +
6202 6201 " </td>\n" +
6203 6202 " </tr>\n" +
6204 6203 " </table>\n" +
6205 6204 "\n" +
6206 6205 " <div ng-if=\"call.children.length > 0\" class=\"subcalls p-l-8\">\n" +
6207 6206 "\n" +
6208 6207 " <p><strong>\n" +
6209 6208 " <small>Sub-calls</small>\n" +
6210 6209 " </strong></p>\n" +
6211 6210 "\n" +
6212 6211 " <div class=\"panel panel-default\">\n" +
6213 6212 " <div ng-repeat=\"call in call.children\" ng-include=\"'slow_call.html'\" class=\"panel-body\"/>\n" +
6214 6213 " </div>\n" +
6215 6214 " </div>\n" +
6216 6215 " </div>\n" +
6217 6216 "\n" +
6218 6217 "</script>\n" +
6219 6218 "\n" +
6220 6219 "<script type=\"text/ng-template\" id=\"AssignReportCtrl.html\">\n" +
6221 6220 "\n" +
6222 6221 " <div class=\"modal-header\">\n" +
6223 6222 " <h3>Assign users to report</h3>\n" +
6224 6223 " </div>\n" +
6225 6224 " <div class=\"modal-body\">\n" +
6226 6225 "\n" +
6227 6226 " <ng-include src=\"'templates/loader.html'\" ng-if=\"ctrl.loading\"></ng-include>\n" +
6228 6227 "\n" +
6229 6228 " <div class=\"row\" ng-if=\"!ctrl.loading\">\n" +
6230 6229 " <div class=\"col-sm-6\">\n" +
6231 6230 " <strong>Unassigned</strong>\n" +
6232 6231 "\n" +
6233 6232 " <div class=\"user-assignment\" ng-repeat=\"user in ctrl.unAssignedUsers\"\n" +
6234 6233 " ng-click=\"ctrl.reassignUser(user)\">\n" +
6235 6234 " <img ng-src=\"{{user.gravatar_url}}\"/>\n" +
6236 6235 " <strong>{{user.user_name}}</strong><br/>\n" +
6237 6236 " {{user.name}}\n" +
6238 6237 " <div class=\"clear\"></div>\n" +
6239 6238 " </div>\n" +
6240 6239 " </div>\n" +
6241 6240 "\n" +
6242 6241 " <div class=\"col-sm-6\">\n" +
6243 6242 " <strong>Assigned</strong>\n" +
6244 6243 "\n" +
6245 6244 " <div class=\"user-assignment\" ng-repeat=\"user in ctrl.assignedUsers\" ng-click=\"ctrl.reassignUser(user)\">\n" +
6246 6245 " <img ng-src=\"{{user.gravatar_url}}\"/>\n" +
6247 6246 " {{user.user_name}}<br/>\n" +
6248 6247 " {{user.name}}\n" +
6249 6248 " <div class=\"clear\"></div>\n" +
6250 6249 " </div>\n" +
6251 6250 " </div>\n" +
6252 6251 " </div>\n" +
6253 6252 " </div>\n" +
6254 6253 " <div class=\"modal-footer\">\n" +
6255 6254 " <button class=\"btn btn-primary\" ng-click=\"ctrl.ok()\">OK</button>\n" +
6256 6255 " <button class=\"btn btn-warning\" ng-click=\"ctrl.cancel()\">Cancel</button>\n" +
6257 6256 " </div>\n" +
6258 6257 "</script>\n" +
6259 6258 "\n" +
6260 6259 "<ng-include src=\"'templates/loader.html'\" ng-if=\"report.is_loading.report\"></ng-include>\n" +
6261 6260 "\n" +
6262 6261 "<div ng-if=\"!report.is_loading.report && report.report === null\">\n" +
6263 6262 " <strong>OOPS something went wrong :(</strong>\n" +
6264 6263 "</div>\n" +
6265 6264 "\n" +
6266 6265 "<div ng-if=\"report.report !== null && !report.is_loading.report\">\n" +
6267 6266 "\n" +
6268 6267 " <div ng-if=\"report.stateHolder.AeUser.id\" class=\"row\">\n" +
6269 6268 " <div class=\"col-lg-12\">\n" +
6270 6269 " <a onclick=\"window.history.back()\" class=\"btn btn-default\" ng-if=\"report.window.history.length > 2\"><span class=\"fa fa-arrow-circle-o-left\"></span>\n" +
6271 6270 " Go back</a>\n" +
6272 6271 " <a class=\"btn btn-default\" ng-click=\"report.assignUsersModal()\" ng-if=\"report.reportType == 'report'\"><span\n" +
6273 6272 " class=\"fa fa-flag\"></span> Assign report\n" +
6274 6273 " to user</a>\n" +
6275 6274 "\n" +
6276 6275 " <a class=\"btn {{ report.report.group.fixed ? 'btn-success' : 'btn-default'}}\" ng-click=\"report.markFixed()\"\n" +
6277 6276 " ng-if=\"report.reportType == 'report'\">\n" +
6278 6277 " <span class=\"fa fa-check\"></span> Mark fixed</a>\n" +
6279 6278 "\n" +
6280 6279 " <span class=\"dropdown\" ng-if=\"report.report.application.integrations.length\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
6281 6280 " <a class=\"dropdown-toggle btn btn-default\" data-uib-dropdown-toggle>\n" +
6282 6281 " <span class=\"fa fa-send\"></span> Integrations\n" +
6283 6282 " </a>\n" +
6284 6283 " <ul class=\"dropdown-menu\">\n" +
6285 6284 " <li ng-repeat=\"choice in report.report.application.integrations\">\n" +
6286 6285 " <a ng-click=\"report.runIntegration(choice.name)\">{{choice.action}}</a>\n" +
6287 6286 " </li>\n" +
6288 6287 " </ul>\n" +
6289 6288 " </span>\n" +
6290 6289 "\n" +
6291 6290 " <a class=\"btn btn-default\" ng-click=\"report.markPublic()\">Make {{report.group.public ? 'private' : 'public'}}</a>\n" +
6292 6291 "\n" +
6293 6292 "<span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
6294 6293 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Delete</a>\n" +
6295 6294 " <ul class=\"dropdown-menu\">\n" +
6296 6295 " <li><a>No</a></li>\n" +
6297 6296 " <li><a ng-click=\"report.delete()\">Yes</a></li>\n" +
6298 6297 " </ul>\n" +
6299 6298 "</span>\n" +
6300 6299 " </div>\n" +
6301 6300 " </div>\n" +
6302 6301 "\n" +
6303 6302 " <div class=\"row\">\n" +
6304 6303 " <div class=\"col-lg-4\">\n" +
6305 6304 "\n" +
6306 6305 " <div class=\"panel panel-default m-t-1\">\n" +
6307 6306 " <div class=\"panel-body\">\n" +
6308 6307 "\n" +
6309 6308 " <h3 class=\"m-t-0\">Report Information</h3>\n" +
6310 6309 "\n" +
6311 6310 " <table class=\"report-table with-ellipsis\">\n" +
6312 6311 " <tr>\n" +
6313 6312 " <td class=\"table-label\">Occurences</td>\n" +
6314 6313 " <td class=\"data\">{{report.report.group.occurences}}</td>\n" +
6315 6314 " </tr>\n" +
6316 6315 " <tr ng-if=\"report.report.http_status\">\n" +
6317 6316 " <td class=\"table-label\">HTTP status</td>\n" +
6318 6317 " <td class=\"data\">{{report.report.http_status}}</td>\n" +
6319 6318 " </tr>\n" +
6320 6319 " <tr ng-if=\"report.report.group.priority\">\n" +
6321 6320 " <td class=\"table-label\">Priority</td>\n" +
6322 6321 " <td class=\"data\">{{report.report.group.priority}}</td>\n" +
6323 6322 " </tr>\n" +
6324 6323 " <tr ng-if=\"report.report.group.public\">\n" +
6325 6324 " <td class=\"table-label\">Public URL</td>\n" +
6326 6325 " <td class=\"data\">\n" +
6327 6326 " <form>\n" +
6328 6327 " <textarea class=\"TextAreaField form-control\" id=\"public-url\" onclick=\"this.select()\">{{report.$state.href(report.$state.current.name, report.$state.params, {absolute: true})}}</textarea>\n" +
6329 6328 " </form>\n" +
6330 6329 " </td>\n" +
6331 6330 " </tr>\n" +
6332 6331 " <tr data-uib-tooltip=\"{{report.report.url}}\">\n" +
6333 6332 " <td class=\"table-label\">URL</td>\n" +
6334 6333 " <td class=\"data ellipsis\"><a href=\"{{report.report.url}}\">{{report.report.url}}</a></td>\n" +
6335 6334 " </tr>\n" +
6336 6335 "\n" +
6337 6336 " <tr ng-if=\"report.report.ip\">\n" +
6338 6337 " <td class=\"table-label\">Remote IP</td>\n" +
6339 6338 " <td class=\"data\">{{report.report.ip}}</td>\n" +
6340 6339 " </tr>\n" +
6341 6340 " <tr ng-if=\"report.report.user_agent\" data-uib-tooltip=\"{{report.report.user_agent}}\">\n" +
6342 6341 " <td class=\"table-label\">User Agent</td>\n" +
6343 6342 " <td class=\"data ellipsis\">{{report.report.user_agent}}</td>\n" +
6344 6343 " </tr>\n" +
6345 6344 " <tr ng-if=\"report.report.message\">\n" +
6346 6345 " <td class=\"table-label\">Message</td>\n" +
6347 6346 " <td class=\"data\">{{report.report.message}}</td>\n" +
6348 6347 " </tr>\n" +
6349 6348 " <tr ng-if=\"report.report.duration > 0\">\n" +
6350 6349 " <td class=\"table-label\">Duration</td>\n" +
6351 6350 " <td class=\"data\">\n" +
6352 6351 " <span>{{report.report.duration}}s</span>\n" +
6353 6352 " </td>\n" +
6354 6353 " </tr>\n" +
6355 6354 " <tr>\n" +
6356 6355 " <td class=\"table-label\">First occured</td>\n" +
6357 6356 " <td class=\"data\">\n" +
6358 6357 " <span uib-tooltip=\"{{report.report.group.first_timestamp}}\"><iso-to-relative-time\n" +
6359 6358 " time=\"{{report.report.group.first_timestamp}}\"/></span>\n" +
6360 6359 " </td>\n" +
6361 6360 " </tr>\n" +
6362 6361 " <tr>\n" +
6363 6362 " <td class=\"table-label\">Last occured</td>\n" +
6364 6363 " <td class=\"data\">\n" +
6365 6364 " <span uib-tooltip=\"{{report.report.group.last_timestamp}}\"><iso-to-relative-time\n" +
6366 6365 " time=\"{{report.report.group.last_timestamp}}\"/></span>\n" +
6367 6366 " </td>\n" +
6368 6367 " </tr>\n" +
6369 6368 " </table>\n" +
6370 6369 "\n" +
6371 6370 " <div ng-if=\"report.requestStats\">\n" +
6372 6371 " <h3>Performance stats</h3>\n" +
6373 6372 "\n" +
6374 6373 " <div class=\"perf_stats\">\n" +
6375 6374 " <span class=\"stat\" ng-repeat=\"stat in report.requestStats\"\n" +
6376 6375 " ng-if=\"stat.calls > 0 || stat.value > 0\"><strong>\n" +
6377 6376 " <span class=\"{{stat.name}} bar\" style=\"width:10px\"></span> {{stat.calls}}\n" +
6378 6377 " <span ng-if=\"stat.name!='main'\"><small>{{stat.name}} calls</small></span>\n" +
6379 6378 " <span ng-if=\"stat.name=='main'\">\n" +
6380 6379 " <span class=\"fa fa-question-circle\"\n" +
6381 6380 " data-uib-tooltip=\"Execution time that didnt get assigned to other layers\"></span> Other</span>\n" +
6382 6381 " </strong>\n" +
6383 6382 " </span>\n" +
6384 6383 "\n" +
6385 6384 " <div style=\"width: 100%; overflow:hidden\">\n" +
6386 6385 " <div class=\"{{stat.name}} bar\" style=\"width:{{stat.percent}}%; height: 25px\"\n" +
6387 6386 " ng-repeat=\"stat in report.requestStats\"\n" +
6388 6387 " data-uib-tooltip=\"{{stat.value}}s - Cumulative time spent in this request on all {{ stat.name }} calls\"></div>\n" +
6389 6388 " <div class=\"row\">\n" +
6390 6389 " <div class=\"col-xs-6 text-left\">\n" +
6391 6390 " <small>0s</small>\n" +
6392 6391 " </div>\n" +
6393 6392 " <div class=\"col-xs-6 text-right\">\n" +
6394 6393 " <small>{{report.report.duration.toFixed(3)}}s</small>\n" +
6395 6394 " </div>\n" +
6396 6395 " </div>\n" +
6397 6396 " </div>\n" +
6398 6397 " </div>\n" +
6399 6398 " </div>\n" +
6400 6399 "\n" +
6401 6400 " <h3>Tags</h3>\n" +
6402 6401 "\n" +
6403 6402 " <table class=\"report-table with-tags\">\n" +
6404 6403 " <tr ng-repeat=\"(tag, value) in report.report.tags\">\n" +
6405 6404 " <td class=\"table-label\" ng-switch=\"tag\"><!--\n" +
6406 6405 " --><span ng-switch-when=\"user_name\">Username/UID</span><!--\n" +
6407 6406 " --><span ng-switch-when=\"view_name\">View Name</span><!--\n" +
6408 6407 " --><span ng-switch-when=\"server_name\">Server Name</span><!--\n" +
6409 6408 " --><span ng-switch-default>{{ tag }}</span>\n" +
6410 6409 " </td>\n" +
6411 6410 " <td class=\"data\"><a ng-click=\"report.searchTag(tag, value)\">{{ value }}</td>\n" +
6412 6411 " </tr>\n" +
6413 6412 " </table>\n" +
6414 6413 "\n" +
6415 6414 " </div>\n" +
6416 6415 " </div>\n" +
6417 6416 "\n" +
6418 6417 "\n" +
6419 6418 " </div>\n" +
6420 6419 " <div class=\"col-lg-8\">\n" +
6421 6420 " <div class=\"frames\">\n" +
6422 6421 " <p class=\"text-center\">Report history</p>\n" +
6423 6422 "\n" +
6424 6423 " <div class=\"panel\" ng-if=\"!report.is_loading.history\">\n" +
6425 6424 " <div class=\"panel-body\">\n" +
6426 6425 " <c3chart data-domid=\"report_history_chart\" data-data=\"report.reportHistoryData\" data-config=\"report.reportHistoryConfig\">\n" +
6427 6426 " </c3chart>\n" +
6428 6427 " </div>\n" +
6429 6428 " </div>\n" +
6430 6429 "\n" +
6431 6430 " <div class=\"row m-b-1\">\n" +
6432 6431 " <div class=\"col-sm-2 text-left\">\n" +
6433 6432 " <a class=\"switch_detail btn btn-sm btn-default {{report.report.group.previous_report ? '' : 'disabled'}}\"\n" +
6434 6433 " ng-click=\"report.previousDetail()\">\n" +
6435 6434 " <span class=\"fa fa-arrow-left\"></span>\n" +
6436 6435 " Prev. detail</a>\n" +
6437 6436 "\n" +
6438 6437 " </div>\n" +
6439 6438 " <div class=\"col-sm-8 text-center\">\n" +
6440 6439 " <small>\n" +
6441 6440 " <span uib-tooltip=\"{{report.report.start_time|isoToRelativeTime}}\" class=\"m-r-1\">\n" +
6442 6441 " {{report.report.start_time.replace('T', ' ')}} UTC</span>\n" +
6443 6442 " <span class=\"text-muted\">ID: {{report.report.request_id}}</span>\n" +
6444 6443 " </small>\n" +
6445 6444 " </div>\n" +
6446 6445 " <div class=\"col-sm-2 text-right\">\n" +
6447 6446 " <a class=\"switch_detail btn btn-sm btn-default {{report.report.group.next_report ? '' : 'disabled'}}\"\n" +
6448 6447 " ng-click=\"report.nextDetail()\">\n" +
6449 6448 " Next detail <span class=\"fa fa-arrow-right\"></span></a>\n" +
6450 6449 " </div>\n" +
6451 6450 " </div>\n" +
6452 6451 "\n" +
6453 6452 " <h3 class=\"word-wrap\">{{report.report.error}}</h3>\n" +
6454 6453 "\n" +
6455 6454 " <div ng-if=\"report.report.traceback\">\n" +
6456 6455 "\n" +
6457 6456 " <h3><strong>Traceback</strong></h3>\n" +
6458 6457 "\n" +
6459 6458 " <div class=\"btn-group\">\n" +
6460 6459 " <a ng-if=\"report.traceback.length-10 > 0 \" ng-click=\"report.showLong = !report.showLong\"\n" +
6461 6460 " class=\"btn btn-default {{report.showLong ? 'active' : ''}}\">\n" +
6462 6461 " <span class=\"fa fa-align-left\"></span>\n" +
6463 6462 " <small>Show {{report.traceback.length-10}} remaining frames</small>\n" +
6464 6463 " </a>\n" +
6465 6464 "\n" +
6466 6465 " <a class=\"btn btn-default {{report.showRaw ? 'active' : ''}}\" ng-click=\"report.showRaw = !report.showRaw\">\n" +
6467 6466 " <span class=\"fa fa-list\"></span>\n" +
6468 6467 " <small>Raw version</small>\n" +
6469 6468 " </a>\n" +
6470 6469 " </div>\n" +
6471 6470 "\n" +
6472 6471 " <div ng-if=\"report.showRaw\" class=\"m-t-1\">\n" +
6473 6472 " <pre>{{report.rawTraceback}}</pre>\n" +
6474 6473 " </div>\n" +
6475 6474 " <div ng-if=\"!report.showRaw\" class=\"m-t-1\">\n" +
6476 6475 "\n" +
6477 6476 " <div ng-repeat=\"frame in report.traceback\" class=\"frame {{$odd ? 'odd' : 'even'}}\"\n" +
6478 6477 " ng-if=\"$index >= report.traceback.length-10 || report.traceback.length <= 10 || report.showLong\">\n" +
6479 6478 " <div class=\"frameline\" ng-if=\"frame.line\">\n" +
6480 6479 " <a class=\"inspect_vars\" ng-click=\"frame.showVars = !frame.showVars\" ng-if=\"frame.vars\">\n" +
6481 6480 " <span class=\"fa fa-search dim btn btn-default\"\n" +
6482 6481 " uib-tooltip=\"Show local vars\"> </span>\n" +
6483 6482 " </a>\n" +
6484 6483 "\n" +
6485 6484 " <span class=\"no-vars\" ng-if=\"frame.vars.length == 0\"></span>\n" +
6486 6485 "\n" +
6487 6486 " <span ng-if=\"frame.file\">\n" +
6488 6487 " <span class=\"mono\">File</span> <span class=\"file mono\">{{frame.file || 'Unknown file'}}</span>,\n" +
6489 6488 " </span>\n" +
6490 6489 " <span ng-if=\"frame.module && !frame.file\">\n" +
6491 6490 " <span class=\"mono\">Module</span> <span class=\"file mono\">{{frame.module || 'Unknown module'}}</span>,\n" +
6492 6491 " </span>\n" +
6493 6492 " <span class=\"mono\">line</span> <span class=\"line mono\">{{frame.line || 'Unknown line'}}</span>\n" +
6494 6493 "\n" +
6495 6494 " <span ng-if=\"frame.fn\"><span class=\"mono\">in</span> <strong\n" +
6496 6495 " class=\"fn mono\">{{frame.fn || 'Unknown function'}}</strong></span>\n" +
6497 6496 "\n" +
6498 6497 " </div>\n" +
6499 6498 " <div class=\"cline mono\" ng-if=\"frame.cline\">{{frame.cline || 'Unknown context'}}</div>\n" +
6500 6499 "\n" +
6501 6500 " <div class=\"vars\" ng-if=\"frame.showVars\">\n" +
6502 6501 " <table class=\"var-listing small\">\n" +
6503 6502 " <tr ng-repeat=\"fvar in frame.vars track by $index\" class=\"frame {{$odd ? 'odd' : 'even'}}\">\n" +
6504 6503 " <td class=\"var-label\">{{ fvar[0] }}</td>\n" +
6505 6504 " <td>\n" +
6506 6505 " <span human-format vars=\"fvar[1]\"></span>\n" +
6507 6506 " </td>\n" +
6508 6507 " </tr>\n" +
6509 6508 " </table>\n" +
6510 6509 "\n" +
6511 6510 " </div>\n" +
6512 6511 " </div>\n" +
6513 6512 " </div>\n" +
6514 6513 "\n" +
6515 6514 "\n" +
6516 6515 " </div>\n" +
6517 6516 "\n" +
6518 6517 "\n" +
6519 6518 " <uib-tabset>\n" +
6520 6519 " <uib-tab select=\"report.selectedTab('slow_calls')\" active=\"report.tabs.slow_calls\">\n" +
6521 6520 " <uib-tab-heading>\n" +
6522 6521 " Slow Calls\n" +
6523 6522 " </uib-tab-heading>\n" +
6524 6523 "\n" +
6525 6524 " <h3><strong>Slow Calls</strong></h3>\n" +
6526 6525 "\n" +
6527 6526 " <div ng-if=\"report.report.slow_calls.length > 0\">\n" +
6528 6527 " <div ng-repeat=\"call in report.report.slow_calls\" ng-include=\"'slow_call.html'\"></div>\n" +
6529 6528 " </div>\n" +
6530 6529 "\n" +
6531 6530 " <div ng-if=\"report.report.slow_calls.length == 0\">\n" +
6532 6531 " No slow calls reported\n" +
6533 6532 " </div>\n" +
6534 6533 "\n" +
6535 6534 " </uib-tab>\n" +
6536 6535 "\n" +
6537 6536 "\n" +
6538 6537 " <uib-tab select=\"report.selectedTab('request_details')\" active=\"report.tabs.request_details\">\n" +
6539 6538 " <uib-tab-heading>\n" +
6540 6539 " Request details\n" +
6541 6540 " </uib-tab-heading>\n" +
6542 6541 "\n" +
6543 6542 " <h3><strong>Extra</strong></h3>\n" +
6544 6543 " <div class=\"var-listing\" human-format vars=\"report.report.extra\"></div>\n" +
6545 6544 " <h3><strong>Request details</strong></h3>\n" +
6546 6545 " <div class=\"var-listing\" human-format vars=\"report.report.request\"></div>\n" +
6547 6546 "\n" +
6548 6547 " </uib-tab>\n" +
6549 6548 "\n" +
6550 6549 " <uib-tab select=\"report.selectedTab('logs')\" active=\"report.tabs.logs\">\n" +
6551 6550 " <uib-tab-heading>\n" +
6552 6551 " Logs\n" +
6553 6552 " </uib-tab-heading>\n" +
6554 6553 "\n" +
6555 6554 " <div ng-if=\"report.is_loading.logs!=false\" class=\"text-center\">\n" +
6556 6555 " <span class=\"fa fa-cog fa-spin fa-3x loader\"></span>\n" +
6557 6556 " </div>\n" +
6558 6557 " <p ng-if=\"report.reportLogs.length == 0\"> No logs found</p>\n" +
6559 6558 "\n" +
6560 6559 " <table class=\"table table-striped log-list\" ng-if=\"report.reportLogs.length > 0\">\n" +
6561 6560 "\n" +
6562 6561 " <caption>Logs</caption>\n" +
6563 6562 " <thead>\n" +
6564 6563 " <tr>\n" +
6565 6564 " <th class=\"message\">Message</th>\n" +
6566 6565 " <th class=\"when\">When</th>\n" +
6567 6566 " </tr>\n" +
6568 6567 " </thead>\n" +
6569 6568 " <tbody>\n" +
6570 6569 " <tr ng-repeat=\"log in report.reportLogs track by log.log_id\">\n" +
6571 6570 " <td>\n" +
6572 6571 " <a class=\"tag {{log.log_level|lowercase}}\">\n" +
6573 6572 " <span class=\"name\">level:</span> {{log.log_level}}</a>\n" +
6574 6573 " <a class=\"tag\">\n" +
6575 6574 " <span class=\"name\">namespace:</span> {{log.namespace}}</a>\n" +
6576 6575 " <a ng-repeat=\"(tag, value) in log.tags\" class=\"tag\">\n" +
6577 6576 " <span class=\"name\">{{tag}}:</span> {{value}}</a>\n" +
6578 6577 " <div class=\"log\">\n" +
6579 6578 " {{log.message}}\n" +
6580 6579 " </div>\n" +
6581 6580 " </td>\n" +
6582 6581 " <td class=\"when\">\n" +
6583 6582 " <a data-uib-tooltip=\"{{log.timestamp}}\">\n" +
6584 6583 " <iso-to-relative-time time=\"{{log.timestamp}}\"/>\n" +
6585 6584 " </a>\n" +
6586 6585 " </td>\n" +
6587 6586 " </tr>\n" +
6588 6587 "\n" +
6589 6588 " </tbody>\n" +
6590 6589 " </table>\n" +
6591 6590 "\n" +
6592 6591 " </uib-tab>\n" +
6593 6592 "\n" +
6594 6593 "\n" +
6595 6594 " <uib-tab select=\"report.selectedTab('comments')\" active=\"report.tabs.comments\">\n" +
6596 6595 " <uib-tab-heading>\n" +
6597 6596 " Comments\n" +
6598 6597 " <span class=\"label label-info\">{{report.report.comments.length}}</span>\n" +
6599 6598 "\n" +
6600 6599 " </uib-tab-heading>\n" +
6601 6600 "\n" +
6602 6601 " <h3><strong>Comments</strong></h3>\n" +
6603 6602 "\n" +
6604 6603 " <p ng-if=\"report.report.comments.length == 0\">No comments yet - be first to add one!</p>\n" +
6605 6604 "\n" +
6606 6605 " <div class=\"comment\" ng-repeat=\"comment in report.report.comments\">\n" +
6607 6606 " <p name=\"comment-{{comment.comment_id}}\"><span class=\"fa fa-comment\"></span>\n" +
6608 6607 " <strong>{{comment.user_name}}</strong>\n" +
6609 6608 " <iso-to-relative-time time=\"{{comment.created_timestamp}}\"/>\n" +
6610 6609 " </p>\n" +
6611 6610 " <p class=\"well\">{{comment.body}}</p>\n" +
6612 6611 " </div>\n" +
6613 6612 "\n" +
6614 6613 " <form name=\"commentForm\" ng-submit=\"report.addComment()\">\n" +
6615 6614 " <div class=\"form-group\">\n" +
6616 6615 " <textarea type=\"text\" class=\"form-control\" id=\"report.commentForm\" ng-model=\"report.comment\" required\n" +
6617 6616 " mentio mentio-search=\"report.searchMentionedPeople(term)\" mentio-items=\"report.mentionedPeople| filter:label:typedTerm\" class=\"form-control\"></textarea>\n" +
6618 6617 "\n" +
6619 6618 " </div>\n" +
6620 6619 " <div class=\"form-group\">\n" +
6621 6620 " <button class=\"btn btn-info\" ng-disabled=\"report.commentForm.$invalid\">Comment</button>\n" +
6622 6621 " </div>\n" +
6623 6622 " </form>\n" +
6624 6623 "\n" +
6625 6624 " <div ng-repeat=\"comment in report.report.comments\" class=\"{{$odd ? 'odd' : 'even'}}\" class=\"repeat-animate\">\n" +
6626 6625 " </div>\n" +
6627 6626 "\n" +
6628 6627 " </uib-tab>\n" +
6629 6628 "\n" +
6630 6629 " <uib-tab select=\"report.selectedTab('affected_users')\" active=\"report.tabs.affected_users\">\n" +
6631 6630 " <uib-tab-heading>\n" +
6632 6631 " Affected users\n" +
6633 6632 " <span class=\"label label-warning\">{{report.report.affected_users_count}}</span>\n" +
6634 6633 "\n" +
6635 6634 " </uib-tab-heading>\n" +
6636 6635 "\n" +
6637 6636 " <h3><strong>50 most affected users ID's by this issue:</strong></h3>\n" +
6638 6637 " <ul class=\"affected-user-list\">\n" +
6639 6638 " <li ng-repeat=\"user in report.report.top_affected_users\">\n" +
6640 6639 " <strong>{{user.username}}</strong> <span class=\"badge\" uib-tooltip=\"occurences\">{{user.count}}</span>\n" +
6641 6640 " </li>\n" +
6642 6641 " </ul>\n" +
6643 6642 "\n" +
6644 6643 " </uib-tab>\n" +
6645 6644 "\n" +
6646 6645 " </uib-tabset>\n" +
6647 6646 "\n" +
6648 6647 "\n" +
6649 6648 " </div>\n" +
6650 6649 "\n" +
6651 6650 " </div>\n" +
6652 6651 " </div>\n" +
6653 6652 "</div>\n"
6654 6653 );
6655 6654
6656 6655
6657 6656 $templateCache.put('templates/user/alert_channels_email.html',
6658 6657 "<ng-include src=\"'templates/loader.html'\" ng-if=\"email.loading.email\"></ng-include>\n" +
6659 6658 "\n" +
6660 6659 "<div ng-show=\"!email.loading.email\">\n" +
6661 6660 "\n" +
6662 6661 " <div class=\"panel panel-default\">\n" +
6663 6662 " <div class=\"panel-heading\" ng-include=\"'templates/user/breadcrumbs.html'\"></div>\n" +
6664 6663 " <div class=\"panel-body\">\n" +
6665 6664 " <p>Adding email alert channel - after you authorize your email in the system we can send alerts directly to this mailbox.</p>\n" +
6666 6665 " <form class=\"form-horizontal\" name=\"email.channelForm\" ng-submit=\"email.createChannel()\">\n" +
6667 6666 " <div class=\"form-group\" id=\"row-email\">\n" +
6668 6667 " <data-form-errors errors=\"email.channelForm.ae_validation.email\"></data-form-errors>\n" +
6669 6668 " <label id=\"label-email\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6670 6669 " Email Address\n" +
6671 6670 " <span class=\"required\">*</span>\n" +
6672 6671 " </label>\n" +
6673 6672 " <div class=\"col-sm-8 col-lg-9\">\n" +
6674 6673 " <input class=\"form-control\" type=\"text\" ng-model=\"email.form.email\">\n" +
6675 6674 " </div>\n" +
6676 6675 " </div>\n" +
6677 6676 " <div class=\"form-group\">\n" +
6678 6677 " <label for=\"submit\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6679 6678 " </label>\n" +
6680 6679 " <div class=\"col-sm-8 col-lg-9\">\n" +
6681 6680 " <input class=\"form-control btn btn-primary\" name=\"submit\" type=\"submit\" value=\"Add email channel\">\n" +
6682 6681 " </div>\n" +
6683 6682 " </div>\n" +
6684 6683 " </form>\n" +
6685 6684 " </div>\n" +
6686 6685 " </div>\n" +
6687 6686 "</div>\n"
6688 6687 );
6689 6688
6690 6689
6691 6690 $templateCache.put('templates/user/alert_channels_list.html',
6692 6691 "<ng-include src=\"'templates/loader.html'\" ng-if=\"channels.loading.channels || channels.loading.applications\"></ng-include>\n" +
6693 6692 "\n" +
6694 6693 "<div ng-if=\"!channels.loading.channels && !channels.loading.applications && !channels.loading.actions\">\n" +
6695 6694 "\n" +
6696 6695 " <div class=\"panel panel-default\">\n" +
6697 6696 " <div class=\"panel-heading\" ng-include=\"'templates/user/breadcrumbs.html'\"></div>\n" +
6698 6697 " <div class=\"panel-body\">\n" +
6699 6698 " <h1>Report alert rules</h1>\n" +
6700 6699 " <p>\n" +
6701 6700 " <a class=\"btn btn-info\" ng-click=\"channels.addAction()\"><span class=\"fa fa-plus-circle\"></span> Add top-level rule</a>\n" +
6702 6701 " </p>\n" +
6703 6702 "\n" +
6704 6703 " <report-alert-action action=\"action\" rule-definitions=\"channels.ruleDefinitions\"\n" +
6705 6704 " possible-channels=\"channels.alertChannels\"\n" +
6706 6705 " actions=\"channels.alertActions\" applications=\"channels.applications\"\n" +
6707 6706 " ng-repeat=\"action in channels.alertActions | filter: {type:'report'}\"></report-alert-action>\n" +
6708 6707 "\n" +
6709 6708 " </div>\n" +
6710 6709 " </div>\n" +
6711 6710 "\n" +
6712 6711 " <div class=\"panel panel-default\">\n" +
6713 6712 " <div class=\"panel-body\">\n" +
6714 6713 " <h1>Alert channels</h1>\n" +
6715 6714 "\n" +
6716 6715 " <p>Here you can configure your <em>alert channels</em>.</p>\n" +
6717 6716 "\n" +
6718 6717 " <p>An alert channel serves as means of delivery of notifications about important events that happen in your applications.</p>\n" +
6719 6718 "\n" +
6720 6719 " <div class=\"alert alert-success\">You can add more integrations that support different alert channels via application management panel.</div>\n" +
6721 6720 "\n" +
6722 6721 " <table class=\"table table-striped\">\n" +
6723 6722 " <tr ng-repeat=\"channel in channels.alertChannels\" class=\"animate-repeat\">\n" +
6724 6723 " <td><strong>{{ channel.channel_visible_value }}</strong></td>\n" +
6725 6724 " <td class=\"text-right\">\n" +
6726 6725 " <span class=\"btn btn-default\" data-uib-tooltip=\"Channel is {{ channel.channel_validated? '' :'NOT' }} validated\" tooltip-append-to-body=\"true\"\n" +
6727 6726 " ng-class=\"{dim:!channel.channel_validated}\">\n" +
6728 6727 " <span class=\"fa\" ng-class=\"{'fa-check-circle':channel.channel_validated, 'fa-times-circle':!channel.channel_validated}\"></span>\n" +
6729 6728 " </span>\n" +
6730 6729 " <a class=\"btn btn-default\" data-uib-tooltip=\"Press to turn {{ channel.send_alerts ? 'OFF' : 'ON' }} alerting on this chanel\"\n" +
6731 6730 " ng-click=\"channels.updateChannel(channel,'send_alerts')\" ng-class=\"{dim:!channel.send_alerts}\" tooltip-append-to-body=\"true\">\n" +
6732 6731 " <span class=\"fa fa-rss\"></span> Alerts\n" +
6733 6732 " </a>\n" +
6734 6733 " <a class=\"btn btn-default\" data-uib-tooltip=\"Press to turn {{ channel.daily_digest ? 'OFF' : 'ON' }} daily digests on this channel\"\n" +
6735 6734 " ng-click=\"channels.updateChannel(channel,'daily_digest')\" ng-class=\"{dim:!channel.daily_digest}\" tooltip-append-to-body=\"true\">\n" +
6736 6735 " <span class=\"fa fa-envelope\"></span> Daily digests\n" +
6737 6736 " </a>\n" +
6738 6737 "\n" +
6739 6738 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
6740 6739 " <a class=\"btn btn-default\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span> Remove</a>\n" +
6741 6740 " <ul class=\"dropdown-menu\">\n" +
6742 6741 " <li><a>No</a></li>\n" +
6743 6742 " <li><a ng-click=\"channels.removeChannel(channel)\">Yes</a></li>\n" +
6744 6743 " </ul>\n" +
6745 6744 " </span>\n" +
6746 6745 "\n" +
6747 6746 " </td>\n" +
6748 6747 " </tr>\n" +
6749 6748 " </table>\n" +
6750 6749 "\n" +
6751 6750 " </div>\n" +
6752 6751 " </div>\n" +
6753 6752 "\n" +
6754 6753 "</div>\n"
6755 6754 );
6756 6755
6757 6756
6758 6757 $templateCache.put('templates/user/alert_channels.html',
6759 6758 "<ui-view></ui-view>"
6760 6759 );
6761 6760
6762 6761
6763 6762 $templateCache.put('templates/user/auth_tokens.html',
6764 6763 "<ng-include src=\"'templates/loader.html'\" ng-if=\"auth_tokens.loading.tokens\"></ng-include>\n" +
6765 6764 "\n" +
6766 6765 "<div ng-show=\"!auth_tokens.loading.tokens\">\n" +
6767 6766 "\n" +
6768 6767 " <div class=\"panel panel-default\">\n" +
6769 6768 " <div class=\"panel-heading\" ng-include=\"'templates/user/breadcrumbs.html'\"></div>\n" +
6770 6769 "\n" +
6771 6770 " <div class=\"panel-body\">\n" +
6772 6771 "\n" +
6773 6772 " <div class=\"alert alert-success\">You can use those tokens to authenticate yourself when performing various API calls</div>\n" +
6774 6773 "\n" +
6775 6774 " <hr/>\n" +
6776 6775 "\n" +
6777 6776 " <form method=\"post\" class=\"form-inline\" name=\"auth_tokens.TokenForm\" ng-submit=\"auth_tokens.addToken()\" novalidate>\n" +
6778 6777 " <data-form-errors errors=\"auth_tokens.TokenForm.ae_validation.description\"></data-form-errors>\n" +
6779 6778 " <data-form-errors errors=\"auth_tokens.TokenForm.ae_validation.expires\"></data-form-errors>\n" +
6780 6779 " <div class=\"form-group\">\n" +
6781 6780 " <label>\n" +
6782 6781 " Description\n" +
6783 6782 " </label>\n" +
6784 6783 " <input class=\"form-control\" name=\"description\" placeholder=\"Token description\" type=\"text\" ng-model=\"auth_tokens.form.description\">\n" +
6785 6784 " </div>\n" +
6786 6785 " <div class=\"form-group\">\n" +
6787 6786 " <label>\n" +
6788 6787 " Expires\n" +
6789 6788 " </label>\n" +
6790 6789 " <select class=\"form-control\" ng-model=\"auth_tokens.form.expires\" ng-options=\"i.key as i.label for i in auth_tokens.expireOptions | objectToOrderedArray:'minutes'\">\n" +
6791 6790 " <option value=\"\">Never</option>\n" +
6792 6791 " </select>\n" +
6793 6792 " </div>\n" +
6794 6793 " <div class=\"form-group\">\n" +
6795 6794 " <label class=\"control-label col-sm-4 col-lg-3\">\n" +
6796 6795 " </label>\n" +
6797 6796 " <input class=\"form-control btn btn-primary\" name=\"submit\" type=\"submit\" value=\"Create Token\">\n" +
6798 6797 " </div>\n" +
6799 6798 " </form>\n" +
6800 6799 "\n" +
6801 6800 " </div>\n" +
6802 6801 "\n" +
6803 6802 "\n" +
6804 6803 " </div>\n" +
6805 6804 "\n" +
6806 6805 " <div class=\"panel panel-default\">\n" +
6807 6806 " <table st-table=\"displayedCollection\" st-safe-src=\"auth_tokens.tokens\" class=\"table table-striped\">\n" +
6808 6807 " <caption>Your current tokens</caption>\n" +
6809 6808 " <thead>\n" +
6810 6809 " <tr>\n" +
6811 6810 " <th st-sort=\"description\"><a>Description</a></th>\n" +
6812 6811 " <th class=\"created\"><a>Created</a></th>\n" +
6813 6812 " <th class=\"expires\"><a>Expires</a></th>\n" +
6814 6813 " <th class=\"options\"></th>\n" +
6815 6814 " </tr>\n" +
6816 6815 " <tr>\n" +
6817 6816 " <th><input st-search=\"description\" placeholder=\"search for description\" class=\"form-control\" type=\"search\" st-delay=\"1\"/></th>\n" +
6818 6817 " <th></th>\n" +
6819 6818 " <th></th>\n" +
6820 6819 " <th></th>\n" +
6821 6820 " </tr>\n" +
6822 6821 " </thead>\n" +
6823 6822 " <tbody>\n" +
6824 6823 "\n" +
6825 6824 " <tr ng-repeat=\"token in displayedCollection\">\n" +
6826 6825 " <td><p>{{token.description}}</p>\n" +
6827 6826 " <pre ng-init=\"token.limit = 8\" ng-mouseover=\"token.limit = 99\" ng-mouseleave=\"token.limit = 8\">{{token.token| limitTo:token.limit}}...</pre>\n" +
6828 6827 " </td>\n" +
6829 6828 " <td><span data-uib-tooltip=\"{{token.creation_date}}\">{{token.creation_date | isoToRelativeTime}}</span></td>\n" +
6830 6829 " <td><span ng-if=\"token.expires\" data-uib-tooltip=\"{{token.expires}}\">{{token.expires | isoToRelativeTime}}</span>\n" +
6831 6830 " <span ng-if=\"!token.expires\">Never</span></td>\n" +
6832 6831 " <td>\n" +
6833 6832 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
6834 6833 " <a class=\"btn btn-danger\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
6835 6834 " <ul class=\"dropdown-menu\">\n" +
6836 6835 " <li><a>No</a></li>\n" +
6837 6836 " <li><a ng-click=\"auth_tokens.removeToken(token)\">Yes</a></li>\n" +
6838 6837 " </ul>\n" +
6839 6838 " </span>\n" +
6840 6839 " </td>\n" +
6841 6840 " </tr>\n" +
6842 6841 " </tbody>\n" +
6843 6842 " </table>\n" +
6844 6843 " </div>\n" +
6845 6844 "\n" +
6846 6845 "</div>\n"
6847 6846 );
6848 6847
6849 6848
6850 6849 $templateCache.put('templates/user/breadcrumbs.html',
6851 6850 "<ol class=\"breadcrumb\" ng-show=\"$state.includes('user.profile')\">\n" +
6852 6851 " <li>Settings</li>\n" +
6853 6852 " <li ng-show=\"$state.includes('user.profile.edit')\" ng-class=\"{bold:$state.is('user.profile.edit')}\">User Profile</li>\n" +
6854 6853 " <li ng-show=\"$state.includes('user.profile.password')\" ng-class=\"{bold:$state.is('user.profile.password')}\">Password</li>\n" +
6855 6854 " <li ng-show=\"$state.includes('user.profile.identities')\" ng-class=\"{bold:$state.is('user.profile.identities')}\">Identities</li>\n" +
6856 6855 "</ol>\n" +
6857 6856 "\n" +
6858 6857 "<ol class=\"breadcrumb\" ng-show=\"$state.includes('user.alert_channels')\">\n" +
6859 6858 "<li>Notifications</li>\n" +
6860 6859 "<li ng-show=\"$state.includes('user.alert_channels.list')\" ng-class=\"{bold:$state.is('user.alert_channels.list')}\">Alert Channels</li>\n" +
6861 6860 "<li ng-show=\"$state.includes('user.alert_channels.email')\" ng-class=\"{bold:$state.is('user.alert_channels.email')}\">Create email channel</li>\n" +
6862 6861 "</ol>\n"
6863 6862 );
6864 6863
6865 6864
6866 6865 $templateCache.put('templates/user/index.html',
6867 6866 ""
6868 6867 );
6869 6868
6870 6869
6871 6870 $templateCache.put('templates/user/menu.html',
6872 6871 "<div class=\"panel panel-default\">\n" +
6873 6872 " <div class=\"panel-heading\">Applications</div>\n" +
6874 6873 " <ul class=\"list-group\">\n" +
6875 6874 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"applications.list\"><span class=\"fa fa-cog\"></span> List applications</a></li>\n" +
6876 6875 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"applications.update({resourceId:'new'})\"><span class=\"fa fa-plus-circle\"></span> Create application</a></li>\n" +
6877 6876 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"applications.purge_logs\"><span class=\"fa fa-trash-o\"></span> Purge logs</a></li>\n" +
6878 6877 " </ul>\n" +
6879 6878 "</div>\n" +
6880 6879 "\n" +
6881 6880 "\n" +
6882 6881 "<div class=\"panel panel-default\">\n" +
6883 6882 " <div class=\"panel-heading\">Settings</div>\n" +
6884 6883 " <ul class=\"list-group\">\n" +
6885 6884 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"user.profile.edit\"><span class=\"fa fa-user\"></span> Profile details</a></li>\n" +
6886 6885 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"user.profile.password\"><span class=\"fa fa-lock\"></span> Change Password</a></li>\n" +
6887 6886 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"user.profile.identities\"><span class=\"fa fa-link\"></span> External Identities</a></li>\n" +
6888 6887 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"user.profile.auth_tokens\"><span class=\"fa fa-unlock\"></span> Auth Tokens</a></li>\n" +
6889 6888 " </ul>\n" +
6890 6889 "</div>\n" +
6891 6890 "\n" +
6892 6891 "<div class=\"panel panel-default\">\n" +
6893 6892 " <div class=\"panel-heading\">Notifications</div>\n" +
6894 6893 " <ul class=\"list-group\">\n" +
6895 6894 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"user.alert_channels.list\"><span class=\"fa fa-bullhorn\"></span> Alert channels</a></li>\n" +
6896 6895 " <li class=\"list-group-item\" ui-sref-active-eq=\"active\"><a data-ui-sref=\"user.alert_channels.email\"><span class=\"fa fa-envelope\"></span> Add email channel</a></li>\n" +
6897 6896 " </ul>\n" +
6898 6897 "</div>"
6899 6898 );
6900 6899
6901 6900
6902 6901 $templateCache.put('templates/user/parent_view.html',
6903 6902 "<div class=\"row\">\n" +
6904 6903 " <div class=\"col-sm-3\" id=\"menu\">\n" +
6905 6904 " <div ng-include=\"'templates/user/menu.html'\"></div>\n" +
6906 6905 " </div>\n" +
6907 6906 "\n" +
6908 6907 " <div class=\"col-sm-9\" ui-view></div>\n" +
6909 6908 "</div>\n"
6910 6909 );
6911 6910
6912 6911
6913 6912 $templateCache.put('templates/user/profile_edit.html',
6914 6913 "<ng-include src=\"'templates/loader.html'\" ng-if=\"profile.loading.profile\"></ng-include>\n" +
6915 6914 "\n" +
6916 6915 "<div ng-show=\"!profile.loading.profile\">\n" +
6917 6916 " <div class=\"panel panel-default\">\n" +
6918 6917 " <div class=\"panel-heading\" ng-include=\"'templates/user/breadcrumbs.html'\"></div>\n" +
6919 6918 " <div class=\"panel-body\">\n" +
6920 6919 " <form name=\"profile.profileForm\" class=\"form-horizontal\" ng-submit=\"profile.updateProfile()\">\n" +
6921 6920 " <div class=\"form-group\" id=\"row-email\">\n" +
6922 6921 " <data-form-errors errors=\"profile.profileForm.ae_validation.email\"></data-form-errors>\n" +
6923 6922 " <label for=\"email\" id=\"label-email\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6924 6923 " Email Address\n" +
6925 6924 " <span class=\"required\">*</span>\n" +
6926 6925 " </label>\n" +
6927 6926 " <div class=\"col-sm-8 col-lg-9\">\n" +
6928 6927 " <input class=\"form-control\" id=\"email\" name=\"email\" type=\"text\" ng-model=\"profile.user.email\">\n" +
6929 6928 " </div>\n" +
6930 6929 " </div>\n" +
6931 6930 "\n" +
6932 6931 " <div class=\"form-group\" id=\"row-first_name\">\n" +
6933 6932 " <data-form-errors errors=\"profile.profileForm.ae_validation.first_name\"></data-form-errors>\n" +
6934 6933 " <label for=\"first_name\" id=\"label-first_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6935 6934 " First Name\n" +
6936 6935 " </label>\n" +
6937 6936 " <div class=\"col-sm-8 col-lg-9\">\n" +
6938 6937 " <input class=\"form-control\" id=\"first_name\" name=\"first_name\" type=\"text\" ng-model=\"profile.user.first_name\">\n" +
6939 6938 " </div>\n" +
6940 6939 " </div>\n" +
6941 6940 " <div class=\"form-group\" id=\"row-last_name\">\n" +
6942 6941 " <data-form-errors errors=\"profile.profileForm.ae_validation.last_name\"></data-form-errors>\n" +
6943 6942 " <label for=\"last_name\" id=\"label-last_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6944 6943 " Last Name\n" +
6945 6944 " </label>\n" +
6946 6945 " <div class=\"col-sm-8 col-lg-9\">\n" +
6947 6946 " <input class=\"form-control\" id=\"last_name\" name=\"last_name\" type=\"text\" ng-model=\"profile.user.last_name\">\n" +
6948 6947 " </div>\n" +
6949 6948 " </div>\n" +
6950 6949 " <div class=\"form-group\" id=\"row-company_name\">\n" +
6951 6950 " <data-form-errors errors=\"profile.profileForm.ae_validation.company_name\"></data-form-errors>\n" +
6952 6951 " <label for=\"company_name\" id=\"label-company_name\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6953 6952 " Company Name\n" +
6954 6953 " </label>\n" +
6955 6954 " <div class=\"col-sm-8 col-lg-9\">\n" +
6956 6955 " <input class=\"form-control\" id=\"company_name\" name=\"company_name\" type=\"text\" ng-model=\"profile.user.company_name\">\n" +
6957 6956 " </div>\n" +
6958 6957 " </div>\n" +
6959 6958 " <div class=\"form-group\" id=\"row-company_address\">\n" +
6960 6959 " <data-form-errors errors=\"profile.profileForm.ae_validation.company_address\"></data-form-errors>\n" +
6961 6960 " <label for=\"company_address\" id=\"label-company_address\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6962 6961 " Company Address\n" +
6963 6962 " </label>\n" +
6964 6963 " <div class=\"col-sm-8 col-lg-9\">\n" +
6965 6964 " <textarea class=\"form-control\" id=\"company_address\" name=\"company_address\" ng-model=\"profile.user.company_address\"></textarea>\n" +
6966 6965 " </div>\n" +
6967 6966 " </div>\n" +
6968 6967 " <div class=\"form-group\" id=\"row-zip_code\">\n" +
6969 6968 " <data-form-errors errors=\"profile.profileForm.ae_validation.zip_code\"></data-form-errors>\n" +
6970 6969 " <label for=\"zip_code\" id=\"label-zip_code\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6971 6970 " ZIP code\n" +
6972 6971 " </label>\n" +
6973 6972 " <div class=\"col-sm-8 col-lg-9\">\n" +
6974 6973 " <input class=\"form-control\" id=\"zip_code\" name=\"zip_code\" type=\"text\" ng-model=\"profile.user.zip_code\">\n" +
6975 6974 " </div>\n" +
6976 6975 " </div>\n" +
6977 6976 " <div class=\"form-group\" id=\"row-city\">\n" +
6978 6977 " <data-form-errors errors=\"profile.profileForm.ae_validation.city\"></data-form-errors>\n" +
6979 6978 " <label for=\"city\" id=\"label-city\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6980 6979 " City\n" +
6981 6980 " </label>\n" +
6982 6981 " <div class=\"col-sm-8 col-lg-9\">\n" +
6983 6982 " <input class=\"form-control\" id=\"city\" name=\"city\" type=\"text\" ng-model=\"profile.user.city\">\n" +
6984 6983 " </div>\n" +
6985 6984 " </div>\n" +
6986 6985 " <div class=\"form-group\" id=\"row-notifications\">\n" +
6987 6986 " <data-form-errors errors=\"profile.profileForm.ae_validation.notifications\"></data-form-errors>\n" +
6988 6987 " <label for=\"notifications\" id=\"label-notifications\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6989 6988 " Account notifications\n" +
6990 6989 " </label>\n" +
6991 6990 " <div class=\"col-sm-8 col-lg-9\">\n" +
6992 6991 " <input checked class=\"form-control\" id=\"notifications\" name=\"notifications\" type=\"checkbox\" ng-model=\"profile.user.notifications\">\n" +
6993 6992 " </div>\n" +
6994 6993 " </div>\n" +
6995 6994 " <div class=\"form-group\" id=\"row-submit\">\n" +
6996 6995 " <label for=\"submit\" id=\"label-submit\" class=\"control-label col-sm-4 col-lg-3\">\n" +
6997 6996 " </label>\n" +
6998 6997 " <div class=\"col-sm-8 col-lg-9\">\n" +
6999 6998 " <input class=\"form-control btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"Update Account\">\n" +
7000 6999 " </div>\n" +
7001 7000 " </div>\n" +
7002 7001 " </form>\n" +
7003 7002 " </div>\n" +
7004 7003 " </div>\n" +
7005 7004 "</div>\n"
7006 7005 );
7007 7006
7008 7007
7009 7008 $templateCache.put('templates/user/profile_identities.html',
7010 7009 "<ng-include src=\"'templates/loader.html'\" ng-if=\"identities.loading.identities\"></ng-include>\n" +
7011 7010 "\n" +
7012 7011 "<div ng-show=\"!identities.loading.identities\">\n" +
7013 7012 "\n" +
7014 7013 " <div class=\"panel panel-default\">\n" +
7015 7014 " <div class=\"panel-heading\" ng-include=\"'templates/user/breadcrumbs.html'\"></div>\n" +
7016 7015 " <div class=\"panel-body\">\n" +
7017 7016 "\n" +
7018 7017 " <div class=\"col-sm-6\">\n" +
7019 7018 " <p ng-show=\"identities.identities.length === 0\">No external providers linked yet</p>\n" +
7020 7019 " <ul class=\"list-group\">\n" +
7021 7020 " <li ng-repeat=\"provider in identities.identities\" class=\"animate-repeat list-group-item\">\n" +
7022 7021 " <div class=\"pull-right\">\n" +
7023 7022 " <span class=\"dropdown\" data-uib-dropdown on-toggle=\"toggled(open)\">\n" +
7024 7023 " <a class=\"btn btn-danger btn-xs\" data-uib-dropdown-toggle><span class=\"fa fa-trash-o\"></span></a>\n" +
7025 7024 " <ul class=\"dropdown-menu\">\n" +
7026 7025 " <li><a>No</a></li>\n" +
7027 7026 " <li><a ng-click=\"identities.removeProvider(provider)\">Yes</a></li>\n" +
7028 7027 " </ul>\n" +
7029 7028 " </span>\n" +
7030 7029 " </div>\n" +
7031 7030 " <em>@{{ provider.provider }}</em>: <strong>{{ provider.id }}</strong>\n" +
7032 7031 " </li>\n" +
7033 7032 " </ul>\n" +
7034 7033 " </div>\n" +
7035 7034 " <div class=\"col-sm-6\">\n" +
7036 7035 " <ul class=\"list-group\">\n" +
7037 7036 " <li class=\"list-group-item\">\n" +
7038 7037 " <a href=\"{{AeConfig.urls.social_auth.google}}\" target=\"_self\">\n" +
7039 7038 " <span class=\"fa fa-google-plus-square fa-2x\"></span> Connect with Google</a>\n" +
7040 7039 " </li>\n" +
7041 7040 " <li class=\"list-group-item\">\n" +
7042 7041 " <a href=\"{{AeConfig.urls.social_auth.twitter}}\" target=\"_self\">\n" +
7043 7042 " <span class=\"fa fa-twitter fa-2x\"></span> Connect with Twitter</a>\n" +
7044 7043 " </li>\n" +
7045 7044 " <li class=\"list-group-item\">\n" +
7046 7045 " <a href=\"{{AeConfig.urls.social_auth.bitbucket}}\" target=\"_self\">\n" +
7047 7046 " <span class=\"fa fa-bitbucket fa-2x\"></span> Connect with Bitbucket</a>\n" +
7048 7047 " </li>\n" +
7049 7048 " <li class=\"list-group-item\">\n" +
7050 7049 " <a href=\"{{AeConfig.urls.social_auth.github}}\" target=\"_self\">\n" +
7051 7050 " <span class=\"fa fa-github fa-2x\"></span> Connect with Github including private repo access</a>\n" +
7052 7051 " </li>\n" +
7053 7052 " </ul>\n" +
7054 7053 " </div>\n" +
7055 7054 " </div>\n" +
7056 7055 " </div>\n" +
7057 7056 "</div>\n"
7058 7057 );
7059 7058
7060 7059
7061 7060 $templateCache.put('templates/user/profile_password.html',
7062 7061 "<ng-include src=\"'templates/loader.html'\" ng-if=\"password.loading.password\"></ng-include>\n" +
7063 7062 "\n" +
7064 7063 "<div ng-show=\"!password.loading.password\">\n" +
7065 7064 "\n" +
7066 7065 " <div class=\"panel panel-default\">\n" +
7067 7066 " <div class=\"panel-heading\" ng-include=\"'templates/user/breadcrumbs.html'\"></div>\n" +
7068 7067 " <div class=\"panel-body\">\n" +
7069 7068 "\n" +
7070 7069 " <form class=\"form-horizontal\" name=\"password.passwordForm\" ng-submit=\"password.updatePassword()\">\n" +
7071 7070 " <div class=\"form-group\" id=\"row-old_password\">\n" +
7072 7071 " <data-form-errors errors=\"password.passwordForm.ae_validation.old_password\"></data-form-errors>\n" +
7073 7072 " <label for=\"old_password\" id=\"label-old_password\" class=\"control-label col-sm-4 col-lg-3\">\n" +
7074 7073 " Old Password\n" +
7075 7074 " <span class=\"required\">*</span>\n" +
7076 7075 " </label>\n" +
7077 7076 " <div class=\"col-sm-8 col-lg-9\">\n" +
7078 7077 " <input class=\"form-control\" id=\"old_password\" name=\"old_password\" type=\"password\" ng-model=\"password.form.old_password\">\n" +
7079 7078 " </div>\n" +
7080 7079 " </div>\n" +
7081 7080 " <div class=\"form-group\" id=\"row-new_password\">\n" +
7082 7081 " <data-form-errors errors=\"password.passwordForm.ae_validation.new_password\"></data-form-errors>\n" +
7083 7082 " <label for=\"new_password\" id=\"label-new_password\" class=\"control-label col-sm-4 col-lg-3\">\n" +
7084 7083 " New Password\n" +
7085 7084 " <span class=\"required\">*</span>\n" +
7086 7085 " </label>\n" +
7087 7086 " <div class=\"col-sm-8 col-lg-9\">\n" +
7088 7087 " <input class=\"form-control\" id=\"new_password\" name=\"new_password\" type=\"password\" ng-model=\"password.form.new_password\">\n" +
7089 7088 " </div>\n" +
7090 7089 " </div>\n" +
7091 7090 " <div class=\"form-group\" id=\"row-new_password_confirm\">\n" +
7092 7091 " <data-form-errors errors=\"password.passwordForm.ae_validation.new_password_confirm\"></data-form-errors>\n" +
7093 7092 " <label for=\"new_password_confirm\" id=\"label-new_password_confirm\" class=\"control-label col-sm-4 col-lg-3\">\n" +
7094 7093 " Confirm Password\n" +
7095 7094 " <span class=\"required\">*</span>\n" +
7096 7095 " </label>\n" +
7097 7096 " <div class=\"col-sm-8 col-lg-9\">\n" +
7098 7097 " <input class=\"form-control\" id=\"new_password_confirm\" name=\"new_password_confirm\" type=\"password\" ng-model=\"password.form.new_password_confirm\">\n" +
7099 7098 " </div>\n" +
7100 7099 " </div>\n" +
7101 7100 " <div class=\"form-group\" id=\"row-submit\">\n" +
7102 7101 " <label for=\"submit\" id=\"label-submit\" class=\"control-label col-sm-4 col-lg-3\"></label>\n" +
7103 7102 " <div class=\"col-sm-8 col-lg-9\">\n" +
7104 7103 " <input class=\"form-control SubmitField btn btn-primary\" id=\"submit\" name=\"submit\" type=\"submit\" value=\"Change Password\">\n" +
7105 7104 " </div>\n" +
7106 7105 " </div>\n" +
7107 7106 " </form>\n" +
7108 7107 "\n" +
7109 7108 " </div>\n" +
7110 7109 " </div>\n" +
7111 7110 "</div>\n"
7112 7111 );
7113 7112
7114 7113
7115 7114 $templateCache.put('templates/user/profile.html',
7116 7115 "<ui-view></ui-view>"
7117 7116 );
7118 7117
7119 7118 }]);
7120 7119
7121 7120 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7122 7121 // #
7123 7122 // # This program is free software: you can redistribute it and/or modify
7124 7123 // # it under the terms of the GNU Affero General Public License, version 3
7125 7124 // # (only), as published by the Free Software Foundation.
7126 7125 // #
7127 7126 // # This program is distributed in the hope that it will be useful,
7128 7127 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7129 7128 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7130 7129 // # GNU General Public License for more details.
7131 7130 // #
7132 7131 // # You should have received a copy of the GNU Affero General Public License
7133 7132 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7134 7133 // #
7135 7134 // # This program is dual-licensed. If you wish to learn more about the
7136 7135 // # AppEnlight Enterprise Edition, including its added features, Support
7137 7136 // # services, and proprietary license terms, please see
7138 7137 // # https://rhodecode.com/licenses/
7139 7138
7140 7139 angular.module('appenlight.components.appenlightApp', [])
7141 7140 .component('appenlightApp', {
7142 7141 templateUrl: 'components/appenlight-app/appenlight-app.html',
7143 7142 controller: AppEnlightAppController
7144 7143 });
7145 7144
7146 7145 AppEnlightAppController.$inject = ['$scope','$state', 'stateHolder', 'AeConfig'];
7147 7146
7148 7147 function AppEnlightAppController($scope, $state, stateHolder, AeConfig){
7149 7148
7150 7149 // to keep bw compatibility
7151 7150 $scope.$state = $state;
7152 7151 $scope.stateHolder = stateHolder;
7153 7152 $scope.flash = stateHolder.flashMessages.list;
7154 7153 $scope.closeAlert = stateHolder.flashMessages.closeAlert;
7155 7154 $scope.AeConfig = AeConfig;
7156 7155 }
7157 7156
7158 7157 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7159 7158 // #
7160 7159 // # This program is free software: you can redistribute it and/or modify
7161 7160 // # it under the terms of the GNU Affero General Public License, version 3
7162 7161 // # (only), as published by the Free Software Foundation.
7163 7162 // #
7164 7163 // # This program is distributed in the hope that it will be useful,
7165 7164 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7166 7165 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7167 7166 // # GNU General Public License for more details.
7168 7167 // #
7169 7168 // # You should have received a copy of the GNU Affero General Public License
7170 7169 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7171 7170 // #
7172 7171 // # This program is dual-licensed. If you wish to learn more about the
7173 7172 // # AppEnlight Enterprise Edition, including its added features, Support
7174 7173 // # services, and proprietary license terms, please see
7175 7174 // # https://rhodecode.com/licenses/
7176 7175
7177 7176 angular.module('appenlight.components.appenlightHeader', [])
7178 7177 .component('appenlightFooter', {
7179 7178 templateUrl: 'templates/components/appenlight-footer.html',
7180 7179 controller: AppEnlightFooterController
7181 7180 });
7182 7181
7183 7182 ChannelstreamController.$inject = ['stateHolder', 'AeConfig'];
7184 7183
7185 7184 function AppEnlightFooterController(stateHolder, AeConfig){
7186 7185 var vm = this;
7187 7186 vm.AeConfig = AeConfig;
7188 7187 vm.stateHolder = stateHolder;
7189 7188 }
7190 7189
7191 7190 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7192 7191 // #
7193 7192 // # This program is free software: you can redistribute it and/or modify
7194 7193 // # it under the terms of the GNU Affero General Public License, version 3
7195 7194 // # (only), as published by the Free Software Foundation.
7196 7195 // #
7197 7196 // # This program is distributed in the hope that it will be useful,
7198 7197 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7199 7198 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7200 7199 // # GNU General Public License for more details.
7201 7200 // #
7202 7201 // # You should have received a copy of the GNU Affero General Public License
7203 7202 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7204 7203 // #
7205 7204 // # This program is dual-licensed. If you wish to learn more about the
7206 7205 // # AppEnlight Enterprise Edition, including its added features, Support
7207 7206 // # services, and proprietary license terms, please see
7208 7207 // # https://rhodecode.com/licenses/
7209 7208
7210 7209 angular.module('appenlight.components.appenlightHeader', [])
7211 7210 .component('appenlightHeader', {
7212 7211 templateUrl: 'components/appenlight-header/appenlight-header.html',
7213 7212 controller: AppEnlightHeaderController
7214 7213 });
7215 7214
7216 7215 ChannelstreamController.$inject = ['$state', 'stateHolder', 'AeConfig'];
7217 7216
7218 7217 function AppEnlightHeaderController($state, stateHolder, AeConfig){
7219 7218 var vm = this;
7220 7219 vm.AeConfig = AeConfig;
7221 7220 vm.stateHolder = stateHolder;
7222 7221 vm.assignedReports = stateHolder.AeUser.assigned_reports;
7223 7222 vm.latestEvents = stateHolder.AeUser.latest_events;
7224 7223 vm.activeEvents = 0;
7225 7224 _.each(vm.latestEvents, function (event) {
7226 7225 if (event.status === 1 && event.end_date === null) {
7227 7226 vm.activeEvents += 1;
7228 7227 }
7229 7228 });
7230 7229
7231 7230 vm.clickedEvent = function(event){
7232 7231 // exception reports
7233 7232 if (_.contains([1,2], event.event_type)){
7234 7233 $state.go('report.list', {resource:event.resource_id, start_date:event.start_date});
7235 7234 }
7236 7235 // slowness reports
7237 7236 else if (_.contains([3,4], event.event_type)){
7238 7237 $state.go('report.list_slow', {resource:event.resource_id, start_date:event.start_date});
7239 7238 }
7240 7239 // uptime reports
7241 7240 else if (_.contains([7,8], event.event_type)){
7242 7241 $state.go('uptime', {resource:event.resource_id, start_date:event.start_date});
7243 7242 }
7244 7243 else{
7245 7244
7246 7245 }
7247 7246 }
7248 7247 }
7249 7248
7250 7249 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7251 7250 // #
7252 7251 // # This program is free software: you can redistribute it and/or modify
7253 7252 // # it under the terms of the GNU Affero General Public License, version 3
7254 7253 // # (only), as published by the Free Software Foundation.
7255 7254 // #
7256 7255 // # This program is distributed in the hope that it will be useful,
7257 7256 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7258 7257 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7259 7258 // # GNU General Public License for more details.
7260 7259 // #
7261 7260 // # You should have received a copy of the GNU Affero General Public License
7262 7261 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7263 7262 // #
7264 7263 // # This program is dual-licensed. If you wish to learn more about the
7265 7264 // # AppEnlight Enterprise Edition, including its added features, Support
7266 7265 // # services, and proprietary license terms, please see
7267 7266 // # https://rhodecode.com/licenses/
7268 7267
7269 7268 angular.module('appenlight.components.channelstream', [])
7270 7269 .component('channelstream', {
7271 7270 controller: ChannelstreamController,
7272 7271 bindings: {
7273 7272 config: '='
7274 7273 }
7275 7274 });
7276 7275
7277 7276 ChannelstreamController.$inject = ['$rootScope', 'stateHolder', 'userSelfPropertyResource'];
7278 7277
7279 7278 function ChannelstreamController($rootScope, stateHolder, userSelfPropertyResource){
7280 7279 if (stateHolder.AeUser.id === null){
7281 7280 return
7282 7281 }
7283 7282 userSelfPropertyResource.get({key: 'websocket'}, function (data) {
7284 7283 stateHolder.websocket = new ReconnectingWebSocket(this.config.ws_url + '/ws?conn_id=' + data.conn_id);
7285 7284 stateHolder.websocket.onopen = function (event) {
7286 7285
7287 7286 };
7288 7287 stateHolder.websocket.onmessage = function (event) {
7289 7288 var data = JSON.parse(event.data);
7290 7289 $rootScope.$apply(function (scope) {
7291 7290 _.each(data, function (message) {
7292 7291
7293 7292 if(typeof message.message.topic !== 'undefined'){
7294 7293 $rootScope.$emit(
7295 7294 'channelstream-message.'+message.message.topic, message);
7296 7295 }
7297 7296 else{
7298 7297 $rootScope.$emit('channelstream-message', message);
7299 7298 }
7300 7299 });
7301 7300 });
7302 7301 };
7303 7302 stateHolder.websocket.onclose = function (event) {
7304 7303
7305 7304 };
7306 7305
7307 7306 stateHolder.websocket.onerror = function (event) {
7308 7307
7309 7308 };
7310 7309 }.bind(this));
7311 7310 }
7312 7311
7313 7312 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7314 7313 // #
7315 7314 // # This program is free software: you can redistribute it and/or modify
7316 7315 // # it under the terms of the GNU Affero General Public License, version 3
7317 7316 // # (only), as published by the Free Software Foundation.
7318 7317 // #
7319 7318 // # This program is distributed in the hope that it will be useful,
7320 7319 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7321 7320 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7322 7321 // # GNU General Public License for more details.
7323 7322 // #
7324 7323 // # You should have received a copy of the GNU Affero General Public License
7325 7324 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7326 7325 // #
7327 7326 // # This program is dual-licensed. If you wish to learn more about the
7328 7327 // # AppEnlight Enterprise Edition, including its added features, Support
7329 7328 // # services, and proprietary license terms, please see
7330 7329 // # https://rhodecode.com/licenses/
7331 7330
7332 var aeconfig = angular.module('appenlight.config', []);
7333 aeconfig.factory('AeConfig', function () {
7334 var obj = {};
7335 obj.flashMessages = decodeEncodedJSON(window.AE.flash_messages);
7336 obj.timeOptions = decodeEncodedJSON(window.AE.timeOptions);
7337 obj.plugins = decodeEncodedJSON(window.AE.plugins);
7338 obj.topNav = decodeEncodedJSON(window.AE.topNav);
7339 obj.ws_url = window.AE.ws_url;
7340 obj.urls = window.AE.urls;
7341 // set keys on values because we wont be able to retrieve them everywhere
7342 for (var key in obj.timeOptions) {
7343 obj.timeOptions[key]['key'] = key;
7344 }
7345 console.info('config', obj);
7346 return obj;
7347 });
7348
7349 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7350 // #
7351 // # This program is free software: you can redistribute it and/or modify
7352 // # it under the terms of the GNU Affero General Public License, version 3
7353 // # (only), as published by the Free Software Foundation.
7354 // #
7355 // # This program is distributed in the hope that it will be useful,
7356 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7357 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7358 // # GNU General Public License for more details.
7359 // #
7360 // # You should have received a copy of the GNU Affero General Public License
7361 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7362 // #
7363 // # This program is dual-licensed. If you wish to learn more about the
7364 // # AppEnlight Enterprise Edition, including its added features, Support
7365 // # services, and proprietary license terms, please see
7366 // # https://rhodecode.com/licenses/
7367
7368 angular.module('appenlight.controllers').controller('AdminApplicationsListController', AdminApplicationsListController);
7331 angular.module('appenlight.components.indexDashboardView', [])
7332 .component('indexDashboardView', {
7333 templateUrl: 'components/views/index-dashboard/index-dashboard.html',
7334 controller: IndexDashboardController
7335 });
7369 7336
7370 AdminApplicationsListController.$inject = ['applicationsResource'];
7337 IndexDashboardController.$inject = ['$rootScope', '$scope', '$location','$cookies', '$interval', 'stateHolder', 'applicationsPropertyResource', 'AeConfig'];
7371 7338
7372 function AdminApplicationsListController(applicationsResource) {
7373
7339 function IndexDashboardController($rootScope, $scope, $location, $cookies, $interval, stateHolder, applicationsPropertyResource, AeConfig) {
7374 7340 var vm = this;
7375 vm.loading = {applications: true};
7376
7377 vm.applications = applicationsResource.query({
7378 root_list: true,
7379 resource_type: 'application'
7380 }, function (data) {
7381 vm.loading = {applications: false};
7341 stateHolder.section = 'dashboard';
7342 vm.timeOptions = {};
7343 var allowed = ['1h', '4h', '12h', '24h', '1w', '2w', '1M'];
7344 _.each(allowed, function (key) {
7345 if (allowed.indexOf(key) !== -1) {
7346 vm.timeOptions[key] = AeConfig.timeOptions[key];
7347 }
7382 7348 });
7383 };
7349 vm.stateHolder = stateHolder;
7350 vm.urls = AeConfig.urls;
7351 vm.applications = stateHolder.AeUser.applications_map;
7352 vm.show_dashboard = false;
7353 vm.resource = null;
7354 vm.graphType = {selected: null};
7355 vm.timeSpan = vm.timeOptions['1h'];
7356 vm.trendingReports = [];
7357 vm.exceptions = 0;
7358 vm.satisfyingRequests = 0;
7359 vm.toleratedRequests = 0;
7360 vm.frustratingRequests = 0;
7361 vm.uptimeStats = 0;
7362 vm.apdexStats = [];
7363 vm.seriesRequestsData = [];
7364 vm.seriesMetricsData = [];
7365 vm.seriesSlowData = [];
7366 vm.slowCalls = [];
7367 vm.slowURIS = [];
7384 7368
7385 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7386 // #
7387 // # This program is free software: you can redistribute it and/or modify
7388 // # it under the terms of the GNU Affero General Public License, version 3
7389 // # (only), as published by the Free Software Foundation.
7390 // #
7391 // # This program is distributed in the hope that it will be useful,
7392 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7393 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7394 // # GNU General Public License for more details.
7395 // #
7396 // # You should have received a copy of the GNU Affero General Public License
7397 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7398 // #
7399 // # This program is dual-licensed. If you wish to learn more about the
7400 // # AppEnlight Enterprise Edition, including its added features, Support
7401 // # services, and proprietary license terms, please see
7402 // # https://rhodecode.com/licenses/
7403
7404 angular.module('appenlight.controllers').controller('ConfigsListController', ConfigsListController);
7405
7406 ConfigsListController.$inject = ['configsResource', 'configsNoIdResource'];
7407
7408 function ConfigsListController(configsResource, configsNoIdResource) {
7409 var vm = this;
7410 vm.loading = {config: true};
7411
7412 var filters = [
7413 'template_footer_html:global',
7414 'list_groups_to_non_admins:global',
7415 'per_application_reports_rate_limit:global',
7416 'per_application_logs_rate_limit:global',
7417 'per_application_metrics_rate_limit:global',
7418 ];
7419
7420 vm.configs = {};
7421
7422 vm.configList = configsResource.query({filter: filters},
7423 function (data) {
7424 vm.loading = {config: false};
7425 _.each(data, function (item) {
7426 if (vm.configs[item.section] === undefined) {
7427 vm.configs[item.section] = {};
7369 vm.reportChartConfig = {
7370 data: {
7371 json: [],
7372 xFormat: '%Y-%m-%dT%H:%M:%S'
7373 },
7374 color: {
7375 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
7376 },
7377 axis: {
7378 x: {
7379 type: 'timeseries',
7380 tick: {
7381 culling: {
7382 max: 6 // the number of tick texts will be adjusted to less than this value
7383 },
7384 format: '%Y-%m-%d %H:%M'
7428 7385 }
7429 vm.configs[item.section][item.key] = item;
7430 });
7431 });
7432
7433 vm.save = function () {
7434 vm.loading.config = true;
7435 _.each(vm.configList, function (item) {
7436 item.$save();
7437 });
7438 vm.loading.config = false;
7386 },
7387 y: {
7388 tick: {
7389 count: 5,
7390 format: d3.format('.2s')
7391 }
7392 }
7393 },
7394 subchart: {
7395 show: true,
7396 size: {
7397 height: 20
7398 }
7399 },
7400 size: {
7401 height: 250
7402 },
7403 zoom: {
7404 rescale: true
7405 },
7406 grid: {
7407 x: {
7408 show: true
7409 },
7410 y: {
7411 show: true
7412 }
7413 },
7414 tooltip: {
7415 format: {
7416 title: function (d) {
7417 return '' + d;
7418 },
7419 value: function (v) {
7420 return v
7421 }
7422 }
7423 }
7439 7424 };
7425 vm.reportChartData = {};
7440 7426
7441 };
7442
7443 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7444 // #
7445 // # This program is free software: you can redistribute it and/or modify
7446 // # it under the terms of the GNU Affero General Public License, version 3
7447 // # (only), as published by the Free Software Foundation.
7448 // #
7449 // # This program is distributed in the hope that it will be useful,
7450 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7451 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7452 // # GNU General Public License for more details.
7453 // #
7454 // # You should have received a copy of the GNU Affero General Public License
7455 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7456 // #
7457 // # This program is dual-licensed. If you wish to learn more about the
7458 // # AppEnlight Enterprise Edition, including its added features, Support
7459 // # services, and proprietary license terms, please see
7460 // # https://rhodecode.com/licenses/
7461
7462 angular.module('appenlight.controllers').controller('AdminGroupsCreateController', AdminGroupsCreateController);
7463
7464 AdminGroupsCreateController.$inject = ['$state', 'groupsResource', 'groupsPropertyResource', 'sectionViewResource', 'AeConfig'];
7465
7466 function AdminGroupsCreateController($state, groupsResource, groupsPropertyResource, sectionViewResource, AeConfig) {
7467
7468 var vm = this;
7469 vm.loading = {
7470 group: false,
7471 resource_permissions: false,
7472 users: false
7427 vm.reportSlowChartConfig = {
7428 data: {
7429 json: [],
7430 xFormat: '%Y-%m-%dT%H:%M:%S'
7431 },
7432 color: {
7433 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
7434 },
7435 axis: {
7436 x: {
7437 type: 'timeseries',
7438 tick: {
7439 culling: {
7440 max: 6 // the number of tick texts will be adjusted to less than this value
7441 },
7442 format: '%Y-%m-%d %H:%M'
7443 }
7444 },
7445 y: {
7446 tick: {
7447 count: 5,
7448 format: d3.format('.2s')
7449 }
7450 }
7451 },
7452 subchart: {
7453 show: true,
7454 size: {
7455 height: 20
7456 }
7457 },
7458 size: {
7459 height: 250
7460 },
7461 zoom: {
7462 rescale: true
7463 },
7464 grid: {
7465 x: {
7466 show: true
7467 },
7468 y: {
7469 show: true
7470 }
7471 },
7472 tooltip: {
7473 format: {
7474 title: function (d) {
7475 return '' + d;
7476 },
7477 value: function (v) {
7478 return v
7479 }
7480 }
7481 }
7473 7482 };
7483 vm.reportSlowChartData = {};
7474 7484
7475 vm.form = {
7476 autocompleteUser: '',
7477 }
7478
7479
7480 if (typeof $state.params.groupId !== 'undefined') {
7481 vm.loading.group = true;
7482 var groupId = $state.params.groupId;
7483 vm.group = groupsResource.get({groupId: groupId}, function (data) {
7484 vm.loading.group = false;
7485 });
7486
7487 vm.resource_permissions = groupsPropertyResource.query(
7488 {groupId: groupId, key: 'resource_permissions'}, function (data) {
7489 vm.loading.resource_permissions = false;
7490 var tmpObj = {
7491 'group': {
7492 'application': {},
7493 'dashboard': {}
7494 }
7495 };
7496 _.each(data, function (item) {
7497
7498 var section = tmpObj[item.type][item.resource_type];
7499 if (typeof section[item.resource_id] == 'undefined') {
7500 section[item.resource_id] = {
7501 self: item,
7502 permissions: []
7503 }
7504 }
7505 section[item.resource_id].permissions.push(item.perm_name);
7506
7507 });
7508 vm.resourcePermissions = tmpObj;
7509 });
7510
7511 vm.users = groupsPropertyResource.query(
7512 {groupId: groupId, key: 'users'}, function (data) {
7513 vm.loading.users = false;
7514 }, function () {
7515 vm.loading.users = false;
7516 });
7517
7518 }
7519 else {
7520 var groupId = null;
7521 }
7485 vm.metricsChartConfig = {
7486 data: {
7487 json: [],
7488 xFormat: '%Y-%m-%dT%H:%M:%S',
7489 keys: {
7490 x: 'x',
7491 value: ["main", "sql", "nosql", "tmpl", "remote", "custom"]
7492 },
7493 names: {
7494 main: 'View/Application logic',
7495 sql: 'Relational database queries',
7496 nosql: 'NoSql datastore calls',
7497 tmpl: 'Template rendering',
7498 custom: 'Custom timed calls',
7499 remote: 'Requests to remote resources'
7500 },
7501 type: 'area',
7502 groups: [["main", "sql", "nosql", "remote", "custom", "tmpl"]],
7503 order: null
7504 },
7505 color: {
7506 pattern: ['#6baed6', '#c7e9c0', '#fd8d3c', '#d6616b', '#ffcc00', '#c6dbef']
7507 },
7508 axis: {
7509 x: {
7510 type: 'timeseries',
7511 tick: {
7512 culling: {
7513 max: 6 // the number of tick texts will be adjusted to less than this value
7514 },
7515 format: '%Y-%m-%d %H:%M'
7516 }
7517 },
7518 y: {
7519 tick: {
7520 count: 5,
7521 format: d3.format('.2f')
7522 }
7523 }
7524 },
7525 point: {
7526 show: false
7527 },
7528 subchart: {
7529 show: true,
7530 size: {
7531 height: 20
7532 }
7533 },
7534 size: {
7535 height: 350
7536 },
7537 zoom: {
7538 rescale: true
7539 },
7540 grid: {
7541 x: {
7542 show: true
7543 },
7544 y: {
7545 show: true
7546 }
7547 },
7548 tooltip: {
7549 format: {
7550 title: function (d) {
7551 return '' + d;
7552 },
7553 value: function (v) {
7554 return v
7555 }
7556 }
7557 }
7558 };
7559 vm.metricsChartData = {};
7522 7560
7523 var formResponse = function (response) {
7524 if (response.status === 422) {
7525 setServerValidation(vm.groupForm, response.data);
7561 vm.responseChartConfig = {
7562 data: {
7563 json: [],
7564 xFormat: '%Y-%m-%dT%H:%M:%S'
7565 },
7566 color: {
7567 pattern: ['#d6616b', '#6baed6', '#fd8d3c']
7568 },
7569 axis: {
7570 x: {
7571 type: 'timeseries',
7572 tick: {
7573 culling: {
7574 max: 6 // the number of tick texts will be adjusted to less than this value
7575 },
7576 format: '%Y-%m-%d %H:%M'
7577 }
7578 },
7579 y: {
7580 tick: {
7581 count: 5,
7582 format: d3.format('.2f')
7583 }
7584 }
7585 },
7586 point: {
7587 show: false
7588 },
7589 subchart: {
7590 show: true,
7591 size: {
7592 height: 20
7593 }
7594 },
7595 size: {
7596 height: 350
7597 },
7598 zoom: {
7599 rescale: true
7600 },
7601 grid: {
7602 x: {
7603 show: true
7604 },
7605 y: {
7606 show: true
7607 }
7608 },
7609 tooltip: {
7610 format: {
7611 title: function (d) {
7612 return '' + d;
7613 },
7614 value: function (v) {
7615 return v
7616 }
7617 }
7526 7618 }
7527 vm.loading.group = false;
7528 7619 };
7620 vm.responseChartData = {};
7529 7621
7530 vm.createGroup = function () {
7531 vm.loading.group = true;
7532 if (groupId) {
7533 groupsResource.update({groupId: vm.group.id}, vm.group, function (data) {
7534 setServerValidation(vm.groupForm);
7535 vm.loading.group = false;
7536 }, formResponse);
7537 }
7538 else {
7539 groupsResource.save(vm.group, function (data) {
7540 $state.go('admin.group.update', {groupId: data.id});
7541 }, formResponse);
7622 vm.requestsChartConfig = {
7623 data: {
7624 json: [],
7625 xFormat: '%Y-%m-%dT%H:%M:%S'
7626 },
7627 color: {
7628 pattern: ['#d6616b', '#6baed6', '#fd8d3c']
7629 },
7630 axis: {
7631 x: {
7632 type: 'timeseries',
7633 tick: {
7634 culling: {
7635 max: 6 // the number of tick texts will be adjusted to less than this value
7636 },
7637 format: '%Y-%m-%d %H:%M'
7638 }
7639 },
7640 y: {
7641 tick: {
7642 count: 5,
7643 format: d3.format('.2f')
7644 }
7645 }
7646 },
7647 point: {
7648 show: false
7649 },
7650 subchart: {
7651 show: true,
7652 size: {
7653 height: 20
7654 }
7655 },
7656 size: {
7657 height: 350
7658 },
7659 zoom: {
7660 rescale: true
7661 },
7662 grid: {
7663 x: {
7664 show: true
7665 },
7666 y: {
7667 show: true
7668 }
7669 },
7670 tooltip: {
7671 format: {
7672 title: function (d) {
7673 return '' + d;
7674 },
7675 value: function (v) {
7676 return v
7677 }
7678 }
7542 7679 }
7543 7680 };
7681 vm.requestsChartData = {};
7544 7682
7545 vm.removeUser = function (user) {
7546 groupsPropertyResource.delete(
7547 {groupId: groupId, key: 'users', user_name: user.user_name},
7548 function (data) {
7549 vm.loading.users = false;
7550 vm.users = _.filter(vm.users, function (item) {
7551 return item != user;
7552 });
7553 }, function () {
7554 vm.loading.users = false;
7555 });
7683 vm.loading = {
7684 'apdex': true,
7685 'reports': true,
7686 'graphs': true,
7687 'slowCalls': true,
7688 'slowURIS': true,
7689 'requestsBreakdown': true,
7690 'series': true
7556 7691 };
7692 vm.stream = {paused: false, filtered: false, messages: [], reports: []};
7557 7693
7558 vm.addUser = function () {
7559 groupsPropertyResource.save(
7560 {groupId: groupId, key: 'users'},
7561 {user_name: vm.form.autocompleteUser},
7562 function (data) {
7563 vm.loading.users = false;
7564 vm.users.push(data);
7565 vm.form.autocompleteUser = '';
7566 }, function () {
7567 vm.loading.users = false;
7568 });
7569 }
7570
7571 vm.searchUsers = function (searchPhrase) {
7572
7573 return sectionViewResource.query({
7574 section: 'users_section',
7575 view: 'search_users',
7576 'user_name': searchPhrase
7577 }).$promise.then(function (data) {
7578 return _.map(data, function (item) {
7579 return item.user;
7580 });
7581 });
7582 }
7583 };
7584
7585 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7586 // #
7587 // # This program is free software: you can redistribute it and/or modify
7588 // # it under the terms of the GNU Affero General Public License, version 3
7589 // # (only), as published by the Free Software Foundation.
7590 // #
7591 // # This program is distributed in the hope that it will be useful,
7592 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7593 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7594 // # GNU General Public License for more details.
7595 // #
7596 // # You should have received a copy of the GNU Affero General Public License
7597 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7598 // #
7599 // # This program is dual-licensed. If you wish to learn more about the
7600 // # AppEnlight Enterprise Edition, including its added features, Support
7601 // # services, and proprietary license terms, please see
7602 // # https://rhodecode.com/licenses/
7603
7604 angular.module('appenlight.controllers').controller('AdminGroupsController', AdminGroupsController);
7605
7606 AdminGroupsController.$inject = ['groupsResource'];
7607
7608 function AdminGroupsController(groupsResource) {
7609
7610 var vm = this;
7611 vm.loading = {groups: true};
7612
7613 vm.groups = groupsResource.query({}, function (data) {
7614 vm.loading = {groups: false};
7615 vm.activeUsers = _.reduce(vm.groups, function(memo, val){
7616 if (val.status == 1){
7617 return memo + 1;
7694 $rootScope.$on('channelstream-message.front_dashboard.new_topic', function(event, message){
7695 var ws_report = message.message.report;
7696 if (ws_report.http_status != 500) {
7697 return
7698 }
7699 if (vm.stream.paused == true) {
7700 return
7701 }
7702 if (vm.stream.filtered && ws_report.resource_id != vm.resource) {
7703 return
7704 }
7705 var should_insert = true;
7706 _.each(vm.stream.reports, function (report) {
7707 if (report.report_id == ws_report.report_id) {
7708 report.occurences = ws_report.occurences;
7709 should_insert = false;
7618 7710 }
7619 return memo;
7620 }, 0);
7621
7711 });
7712 if (should_insert) {
7713 if (vm.stream.reports.length > 7) {
7714 vm.stream.reports.pop();
7715 }
7716 vm.stream.reports.unshift(ws_report);
7717 }
7622 7718 });
7623 7719
7720 vm.determineStartState = function () {
7721 if (stateHolder.AeUser.applications.length) {
7722 vm.resource = Number($location.search().resource);
7624 7723
7625 vm.removeGroup = function (group) {
7626 groupsResource.remove({groupId: group.id}, function (data, responseHeaders) {
7627
7628 if (data) {
7629 var index = vm.groups.indexOf(group);
7630 if (index !== -1) {
7631 vm.groups.splice(index, 1);
7632 vm.activeGroups -= 1;
7724 if (!vm.resource){
7725 var cookieResource = $cookies.getObject('resource');
7726
7727
7728 if (cookieResource) {
7729 vm.resource = cookieResource;
7730 }
7731 else{
7732 vm.resource = stateHolder.AeUser.applications[0].resource_id;
7633 7733 }
7634 7734 }
7635 });
7636 }
7637 };
7638
7639 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7640 // #
7641 // # This program is free software: you can redistribute it and/or modify
7642 // # it under the terms of the GNU Affero General Public License, version 3
7643 // # (only), as published by the Free Software Foundation.
7644 // #
7645 // # This program is distributed in the hope that it will be useful,
7646 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7647 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7648 // # GNU General Public License for more details.
7649 // #
7650 // # You should have received a copy of the GNU Affero General Public License
7651 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7652 // #
7653 // # This program is dual-licensed. If you wish to learn more about the
7654 // # AppEnlight Enterprise Edition, including its added features, Support
7655 // # services, and proprietary license terms, please see
7656 // # https://rhodecode.com/licenses/
7657
7658 angular.module('appenlight.controllers').controller('AdminPartitionsController', AdminPartitionsController);
7659
7660 AdminPartitionsController.$inject = ['sectionViewResource'];
7661
7662 function AdminPartitionsController(sectionViewResource) {
7663 var vm = this;
7664 vm.permanentPartitions = [];
7665 vm.dailyPartitions = [];
7666 vm.loading = {partitions: true};
7667 vm.dailyChecked = false;
7668 vm.permChecked = false;
7669 vm.dailyConfirm = '';
7670 vm.permConfirm = '';
7671
7672
7673 vm.loadPartitions = function (data) {
7674 var permanentPartitions = vm.transformPartitionList(
7675 data.permanent_partitions);
7676 var dailyPartitions = vm.transformPartitionList(
7677 data.daily_partitions);
7678 vm.permanentPartitions = permanentPartitions;
7679 vm.dailyPartitions = dailyPartitions;
7680 vm.loading = {partitions: false};
7681 };
7682
7683 vm.setCheckedList = function (scope) {
7684 var toTest = null;
7685 if (scope === 'dailyPartitions'){
7686 toTest = 'dailyChecked';
7735 }
7736
7737 var timespan = $location.search().timespan;
7738
7739 if(_.has(vm.timeOptions, timespan)){
7740 vm.timeSpan = vm.timeOptions[timespan];
7687 7741 }
7688 7742 else{
7689 toTest = 'permChecked';
7743 vm.timeSpan = vm.timeOptions['1h'];
7690 7744 }
7691 7745
7692 if (vm[toTest]) {
7693 var val = true;
7746 var graphType = $location.search().graphtype;
7747 if(!graphType){
7748 vm.graphType = {selected: 'metrics_graphs'};
7694 7749 }
7695 else {
7696 var val = false;
7750 else{
7751 vm.graphType = {selected: graphType};
7697 7752 }
7698
7699 _.each(vm[scope], function (item) {
7700 _.each(item[1].pg, function (index) {
7701 index.checked = val;
7702 });
7703 _.each(item[1].elasticsearch, function (index) {
7704 index.checked = val;
7705 });
7706 });
7707 }
7753 vm.updateSearchParams();
7754 };
7708 7755
7756 vm.updateSearchParams = function () {
7757 $location.search('resource', vm.resource);
7758 $location.search('timespan', vm.timeSpan.key);
7759 $location.search('graphtype', vm.graphType.selected);
7760 stateHolder.resource = vm.resource;
7709 7761
7710 vm.transformPartitionList = function (inputList) {
7711 var outputList = [];
7762 if (vm.resource){
7763 $cookies.putObject('resource', vm.resource,
7764 {expires:new Date(3000, 1, 1)});
7765 }
7766 vm.refreshData();
7767 };
7712 7768
7713 _.each(inputList, function (item) {
7714 var time = [item[0], {
7715 elasticsearch: [],
7716 pg: []
7717 }]
7718 _.each(item[1].pg, function (index) {
7719 time[1].pg.push({name: index, checked: false})
7720 });
7721 _.each(item[1].elasticsearch, function (index) {
7722 time[1].elasticsearch.push({
7723 name: index,
7724 checked: false
7725 })
7726 });
7727 outputList.push(time);
7728 });
7729 return outputList;
7769 vm.refreshData = function () {
7770 vm.fetchApdexStats();
7771 vm.fetchTrendingReports();
7772 vm.fetchMetrics();
7773 vm.fetchRequestsBreakdown();
7774 vm.fetchSlowCalls();
7730 7775 };
7731 7776
7732 sectionViewResource.get({section:'admin_section', view: 'partitions'},
7733 vm.loadPartitions);
7777 vm.changedTimeSpan = function(){
7778 vm.startDateFilter = timeSpanToStartDate(vm.timeSpan.key);
7779 vm.refreshData();
7780 };
7734 7781
7735 vm.partitionsDelete = function (partitionType) {
7736 var es_indices = [];
7737 var pg_indices = [];
7738 _.each(vm[partitionType], function (item) {
7739 _.each(item[1].pg, function (index) {
7740 if (index.checked) {
7741 pg_indices.push(index.name)
7742 }
7743 });
7744 _.each(item[1].elasticsearch, function (index) {
7745 if (index.checked) {
7746 es_indices.push(index.name)
7782 vm.intervalId = $interval(function () {
7783 if (_.contains(['30m', "1h"], vm.timeSpan.key)) {
7784 // don't do anything if window is unfocused
7785 if(document.hidden === true){
7786 return ;
7787 }
7788 vm.refreshData();
7789 }
7790 }, 60000);
7791
7792 vm.fetchApdexStats = function () {
7793 vm.loading.apdex = true;
7794 vm.apdexStats = applicationsPropertyResource.query({
7795 'key': 'apdex_stats',
7796 'resourceId': vm.resource,
7797 "start_date": timeSpanToStartDate(vm.timeSpan.key)
7798 },
7799 function (data) {
7800 vm.loading.apdex = false;
7801
7802 vm.exceptions = _.reduce(data, function (memo, row) {
7803 return memo + row.errors;
7804 }, 0);
7805 vm.satisfyingRequests = _.reduce(data, function (memo, row) {
7806 return memo + row.satisfying_requests;
7807 }, 0);
7808 vm.toleratedRequests = _.reduce(data, function (memo, row) {
7809 return memo + row.tolerated_requests;
7810 }, 0);
7811 vm.frustratingRequests = _.reduce(data, function (memo, row) {
7812 return memo + row.frustrating_requests;
7813 }, 0);
7814 if (data.length) {
7815 vm.uptimeStats = data[0].uptime;
7747 7816 }
7748 });
7817
7818 },
7819 function () {
7820 vm.loading.apdex = false;
7821 }
7822 );
7823 }
7824
7825 vm.fetchMetrics = function () {
7826 vm.loading.series = true;
7827 applicationsPropertyResource.query({
7828 'resourceId': vm.resource,
7829 'key': vm.graphType.selected,
7830 "start_date": timeSpanToStartDate(vm.timeSpan.key)
7831 }, function (data) {
7832 if (vm.graphType.selected == 'metrics_graphs') {
7833 vm.metricsChartData = {
7834 json: data,
7835 xFormat: '%Y-%m-%dT%H:%M:%S',
7836 keys: {
7837 x: 'x',
7838 value: ["main", "sql", "nosql", "tmpl", "remote", "custom"]
7839 },
7840 names: {
7841 main: 'View/Application logic',
7842 sql: 'Relational database queries',
7843 nosql: 'NoSql datastore calls',
7844 tmpl: 'Template rendering',
7845 custom: 'Custom timed calls',
7846 remote: 'Requests to remote resources'
7847 },
7848 type: 'area',
7849 groups: [["main", "sql", "nosql", "remote", "custom", "tmpl"]],
7850 order: null
7851 };
7852 }
7853 else if (vm.graphType.selected == 'report_graphs') {
7854 vm.reportChartData = {
7855 json: data,
7856 xFormat: '%Y-%m-%dT%H:%M:%S',
7857 keys: {
7858 x: 'x',
7859 value: ["not_found", "report"]
7860 },
7861 names: {
7862 report: 'Errors',
7863 not_found: '404\'s requests'
7864 },
7865 type: 'bar'
7866 };
7867 }
7868 else if (vm.graphType.selected == 'slow_report_graphs') {
7869 vm.reportSlowChartData = {
7870 json: data,
7871 xFormat: '%Y-%m-%dT%H:%M:%S',
7872 keys: {
7873 x: 'x',
7874 value: ["slow_report"]
7875 },
7876 names: {
7877 slow_report: 'Slow reports'
7878 },
7879 type: 'bar'
7880 };
7881 }
7882 else if (vm.graphType.selected == 'response_graphs') {
7883 vm.responseChartData = {
7884 json: data,
7885 xFormat: '%Y-%m-%dT%H:%M:%S',
7886 keys: {
7887 x: 'x',
7888 value: ["today", "days_ago_2", "days_ago_7"]
7889 },
7890 names: {
7891 today: 'Today',
7892 "days_ago_2": '2 days ago',
7893 "days_ago_7": '7 days ago'
7894 }
7895 };
7896 }
7897 else if (vm.graphType.selected == 'requests_graphs') {
7898 vm.requestsChartData = {
7899 json: data,
7900 xFormat: '%Y-%m-%dT%H:%M:%S',
7901 keys: {
7902 x: 'x',
7903 value: ["requests"]
7904 },
7905 names: {
7906 requests: 'Requests/s'
7907 }
7908 };
7909 }
7910 vm.loading.series = false;
7911 }, function(){
7912 vm.loading.series = false;
7749 7913 });
7750
7914 }
7915
7916 vm.fetchSlowCalls = function () {
7917 vm.loading.slowCalls = true;
7918 applicationsPropertyResource.query({
7919 'resourceId': vm.resource,
7920 "start_date": timeSpanToStartDate(vm.timeSpan.key),
7921 'key': 'slow_calls'
7922 }, function (data) {
7923 vm.slowCalls = data;
7924 vm.loading.slowCalls = false;
7925 }, function () {
7926 vm.loading.slowCalls = false;
7927 });
7928 }
7929
7930 vm.fetchRequestsBreakdown = function () {
7931 vm.loading.requestsBreakdown = true;
7932 applicationsPropertyResource.query({
7933 'resourceId': vm.resource,
7934 "start_date": timeSpanToStartDate(vm.timeSpan.key),
7935 'key': 'requests_breakdown'
7936 }, function (data) {
7937 vm.requestsBreakdown = data;
7938 vm.loading.requestsBreakdown = false;
7939 }, function () {
7940 vm.loading.requestsBreakdown = false;
7941 });
7942 }
7943
7944 vm.fetchTrendingReports = function () {
7945
7946 if (vm.graphType.selected == 'slow_report_graphs') {
7947 var report_type = 'slow';
7948 }
7949 else {
7950 var report_type = 'error';
7951 }
7952
7953 vm.loading.reports = true;
7954 vm.trendingReports = applicationsPropertyResource.query({
7955 'key': 'trending_reports',
7956 'resourceId': vm.resource,
7957 "start_date": timeSpanToStartDate(vm.timeSpan.key),
7958 "report_type": report_type
7959 },
7960 function () {
7961 vm.loading.reports = false;
7962 },
7963 function () {
7964 vm.loading.reports = false;
7965 }
7966 );
7967 };
7751 7968
7752 vm.loading = {partitions: true};
7753 sectionViewResource.save({section:'admin_section',
7754 view: 'partitions_remove'}, {
7755 es_indices: es_indices,
7756 pg_indices: pg_indices,
7757 confirm: 'CONFIRM'
7758 }, vm.loadPartitions);
7969 $scope.$on('$destroy',function(){
7970 $interval.cancel(vm.intervalId);
7971 });
7759 7972
7973 if (stateHolder.AeUser.applications.length){
7974 vm.show_dashboard = true;
7975 vm.determineStartState();
7976 vm.refreshData();
7760 7977 }
7761
7762 7978 }
7763 7979
7764 7980 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7765 7981 // #
7766 7982 // # This program is free software: you can redistribute it and/or modify
7767 7983 // # it under the terms of the GNU Affero General Public License, version 3
7768 7984 // # (only), as published by the Free Software Foundation.
7769 7985 // #
7770 7986 // # This program is distributed in the hope that it will be useful,
7771 7987 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7772 7988 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7773 7989 // # GNU General Public License for more details.
7774 7990 // #
7775 7991 // # You should have received a copy of the GNU Affero General Public License
7776 7992 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7777 7993 // #
7778 7994 // # This program is dual-licensed. If you wish to learn more about the
7779 7995 // # AppEnlight Enterprise Edition, including its added features, Support
7780 7996 // # services, and proprietary license terms, please see
7781 7997 // # https://rhodecode.com/licenses/
7782 7998
7783 angular.module('appenlight.controllers').controller('AdminSystemController', AdminSystemController);
7784
7785 AdminSystemController.$inject = ['sectionViewResource'];
7786
7787 function AdminSystemController(sectionViewResource) {
7788 var vm = this;
7789 vm.tables = [];
7790 vm.loading = {system: true};
7791 sectionViewResource.get({
7792 section: 'admin_section',
7793 view: 'system'
7794 }, null, function (data) {
7795 vm.DBtables = data.db_tables;
7796 vm.ESIndices = data.es_indices;
7797 vm.queueStats = data.queue_stats;
7798 vm.systemLoad = data.system_load;
7799 vm.packages = data.packages;
7800 vm.processInfo = data.process_info;
7801 vm.disks = data.disks;
7802 vm.memory = data.memory;
7803 vm.selfInfo = data.self_info;
7804
7805 vm.loading.system = false;
7806 });
7807 };
7999 var aeconfig = angular.module('appenlight.config', []);
8000 aeconfig.factory('AeConfig', function () {
8001 var obj = {};
8002 obj.flashMessages = decodeEncodedJSON(window.AE.flash_messages);
8003 obj.timeOptions = decodeEncodedJSON(window.AE.timeOptions);
8004 obj.plugins = decodeEncodedJSON(window.AE.plugins);
8005 obj.topNav = decodeEncodedJSON(window.AE.topNav);
8006 obj.ws_url = window.AE.ws_url;
8007 obj.urls = window.AE.urls;
8008 // set keys on values because we wont be able to retrieve them everywhere
8009 for (var key in obj.timeOptions) {
8010 obj.timeOptions[key]['key'] = key;
8011 }
8012 console.info('config', obj);
8013 return obj;
8014 });
7808 8015
7809 8016 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7810 8017 // #
7811 8018 // # This program is free software: you can redistribute it and/or modify
7812 8019 // # it under the terms of the GNU Affero General Public License, version 3
7813 8020 // # (only), as published by the Free Software Foundation.
7814 8021 // #
7815 8022 // # This program is distributed in the hope that it will be useful,
7816 8023 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7817 8024 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7818 8025 // # GNU General Public License for more details.
7819 8026 // #
7820 8027 // # You should have received a copy of the GNU Affero General Public License
7821 8028 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7822 8029 // #
7823 8030 // # This program is dual-licensed. If you wish to learn more about the
7824 8031 // # AppEnlight Enterprise Edition, including its added features, Support
7825 8032 // # services, and proprietary license terms, please see
7826 8033 // # https://rhodecode.com/licenses/
7827 8034
7828 angular.module('appenlight.controllers').controller('AdminUsersCreateController', AdminUsersCreateController);
8035 angular.module('appenlight.controllers').controller('AdminApplicationsListController', AdminApplicationsListController);
7829 8036
7830 AdminUsersCreateController.$inject = ['$state', 'usersResource', 'usersPropertyResource', 'sectionViewResource', 'AeConfig'];
8037 AdminApplicationsListController.$inject = ['applicationsResource'];
7831 8038
7832 function AdminUsersCreateController($state, usersResource, usersPropertyResource, sectionViewResource, AeConfig) {
8039 function AdminApplicationsListController(applicationsResource) {
7833 8040
7834 8041 var vm = this;
7835 vm.loading = {user: false};
7836
7837
7838 if (typeof $state.params.userId !== 'undefined') {
7839 vm.loading.user = true;
7840 var userId = $state.params.userId;
7841 vm.user = usersResource.get({userId: userId}, function (data) {
7842 vm.loading.user = false;
7843 // cast to true for angular checkbox
7844 if (vm.user.status === 1) {
7845 vm.user.status = true;
7846 }
7847 });
7848
7849 vm.resource_permissions = usersPropertyResource.query(
7850 {userId: userId, key: 'resource_permissions'}, function (data) {
7851 vm.loading.resource_permissions = false;
7852 var tmpObj = {
7853 'user': {
7854 'application': {},
7855 'dashboard': {}
7856 },
7857 'group': {
7858 'application': {},
7859 'dashboard': {}
7860 }
7861 };
7862 _.each(data, function (item) {
7863
7864 var section = tmpObj[item.type][item.resource_type];
7865 if (typeof section[item.resource_id] == 'undefined'){
7866 section[item.resource_id] = {
7867 self:item,
7868 permissions: []
7869 }
7870 }
7871 section[item.resource_id].permissions.push(item.perm_name);
7872
7873 });
7874 vm.resourcePermissions = tmpObj;
7875 });
7876
7877 }
7878 else {
7879 var userId = null;
7880 vm.user = {
7881 status: true
7882 }
7883 }
7884
7885 var formResponse = function (response) {
7886 if (response.status == 422) {
7887 setServerValidation(vm.profileForm, response.data);
7888 }
7889 vm.loading.user = false;
7890 }
7891
7892 vm.createUser = function () {
7893 vm.loading.user = true;
7894
7895 if (userId) {
7896 usersResource.update({userId: vm.user.id}, vm.user, function (data) {
7897 setServerValidation(vm.profileForm);
7898 vm.loading.user = false;
7899 }, formResponse);
7900 }
7901 else {
7902 usersResource.save(vm.user, function (data) {
7903 $state.go('admin.user.update', {userId: data.id});
7904 }, formResponse);
7905 }
7906 }
7907
7908 vm.generatePassword = function () {
7909 var length = 8;
7910 var charset = "abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
7911 vm.gen_pass = "";
7912 for (var i = 0, n = charset.length; i < length; ++i) {
7913 vm.gen_pass += charset.charAt(Math.floor(Math.random() * n));
7914 }
7915 vm.user.user_password = '' + vm.gen_pass;
7916
7917 }
7918
7919 vm.reloginUser = function () {
7920 sectionViewResource.get({
7921 section: 'admin_section', view: 'relogin_user',
7922 user_id: vm.user.id
7923 }, function () {
7924 window.location = AeConfig.urls.baseUrl;
7925 });
8042 vm.loading = {applications: true};
7926 8043
7927 }
8044 vm.applications = applicationsResource.query({
8045 root_list: true,
8046 resource_type: 'application'
8047 }, function (data) {
8048 vm.loading = {applications: false};
8049 });
7928 8050 };
7929 8051
7930 8052 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7931 8053 // #
7932 8054 // # This program is free software: you can redistribute it and/or modify
7933 8055 // # it under the terms of the GNU Affero General Public License, version 3
7934 8056 // # (only), as published by the Free Software Foundation.
7935 8057 // #
7936 8058 // # This program is distributed in the hope that it will be useful,
7937 8059 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7938 8060 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7939 8061 // # GNU General Public License for more details.
7940 8062 // #
7941 8063 // # You should have received a copy of the GNU Affero General Public License
7942 8064 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7943 8065 // #
7944 8066 // # This program is dual-licensed. If you wish to learn more about the
7945 8067 // # AppEnlight Enterprise Edition, including its added features, Support
7946 8068 // # services, and proprietary license terms, please see
7947 8069 // # https://rhodecode.com/licenses/
7948 8070
7949 angular.module('appenlight.controllers').controller('AdminUsersController', AdminUsersController);
8071 angular.module('appenlight.controllers').controller('ConfigsListController', ConfigsListController);
7950 8072
7951 AdminUsersController.$inject = ['usersResource'];
8073 ConfigsListController.$inject = ['configsResource', 'configsNoIdResource'];
7952 8074
7953 function AdminUsersController(usersResource) {
7954
8075 function ConfigsListController(configsResource, configsNoIdResource) {
7955 8076 var vm = this;
7956 vm.loading = {users: true};
8077 vm.loading = {config: true};
7957 8078
7958 vm.users = usersResource.query({}, function (data) {
7959 vm.loading = {users: false};
7960 vm.activeUsers = _.reduce(vm.users, function(memo, val){
7961 if (val.status == 1){
7962 return memo + 1;
7963 }
7964 return memo;
7965 }, 0);
7966
7967 });
8079 var filters = [
8080 'template_footer_html:global',
8081 'list_groups_to_non_admins:global',
8082 'per_application_reports_rate_limit:global',
8083 'per_application_logs_rate_limit:global',
8084 'per_application_metrics_rate_limit:global',
8085 ];
7968 8086
8087 vm.configs = {};
7969 8088
7970 vm.removeUser = function (user) {
7971 usersResource.remove({userId: user.id}, function (data, responseHeaders) {
7972
7973 if (data) {
7974 var index = vm.users.indexOf(user);
7975 if (index !== -1) {
7976 vm.users.splice(index, 1);
7977 vm.activeUsers -= 1;
8089 vm.configList = configsResource.query({filter: filters},
8090 function (data) {
8091 vm.loading = {config: false};
8092 _.each(data, function (item) {
8093 if (vm.configs[item.section] === undefined) {
8094 vm.configs[item.section] = {};
7978 8095 }
7979 }
8096 vm.configs[item.section][item.key] = item;
8097 });
7980 8098 });
7981 }
8099
8100 vm.save = function () {
8101 vm.loading.config = true;
8102 _.each(vm.configList, function (item) {
8103 item.$save();
8104 });
8105 vm.loading.config = false;
8106 };
8107
7982 8108 };
7983 8109
7984 8110 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
7985 8111 // #
7986 8112 // # This program is free software: you can redistribute it and/or modify
7987 8113 // # it under the terms of the GNU Affero General Public License, version 3
7988 8114 // # (only), as published by the Free Software Foundation.
7989 8115 // #
7990 8116 // # This program is distributed in the hope that it will be useful,
7991 8117 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
7992 8118 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7993 8119 // # GNU General Public License for more details.
7994 8120 // #
7995 8121 // # You should have received a copy of the GNU Affero General Public License
7996 8122 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
7997 8123 // #
7998 8124 // # This program is dual-licensed. If you wish to learn more about the
7999 8125 // # AppEnlight Enterprise Edition, including its added features, Support
8000 8126 // # services, and proprietary license terms, please see
8001 8127 // # https://rhodecode.com/licenses/
8002 8128
8003 angular.module('appenlight.controllers')
8004 .controller('ApplicationsUpdateController', ApplicationsUpdateController)
8129 angular.module('appenlight.controllers').controller('AdminGroupsCreateController', AdminGroupsCreateController);
8005 8130
8006 ApplicationsUpdateController.$inject = ['$state', 'applicationsNoIdResource', 'applicationsResource', 'applicationsPropertyResource', 'stateHolder'];
8131 AdminGroupsCreateController.$inject = ['$state', 'groupsResource', 'groupsPropertyResource', 'sectionViewResource', 'AeConfig'];
8007 8132
8008 function ApplicationsUpdateController($state, applicationsNoIdResource, applicationsResource, applicationsPropertyResource, stateHolder) {
8009 'use strict';
8133 function AdminGroupsCreateController($state, groupsResource, groupsPropertyResource, sectionViewResource, AeConfig) {
8010 8134
8011 8135 var vm = this;
8012 vm.loading = {application: false};
8136 vm.loading = {
8137 group: false,
8138 resource_permissions: false,
8139 users: false
8140 };
8013 8141
8014 vm.groupingOptions = [
8015 ['url_type', 'Error Type + location'],
8016 ['url_traceback', 'Traceback + location'],
8017 ['traceback_server', 'Traceback + Server'],
8018 ];
8142 vm.form = {
8143 autocompleteUser: '',
8144 }
8019 8145
8020 var resourceId = $state.params.resourceId;
8021 8146
8147 if (typeof $state.params.groupId !== 'undefined') {
8148 vm.loading.group = true;
8149 var groupId = $state.params.groupId;
8150 vm.group = groupsResource.get({groupId: groupId}, function (data) {
8151 vm.loading.group = false;
8152 });
8022 8153
8023 var options = {};
8154 vm.resource_permissions = groupsPropertyResource.query(
8155 {groupId: groupId, key: 'resource_permissions'}, function (data) {
8156 vm.loading.resource_permissions = false;
8157 var tmpObj = {
8158 'group': {
8159 'application': {},
8160 'dashboard': {}
8161 }
8162 };
8163 _.each(data, function (item) {
8164
8165 var section = tmpObj[item.type][item.resource_type];
8166 if (typeof section[item.resource_id] == 'undefined') {
8167 section[item.resource_id] = {
8168 self: item,
8169 permissions: []
8170 }
8171 }
8172 section[item.resource_id].permissions.push(item.perm_name);
8024 8173
8025 vm.momentJs = moment;
8026
8027 vm.formTransferModel = {password:''};
8174 });
8175 vm.resourcePermissions = tmpObj;
8176 });
8028 8177
8029 // set initial data
8178 vm.users = groupsPropertyResource.query(
8179 {groupId: groupId, key: 'users'}, function (data) {
8180 vm.loading.users = false;
8181 }, function () {
8182 vm.loading.users = false;
8183 });
8030 8184
8031 if (resourceId === 'new') {
8032 vm.resource = {
8033 resource_id: null,
8034 slow_report_threshold: 10,
8035 error_report_threshold: 10,
8036 allow_permanent_storage: true,
8037 default_grouping: vm.groupingOptions[1][0]
8038 };
8039 8185 }
8040 8186 else {
8041 vm.loading.application = true;
8042 vm.resource = applicationsResource.get({
8043 'resourceId': resourceId
8044 }, function (data) {
8045 vm.loading.application = false;
8046 });
8187 var groupId = null;
8047 8188 }
8048 8189
8190 var formResponse = function (response) {
8191 if (response.status === 422) {
8192 setServerValidation(vm.groupForm, response.data);
8193 }
8194 vm.loading.group = false;
8195 };
8049 8196
8050 vm.updateBasicForm = function () {
8051 vm.loading.application = true;
8052 if (vm.resource.resource_id === null) {
8053 applicationsNoIdResource.save(null, vm.resource, function (data) {
8054 stateHolder.AeUser.addApplication(data);
8055 $state.go('applications.update', {resourceId: data.resource_id});
8056 setServerValidation(vm.BasicForm);
8057 }, function (response) {
8058 if (response.status == 422) {
8059 setServerValidation(vm.BasicForm, response.data);
8060 }
8061 vm.loading.application = false;
8062
8063 });
8197 vm.createGroup = function () {
8198 vm.loading.group = true;
8199 if (groupId) {
8200 groupsResource.update({groupId: vm.group.id}, vm.group, function (data) {
8201 setServerValidation(vm.groupForm);
8202 vm.loading.group = false;
8203 }, formResponse);
8064 8204 }
8065 8205 else {
8066 applicationsResource.update({resourceId: vm.resource.resource_id},
8067 vm.resource, function (data) {
8068 vm.resource = data;
8069 vm.loading.application = false;
8070 setServerValidation(vm.BasicForm);
8071 }, function (response) {
8072 if (response.status == 422) {
8073 setServerValidation(vm.BasicForm, response.data);
8074 }
8075 vm.loading.application = false;
8076 });
8206 groupsResource.save(vm.group, function (data) {
8207 $state.go('admin.group.update', {groupId: data.id});
8208 }, formResponse);
8077 8209 }
8078 8210 };
8079 8211
8080 vm.addRule = function () {
8081
8082 applicationsPropertyResource.save({
8083 resourceId: vm.resource.resource_id,
8084 key: 'postprocessing_rules'
8085 }, null,
8086 function (data) {
8087 vm.resource.postprocessing_rules.push(data);
8088 }
8089 );
8090 };
8091
8092 vm.regenerateAPIKeys = function(){
8093 vm.loading.application = true;
8094 applicationsPropertyResource.save({
8095 resourceId: vm.resource.resource_id,
8096 key: 'api_key'
8097 }, {password: vm.regenerateAPIKeysPassword},
8098 function (data) {
8099 vm.resource = data;
8100 vm.loading.application = false;
8101 vm.regenerateAPIKeysPassword = '';
8102 setServerValidation(vm.regenerateAPIKeysForm);
8103 },
8104 function (response) {
8105 if (response.status == 422) {
8106 setServerValidation(vm.regenerateAPIKeysForm, response.data);
8107
8108 }
8109 vm.loading.application = false;
8110 }
8111 )
8112 };
8113
8114 vm.deleteApplication = function(){
8115 vm.loading.application = true;
8116 applicationsPropertyResource.update({
8117 resourceId: vm.resource.resource_id,
8118 key: 'delete_resource'
8119 }, vm.formDeleteModel,
8212 vm.removeUser = function (user) {
8213 groupsPropertyResource.delete(
8214 {groupId: groupId, key: 'users', user_name: user.user_name},
8120 8215 function (data) {
8121 stateHolder.AeUser.removeApplicationById(vm.resource.resource_id);
8122 $state.go('applications.list');
8123 },
8124 function (response) {
8125 if (response.status == 422) {
8126 setServerValidation(vm.formDelete, response.data);
8127
8128 }
8129 vm.loading.application = false;
8130 }
8131 );
8216 vm.loading.users = false;
8217 vm.users = _.filter(vm.users, function (item) {
8218 return item != user;
8219 });
8220 }, function () {
8221 vm.loading.users = false;
8222 });
8132 8223 };
8133 8224
8134 vm.transferApplication = function(){
8135 vm.loading.application = true;
8136 applicationsPropertyResource.update({
8137 resourceId: vm.resource.resource_id,
8138 key: 'owner'
8139 }, vm.formTransferModel,
8225 vm.addUser = function () {
8226 groupsPropertyResource.save(
8227 {groupId: groupId, key: 'users'},
8228 {user_name: vm.form.autocompleteUser},
8140 8229 function (data) {
8141 $state.go('applications.list');
8142 },
8143 function (response) {
8144 if (response.status == 422) {
8145 setServerValidation(vm.formTransfer, response.data);
8146
8147 }
8148 vm.loading.application = false;
8149 }
8150 )
8230 vm.loading.users = false;
8231 vm.users.push(data);
8232 vm.form.autocompleteUser = '';
8233 }, function () {
8234 vm.loading.users = false;
8235 });
8151 8236 }
8152 8237
8153 }
8238 vm.searchUsers = function (searchPhrase) {
8239
8240 return sectionViewResource.query({
8241 section: 'users_section',
8242 view: 'search_users',
8243 'user_name': searchPhrase
8244 }).$promise.then(function (data) {
8245 return _.map(data, function (item) {
8246 return item.user;
8247 });
8248 });
8249 }
8250 };
8154 8251
8155 8252 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8156 8253 // #
8157 8254 // # This program is free software: you can redistribute it and/or modify
8158 8255 // # it under the terms of the GNU Affero General Public License, version 3
8159 8256 // # (only), as published by the Free Software Foundation.
8160 8257 // #
8161 8258 // # This program is distributed in the hope that it will be useful,
8162 8259 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8163 8260 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8164 8261 // # GNU General Public License for more details.
8165 8262 // #
8166 8263 // # You should have received a copy of the GNU Affero General Public License
8167 8264 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8168 8265 // #
8169 8266 // # This program is dual-licensed. If you wish to learn more about the
8170 8267 // # AppEnlight Enterprise Edition, including its added features, Support
8171 8268 // # services, and proprietary license terms, please see
8172 8269 // # https://rhodecode.com/licenses/
8173 8270
8174 angular.module('appenlight.controllers')
8175 .controller('IntegrationController', IntegrationController)
8176
8177 IntegrationController.$inject = ['$state', 'integrationResource'];
8178
8179 function IntegrationController($state, integrationResource) {
8180
8181 var vm = this;
8182 vm.loading = {integration: true};
8183 vm.config = integrationResource.get(
8184 {
8185 integration: $state.params.integration,
8186 action: 'setup',
8187 resourceId: $state.params.resourceId
8188 }, function (data) {
8189 vm.loading.integration = false;
8190 });
8191
8192 vm.configureIntegration = function () {
8193 console.info('configureIntegration');
8194 vm.loading.integration = true;
8195 integrationResource.save(
8196 {
8197 integration: $state.params.integration,
8198 action: 'setup',
8199 resourceId: $state.params.resourceId
8200 }, vm.config, function (data) {
8201 vm.loading.integration = false;
8202 setServerValidation(vm.integrationForm);
8203 }, function (response) {
8204 if (response.status == 422) {
8205 setServerValidation(vm.integrationForm, response.data);
8206 }
8207 vm.loading.integration = false;
8208 });
8209 };
8210
8211 vm.removeIntegration = function () {
8212 console.info('removeIntegration');
8213 integrationResource.remove({
8214 integration: $state.params.integration,
8215 resourceId: $state.params.resourceId,
8216 action: 'delete'
8217 },
8218 function () {
8219 $state.go('applications.integrations',
8220 {resourceId: $state.params.resourceId});
8221 }
8222 );
8223 }
8224
8225 vm.testIntegration = function(to_test){
8226 console.info('testIntegration', to_test);
8227 vm.loading.integration = true;
8228 integrationResource.save(
8229 {
8230 integration: $state.params.integration,
8231 action: 'test_'+ to_test,
8232 resourceId: $state.params.resourceId
8233 }, vm.config, function (data) {
8234 vm.loading.integration = false;
8235 }, function (response) {
8236 vm.loading.integration = false;
8237 });
8238 }
8271 angular.module('appenlight.controllers').controller('AdminGroupsController', AdminGroupsController);
8239 8272
8273 AdminGroupsController.$inject = ['groupsResource'];
8274
8275 function AdminGroupsController(groupsResource) {
8240 8276
8241 }
8277 var vm = this;
8278 vm.loading = {groups: true};
8279
8280 vm.groups = groupsResource.query({}, function (data) {
8281 vm.loading = {groups: false};
8282 vm.activeUsers = _.reduce(vm.groups, function(memo, val){
8283 if (val.status == 1){
8284 return memo + 1;
8285 }
8286 return memo;
8287 }, 0);
8288
8289 });
8290
8291
8292 vm.removeGroup = function (group) {
8293 groupsResource.remove({groupId: group.id}, function (data, responseHeaders) {
8294
8295 if (data) {
8296 var index = vm.groups.indexOf(group);
8297 if (index !== -1) {
8298 vm.groups.splice(index, 1);
8299 vm.activeGroups -= 1;
8300 }
8301 }
8302 });
8303 }
8304 };
8242 8305
8243 8306 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8244 8307 // #
8245 8308 // # This program is free software: you can redistribute it and/or modify
8246 8309 // # it under the terms of the GNU Affero General Public License, version 3
8247 8310 // # (only), as published by the Free Software Foundation.
8248 8311 // #
8249 8312 // # This program is distributed in the hope that it will be useful,
8250 8313 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8251 8314 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8252 8315 // # GNU General Public License for more details.
8253 8316 // #
8254 8317 // # You should have received a copy of the GNU Affero General Public License
8255 8318 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8256 8319 // #
8257 8320 // # This program is dual-licensed. If you wish to learn more about the
8258 8321 // # AppEnlight Enterprise Edition, including its added features, Support
8259 8322 // # services, and proprietary license terms, please see
8260 8323 // # https://rhodecode.com/licenses/
8261 8324
8262 angular.module('appenlight.controllers')
8263 .controller('IntegrationsListController', IntegrationsListController)
8325 angular.module('appenlight.controllers').controller('AdminPartitionsController', AdminPartitionsController);
8264 8326
8265 IntegrationsListController.$inject = ['$state', 'applicationsResource'];
8327 AdminPartitionsController.$inject = ['sectionViewResource'];
8266 8328
8267 function IntegrationsListController($state, applicationsResource) {
8268
8329 function AdminPartitionsController(sectionViewResource) {
8269 8330 var vm = this;
8270 vm.loading = {application: true};
8271 vm.resource = applicationsResource.get({resourceId: $state.params.resourceId}, function (data) {
8272 vm.loading.application = false;
8273 $state.current.data.resource = vm.resource;
8274 });
8331 vm.permanentPartitions = [];
8332 vm.dailyPartitions = [];
8333 vm.loading = {partitions: true};
8334 vm.dailyChecked = false;
8335 vm.permChecked = false;
8336 vm.dailyConfirm = '';
8337 vm.permConfirm = '';
8338
8339
8340 vm.loadPartitions = function (data) {
8341 var permanentPartitions = vm.transformPartitionList(
8342 data.permanent_partitions);
8343 var dailyPartitions = vm.transformPartitionList(
8344 data.daily_partitions);
8345 vm.permanentPartitions = permanentPartitions;
8346 vm.dailyPartitions = dailyPartitions;
8347 vm.loading = {partitions: false};
8348 };
8349
8350 vm.setCheckedList = function (scope) {
8351 var toTest = null;
8352 if (scope === 'dailyPartitions'){
8353 toTest = 'dailyChecked';
8354 }
8355 else{
8356 toTest = 'permChecked';
8357 }
8358
8359 if (vm[toTest]) {
8360 var val = true;
8361 }
8362 else {
8363 var val = false;
8364 }
8365
8366 _.each(vm[scope], function (item) {
8367 _.each(item[1].pg, function (index) {
8368 index.checked = val;
8369 });
8370 _.each(item[1].elasticsearch, function (index) {
8371 index.checked = val;
8372 });
8373 });
8374 }
8375
8376
8377 vm.transformPartitionList = function (inputList) {
8378 var outputList = [];
8379
8380 _.each(inputList, function (item) {
8381 var time = [item[0], {
8382 elasticsearch: [],
8383 pg: []
8384 }]
8385 _.each(item[1].pg, function (index) {
8386 time[1].pg.push({name: index, checked: false})
8387 });
8388 _.each(item[1].elasticsearch, function (index) {
8389 time[1].elasticsearch.push({
8390 name: index,
8391 checked: false
8392 })
8393 });
8394 outputList.push(time);
8395 });
8396 return outputList;
8397 };
8398
8399 sectionViewResource.get({section:'admin_section', view: 'partitions'},
8400 vm.loadPartitions);
8401
8402 vm.partitionsDelete = function (partitionType) {
8403 var es_indices = [];
8404 var pg_indices = [];
8405 _.each(vm[partitionType], function (item) {
8406 _.each(item[1].pg, function (index) {
8407 if (index.checked) {
8408 pg_indices.push(index.name)
8409 }
8410 });
8411 _.each(item[1].elasticsearch, function (index) {
8412 if (index.checked) {
8413 es_indices.push(index.name)
8414 }
8415 });
8416 });
8417
8418
8419 vm.loading = {partitions: true};
8420 sectionViewResource.save({section:'admin_section',
8421 view: 'partitions_remove'}, {
8422 es_indices: es_indices,
8423 pg_indices: pg_indices,
8424 confirm: 'CONFIRM'
8425 }, vm.loadPartitions);
8426
8427 }
8428
8275 8429 }
8276 8430
8277 8431 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8278 8432 // #
8279 8433 // # This program is free software: you can redistribute it and/or modify
8280 8434 // # it under the terms of the GNU Affero General Public License, version 3
8281 8435 // # (only), as published by the Free Software Foundation.
8282 8436 // #
8283 8437 // # This program is distributed in the hope that it will be useful,
8284 8438 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8285 8439 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8286 8440 // # GNU General Public License for more details.
8287 8441 // #
8288 8442 // # You should have received a copy of the GNU Affero General Public License
8289 8443 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8290 8444 // #
8291 8445 // # This program is dual-licensed. If you wish to learn more about the
8292 8446 // # AppEnlight Enterprise Edition, including its added features, Support
8293 8447 // # services, and proprietary license terms, please see
8294 8448 // # https://rhodecode.com/licenses/
8295 8449
8296 angular.module('appenlight.controllers')
8297 .controller('ApplicationsListController', ApplicationsListController)
8450 angular.module('appenlight.controllers').controller('AdminSystemController', AdminSystemController);
8298 8451
8299 ApplicationsListController.$inject = ['applicationsResource'];
8452 AdminSystemController.$inject = ['sectionViewResource'];
8300 8453
8301 function ApplicationsListController(applicationsResource) {
8302
8454 function AdminSystemController(sectionViewResource) {
8303 8455 var vm = this;
8304 vm.loading = {applications: true};
8305 vm.applications = applicationsResource.query(null, function(){
8306 vm.loading.applications = false;
8456 vm.tables = [];
8457 vm.loading = {system: true};
8458 sectionViewResource.get({
8459 section: 'admin_section',
8460 view: 'system'
8461 }, null, function (data) {
8462 vm.DBtables = data.db_tables;
8463 vm.ESIndices = data.es_indices;
8464 vm.queueStats = data.queue_stats;
8465 vm.systemLoad = data.system_load;
8466 vm.packages = data.packages;
8467 vm.processInfo = data.process_info;
8468 vm.disks = data.disks;
8469 vm.memory = data.memory;
8470 vm.selfInfo = data.self_info;
8471
8472 vm.loading.system = false;
8307 8473 });
8308 }
8474 };
8309 8475
8310 8476 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8311 8477 // #
8312 8478 // # This program is free software: you can redistribute it and/or modify
8313 8479 // # it under the terms of the GNU Affero General Public License, version 3
8314 8480 // # (only), as published by the Free Software Foundation.
8315 8481 // #
8316 8482 // # This program is distributed in the hope that it will be useful,
8317 8483 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8318 8484 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8319 8485 // # GNU General Public License for more details.
8320 8486 // #
8321 8487 // # You should have received a copy of the GNU Affero General Public License
8322 8488 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8323 8489 // #
8324 8490 // # This program is dual-licensed. If you wish to learn more about the
8325 8491 // # AppEnlight Enterprise Edition, including its added features, Support
8326 8492 // # services, and proprietary license terms, please see
8327 8493 // # https://rhodecode.com/licenses/
8328 8494
8329 angular.module('appenlight.controllers')
8330 .controller('ApplicationsPurgeLogsController', ApplicationsPurgeLogsController)
8495 angular.module('appenlight.controllers').controller('AdminUsersCreateController', AdminUsersCreateController);
8331 8496
8332 ApplicationsPurgeLogsController.$inject = ['applicationsResource', 'sectionViewResource', 'logsNoIdResource'];
8497 AdminUsersCreateController.$inject = ['$state', 'usersResource', 'usersPropertyResource', 'sectionViewResource', 'AeConfig'];
8333 8498
8334 function ApplicationsPurgeLogsController(applicationsResource, sectionViewResource, logsNoIdResource) {
8499 function AdminUsersCreateController($state, usersResource, usersPropertyResource, sectionViewResource, AeConfig) {
8335 8500
8336 8501 var vm = this;
8337 vm.loading = {applications: true};
8502 vm.loading = {user: false};
8338 8503
8339 vm.namespace = null;
8340 vm.selectedResource = null;
8341 vm.commonNamespaces = [];
8342 8504
8343 vm.applications = applicationsResource.query({'type':'update_reports'}, function () {
8344 vm.loading.applications = false;
8345 vm.selectedResource = vm.applications[0].resource_id;
8346 vm.getCommonKeys();
8347 });
8505 if (typeof $state.params.userId !== 'undefined') {
8506 vm.loading.user = true;
8507 var userId = $state.params.userId;
8508 vm.user = usersResource.get({userId: userId}, function (data) {
8509 vm.loading.user = false;
8510 // cast to true for angular checkbox
8511 if (vm.user.status === 1) {
8512 vm.user.status = true;
8513 }
8514 });
8515
8516 vm.resource_permissions = usersPropertyResource.query(
8517 {userId: userId, key: 'resource_permissions'}, function (data) {
8518 vm.loading.resource_permissions = false;
8519 var tmpObj = {
8520 'user': {
8521 'application': {},
8522 'dashboard': {}
8523 },
8524 'group': {
8525 'application': {},
8526 'dashboard': {}
8527 }
8528 };
8529 _.each(data, function (item) {
8530
8531 var section = tmpObj[item.type][item.resource_type];
8532 if (typeof section[item.resource_id] == 'undefined'){
8533 section[item.resource_id] = {
8534 self:item,
8535 permissions: []
8536 }
8537 }
8538 section[item.resource_id].permissions.push(item.perm_name);
8539
8540 });
8541 vm.resourcePermissions = tmpObj;
8542 });
8543
8544 }
8545 else {
8546 var userId = null;
8547 vm.user = {
8548 status: true
8549 }
8550 }
8551
8552 var formResponse = function (response) {
8553 if (response.status == 422) {
8554 setServerValidation(vm.profileForm, response.data);
8555 }
8556 vm.loading.user = false;
8557 }
8558
8559 vm.createUser = function () {
8560 vm.loading.user = true;
8561
8562 if (userId) {
8563 usersResource.update({userId: vm.user.id}, vm.user, function (data) {
8564 setServerValidation(vm.profileForm);
8565 vm.loading.user = false;
8566 }, formResponse);
8567 }
8568 else {
8569 usersResource.save(vm.user, function (data) {
8570 $state.go('admin.user.update', {userId: data.id});
8571 }, formResponse);
8572 }
8573 }
8348 8574
8349 /**
8350 * Fetches most commonly used tags in logs
8351 */
8352 vm.getCommonKeys = function () {
8575 vm.generatePassword = function () {
8576 var length = 8;
8577 var charset = "abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
8578 vm.gen_pass = "";
8579 for (var i = 0, n = charset.length; i < length; ++i) {
8580 vm.gen_pass += charset.charAt(Math.floor(Math.random() * n));
8581 }
8582 vm.user.user_password = '' + vm.gen_pass;
8583
8584 }
8585
8586 vm.reloginUser = function () {
8353 8587 sectionViewResource.get({
8354 section: 'logs_section',
8355 view: 'common_tags',
8356 resource: vm.selectedResource
8357 }, function (data) {
8358 vm.commonNamespaces = data['namespaces']
8588 section: 'admin_section', view: 'relogin_user',
8589 user_id: vm.user.id
8590 }, function () {
8591 window.location = AeConfig.urls.baseUrl;
8359 8592 });
8360 };
8361 8593
8362 vm.purgeLogs = function () {
8363 vm.loading.applications = true;
8364 logsNoIdResource.delete({resource:vm.selectedResource,
8365 namespace: vm.namespace}, function(){
8366 vm.loading.applications = false;
8367 });
8368 8594 }
8369 }
8595 };
8370 8596
8371 8597 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8372 8598 // #
8373 8599 // # This program is free software: you can redistribute it and/or modify
8374 8600 // # it under the terms of the GNU Affero General Public License, version 3
8375 8601 // # (only), as published by the Free Software Foundation.
8376 8602 // #
8377 8603 // # This program is distributed in the hope that it will be useful,
8378 8604 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8379 8605 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8380 8606 // # GNU General Public License for more details.
8381 8607 // #
8382 8608 // # You should have received a copy of the GNU Affero General Public License
8383 8609 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8384 8610 // #
8385 8611 // # This program is dual-licensed. If you wish to learn more about the
8386 8612 // # AppEnlight Enterprise Edition, including its added features, Support
8387 8613 // # services, and proprietary license terms, please see
8388 8614 // # https://rhodecode.com/licenses/
8389 8615
8390 angular.module('appenlight.controllers').controller('EventsController', EventsController);
8616 angular.module('appenlight.controllers').controller('AdminUsersController', AdminUsersController);
8391 8617
8392 EventsController.$inject = ['eventsNoIdResource', 'eventsResource'];
8618 AdminUsersController.$inject = ['usersResource'];
8393 8619
8394 function EventsController(eventsNoIdResource, eventsResource) {
8395 console.info('EventsController');
8620 function AdminUsersController(usersResource) {
8621
8396 8622 var vm = this;
8623 vm.loading = {users: true};
8397 8624
8398 vm.loading = {events: true};
8399
8400 vm.events = eventsNoIdResource.query(
8401 {key: 'events'},
8402 function (data) {
8403 vm.loading.events = false;
8404 });
8625 vm.users = usersResource.query({}, function (data) {
8626 vm.loading = {users: false};
8627 vm.activeUsers = _.reduce(vm.users, function(memo, val){
8628 if (val.status == 1){
8629 return memo + 1;
8630 }
8631 return memo;
8632 }, 0);
8633
8634 });
8405 8635
8406 8636
8407 vm.closeEvent = function (event) {
8408
8409 eventsResource.update({eventId: event.id}, {status: 0}, function (data) {
8410 event.status = 0;
8637 vm.removeUser = function (user) {
8638 usersResource.remove({userId: user.id}, function (data, responseHeaders) {
8639
8640 if (data) {
8641 var index = vm.users.indexOf(user);
8642 if (index !== -1) {
8643 vm.users.splice(index, 1);
8644 vm.activeUsers -= 1;
8645 }
8646 }
8411 8647 });
8412 8648 }
8413
8414 }
8649 };
8415 8650
8416 8651 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8417 8652 // #
8418 8653 // # This program is free software: you can redistribute it and/or modify
8419 8654 // # it under the terms of the GNU Affero General Public License, version 3
8420 8655 // # (only), as published by the Free Software Foundation.
8421 8656 // #
8422 8657 // # This program is distributed in the hope that it will be useful,
8423 8658 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8424 8659 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8425 8660 // # GNU General Public License for more details.
8426 8661 // #
8427 8662 // # You should have received a copy of the GNU Affero General Public License
8428 8663 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8429 8664 // #
8430 8665 // # This program is dual-licensed. If you wish to learn more about the
8431 8666 // # AppEnlight Enterprise Edition, including its added features, Support
8432 8667 // # services, and proprietary license terms, please see
8433 8668 // # https://rhodecode.com/licenses/
8434 8669
8435 8670 angular.module('appenlight.controllers')
8436 .controller('IndexDashboardController', IndexDashboardController);
8671 .controller('ApplicationsUpdateController', ApplicationsUpdateController)
8437 8672
8438 IndexDashboardController.$inject = ['$rootScope', '$scope', '$location','$cookies', '$interval', 'stateHolder', 'applicationsPropertyResource', 'AeConfig'];
8673 ApplicationsUpdateController.$inject = ['$state', 'applicationsNoIdResource', 'applicationsResource', 'applicationsPropertyResource', 'stateHolder'];
8439 8674
8440 function IndexDashboardController($rootScope, $scope, $location, $cookies, $interval, stateHolder, applicationsPropertyResource, AeConfig) {
8675 function ApplicationsUpdateController($state, applicationsNoIdResource, applicationsResource, applicationsPropertyResource, stateHolder) {
8676 'use strict';
8677
8441 8678 var vm = this;
8442 stateHolder.section = 'dashboard';
8443 vm.timeOptions = {};
8444 var allowed = ['1h', '4h', '12h', '24h', '1w', '2w', '1M'];
8445 _.each(allowed, function (key) {
8446 if (allowed.indexOf(key) !== -1) {
8447 vm.timeOptions[key] = AeConfig.timeOptions[key];
8448 }
8449 });
8450 vm.stateHolder = stateHolder;
8451 vm.urls = AeConfig.urls;
8452 vm.applications = stateHolder.AeUser.applications_map;
8453 vm.show_dashboard = false;
8454 vm.resource = null;
8455 vm.graphType = {selected: null};
8456 vm.timeSpan = vm.timeOptions['1h'];
8457 vm.trendingReports = [];
8458 vm.exceptions = 0;
8459 vm.satisfyingRequests = 0;
8460 vm.toleratedRequests = 0;
8461 vm.frustratingRequests = 0;
8462 vm.uptimeStats = 0;
8463 vm.apdexStats = [];
8464 vm.seriesRequestsData = [];
8465 vm.seriesMetricsData = [];
8466 vm.seriesSlowData = [];
8467 vm.slowCalls = [];
8468 vm.slowURIS = [];
8679 vm.loading = {application: false};
8469 8680
8470 vm.reportChartConfig = {
8471 data: {
8472 json: [],
8473 xFormat: '%Y-%m-%dT%H:%M:%S'
8474 },
8475 color: {
8476 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
8477 },
8478 axis: {
8479 x: {
8480 type: 'timeseries',
8481 tick: {
8482 culling: {
8483 max: 6 // the number of tick texts will be adjusted to less than this value
8484 },
8485 format: '%Y-%m-%d %H:%M'
8486 }
8487 },
8488 y: {
8489 tick: {
8490 count: 5,
8491 format: d3.format('.2s')
8492 }
8493 }
8494 },
8495 subchart: {
8496 show: true,
8497 size: {
8498 height: 20
8499 }
8500 },
8501 size: {
8502 height: 250
8503 },
8504 zoom: {
8505 rescale: true
8506 },
8507 grid: {
8508 x: {
8509 show: true
8510 },
8511 y: {
8512 show: true
8513 }
8514 },
8515 tooltip: {
8516 format: {
8517 title: function (d) {
8518 return '' + d;
8519 },
8520 value: function (v) {
8521 return v
8522 }
8523 }
8524 }
8525 };
8526 vm.reportChartData = {};
8681 vm.groupingOptions = [
8682 ['url_type', 'Error Type + location'],
8683 ['url_traceback', 'Traceback + location'],
8684 ['traceback_server', 'Traceback + Server'],
8685 ];
8527 8686
8528 vm.reportSlowChartConfig = {
8529 data: {
8530 json: [],
8531 xFormat: '%Y-%m-%dT%H:%M:%S'
8532 },
8533 color: {
8534 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
8535 },
8536 axis: {
8537 x: {
8538 type: 'timeseries',
8539 tick: {
8540 culling: {
8541 max: 6 // the number of tick texts will be adjusted to less than this value
8542 },
8543 format: '%Y-%m-%d %H:%M'
8544 }
8545 },
8546 y: {
8547 tick: {
8548 count: 5,
8549 format: d3.format('.2s')
8550 }
8551 }
8552 },
8553 subchart: {
8554 show: true,
8555 size: {
8556 height: 20
8557 }
8558 },
8559 size: {
8560 height: 250
8561 },
8562 zoom: {
8563 rescale: true
8564 },
8565 grid: {
8566 x: {
8567 show: true
8568 },
8569 y: {
8570 show: true
8571 }
8572 },
8573 tooltip: {
8574 format: {
8575 title: function (d) {
8576 return '' + d;
8577 },
8578 value: function (v) {
8579 return v
8687 var resourceId = $state.params.resourceId;
8688
8689
8690 var options = {};
8691
8692 vm.momentJs = moment;
8693
8694 vm.formTransferModel = {password:''};
8695
8696 // set initial data
8697
8698 if (resourceId === 'new') {
8699 vm.resource = {
8700 resource_id: null,
8701 slow_report_threshold: 10,
8702 error_report_threshold: 10,
8703 allow_permanent_storage: true,
8704 default_grouping: vm.groupingOptions[1][0]
8705 };
8706 }
8707 else {
8708 vm.loading.application = true;
8709 vm.resource = applicationsResource.get({
8710 'resourceId': resourceId
8711 }, function (data) {
8712 vm.loading.application = false;
8713 });
8714 }
8715
8716
8717 vm.updateBasicForm = function () {
8718 vm.loading.application = true;
8719 if (vm.resource.resource_id === null) {
8720 applicationsNoIdResource.save(null, vm.resource, function (data) {
8721 stateHolder.AeUser.addApplication(data);
8722 $state.go('applications.update', {resourceId: data.resource_id});
8723 setServerValidation(vm.BasicForm);
8724 }, function (response) {
8725 if (response.status == 422) {
8726 setServerValidation(vm.BasicForm, response.data);
8580 8727 }
8581 }
8728 vm.loading.application = false;
8729
8730 });
8731 }
8732 else {
8733 applicationsResource.update({resourceId: vm.resource.resource_id},
8734 vm.resource, function (data) {
8735 vm.resource = data;
8736 vm.loading.application = false;
8737 setServerValidation(vm.BasicForm);
8738 }, function (response) {
8739 if (response.status == 422) {
8740 setServerValidation(vm.BasicForm, response.data);
8741 }
8742 vm.loading.application = false;
8743 });
8582 8744 }
8583 8745 };
8584 vm.reportSlowChartData = {};
8585 8746
8586 vm.metricsChartConfig = {
8587 data: {
8588 json: [],
8589 xFormat: '%Y-%m-%dT%H:%M:%S',
8590 keys: {
8591 x: 'x',
8592 value: ["main", "sql", "nosql", "tmpl", "remote", "custom"]
8593 },
8594 names: {
8595 main: 'View/Application logic',
8596 sql: 'Relational database queries',
8597 nosql: 'NoSql datastore calls',
8598 tmpl: 'Template rendering',
8599 custom: 'Custom timed calls',
8600 remote: 'Requests to remote resources'
8601 },
8602 type: 'area',
8603 groups: [["main", "sql", "nosql", "remote", "custom", "tmpl"]],
8604 order: null
8605 },
8606 color: {
8607 pattern: ['#6baed6', '#c7e9c0', '#fd8d3c', '#d6616b', '#ffcc00', '#c6dbef']
8608 },
8609 axis: {
8610 x: {
8611 type: 'timeseries',
8612 tick: {
8613 culling: {
8614 max: 6 // the number of tick texts will be adjusted to less than this value
8615 },
8616 format: '%Y-%m-%d %H:%M'
8617 }
8618 },
8619 y: {
8620 tick: {
8621 count: 5,
8622 format: d3.format('.2f')
8623 }
8624 }
8625 },
8626 point: {
8627 show: false
8628 },
8629 subchart: {
8630 show: true,
8631 size: {
8632 height: 20
8747 vm.addRule = function () {
8748
8749 applicationsPropertyResource.save({
8750 resourceId: vm.resource.resource_id,
8751 key: 'postprocessing_rules'
8752 }, null,
8753 function (data) {
8754 vm.resource.postprocessing_rules.push(data);
8633 8755 }
8634 },
8635 size: {
8636 height: 350
8637 },
8638 zoom: {
8639 rescale: true
8640 },
8641 grid: {
8642 x: {
8643 show: true
8756 );
8757 };
8758
8759 vm.regenerateAPIKeys = function(){
8760 vm.loading.application = true;
8761 applicationsPropertyResource.save({
8762 resourceId: vm.resource.resource_id,
8763 key: 'api_key'
8764 }, {password: vm.regenerateAPIKeysPassword},
8765 function (data) {
8766 vm.resource = data;
8767 vm.loading.application = false;
8768 vm.regenerateAPIKeysPassword = '';
8769 setServerValidation(vm.regenerateAPIKeysForm);
8644 8770 },
8645 y: {
8646 show: true
8647 }
8648 },
8649 tooltip: {
8650 format: {
8651 title: function (d) {
8652 return '' + d;
8653 },
8654 value: function (v) {
8655 return v
8771 function (response) {
8772 if (response.status == 422) {
8773 setServerValidation(vm.regenerateAPIKeysForm, response.data);
8774
8656 8775 }
8776 vm.loading.application = false;
8657 8777 }
8658 }
8778 )
8659 8779 };
8660 vm.metricsChartData = {};
8661 8780
8662 vm.responseChartConfig = {
8663 data: {
8664 json: [],
8665 xFormat: '%Y-%m-%dT%H:%M:%S'
8666 },
8667 color: {
8668 pattern: ['#d6616b', '#6baed6', '#fd8d3c']
8669 },
8670 axis: {
8671 x: {
8672 type: 'timeseries',
8673 tick: {
8674 culling: {
8675 max: 6 // the number of tick texts will be adjusted to less than this value
8676 },
8677 format: '%Y-%m-%d %H:%M'
8678 }
8781 vm.deleteApplication = function(){
8782 vm.loading.application = true;
8783 applicationsPropertyResource.update({
8784 resourceId: vm.resource.resource_id,
8785 key: 'delete_resource'
8786 }, vm.formDeleteModel,
8787 function (data) {
8788 stateHolder.AeUser.removeApplicationById(vm.resource.resource_id);
8789 $state.go('applications.list');
8679 8790 },
8680 y: {
8681 tick: {
8682 count: 5,
8683 format: d3.format('.2f')
8791 function (response) {
8792 if (response.status == 422) {
8793 setServerValidation(vm.formDelete, response.data);
8794
8684 8795 }
8796 vm.loading.application = false;
8685 8797 }
8686 },
8687 point: {
8688 show: false
8689 },
8690 subchart: {
8691 show: true,
8692 size: {
8693 height: 20
8694 }
8695 },
8696 size: {
8697 height: 350
8698 },
8699 zoom: {
8700 rescale: true
8701 },
8702 grid: {
8703 x: {
8704 show: true
8798 );
8799 };
8800
8801 vm.transferApplication = function(){
8802 vm.loading.application = true;
8803 applicationsPropertyResource.update({
8804 resourceId: vm.resource.resource_id,
8805 key: 'owner'
8806 }, vm.formTransferModel,
8807 function (data) {
8808 $state.go('applications.list');
8705 8809 },
8706 y: {
8707 show: true
8810 function (response) {
8811 if (response.status == 422) {
8812 setServerValidation(vm.formTransfer, response.data);
8813
8814 }
8815 vm.loading.application = false;
8708 8816 }
8709 },
8710 tooltip: {
8711 format: {
8712 title: function (d) {
8713 return '' + d;
8714 },
8715 value: function (v) {
8716 return v
8817 )
8818 }
8819
8820 }
8821
8822 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8823 // #
8824 // # This program is free software: you can redistribute it and/or modify
8825 // # it under the terms of the GNU Affero General Public License, version 3
8826 // # (only), as published by the Free Software Foundation.
8827 // #
8828 // # This program is distributed in the hope that it will be useful,
8829 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8830 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8831 // # GNU General Public License for more details.
8832 // #
8833 // # You should have received a copy of the GNU Affero General Public License
8834 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8835 // #
8836 // # This program is dual-licensed. If you wish to learn more about the
8837 // # AppEnlight Enterprise Edition, including its added features, Support
8838 // # services, and proprietary license terms, please see
8839 // # https://rhodecode.com/licenses/
8840
8841 angular.module('appenlight.controllers')
8842 .controller('IntegrationController', IntegrationController)
8843
8844 IntegrationController.$inject = ['$state', 'integrationResource'];
8845
8846 function IntegrationController($state, integrationResource) {
8847
8848 var vm = this;
8849 vm.loading = {integration: true};
8850 vm.config = integrationResource.get(
8851 {
8852 integration: $state.params.integration,
8853 action: 'setup',
8854 resourceId: $state.params.resourceId
8855 }, function (data) {
8856 vm.loading.integration = false;
8857 });
8858
8859 vm.configureIntegration = function () {
8860 console.info('configureIntegration');
8861 vm.loading.integration = true;
8862 integrationResource.save(
8863 {
8864 integration: $state.params.integration,
8865 action: 'setup',
8866 resourceId: $state.params.resourceId
8867 }, vm.config, function (data) {
8868 vm.loading.integration = false;
8869 setServerValidation(vm.integrationForm);
8870 }, function (response) {
8871 if (response.status == 422) {
8872 setServerValidation(vm.integrationForm, response.data);
8717 8873 }
8718 }
8719 }
8874 vm.loading.integration = false;
8875 });
8720 8876 };
8721 vm.responseChartData = {};
8722 8877
8723 vm.requestsChartConfig = {
8724 data: {
8725 json: [],
8726 xFormat: '%Y-%m-%dT%H:%M:%S'
8727 },
8728 color: {
8729 pattern: ['#d6616b', '#6baed6', '#fd8d3c']
8730 },
8731 axis: {
8732 x: {
8733 type: 'timeseries',
8734 tick: {
8735 culling: {
8736 max: 6 // the number of tick texts will be adjusted to less than this value
8737 },
8738 format: '%Y-%m-%d %H:%M'
8739 }
8740 },
8741 y: {
8742 tick: {
8743 count: 5,
8744 format: d3.format('.2f')
8745 }
8746 }
8747 },
8748 point: {
8749 show: false
8750 },
8751 subchart: {
8752 show: true,
8753 size: {
8754 height: 20
8755 }
8756 },
8757 size: {
8758 height: 350
8759 },
8760 zoom: {
8761 rescale: true
8762 },
8763 grid: {
8764 x: {
8765 show: true
8878 vm.removeIntegration = function () {
8879 console.info('removeIntegration');
8880 integrationResource.remove({
8881 integration: $state.params.integration,
8882 resourceId: $state.params.resourceId,
8883 action: 'delete'
8766 8884 },
8767 y: {
8768 show: true
8769 }
8770 },
8771 tooltip: {
8772 format: {
8773 title: function (d) {
8774 return '' + d;
8775 },
8776 value: function (v) {
8777 return v
8778 }
8885 function () {
8886 $state.go('applications.integrations',
8887 {resourceId: $state.params.resourceId});
8779 8888 }
8780 }
8781 };
8782 vm.requestsChartData = {};
8889 );
8890 }
8783 8891
8784 vm.loading = {
8785 'apdex': true,
8786 'reports': true,
8787 'graphs': true,
8788 'slowCalls': true,
8789 'slowURIS': true,
8790 'requestsBreakdown': true,
8791 'series': true
8792 };
8793 vm.stream = {paused: false, filtered: false, messages: [], reports: []};
8892 vm.testIntegration = function(to_test){
8893 console.info('testIntegration', to_test);
8894 vm.loading.integration = true;
8895 integrationResource.save(
8896 {
8897 integration: $state.params.integration,
8898 action: 'test_'+ to_test,
8899 resourceId: $state.params.resourceId
8900 }, vm.config, function (data) {
8901 vm.loading.integration = false;
8902 }, function (response) {
8903 vm.loading.integration = false;
8904 });
8905 }
8794 8906
8795 $rootScope.$on('channelstream-message.front_dashboard.new_topic', function(event, message){
8796 var ws_report = message.message.report;
8797 if (ws_report.http_status != 500) {
8798 return
8799 }
8800 if (vm.stream.paused == true) {
8801 return
8802 }
8803 if (vm.stream.filtered && ws_report.resource_id != vm.resource) {
8804 return
8805 }
8806 var should_insert = true;
8807 _.each(vm.stream.reports, function (report) {
8808 if (report.report_id == ws_report.report_id) {
8809 report.occurences = ws_report.occurences;
8810 should_insert = false;
8811 }
8812 });
8813 if (should_insert) {
8814 if (vm.stream.reports.length > 7) {
8815 vm.stream.reports.pop();
8816 }
8817 vm.stream.reports.unshift(ws_report);
8818 }
8819 });
8907
8908 }
8820 8909
8821 vm.determineStartState = function () {
8822 if (stateHolder.AeUser.applications.length) {
8823 vm.resource = Number($location.search().resource);
8910 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8911 // #
8912 // # This program is free software: you can redistribute it and/or modify
8913 // # it under the terms of the GNU Affero General Public License, version 3
8914 // # (only), as published by the Free Software Foundation.
8915 // #
8916 // # This program is distributed in the hope that it will be useful,
8917 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8918 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8919 // # GNU General Public License for more details.
8920 // #
8921 // # You should have received a copy of the GNU Affero General Public License
8922 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8923 // #
8924 // # This program is dual-licensed. If you wish to learn more about the
8925 // # AppEnlight Enterprise Edition, including its added features, Support
8926 // # services, and proprietary license terms, please see
8927 // # https://rhodecode.com/licenses/
8824 8928
8825 if (!vm.resource){
8826 var cookieResource = $cookies.getObject('resource');
8827
8929 angular.module('appenlight.controllers')
8930 .controller('IntegrationsListController', IntegrationsListController)
8828 8931
8829 if (cookieResource) {
8830 vm.resource = cookieResource;
8831 }
8832 else{
8833 vm.resource = stateHolder.AeUser.applications[0].resource_id;
8834 }
8835 }
8836 }
8932 IntegrationsListController.$inject = ['$state', 'applicationsResource'];
8837 8933
8838 var timespan = $location.search().timespan;
8934 function IntegrationsListController($state, applicationsResource) {
8935
8936 var vm = this;
8937 vm.loading = {application: true};
8938 vm.resource = applicationsResource.get({resourceId: $state.params.resourceId}, function (data) {
8939 vm.loading.application = false;
8940 $state.current.data.resource = vm.resource;
8941 });
8942 }
8839 8943
8840 if(_.has(vm.timeOptions, timespan)){
8841 vm.timeSpan = vm.timeOptions[timespan];
8842 }
8843 else{
8844 vm.timeSpan = vm.timeOptions['1h'];
8845 }
8944 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8945 // #
8946 // # This program is free software: you can redistribute it and/or modify
8947 // # it under the terms of the GNU Affero General Public License, version 3
8948 // # (only), as published by the Free Software Foundation.
8949 // #
8950 // # This program is distributed in the hope that it will be useful,
8951 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8952 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8953 // # GNU General Public License for more details.
8954 // #
8955 // # You should have received a copy of the GNU Affero General Public License
8956 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8957 // #
8958 // # This program is dual-licensed. If you wish to learn more about the
8959 // # AppEnlight Enterprise Edition, including its added features, Support
8960 // # services, and proprietary license terms, please see
8961 // # https://rhodecode.com/licenses/
8846 8962
8847 var graphType = $location.search().graphtype;
8848 if(!graphType){
8849 vm.graphType = {selected: 'metrics_graphs'};
8850 }
8851 else{
8852 vm.graphType = {selected: graphType};
8853 }
8854 vm.updateSearchParams();
8855 };
8963 angular.module('appenlight.controllers')
8964 .controller('ApplicationsListController', ApplicationsListController)
8856 8965
8857 vm.updateSearchParams = function () {
8858 $location.search('resource', vm.resource);
8859 $location.search('timespan', vm.timeSpan.key);
8860 $location.search('graphtype', vm.graphType.selected);
8861 stateHolder.resource = vm.resource;
8966 ApplicationsListController.$inject = ['applicationsResource'];
8862 8967
8863 if (vm.resource){
8864 $cookies.putObject('resource', vm.resource,
8865 {expires:new Date(3000, 1, 1)});
8866 }
8867 vm.refreshData();
8868 };
8968 function ApplicationsListController(applicationsResource) {
8969
8970 var vm = this;
8971 vm.loading = {applications: true};
8972 vm.applications = applicationsResource.query(null, function(){
8973 vm.loading.applications = false;
8974 });
8975 }
8869 8976
8870 vm.refreshData = function () {
8871 vm.fetchApdexStats();
8872 vm.fetchTrendingReports();
8873 vm.fetchMetrics();
8874 vm.fetchRequestsBreakdown();
8875 vm.fetchSlowCalls();
8876 };
8977 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
8978 // #
8979 // # This program is free software: you can redistribute it and/or modify
8980 // # it under the terms of the GNU Affero General Public License, version 3
8981 // # (only), as published by the Free Software Foundation.
8982 // #
8983 // # This program is distributed in the hope that it will be useful,
8984 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8985 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8986 // # GNU General Public License for more details.
8987 // #
8988 // # You should have received a copy of the GNU Affero General Public License
8989 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
8990 // #
8991 // # This program is dual-licensed. If you wish to learn more about the
8992 // # AppEnlight Enterprise Edition, including its added features, Support
8993 // # services, and proprietary license terms, please see
8994 // # https://rhodecode.com/licenses/
8877 8995
8878 vm.changedTimeSpan = function(){
8879 vm.startDateFilter = timeSpanToStartDate(vm.timeSpan.key);
8880 vm.refreshData();
8881 };
8996 angular.module('appenlight.controllers')
8997 .controller('ApplicationsPurgeLogsController', ApplicationsPurgeLogsController)
8882 8998
8883 vm.intervalId = $interval(function () {
8884 if (_.contains(['30m', "1h"], vm.timeSpan.key)) {
8885 // don't do anything if window is unfocused
8886 if(document.hidden === true){
8887 return ;
8888 }
8889 vm.refreshData();
8890 }
8891 }, 60000);
8999 ApplicationsPurgeLogsController.$inject = ['applicationsResource', 'sectionViewResource', 'logsNoIdResource'];
8892 9000
8893 vm.fetchApdexStats = function () {
8894 vm.loading.apdex = true;
8895 vm.apdexStats = applicationsPropertyResource.query({
8896 'key': 'apdex_stats',
8897 'resourceId': vm.resource,
8898 "start_date": timeSpanToStartDate(vm.timeSpan.key)
8899 },
8900 function (data) {
8901 vm.loading.apdex = false;
9001 function ApplicationsPurgeLogsController(applicationsResource, sectionViewResource, logsNoIdResource) {
9002
9003 var vm = this;
9004 vm.loading = {applications: true};
8902 9005
8903 vm.exceptions = _.reduce(data, function (memo, row) {
8904 return memo + row.errors;
8905 }, 0);
8906 vm.satisfyingRequests = _.reduce(data, function (memo, row) {
8907 return memo + row.satisfying_requests;
8908 }, 0);
8909 vm.toleratedRequests = _.reduce(data, function (memo, row) {
8910 return memo + row.tolerated_requests;
8911 }, 0);
8912 vm.frustratingRequests = _.reduce(data, function (memo, row) {
8913 return memo + row.frustrating_requests;
8914 }, 0);
8915 if (data.length) {
8916 vm.uptimeStats = data[0].uptime;
8917 }
9006 vm.namespace = null;
9007 vm.selectedResource = null;
9008 vm.commonNamespaces = [];
8918 9009
8919 },
8920 function () {
8921 vm.loading.apdex = false;
8922 }
8923 );
8924 }
9010 vm.applications = applicationsResource.query({'type':'update_reports'}, function () {
9011 vm.loading.applications = false;
9012 vm.selectedResource = vm.applications[0].resource_id;
9013 vm.getCommonKeys();
9014 });
8925 9015
8926 vm.fetchMetrics = function () {
8927 vm.loading.series = true;
8928 applicationsPropertyResource.query({
8929 'resourceId': vm.resource,
8930 'key': vm.graphType.selected,
8931 "start_date": timeSpanToStartDate(vm.timeSpan.key)
9016 /**
9017 * Fetches most commonly used tags in logs
9018 */
9019 vm.getCommonKeys = function () {
9020 sectionViewResource.get({
9021 section: 'logs_section',
9022 view: 'common_tags',
9023 resource: vm.selectedResource
8932 9024 }, function (data) {
8933 if (vm.graphType.selected == 'metrics_graphs') {
8934 vm.metricsChartData = {
8935 json: data,
8936 xFormat: '%Y-%m-%dT%H:%M:%S',
8937 keys: {
8938 x: 'x',
8939 value: ["main", "sql", "nosql", "tmpl", "remote", "custom"]
8940 },
8941 names: {
8942 main: 'View/Application logic',
8943 sql: 'Relational database queries',
8944 nosql: 'NoSql datastore calls',
8945 tmpl: 'Template rendering',
8946 custom: 'Custom timed calls',
8947 remote: 'Requests to remote resources'
8948 },
8949 type: 'area',
8950 groups: [["main", "sql", "nosql", "remote", "custom", "tmpl"]],
8951 order: null
8952 };
8953 }
8954 else if (vm.graphType.selected == 'report_graphs') {
8955 vm.reportChartData = {
8956 json: data,
8957 xFormat: '%Y-%m-%dT%H:%M:%S',
8958 keys: {
8959 x: 'x',
8960 value: ["not_found", "report"]
8961 },
8962 names: {
8963 report: 'Errors',
8964 not_found: '404\'s requests'
8965 },
8966 type: 'bar'
8967 };
8968 }
8969 else if (vm.graphType.selected == 'slow_report_graphs') {
8970 vm.reportSlowChartData = {
8971 json: data,
8972 xFormat: '%Y-%m-%dT%H:%M:%S',
8973 keys: {
8974 x: 'x',
8975 value: ["slow_report"]
8976 },
8977 names: {
8978 slow_report: 'Slow reports'
8979 },
8980 type: 'bar'
8981 };
8982 }
8983 else if (vm.graphType.selected == 'response_graphs') {
8984 vm.responseChartData = {
8985 json: data,
8986 xFormat: '%Y-%m-%dT%H:%M:%S',
8987 keys: {
8988 x: 'x',
8989 value: ["today", "days_ago_2", "days_ago_7"]
8990 },
8991 names: {
8992 today: 'Today',
8993 "days_ago_2": '2 days ago',
8994 "days_ago_7": '7 days ago'
8995 }
8996 };
8997 }
8998 else if (vm.graphType.selected == 'requests_graphs') {
8999 vm.requestsChartData = {
9000 json: data,
9001 xFormat: '%Y-%m-%dT%H:%M:%S',
9002 keys: {
9003 x: 'x',
9004 value: ["requests"]
9005 },
9006 names: {
9007 requests: 'Requests/s'
9008 }
9009 };
9010 }
9011 vm.loading.series = false;
9012 }, function(){
9013 vm.loading.series = false;
9025 vm.commonNamespaces = data['namespaces']
9014 9026 });
9015 }
9027 };
9016 9028
9017 vm.fetchSlowCalls = function () {
9018 vm.loading.slowCalls = true;
9019 applicationsPropertyResource.query({
9020 'resourceId': vm.resource,
9021 "start_date": timeSpanToStartDate(vm.timeSpan.key),
9022 'key': 'slow_calls'
9023 }, function (data) {
9024 vm.slowCalls = data;
9025 vm.loading.slowCalls = false;
9026 }, function () {
9027 vm.loading.slowCalls = false;
9029 vm.purgeLogs = function () {
9030 vm.loading.applications = true;
9031 logsNoIdResource.delete({resource:vm.selectedResource,
9032 namespace: vm.namespace}, function(){
9033 vm.loading.applications = false;
9028 9034 });
9029 9035 }
9036 }
9030 9037
9031 vm.fetchRequestsBreakdown = function () {
9032 vm.loading.requestsBreakdown = true;
9033 applicationsPropertyResource.query({
9034 'resourceId': vm.resource,
9035 "start_date": timeSpanToStartDate(vm.timeSpan.key),
9036 'key': 'requests_breakdown'
9037 }, function (data) {
9038 vm.requestsBreakdown = data;
9039 vm.loading.requestsBreakdown = false;
9040 }, function () {
9041 vm.loading.requestsBreakdown = false;
9042 });
9043 }
9038 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9039 // #
9040 // # This program is free software: you can redistribute it and/or modify
9041 // # it under the terms of the GNU Affero General Public License, version 3
9042 // # (only), as published by the Free Software Foundation.
9043 // #
9044 // # This program is distributed in the hope that it will be useful,
9045 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9046 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9047 // # GNU General Public License for more details.
9048 // #
9049 // # You should have received a copy of the GNU Affero General Public License
9050 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9051 // #
9052 // # This program is dual-licensed. If you wish to learn more about the
9053 // # AppEnlight Enterprise Edition, including its added features, Support
9054 // # services, and proprietary license terms, please see
9055 // # https://rhodecode.com/licenses/
9044 9056
9045 vm.fetchTrendingReports = function () {
9057 angular.module('appenlight.controllers').controller('EventsController', EventsController);
9046 9058
9047 if (vm.graphType.selected == 'slow_report_graphs') {
9048 var report_type = 'slow';
9049 }
9050 else {
9051 var report_type = 'error';
9052 }
9059 EventsController.$inject = ['eventsNoIdResource', 'eventsResource'];
9053 9060
9054 vm.loading.reports = true;
9055 vm.trendingReports = applicationsPropertyResource.query({
9056 'key': 'trending_reports',
9057 'resourceId': vm.resource,
9058 "start_date": timeSpanToStartDate(vm.timeSpan.key),
9059 "report_type": report_type
9060 },
9061 function () {
9062 vm.loading.reports = false;
9063 },
9064 function () {
9065 vm.loading.reports = false;
9066 }
9067 );
9068 };
9061 function EventsController(eventsNoIdResource, eventsResource) {
9062 console.info('EventsController');
9063 var vm = this;
9069 9064
9070 $scope.$on('$destroy',function(){
9071 $interval.cancel(vm.intervalId);
9072 });
9065 vm.loading = {events: true};
9073 9066
9074 if (stateHolder.AeUser.applications.length){
9075 vm.show_dashboard = true;
9076 vm.determineStartState();
9077 vm.refreshData();
9067 vm.events = eventsNoIdResource.query(
9068 {key: 'events'},
9069 function (data) {
9070 vm.loading.events = false;
9071 });
9072
9073
9074 vm.closeEvent = function (event) {
9075
9076 eventsResource.update({eventId: event.id}, {status: 0}, function (data) {
9077 event.status = 0;
9078 });
9078 9079 }
9080
9079 9081 }
9080 9082
9081 9083 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9082 9084 // #
9083 9085 // # This program is free software: you can redistribute it and/or modify
9084 9086 // # it under the terms of the GNU Affero General Public License, version 3
9085 9087 // # (only), as published by the Free Software Foundation.
9086 9088 // #
9087 9089 // # This program is distributed in the hope that it will be useful,
9088 9090 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9089 9091 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9090 9092 // # GNU General Public License for more details.
9091 9093 // #
9092 9094 // # You should have received a copy of the GNU Affero General Public License
9093 9095 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9094 9096 // #
9095 9097 // # This program is dual-licensed. If you wish to learn more about the
9096 9098 // # AppEnlight Enterprise Edition, including its added features, Support
9097 9099 // # services, and proprietary license terms, please see
9098 9100 // # https://rhodecode.com/licenses/
9099 9101
9100 9102 angular.module('appenlight.controllers').controller('IndexCtrl', IndexCtrl);
9101 9103
9102 9104 IndexCtrl.$inject = [IndexCtrl];
9103 9105
9104 9106 function IndexCtrl() {
9105 9107 var vm = this;
9106 9108 vm.selected_section = 'errors';
9107 9109 }
9108 9110
9109 9111 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9110 9112 // #
9111 9113 // # This program is free software: you can redistribute it and/or modify
9112 9114 // # it under the terms of the GNU Affero General Public License, version 3
9113 9115 // # (only), as published by the Free Software Foundation.
9114 9116 // #
9115 9117 // # This program is distributed in the hope that it will be useful,
9116 9118 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9117 9119 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9118 9120 // # GNU General Public License for more details.
9119 9121 // #
9120 9122 // # You should have received a copy of the GNU Affero General Public License
9121 9123 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9122 9124 // #
9123 9125 // # This program is dual-licensed. If you wish to learn more about the
9124 9126 // # AppEnlight Enterprise Edition, including its added features, Support
9125 9127 // # services, and proprietary license terms, please see
9126 9128 // # https://rhodecode.com/licenses/
9127 9129
9128 9130 angular.module('appenlight.controllers')
9129 9131 .controller('BitbucketIntegrationCtrl', BitbucketIntegrationCtrl)
9130 9132
9131 9133 BitbucketIntegrationCtrl.$inject = ['$uibModalInstance', '$state', 'report', 'integrationName', 'integrationResource'];
9132 9134
9133 9135 function BitbucketIntegrationCtrl($uibModalInstance, $state, report, integrationName, integrationResource) {
9134 9136 var vm = this;
9135 9137 vm.loading = true;
9136 9138 vm.assignees = [];
9137 9139 vm.report = report;
9138 9140 vm.integrationName = integrationName;
9139 9141 vm.statuses = [];
9140 9142 vm.priorities = [];
9141 9143 vm.error_messages = [];
9142 9144 vm.form = {
9143 9145 content: '\n' +
9144 9146 'Issue created for report: ' +
9145 9147 $state.href('report.view_detail', {groupId:report.group_id, reportId:report.id}, {absolute:true})
9146 9148 };
9147 9149
9148 9150 vm.fetchInfo = function () {
9149 9151 integrationResource.get({
9150 9152 resourceId: vm.report.resource_id,
9151 9153 action: 'info',
9152 9154 integration: vm.integrationName
9153 9155 }, null,
9154 9156 function (data) {
9155 9157 vm.loading = false;
9156 9158 if (data.error_messages) {
9157 9159 vm.error_messages = data.error_messages;
9158 9160 }
9159 9161 vm.assignees = data.assignees;
9160 9162 vm.priorities = data.priorities;
9161 9163 vm.form.responsible = vm.assignees[0];
9162 9164 vm.form.priority = vm.priorities[0];
9163 9165 }, function (error_data) {
9164 9166 if (error_data.data.error_messages) {
9165 9167 vm.error_messages = error_data.data.error_messages;
9166 9168 }
9167 9169 else {
9168 9170 vm.error_messages = ['There was a problem processing your request'];
9169 9171 }
9170 9172 });
9171 9173 };
9172 9174 vm.ok = function () {
9173 9175 vm.loading = true;
9174 9176 vm.form.group_id = vm.report.group_id;
9175 9177 integrationResource.save({
9176 9178 resourceId: vm.report.resource_id,
9177 9179 action: 'create-issue',
9178 9180 integration: vm.integrationName
9179 9181 }, vm.form,
9180 9182 function (data) {
9181 9183 vm.loading = false;
9182 9184 if (data.error_messages) {
9183 9185 vm.error_messages = data.error_messages;
9184 9186 }
9185 9187 if (data !== false) {
9186 9188 $uibModalInstance.dismiss('success');
9187 9189 }
9188 9190 }, function (error_data) {
9189 9191 if (error_data.data.error_messages) {
9190 9192 vm.error_messages = error_data.data.error_messages;
9191 9193 }
9192 9194 else {
9193 9195 vm.error_messages = ['There was a problem processing your request'];
9194 9196 }
9195 9197 });
9196 9198 };
9197 9199 vm.cancel = function () {
9198 9200 $uibModalInstance.dismiss('cancel');
9199 9201 };
9200 9202 vm.fetchInfo();
9201 9203 }
9202 9204
9203 9205 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9204 9206 // #
9205 9207 // # This program is free software: you can redistribute it and/or modify
9206 9208 // # it under the terms of the GNU Affero General Public License, version 3
9207 9209 // # (only), as published by the Free Software Foundation.
9208 9210 // #
9209 9211 // # This program is distributed in the hope that it will be useful,
9210 9212 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9211 9213 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9212 9214 // # GNU General Public License for more details.
9213 9215 // #
9214 9216 // # You should have received a copy of the GNU Affero General Public License
9215 9217 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9216 9218 // #
9217 9219 // # This program is dual-licensed. If you wish to learn more about the
9218 9220 // # AppEnlight Enterprise Edition, including its added features, Support
9219 9221 // # services, and proprietary license terms, please see
9220 9222 // # https://rhodecode.com/licenses/
9221 9223
9222 9224 angular.module('appenlight.controllers')
9223 9225 .controller('GithubIntegrationCtrl', GithubIntegrationCtrl);
9224 9226
9225 9227 GithubIntegrationCtrl.$inject = ['$uibModalInstance', '$state', 'report', 'integrationName', 'integrationResource'];
9226 9228
9227 9229 function GithubIntegrationCtrl($uibModalInstance, $state, report, integrationName, integrationResource) {
9228 9230 var vm = this;
9229 9231 vm.loading = true;
9230 9232 vm.assignees = [];
9231 9233 vm.report = report;
9232 9234 vm.integrationName = integrationName;
9233 9235 vm.statuses = [];
9234 9236 vm.assignees = [];
9235 9237 vm.error_messages = [];
9236 9238 vm.form = {
9237 9239 content: '\n' +
9238 9240 'Issue created for report: ' +
9239 9241 $state.href('report.view_detail', {groupId:report.group_id, reportId:report.id}, {absolute:true})
9240 9242 };
9241 9243
9242 9244 vm.fetchInfo = function () {
9243 9245 integrationResource.get({
9244 9246 resourceId: vm.report.resource_id,
9245 9247 action: 'info',
9246 9248 integration: vm.integrationName
9247 9249 }, null,
9248 9250 function (data) {
9249 9251 vm.loading = false;
9250 9252 if (data.error_messages) {
9251 9253 vm.error_messages = data.error_messages;
9252 9254 }
9253 9255 else {
9254 9256 vm.assignees = data.assignees;
9255 9257 vm.statuses = data.statuses;
9256 9258 vm.form.responsible = vm.assignees[0];
9257 9259 vm.form.status = vm.statuses[0];
9258 9260 }
9259 9261 }, function (error_data) {
9260 9262 if (error_data.data.error_messages) {
9261 9263 vm.error_messages = error_data.data.error_messages;
9262 9264 }
9263 9265 else {
9264 9266 vm.error_messages = ['There was a problem processing your request'];
9265 9267 }
9266 9268 });
9267 9269 };
9268 9270 vm.ok = function () {
9269 9271 vm.loading = true;
9270 9272 vm.form.group_id = vm.report.group_id;
9271 9273 integrationResource.save({
9272 9274 resourceId: vm.report.resource_id,
9273 9275 action: 'create-issue',
9274 9276 integration: vm.integrationName
9275 9277 }, vm.form,
9276 9278 function (data) {
9277 9279 vm.loading = false;
9278 9280 if (data.error_messages) {
9279 9281 vm.error_messages = data.error_messages;
9280 9282 }
9281 9283 else {
9282 9284 $uibModalInstance.dismiss('success');
9283 9285 }
9284 9286 }, function (error_data) {
9285 9287 if (error_data.data.error_messages) {
9286 9288 vm.error_messages = error_data.data.error_messages;
9287 9289 }
9288 9290 else {
9289 9291 vm.error_messages = ['There was a problem processing your request'];
9290 9292 }
9291 9293 });
9292 9294 };
9293 9295 vm.cancel = function () {
9294 9296 $uibModalInstance.dismiss('cancel');
9295 9297 };
9296 9298 vm.fetchInfo();
9297 9299 }
9298 9300
9299 9301 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9300 9302 // #
9301 9303 // # This program is free software: you can redistribute it and/or modify
9302 9304 // # it under the terms of the GNU Affero General Public License, version 3
9303 9305 // # (only), as published by the Free Software Foundation.
9304 9306 // #
9305 9307 // # This program is distributed in the hope that it will be useful,
9306 9308 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9307 9309 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9308 9310 // # GNU General Public License for more details.
9309 9311 // #
9310 9312 // # You should have received a copy of the GNU Affero General Public License
9311 9313 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9312 9314 // #
9313 9315 // # This program is dual-licensed. If you wish to learn more about the
9314 9316 // # AppEnlight Enterprise Edition, including its added features, Support
9315 9317 // # services, and proprietary license terms, please see
9316 9318 // # https://rhodecode.com/licenses/
9317 9319
9318 9320 angular.module('appenlight.controllers')
9319 9321 .controller('JiraIntegrationCtrl', JiraIntegrationCtrl)
9320 9322
9321 9323 JiraIntegrationCtrl.$inject = ['$uibModalInstance', '$state', 'report', 'integrationName', 'integrationResource'];
9322 9324
9323 9325 function JiraIntegrationCtrl($uibModalInstance, $state, report, integrationName, integrationResource) {
9324 9326 var vm = this;
9325 9327 vm.loading = true;
9326 9328 vm.assignees = [];
9327 9329 vm.report = report;
9328 9330 vm.integrationName = integrationName;
9329 9331 vm.statuses = [];
9330 9332 vm.priorities = [];
9331 9333 vm.issue_types = [];
9332 9334 vm.error_messages = [];
9333 9335 vm.form = {
9334 9336 content: '\n' +
9335 9337 'Issue created for report: ' +
9336 9338 $state.href('report.view_detail', {groupId:report.group_id, reportId:report.id}, {absolute:true})
9337 9339 };
9338 9340
9339 9341 vm.fetchInfo = function () {
9340 9342 integrationResource.get({
9341 9343 resourceId: vm.report.resource_id,
9342 9344 action: 'info',
9343 9345 integration: vm.integrationName
9344 9346 }, null,
9345 9347 function (data) {
9346 9348 vm.loading = false;
9347 9349 if (data.error_messages) {
9348 9350 vm.error_messages = data.error_messages;
9349 9351 }
9350 9352 vm.assignees = data.assignees;
9351 9353 vm.priorities = data.priorities;
9352 9354 vm.issue_types = data.issue_types;
9353 9355 vm.form.issue_type = vm.issue_types[0];
9354 9356 vm.form.responsible = vm.assignees[0];
9355 9357 vm.form.priority = vm.priorities[0];
9356 9358 }, function (error_data) {
9357 9359
9358 9360 if (error_data.data.error_messages) {
9359 9361 vm.error_messages = error_data.data.error_messages;
9360 9362 }
9361 9363 else {
9362 9364 vm.error_messages = ['There was a problem processing your request'];
9363 9365 }
9364 9366 });
9365 9367 };
9366 9368 vm.ok = function () {
9367 9369 vm.loading = true;
9368 9370 vm.form.group_id = vm.report.group_id;
9369 9371 integrationResource.save({
9370 9372 resourceId: vm.report.resource_id,
9371 9373 action: 'create-issue',
9372 9374 integration: vm.integrationName
9373 9375 }, vm.form,
9374 9376 function (data) {
9375 9377 vm.loading = false;
9376 9378 if (data.error_messages) {
9377 9379 vm.error_messages = data.error_messages;
9378 9380 }
9379 9381 if (data !== false) {
9380 9382 $uibModalInstance.dismiss('success');
9381 9383 }
9382 9384 }, function (error_data) {
9383 9385 if (error_data.data.error_messages) {
9384 9386 vm.error_messages = error_data.data.error_messages;
9385 9387 }
9386 9388 else {
9387 9389 vm.error_messages = ['There was a problem processing your request'];
9388 9390 }
9389 9391 });
9390 9392 };
9391 9393 vm.cancel = function () {
9392 9394 $uibModalInstance.dismiss('cancel');
9393 9395 };
9394 9396 vm.fetchInfo();
9395 9397 }
9396 9398
9397 9399 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9398 9400 // #
9399 9401 // # This program is free software: you can redistribute it and/or modify
9400 9402 // # it under the terms of the GNU Affero General Public License, version 3
9401 9403 // # (only), as published by the Free Software Foundation.
9402 9404 // #
9403 9405 // # This program is distributed in the hope that it will be useful,
9404 9406 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9405 9407 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9406 9408 // # GNU General Public License for more details.
9407 9409 // #
9408 9410 // # You should have received a copy of the GNU Affero General Public License
9409 9411 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9410 9412 // #
9411 9413 // # This program is dual-licensed. If you wish to learn more about the
9412 9414 // # AppEnlight Enterprise Edition, including its added features, Support
9413 9415 // # services, and proprietary license terms, please see
9414 9416 // # https://rhodecode.com/licenses/
9415 9417
9416 9418 angular.module('appenlight.controllers').controller('LogsController', LogsController);
9417 9419
9418 9420 LogsController.$inject = ['$location', 'stateHolder', 'typeAheadTagHelper', 'logsNoIdResource', 'sectionViewResource'];
9419 9421
9420 9422 function LogsController($location, stateHolder, typeAheadTagHelper, logsNoIdResource, sectionViewResource) {
9421 9423 var vm = this;
9422 9424 vm.logEventsChartConfig = {
9423 9425 data: {
9424 9426 json: [],
9425 9427 xFormat: '%Y-%m-%dT%H:%M:%S'
9426 9428 },
9427 9429 color: {
9428 9430 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
9429 9431 },
9430 9432 axis: {
9431 9433 x: {
9432 9434 type: 'timeseries',
9433 9435 tick: {
9434 9436 format: '%Y-%m-%d'
9435 9437 }
9436 9438 },
9437 9439 y: {
9438 9440 tick: {
9439 9441 count: 5,
9440 9442 format: d3.format('.2s')
9441 9443 }
9442 9444 }
9443 9445 },
9444 9446 subchart: {
9445 9447 show: true,
9446 9448 size: {
9447 9449 height: 20
9448 9450 }
9449 9451 },
9450 9452 size: {
9451 9453 height: 250
9452 9454 },
9453 9455 zoom: {
9454 9456 rescale: true
9455 9457 },
9456 9458 grid: {
9457 9459 x: {
9458 9460 show: true
9459 9461 },
9460 9462 y: {
9461 9463 show: true
9462 9464 }
9463 9465 },
9464 9466 tooltip: {
9465 9467 format: {
9466 9468 title: function (d) {
9467 9469 return '' + d;
9468 9470 },
9469 9471 value: function (v) {
9470 9472 return v
9471 9473 }
9472 9474 }
9473 9475 }
9474 9476 };
9475 9477 vm.logEventsChartData = {};
9476 9478 stateHolder.section = 'logs';
9477 9479 vm.today = function () {
9478 9480 vm.pickerDate = new Date();
9479 9481 };
9480 9482 vm.today();
9481 9483
9482 9484 vm.applications = stateHolder.AeUser.applications_map;
9483 9485 vm.logsPage = [];
9484 9486 vm.itemCount = 0;
9485 9487 vm.itemsPerPage = 250;
9486 9488 vm.page = 1;
9487 9489 vm.$location = $location;
9488 9490 vm.isLoading = {
9489 9491 logs: true,
9490 9492 series: true
9491 9493 };
9492 9494 vm.filterTypeAheadOptions = [
9493 9495 {
9494 9496 type: 'message',
9495 9497 text: 'message:',
9496 9498 'description': 'Full-text search in your logs',
9497 9499 tag: 'Message',
9498 9500 example: 'message:text-im-looking-for'
9499 9501 },
9500 9502 {
9501 9503 type: 'namespace',
9502 9504 text: 'namespace:',
9503 9505 'description': 'Query logs from specific namespace',
9504 9506 tag: 'Namespace',
9505 9507 example: "namespace:module.foo"
9506 9508 },
9507 9509 {
9508 9510 type: 'resource',
9509 9511 text: 'resource:',
9510 9512 'description': 'Restrict resultset to application',
9511 9513 tag: 'Application',
9512 9514 example: "resource:ID"
9513 9515 },
9514 9516 {
9515 9517 type: 'request_id',
9516 9518 text: 'request_id:',
9517 9519 'description': 'Show logs with specific request id',
9518 9520 example: "request_id:883143dc572e4c38aceae92af0ea5ae0",
9519 9521 tag: 'Request ID'
9520 9522 },
9521 9523 {
9522 9524 type: 'level',
9523 9525 text: 'level:',
9524 9526 'description': 'Show entries with specific log level',
9525 9527 example: 'level:warning',
9526 9528 tag: 'Level'
9527 9529 },
9528 9530 {
9529 9531 type: 'server_name',
9530 9532 text: 'server_name:',
9531 9533 'description': 'Show entries tagged with this key/value pair',
9532 9534 example: 'server_name:hostname',
9533 9535 tag: 'Tag'
9534 9536 },
9535 9537 {
9536 9538 type: 'start_date',
9537 9539 text: 'start_date:',
9538 9540 'description': 'Show results newer than this date (press TAB for dropdown)',
9539 9541 example: 'start_date:2014-08-15T13:00',
9540 9542 tag: 'Start Date'
9541 9543 },
9542 9544 {
9543 9545 type: 'end_date',
9544 9546 text: 'end_date:',
9545 9547 'description': 'Show results older than this date (press TAB for dropdown)',
9546 9548 example: 'start_date:2014-08-15T23:59',
9547 9549 tag: 'End Date'
9548 9550 },
9549 9551 {type: 'level', value: 'debug', text: 'level:debug'},
9550 9552 {type: 'level', value: 'info', text: 'level:info'},
9551 9553 {type: 'level', value: 'warning', text: 'level:warning'},
9552 9554 {type: 'level', value: 'critical', text: 'level:critical'}
9553 9555 ];
9554 9556 vm.filterTypeAhead = null;
9555 9557 vm.showDatePicker = false;
9556 9558 vm.manualOpen = false;
9557 9559 vm.aheadFilter = typeAheadTagHelper.aheadFilter;
9558 9560 vm.removeSearchTag = function (tag) {
9559 9561 $location.search(tag.type, null);
9560 9562 vm.refresh();
9561 9563 };
9562 9564 vm.addSearchTag = function (tag) {
9563 9565 $location.search(tag.type, tag.value);
9564 9566 vm.refresh();
9565 9567 };
9566 9568
9567 9569 vm.paginationChange = function(){
9568 9570 $location.search('page', vm.page);
9569 9571 vm.refresh();
9570 9572 };
9571 9573
9572 9574
9573 9575 _.each(vm.applications, function (item) {
9574 9576 vm.filterTypeAheadOptions.push({
9575 9577 type: 'resource',
9576 9578 text: 'resource:' + item.resource_id + ':' + item.resource_name,
9577 9579 example: 'resource:' + item.resource_id,
9578 9580 'tag': item.resource_name,
9579 9581 'description': 'Restrict resultset to this application'
9580 9582 });
9581 9583 });
9582 9584
9583 9585 vm.typeAheadTag = function (event) {
9584 9586 var text = vm.filterTypeAhead;
9585 9587 if (_.isObject(vm.filterTypeAhead)) {
9586 9588 text = vm.filterTypeAhead.text;
9587 9589 };
9588 9590 if (!vm.filterTypeAhead) {
9589 9591 return
9590 9592 }
9591 9593 var parsed = text.split(':');
9592 9594 var tag = {'type': null, 'value': null};
9593 9595 // app tags have : twice
9594 9596 if (parsed.length > 2 && parsed[0] == 'resource') {
9595 9597 tag.type = 'resource';
9596 9598 tag.value = parsed[1];
9597 9599 }
9598 9600 // normal tag:value
9599 9601 else if (parsed.length > 1) {
9600 9602 tag.type = parsed[0];
9601 9603 tag.value = parsed.slice(1).join(':');
9602 9604 }
9603 9605 else {
9604 9606 tag.type = 'message';
9605 9607 tag.value = parsed.join(':');
9606 9608 }
9607 9609
9608 9610 // set datepicker hour based on type of field
9609 9611 if ('start_date:' == text) {
9610 9612 vm.showDatePicker = true;
9611 9613 vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format();
9612 9614 }
9613 9615 else if ('end_date:' == text) {
9614 9616 vm.showDatePicker = true;
9615 9617 vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format();
9616 9618 }
9617 9619
9618 9620 if (event.keyCode != 13 || !tag.type || !tag.value) {
9619 9621 return
9620 9622 }
9621 9623 vm.showDatePicker = false;
9622 9624 // aka we selected one of main options
9623 9625 vm.addSearchTag({type: tag.type, value: tag.value});
9624 9626 // clear typeahead
9625 9627 vm.filterTypeAhead = undefined;
9626 9628 };
9627 9629
9628 9630
9629 9631 vm.pickerDateChanged = function(){
9630 9632 if (vm.filterTypeAhead.indexOf('start_date:') == '0') {
9631 9633 vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format();
9632 9634 }
9633 9635 else if (vm.filterTypeAhead.indexOf('end_date:') == '0') {
9634 9636 vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format();
9635 9637 }
9636 9638 vm.showDatePicker = false;
9637 9639 };
9638 9640
9639 9641 vm.fetchLogs = function (searchParams) {
9640 9642 vm.isLoading.logs = true;
9641 9643 logsNoIdResource.query(searchParams, function (data, getResponseHeaders) {
9642 9644 vm.isLoading.logs = false;
9643 9645 var headers = getResponseHeaders();
9644 9646 vm.logsPage = data;
9645 9647 vm.itemCount = headers['x-total-count'];
9646 9648 vm.itemsPerPage = headers['x-items-per-page'];
9647 9649 }, function () {
9648 9650 vm.isLoading.logs = false;
9649 9651 });
9650 9652 };
9651 9653
9652 9654 vm.fetchSeriesData = function (searchParams) {
9653 9655 searchParams['section'] = 'logs_section';
9654 9656 searchParams['view'] = 'fetch_series';
9655 9657 vm.isLoading.series = true;
9656 9658 sectionViewResource.query(searchParams, function (data) {
9657 9659
9658 9660 vm.logEventsChartData = {
9659 9661 json: data,
9660 9662 xFormat: '%Y-%m-%dT%H:%M:%S',
9661 9663 keys: {
9662 9664 x: 'x',
9663 9665 value: ["logs"]
9664 9666 },
9665 9667 names: {
9666 9668 logs: 'Log events'
9667 9669 },
9668 9670 type: 'bar'
9669 9671 };
9670 9672 vm.isLoading.series = false;
9671 9673 }, function () {
9672 9674 vm.isLoading.series = false;
9673 9675 });
9674 9676 };
9675 9677
9676 9678 vm.filterId = function (log) {
9677 9679 $location.search('request_id', log.request_id);
9678 9680 vm.refresh();
9679 9681 };
9680 9682
9681 9683 vm.refresh = function(){
9682 9684 vm.searchParams = parseSearchToTags($location.search());
9683 9685 vm.page = Number(vm.searchParams.page) || 1;
9684 9686 var params = parseTagsToSearch(vm.searchParams);
9685 9687 vm.fetchLogs(params);
9686 9688 vm.fetchSeriesData(params);
9687 9689 };
9688 9690 console.info('page load');
9689 9691 vm.refresh();
9690 9692 }
9691 9693
9692 9694 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9693 9695 // #
9694 9696 // # This program is free software: you can redistribute it and/or modify
9695 9697 // # it under the terms of the GNU Affero General Public License, version 3
9696 9698 // # (only), as published by the Free Software Foundation.
9697 9699 // #
9698 9700 // # This program is distributed in the hope that it will be useful,
9699 9701 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9700 9702 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9701 9703 // # GNU General Public License for more details.
9702 9704 // #
9703 9705 // # You should have received a copy of the GNU Affero General Public License
9704 9706 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9705 9707 // #
9706 9708 // # This program is dual-licensed. If you wish to learn more about the
9707 9709 // # AppEnlight Enterprise Edition, including its added features, Support
9708 9710 // # services, and proprietary license terms, please see
9709 9711 // # https://rhodecode.com/licenses/
9710 9712
9711 9713 angular.module('appenlight.controllers')
9712 9714 .controller('OverviewCtrl', OverviewCtrl);
9713 9715
9714 9716 OverviewCtrl.$inject = [];
9715 9717
9716 9718 function OverviewCtrl() {
9717 9719
9718 9720 }
9719 9721
9720 9722 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9721 9723 // #
9722 9724 // # This program is free software: you can redistribute it and/or modify
9723 9725 // # it under the terms of the GNU Affero General Public License, version 3
9724 9726 // # (only), as published by the Free Software Foundation.
9725 9727 // #
9726 9728 // # This program is distributed in the hope that it will be useful,
9727 9729 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9728 9730 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9729 9731 // # GNU General Public License for more details.
9730 9732 // #
9731 9733 // # You should have received a copy of the GNU Affero General Public License
9732 9734 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9733 9735 // #
9734 9736 // # This program is dual-licensed. If you wish to learn more about the
9735 9737 // # AppEnlight Enterprise Edition, including its added features, Support
9736 9738 // # services, and proprietary license terms, please see
9737 9739 // # https://rhodecode.com/licenses/
9738 9740
9739 9741 angular.module('appenlight.controllers')
9740 9742 .controller('RegisterController', RegisterController);
9741 9743
9742 9744 RegisterController.$inject = ['$scope', '$location'];
9743 9745
9744 9746 function RegisterController() {
9745 9747 var vm = this;
9746 9748 vm.selected_form = 'sign-up';
9747 9749 if (window.location.search.indexOf('sign_in') != -1 || window.location.search.indexOf('came_from') != -1) {
9748 9750 vm.selected_form = 'sign-in';
9749 9751 }
9750 9752 }
9751 9753
9752 9754 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9753 9755 // #
9754 9756 // # This program is free software: you can redistribute it and/or modify
9755 9757 // # it under the terms of the GNU Affero General Public License, version 3
9756 9758 // # (only), as published by the Free Software Foundation.
9757 9759 // #
9758 9760 // # This program is distributed in the hope that it will be useful,
9759 9761 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9760 9762 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9761 9763 // # GNU General Public License for more details.
9762 9764 // #
9763 9765 // # You should have received a copy of the GNU Affero General Public License
9764 9766 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9765 9767 // #
9766 9768 // # This program is dual-licensed. If you wish to learn more about the
9767 9769 // # AppEnlight Enterprise Edition, including its added features, Support
9768 9770 // # services, and proprietary license terms, please see
9769 9771 // # https://rhodecode.com/licenses/
9770 9772
9771 9773 angular.module('appenlight.controllers').controller('AssignReportCtrl', AssignReportCtrl);
9772 9774 AssignReportCtrl.$inject = ['$uibModalInstance', 'reportGroupPropertyResource', 'report'];
9773 9775
9774 9776 function AssignReportCtrl($uibModalInstance, reportGroupPropertyResource, report) {
9775 9777 var vm = this;
9776 9778 vm.loading = true;
9777 9779 vm.assignedUsers = [];
9778 9780 vm.unAssignedUsers = [];
9779 9781 vm.report = report;
9780 9782 vm.fetchAssignments = function () {
9781 9783 reportGroupPropertyResource.get({
9782 9784 groupId: vm.report.group_id,
9783 9785 key: 'assigned_users'
9784 9786 }, null,
9785 9787 function (data) {
9786 9788 vm.assignedUsers = data.assigned;
9787 9789 vm.unAssignedUsers = data.unassigned;
9788 9790 vm.loading = false;
9789 9791 });
9790 9792 }
9791 9793
9792 9794 vm.reassignUser = function (user) {
9793 9795 var is_assigned = vm.assignedUsers.indexOf(user);
9794 9796 if (is_assigned != -1) {
9795 9797 vm.assignedUsers.splice(is_assigned, 1);
9796 9798 vm.unAssignedUsers.push(user);
9797 9799 return
9798 9800 }
9799 9801 var is_unassigned = vm.unAssignedUsers.indexOf(user);
9800 9802 if (is_unassigned != -1) {
9801 9803 vm.unAssignedUsers.splice(is_unassigned, 1);
9802 9804 vm.assignedUsers.push(user);
9803 9805 return
9804 9806 }
9805 9807 }
9806 9808 vm.updateAssignments = function () {
9807 9809 var post = {'unassigned': [], 'assigned': []};
9808 9810 _.each(vm.assignedUsers, function (u) {
9809 9811 post['assigned'].push(u.user_name)
9810 9812 });
9811 9813 _.each(vm.unAssignedUsers, function (u) {
9812 9814 post['unassigned'].push(u.user_name)
9813 9815 });
9814 9816 vm.loading = true;
9815 9817 reportGroupPropertyResource.update({
9816 9818 groupId: vm.report.group_id,
9817 9819 key: 'assigned_users'
9818 9820 }, post,
9819 9821 function (data) {
9820 9822 vm.loading = false;
9821 9823 $uibModalInstance.close(vm.report);
9822 9824 });
9823 9825 };
9824 9826
9825 9827
9826 9828 vm.ok = function () {
9827 9829 vm.updateAssignments();
9828 9830 };
9829 9831
9830 9832 vm.cancel = function () {
9831 9833 $uibModalInstance.dismiss('cancel');
9832 9834 };
9833 9835
9834 9836 vm.fetchAssignments();
9835 9837
9836 9838 }
9837 9839
9838 9840 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
9839 9841 // #
9840 9842 // # This program is free software: you can redistribute it and/or modify
9841 9843 // # it under the terms of the GNU Affero General Public License, version 3
9842 9844 // # (only), as published by the Free Software Foundation.
9843 9845 // #
9844 9846 // # This program is distributed in the hope that it will be useful,
9845 9847 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9846 9848 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9847 9849 // # GNU General Public License for more details.
9848 9850 // #
9849 9851 // # You should have received a copy of the GNU Affero General Public License
9850 9852 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
9851 9853 // #
9852 9854 // # This program is dual-licensed. If you wish to learn more about the
9853 9855 // # AppEnlight Enterprise Edition, including its added features, Support
9854 9856 // # services, and proprietary license terms, please see
9855 9857 // # https://rhodecode.com/licenses/
9856 9858
9857 9859 'use strict';
9858 9860
9859 9861 /* Controllers */
9860 9862
9861 9863 angular.module('appenlight.controllers')
9862 9864 .controller('ReportsListSlowController', ReportsListSlowController);
9863 9865
9864 9866 ReportsListSlowController.$inject = ['$location', '$cookies',
9865 9867 'stateHolder', 'typeAheadTagHelper', 'slowReportsResource']
9866 9868
9867 9869 function ReportsListSlowController($location, $cookies, stateHolder, typeAheadTagHelper, slowReportsResource) {
9868 9870 var vm = this;
9869 9871 vm.applications = stateHolder.AeUser.applications_map;
9870 9872 stateHolder.section = 'slow_reports';
9871 9873 vm.today = function () {
9872 9874 vm.pickerDate = new Date();
9873 9875 };
9874 9876 vm.today();
9875 9877 vm.reportsPage = [];
9876 9878 vm.page = 1;
9877 9879 vm.itemCount = 0;
9878 9880 vm.itemsPerPage = 250;
9879 9881 typeAheadTagHelper.tags = [];
9880 9882 vm.searchParams = {tags: [], page: 1, type: 'slow_report'};
9881 9883 vm.is_loading = false;
9882 9884 vm.filterTypeAheadOptions = [
9883 9885 {
9884 9886 type: 'view_name',
9885 9887 text: 'view_name:',
9886 9888 'description': 'Query reports occured in specific views',
9887 9889 tag: 'View Name',
9888 9890 example: "view_name:module.foo"
9889 9891 },
9890 9892 {
9891 9893 type: 'resource',
9892 9894 text: 'resource:',
9893 9895 'description': 'Restrict resultset to application',
9894 9896 tag: 'Application',
9895 9897 example: "resource:ID"
9896 9898 },
9897 9899 {
9898 9900 type: 'priority',
9899 9901 text: 'priority:',
9900 9902 'description': 'Show reports with specific priority',
9901 9903 example: 'priority:8',
9902 9904 tag: 'Priority'
9903 9905 },
9904 9906 {
9905 9907 type: 'min_occurences',
9906 9908 text: 'min_occurences:',
9907 9909 'description': 'Show reports from groups with at least X occurences',
9908 9910 example: 'min_occurences:25',
9909 9911 tag: 'Min. occurences'
9910 9912 },
9911 9913 {
9912 9914 type: 'min_duration',
9913 9915 text: 'min_duration:',
9914 9916 'description': 'Show reports from groups with average duration >= Xs',
9915 9917 example: 'min_duration:4.5',
9916 9918 tag: 'Min. duration'
9917 9919 },
9918 9920 {
9919 9921 type: 'url_path',
9920 9922 text: 'url_path:',
9921 9923 'description': 'Show reports from specific URL paths',
9922 9924 example: 'url_path:/foo/bar/baz',
9923 9925 tag: 'Url Path'
9924 9926 },
9925 9927 {
9926 9928 type: 'url_domain',
9927 9929 text: 'url_domain:',
9928 9930 'description': 'Show reports from specific domain',
9929 9931 example: 'url_domain:domain.com',
9930 9932 tag: 'Domain'
9931 9933 },
9932 9934 {
9933 9935 type: 'request_id',
9934 9936 text: 'request_id:',
9935 9937 'description': 'Show reports with specific request id',
9936 9938 example: "request_id:883143dc572e4c38aceae92af0ea5ae0",
9937 9939 tag: 'Request ID'
9938 9940 },
9939 9941 {
9940 9942 type: 'report_status',
9941 9943 text: 'report_status:',
9942 9944 'description': 'Show reports from groups with specific status',
9943 9945 example: 'report_status:never_reviewed',
9944 9946 tag: 'Status'
9945 9947 },
9946 9948 {
9947 9949 type: 'server_name',
9948 9950 text: 'server_name:',
9949 9951 'description': 'Show reports tagged with this key/value pair',
9950 9952 example: 'server_name:hostname',
9951 9953 tag: 'Tag'
9952 9954 },
9953 9955 {
9954 9956 type: 'start_date',
9955 9957 text: 'start_date:',
9956 9958 'description': 'Show reports newer than this date (press TAB for dropdown)',
9957 9959 example: 'start_date:2014-08-15T13:00',
9958 9960 tag: 'Start Date'
9959 9961 },
9960 9962 {
9961 9963 type: 'end_date',
9962 9964 text: 'end_date:',
9963 9965 'description': 'Show reports older than this date (press TAB for dropdown)',
9964 9966 example: 'start_date:2014-08-15T23:59',
9965 9967 tag: 'End Date'
9966 9968 }
9967 9969 ];
9968 9970
9969 9971 vm.filterTypeAhead = undefined;
9970 9972 vm.showDatePicker = false;
9971 9973 vm.aheadFilter = typeAheadTagHelper.aheadFilter;
9972 9974 vm.removeSearchTag = function (tag) {
9973 9975 $location.search(tag.type, null);
9974 9976 vm.refresh();
9975 9977 };
9976 9978 vm.addSearchTag = function (tag) {
9977 9979 $location.search(tag.type, tag.value);
9978 9980 vm.refresh();
9979 9981 };
9980 9982 vm.manualOpen = false;
9981 9983 vm.notRelativeTime = false;
9982 9984 if ($cookies.notRelativeTime) {
9983 9985 vm.notRelativeTime = JSON.parse($cookies.notRelativeTime);
9984 9986 }
9985 9987
9986 9988
9987 9989 vm.changeRelativeTime = function () {
9988 9990 $cookies.notRelativeTime = JSON.stringify(vm.notRelativeTime);
9989 9991 };
9990 9992
9991 9993 _.each(_.range(1, 11), function (priority) {
9992 9994 vm.filterTypeAheadOptions.push({
9993 9995 type: 'priority',
9994 9996 text: 'priority:' + priority.toString(),
9995 9997 description: 'Show entries with specific priority',
9996 9998 example: 'priority:' + priority,
9997 9999 tag: 'Priority'
9998 10000 });
9999 10001 });
10000 10002 _.each(['never_reviewed', 'reviewed', 'fixed', 'public'], function (status) {
10001 10003 vm.filterTypeAheadOptions.push({
10002 10004 type: 'report_status',
10003 10005 text: 'report_status:' + status,
10004 10006 'description': 'Show only reports with this status',
10005 10007 example: 'report_status:' + status,
10006 10008 tag: 'Status ' + status.toUpperCase()
10007 10009 });
10008 10010 });
10009 10011 _.each(stateHolder.AeUser.applications, function (item) {
10010 10012 vm.filterTypeAheadOptions.push({
10011 10013 type: 'resource',
10012 10014 text: 'resource:' + item.resource_id + ':' + item.resource_name,
10013 10015 example: 'resource:' + item.resource_id,
10014 10016 'tag': item.resource_name,
10015 10017 'description': 'Restrict resultset to this application'
10016 10018 });
10017 10019 });
10018 10020
10019 10021 vm.typeAheadTag = function (event) {
10020 10022 var text = vm.filterTypeAhead;
10021 10023 if (_.isObject(vm.filterTypeAhead)) {
10022 10024 text = vm.filterTypeAhead.text;
10023 10025 };
10024 10026 if (!vm.filterTypeAhead) {
10025 10027 return
10026 10028 }
10027 10029 var parsed = text.split(':');
10028 10030 var tag = {'type': null, 'value': null};
10029 10031 // app tags have : twice
10030 10032 if (parsed.length > 2 && parsed[0] == 'resource') {
10031 10033 tag.type = 'resource';
10032 10034 tag.value = parsed[1];
10033 10035 }
10034 10036 // normal tag:value
10035 10037 else if (parsed.length > 1) {
10036 10038 tag.type = parsed[0];
10037 10039 var tagValue = parsed.slice(1);
10038 10040 if (tagValue) {
10039 10041 tag.value = tagValue.join(':');
10040 10042 }
10041 10043 }
10042 10044
10043 10045 // set datepicker hour based on type of field
10044 10046 if ('start_date:' == text) {
10045 10047 vm.showDatePicker = true;
10046 10048 vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format();
10047 10049 }
10048 10050 else if ('end_date:' == text) {
10049 10051 vm.showDatePicker = true;
10050 10052 vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format();
10051 10053 }
10052 10054
10053 10055 if (event.keyCode != 13 || !tag.type || !tag.value) {
10054 10056 return
10055 10057 }
10056 10058 vm.showDatePicker = false;
10057 10059 // aka we selected one of main options
10058 10060 vm.addSearchTag({type: tag.type, value: tag.value});
10059 10061 // clear typeahead
10060 10062 vm.filterTypeAhead = undefined;
10061 10063 };
10062 10064
10063 10065 vm.paginationChange = function(){
10064 10066 $location.search('page', vm.page);
10065 10067 vm.refresh();
10066 10068 };
10067 10069
10068 10070 vm.pickerDateChanged = function(){
10069 10071 if (vm.filterTypeAhead.indexOf('start_date:') == '0') {
10070 10072 vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format();
10071 10073 }
10072 10074 else if (vm.filterTypeAhead.indexOf('end_date:') == '0') {
10073 10075 vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format();
10074 10076 }
10075 10077 vm.showDatePicker = false;
10076 10078 };
10077 10079
10078 10080 var reportPresentation = function (report) {
10079 10081 report.presentation = {};
10080 10082 if (report.group.public) {
10081 10083 report.presentation.className = 'public';
10082 10084 report.presentation.tooltip = 'Public';
10083 10085 }
10084 10086 else if (report.group.fixed) {
10085 10087 report.presentation.className = 'fixed';
10086 10088 report.presentation.tooltip = 'Fixed';
10087 10089 }
10088 10090 else if (report.group.read) {
10089 10091 report.presentation.className = 'reviewed';
10090 10092 report.presentation.tooltip = 'Reviewed';
10091 10093 }
10092 10094 else {
10093 10095 report.presentation.className = 'new';
10094 10096 report.presentation.tooltip = 'New';
10095 10097 }
10096 10098 return report;
10097 10099 };
10098 10100
10099 10101 vm.fetchReports = function (searchParams) {
10100 10102 vm.is_loading = true;
10101 10103 slowReportsResource.query(searchParams, function (data, getResponseHeaders) {
10102 10104 var headers = getResponseHeaders();
10103 10105
10104 10106 vm.is_loading = false;
10105 10107 vm.reportsPage = _.map(data, function (item) {
10106 10108 return reportPresentation(item);
10107 10109 });
10108 10110 vm.itemCount = headers['x-total-count'];
10109 10111 vm.itemsPerPage = headers['x-items-per-page'];
10110 10112 }, function () {
10111 10113 vm.is_loading = false;
10112 10114 });
10113 10115 };
10114 10116
10115 10117 vm.filterId = function (log) {
10116 10118 vm.searchParams.tags.push({
10117 10119 type: "request_id",
10118 10120 value: log.request_id
10119 10121 });
10120 10122 vm.refresh();
10121 10123 };
10122 10124 vm.refresh = function(){
10123 10125 vm.searchParams = parseSearchToTags($location.search());
10124 10126 vm.page = Number(vm.searchParams.page) || 1;
10125 10127 var params = parseTagsToSearch(vm.searchParams);
10126 10128 vm.fetchReports(params);
10127 10129 };
10128 10130
10129 10131 //initial load
10130 10132 vm.refresh();
10131 10133 }
10132 10134
10133 10135 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
10134 10136 // #
10135 10137 // # This program is free software: you can redistribute it and/or modify
10136 10138 // # it under the terms of the GNU Affero General Public License, version 3
10137 10139 // # (only), as published by the Free Software Foundation.
10138 10140 // #
10139 10141 // # This program is distributed in the hope that it will be useful,
10140 10142 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
10141 10143 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10142 10144 // # GNU General Public License for more details.
10143 10145 // #
10144 10146 // # You should have received a copy of the GNU Affero General Public License
10145 10147 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
10146 10148 // #
10147 10149 // # This program is dual-licensed. If you wish to learn more about the
10148 10150 // # AppEnlight Enterprise Edition, including its added features, Support
10149 10151 // # services, and proprietary license terms, please see
10150 10152 // # https://rhodecode.com/licenses/
10151 10153
10152 10154 angular.module('appenlight.controllers')
10153 10155 .controller('ReportsListController', ReportsListController);
10154 10156
10155 10157 ReportsListController.$inject = ['$location', '$cookies',
10156 10158 'stateHolder', 'typeAheadTagHelper', 'reportsResource'];
10157 10159
10158 10160 function ReportsListController($location, $cookies, stateHolder,
10159 10161 typeAheadTagHelper, reportsResource) {
10160 10162 var vm = this;
10161 10163 vm.applications = stateHolder.AeUser.applications_map;
10162 10164 stateHolder.section = 'reports';
10163 10165 vm.today = function () {
10164 10166 vm.pickerDate = new Date();
10165 10167 };
10166 10168 vm.today();
10167 10169 vm.reportsPage = [];
10168 10170 vm.page = 1;
10169 10171 vm.itemCount = 0;
10170 10172 vm.itemsPerPage = 250;
10171 10173 typeAheadTagHelper.tags = [];
10172 10174 vm.searchParams = {tags: [], page: 1, type: 'report'};
10173 10175 vm.is_loading = false;
10174 10176 vm.filterTypeAheadOptions = [
10175 10177 {
10176 10178 type: 'error',
10177 10179 text: 'error:',
10178 10180 'description': 'Full-text search in your reports',
10179 10181 example: 'error:text-im-looking-for',
10180 10182 tag: 'Error'
10181 10183 },
10182 10184 {
10183 10185 type: 'view_name',
10184 10186 text: 'view_name:',
10185 10187 'description': 'Query reports occured in specific views',
10186 10188 example: "view_name:module.foo",
10187 10189 tag: 'View Name'
10188 10190 },
10189 10191 {
10190 10192 type: 'resource',
10191 10193 text: 'resource:',
10192 10194 'description': 'Restrict resultset to application',
10193 10195 example: "resource:ID",
10194 10196 tag: 'Application'
10195 10197 },
10196 10198 {
10197 10199 type: 'priority',
10198 10200 text: 'priority:',
10199 10201 'description': 'Show reports with specific priority',
10200 10202 example: 'priority:8',
10201 10203 tag: 'Priority'
10202 10204 },
10203 10205 {
10204 10206 type: 'min_occurences',
10205 10207 text: 'min_occurences:',
10206 10208 'description': 'Show reports from groups with at least X occurences',
10207 10209 example: 'min_occurences:25',
10208 10210 tag: 'Occurences'
10209 10211 },
10210 10212 {
10211 10213 type: 'url_path',
10212 10214 text: 'url_path:',
10213 10215 'description': 'Show reports from specific URL paths',
10214 10216 example: 'url_path:/foo/bar/baz',
10215 10217 tag: 'Url Path'
10216 10218 },
10217 10219 {
10218 10220 type: 'url_domain',
10219 10221 text: 'url_domain:',
10220 10222 'description': 'Show reports from specific domain',
10221 10223 example: 'url_domain:domain.com',
10222 10224 tag: 'Domain'
10223 10225 },
10224 10226 {
10225 10227 type: 'report_status',
10226 10228 text: 'report_status:',
10227 10229 'description': 'Show reports from groups with specific status',
10228 10230 example: 'report_status:never_reviewed',
10229 10231 tag: 'Status'
10230 10232 },
10231 10233 {
10232 10234 type: 'request_id',
10233 10235 text: 'request_id:',
10234 10236 'description': 'Show reports with specific request id',
10235 10237 example: "request_id:883143dc572e4c38aceae92af0ea5ae0",
10236 10238 tag: 'Request ID'
10237 10239 },
10238 10240 {
10239 10241 type: 'server_name',
10240 10242 text: 'server_name:',
10241 10243 'description': 'Show reports tagged with this key/value pair',
10242 10244 example: 'server_name:hostname',
10243 10245 tag: 'Tag'
10244 10246 },
10245 10247 {
10246 10248 type: 'http_status',
10247 10249 text: 'http_status:',
10248 10250 'description': 'Show reports with specific HTTP status code',
10249 10251 example: "http_status:",
10250 10252 tag: 'HTTP Status'
10251 10253 },
10252 10254 {
10253 10255 type: 'http_status',
10254 10256 text: 'http_status:500',
10255 10257 'description': 'Show reports with specific HTTP status code',
10256 10258 example: "http_status:500",
10257 10259 tag: 'HTTP Status'
10258 10260 },
10259 10261 {
10260 10262 type: 'http_status',
10261 10263 text: 'http_status:404',
10262 10264 'description': 'Include 404 reports in your search',
10263 10265 example: "http_status:404",
10264 10266 tag: 'HTTP Status'
10265 10267 },
10266 10268 {
10267 10269 type: 'start_date',
10268 10270 text: 'start_date:',
10269 10271 'description': 'Show reports newer than this date (press TAB for dropdown)',
10270 10272 example: 'start_date:2014-08-15T13:00',
10271 10273 tag: 'Start Date'
10272 10274 },
10273 10275 {
10274 10276 type: 'end_date',
10275 10277 text: 'end_date:',
10276 10278 'description': 'Show reports older than this date (press TAB for dropdown)',
10277 10279 example: 'start_date:2014-08-15T23:59',
10278 10280 tag: 'End Date'
10279 10281 }
10280 10282 ];
10281 10283
10282 10284 vm.filterTypeAhead = undefined;
10283 10285 vm.showDatePicker = false;
10284 10286 vm.manualOpen = false;
10285 10287 vm.aheadFilter = typeAheadTagHelper.aheadFilter;
10286 10288 vm.removeSearchTag = function (tag) {
10287 10289 $location.search(tag.type, null);
10288 10290 vm.refresh();
10289 10291 };
10290 10292 vm.addSearchTag = function (tag) {
10291 10293 $location.search(tag.type, tag.value);
10292 10294 vm.refresh();
10293 10295 };
10294 10296 vm.notRelativeTime = false;
10295 10297 if ($cookies.notRelativeTime) {
10296 10298 vm.notRelativeTime = JSON.parse($cookies.notRelativeTime);
10297 10299 }
10298 10300
10299 10301 vm.changeRelativeTime = function () {
10300 10302 $cookies.notRelativeTime = JSON.stringify(vm.notRelativeTime);
10301 10303 };
10302 10304
10303 10305 _.each(_.range(1, 11), function (priority) {
10304 10306 vm.filterTypeAheadOptions.push({
10305 10307 type: 'priority',
10306 10308 text: 'priority:' + priority.toString(),
10307 10309 description: 'Show entries with specific priority',
10308 10310 example: 'priority:' + priority,
10309 10311 tag: 'Priority'
10310 10312 });
10311 10313 });
10312 10314 _.each(['never_reviewed', 'reviewed', 'fixed', 'public'], function (status) {
10313 10315 vm.filterTypeAheadOptions.push({
10314 10316 type: 'report_status',
10315 10317 text: 'report_status:' + status,
10316 10318 'description': 'Show only reports with this status',
10317 10319 example: 'report_status:' + status,
10318 10320 tag: 'Status ' + status.toUpperCase()
10319 10321 });
10320 10322 });
10321 10323 _.each(stateHolder.AeUser.applications, function (item) {
10322 10324 vm.filterTypeAheadOptions.push({
10323 10325 type: 'resource',
10324 10326 text: 'resource:' + item.resource_id + ':' + item.resource_name,
10325 10327 example: 'resource:' + item.resource_id,
10326 10328 'tag': item.resource_name,
10327 10329 'description': 'Restrict resultset to this application'
10328 10330 });
10329 10331 });
10330 10332
10331 10333 vm.paginationChange = function(){
10332 10334 $location.search('page', vm.page);
10333 10335 vm.refresh();
10334 10336 };
10335 10337
10336 10338 vm.typeAheadTag = function (event) {
10337 10339 var text = vm.filterTypeAhead;
10338 10340 if (_.isObject(vm.filterTypeAhead)) {
10339 10341 text = vm.filterTypeAhead.text;
10340 10342 }
10341 10343 if (!vm.filterTypeAhead) {
10342 10344 return
10343 10345 }
10344 10346
10345 10347 var parsed = text.split(':');
10346 10348 var tag = {'type': null, 'value': null};
10347 10349 // app tags have : twice
10348 10350 if (parsed.length > 2 && parsed[0] == 'resource') {
10349 10351 tag.type = 'resource';
10350 10352 tag.value = parsed[1];
10351 10353 }
10352 10354 // normal tag:value
10353 10355 else if (parsed.length > 1) {
10354 10356 tag.type = parsed[0];
10355 10357 var tagValue = parsed.slice(1);
10356 10358 if (tagValue) {
10357 10359 tag.value = tagValue.join(':');
10358 10360 }
10359 10361 }
10360 10362 else {
10361 10363 tag.type = 'error';
10362 10364 tag.value = parsed.join(':');
10363 10365 }
10364 10366
10365 10367 // set datepicker hour based on type of field
10366 10368 if ('start_date:' == text) {
10367 10369 vm.showDatePicker = true;
10368 10370 vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format();
10369 10371 }
10370 10372 else if ('end_date:' == text) {
10371 10373 vm.showDatePicker = true;
10372 10374 vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format();
10373 10375 }
10374 10376
10375 10377 if (event.keyCode != 13 || !tag.type || !tag.value) {
10376 10378 return
10377 10379 }
10378 10380 vm.showDatePicker = false;
10379 10381 // aka we selected one of main options
10380 10382 vm.addSearchTag({type: tag.type, value: tag.value});
10381 10383 // clear typeahead
10382 10384 vm.filterTypeAhead = undefined;
10383 10385 };
10384 10386
10385 10387 vm.pickerDateChanged = function(){
10386 10388 if (vm.filterTypeAhead.indexOf('start_date:') == '0') {
10387 10389 vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format();
10388 10390 }
10389 10391 else if (vm.filterTypeAhead.indexOf('end_date:') == '0') {
10390 10392 vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format();
10391 10393 }
10392 10394 vm.showDatePicker = false;
10393 10395 };
10394 10396
10395 10397 var reportPresentation = function (report) {
10396 10398 report.presentation = {};
10397 10399 if (report.group.public) {
10398 10400 report.presentation.className = 'public';
10399 10401 report.presentation.tooltip = 'Public';
10400 10402 }
10401 10403 else if (report.group.fixed) {
10402 10404 report.presentation.className = 'fixed';
10403 10405 report.presentation.tooltip = 'Fixed';
10404 10406 }
10405 10407 else if (report.group.read) {
10406 10408 report.presentation.className = 'reviewed';
10407 10409 report.presentation.tooltip = 'Reviewed';
10408 10410 }
10409 10411 else {
10410 10412 report.presentation.className = 'new';
10411 10413 report.presentation.tooltip = 'New';
10412 10414 }
10413 10415 return report;
10414 10416 };
10415 10417
10416 10418 vm.fetchReports = function (searchParams) {
10417 10419 vm.is_loading = true;
10418 10420 reportsResource.query(searchParams, function (data, getResponseHeaders) {
10419 10421 var headers = getResponseHeaders();
10420 10422
10421 10423 vm.is_loading = false;
10422 10424 vm.reportsPage = _.map(data, function (item) {
10423 10425 return reportPresentation(item);
10424 10426 });
10425 10427 vm.itemCount = headers['x-total-count'];
10426 10428 vm.itemsPerPage = headers['x-items-per-page'];
10427 10429 }, function () {
10428 10430 vm.is_loading = false;
10429 10431 });
10430 10432 };
10431 10433
10432 10434 vm.filterId = function (log) {
10433 10435 vm.searchParams.tags.push({
10434 10436 type: "request_id",
10435 10437 value: log.request_id
10436 10438 });
10437 10439 vm.refresh();
10438 10440 };
10439 10441
10440 10442 vm.refresh = function(){
10441 10443 vm.searchParams = parseSearchToTags($location.search());
10442 10444 vm.page = Number(vm.searchParams.page) || 1;
10443 10445 var params = parseTagsToSearch(vm.searchParams);
10444 10446
10445 10447 vm.fetchReports(params);
10446 10448 };
10447 10449 // initial load
10448 10450 vm.refresh();
10449 10451 }
10450 10452
10451 10453 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
10452 10454 // #
10453 10455 // # This program is free software: you can redistribute it and/or modify
10454 10456 // # it under the terms of the GNU Affero General Public License, version 3
10455 10457 // # (only), as published by the Free Software Foundation.
10456 10458 // #
10457 10459 // # This program is distributed in the hope that it will be useful,
10458 10460 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
10459 10461 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10460 10462 // # GNU General Public License for more details.
10461 10463 // #
10462 10464 // # You should have received a copy of the GNU Affero General Public License
10463 10465 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
10464 10466 // #
10465 10467 // # This program is dual-licensed. If you wish to learn more about the
10466 10468 // # AppEnlight Enterprise Edition, including its added features, Support
10467 10469 // # services, and proprietary license terms, please see
10468 10470 // # https://rhodecode.com/licenses/
10469 10471
10470 10472 angular.module('appenlight.controllers').controller('ReportsViewController', ReportsViewController);
10471 10473 ReportsViewController.$inject = ['$window', '$location', '$state', '$uibModal',
10472 10474 '$cookies', 'reportGroupPropertyResource', 'reportGroupResource',
10473 10475 'logsNoIdResource', 'stateHolder'];
10474 10476
10475 10477 function ReportsViewController($window, $location, $state, $uibModal, $cookies, reportGroupPropertyResource, reportGroupResource, logsNoIdResource, stateHolder) {
10476 10478 var vm = this;
10477 10479 vm.window = $window;
10478 10480 vm.stateHolder = stateHolder;
10479 10481 vm.$state = $state;
10480 10482 vm.reportHistoryConfig = {
10481 10483 data: {
10482 10484 json: [],
10483 10485 xFormat: '%Y-%m-%dT%H:%M:%S'
10484 10486 },
10485 10487 color: {
10486 10488 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
10487 10489 },
10488 10490 axis: {
10489 10491 x: {
10490 10492 type: 'timeseries',
10491 10493 tick: {
10492 10494 format: '%Y-%m-%d'
10493 10495 }
10494 10496 },
10495 10497 y: {
10496 10498 tick: {
10497 10499 count: 5,
10498 10500 format: d3.format('.2s')
10499 10501 }
10500 10502 }
10501 10503 },
10502 10504 subchart: {
10503 10505 show: true,
10504 10506 size: {
10505 10507 height: 20
10506 10508 }
10507 10509 },
10508 10510 size: {
10509 10511 height: 250
10510 10512 },
10511 10513 zoom: {
10512 10514 rescale: true
10513 10515 },
10514 10516 grid: {
10515 10517 x: {
10516 10518 show: true
10517 10519 },
10518 10520 y: {
10519 10521 show: true
10520 10522 }
10521 10523 },
10522 10524 tooltip: {
10523 10525 format: {
10524 10526 title: function (d) {
10525 10527 return '' + d;
10526 10528 },
10527 10529 value: function (v) {
10528 10530 return v
10529 10531 }
10530 10532 }
10531 10533 }
10532 10534 };
10533 10535 vm.mentionedPeople = [];
10534 10536 vm.reportHistoryData = {};
10535 10537 vm.textTraceback = true;
10536 10538 vm.rawTraceback = '';
10537 10539 vm.traceback = '';
10538 10540 vm.reportType = 'report';
10539 10541 vm.report = null;
10540 10542 vm.showLong = false;
10541 10543 vm.reportLogs = null;
10542 10544 vm.requestStats = null;
10543 10545 vm.comment = null;
10544 10546 vm.is_loading = {
10545 10547 report: true,
10546 10548 logs: true,
10547 10549 history: true
10548 10550 };
10549 10551
10550 10552 vm.searchMentionedPeople = function(term){
10551 10553 //vm.mentionedPeople = [];
10552 10554 var term = term.toLowerCase();
10553 10555 reportGroupPropertyResource.get({
10554 10556 groupId: vm.report.group_id,
10555 10557 key: 'assigned_users'
10556 10558 }, null,
10557 10559 function (data) {
10558 10560 var users = [];
10559 10561 _.each(data.assigned, function(u){
10560 10562 users.push({label: u.user_name});
10561 10563 });
10562 10564 _.each(data.unassigned, function(u){
10563 10565 users.push({label: u.user_name});
10564 10566 });
10565 10567
10566 10568 var result = _.filter(users, function(u){
10567 10569 return u.label.toLowerCase().indexOf(term) !== -1;
10568 10570 });
10569 10571 vm.mentionedPeople = result;
10570 10572 });
10571 10573 };
10572 10574
10573 10575 vm.searchTag = function (tag, value) {
10574 10576
10575 10577 if (vm.report.report_type === 3) {
10576 10578 $location.url($state.href('report.list_slow'));
10577 10579 }
10578 10580 else {
10579 10581 $location.url($state.href('report.list'));
10580 10582 }
10581 10583 $location.search(tag, value);
10582 10584 };
10583 10585
10584 10586 vm.tabs = {
10585 10587 slow_calls:false,
10586 10588 request_details:false,
10587 10589 logs:false,
10588 10590 comments:false,
10589 10591 affected_users:false
10590 10592 };
10591 10593 if ($cookies.selectedReportTab) {
10592 10594 vm.tabs[$cookies.selectedReportTab] = true;
10593 10595 }
10594 10596 else{
10595 10597 $cookies.selectedReportTab = 'request_details';
10596 10598 vm.tabs.request_details = true;
10597 10599 }
10598 10600
10599 10601 vm.fetchLogs = function () {
10600 10602 if (!vm.report.request_id){
10601 10603 return
10602 10604 }
10603 10605 vm.is_loading.logs = true;
10604 10606 logsNoIdResource.query({request_id: vm.report.request_id},
10605 10607 function (data) {
10606 10608 vm.is_loading.logs = false;
10607 10609 vm.reportLogs = data;
10608 10610 }, function () {
10609 10611 vm.is_loading.logs = false;
10610 10612 });
10611 10613 };
10612 10614 vm.addComment = function () {
10613 10615 reportGroupPropertyResource.save({
10614 10616 groupId: vm.report.group_id,
10615 10617 key: 'comments'
10616 10618 }, {body: vm.comment},
10617 10619 function (data) {
10618 10620 vm.report.comments.push(data);
10619 10621 });
10620 10622 vm.comment = '';
10621 10623 };
10622 10624
10623 10625 vm.fetchReport = function () {
10624 10626 vm.is_loading.report = true;
10625 10627 reportGroupResource.get($state.params, function (data) {
10626 10628 vm.is_loading.report = false;
10627 10629 if (data.request) {
10628 10630 try {
10629 10631 var to_sort = _.pairs(data.request);
10630 10632 data.request = _.object(_.sortBy(to_sort, function (i) {
10631 10633 return i[0]
10632 10634 }));
10633 10635 }
10634 10636 catch (err) {
10635 10637 }
10636 10638 }
10637 10639 vm.report = data;
10638 10640 if (vm.report.req_stats) {
10639 10641 vm.requestStats = [];
10640 10642 _.each(_.pairs(vm.report.req_stats['percentages']), function (p) {
10641 10643 vm.requestStats.push({
10642 10644 name: p[0],
10643 10645 value: vm.report.req_stats[p[0]].toFixed(3),
10644 10646 percent: p[1],
10645 10647 calls: vm.report.req_stats[p[0] + '_calls']
10646 10648 })
10647 10649 });
10648 10650 }
10649 10651 vm.traceback = data.traceback;
10650 10652 _.each(vm.traceback, function (frame) {
10651 10653 if (frame.line) {
10652 10654 vm.rawTraceback += 'File ' + frame.file + ' line ' + frame.line + ' in ' + frame.fn + ": \r\n";
10653 10655 }
10654 10656 vm.rawTraceback += ' ' + frame.cline + "\r\n";
10655 10657 });
10656 10658
10657 10659 if (stateHolder.AeUser.id){
10658 10660 vm.fetchHistory();
10659 10661 }
10660 10662
10661 10663 vm.selectedTab($cookies.selectedReportTab);
10662 10664
10663 10665 }, function (response) {
10664 10666
10665 10667 if (response.status == 403) {
10666 10668 var uid = response.headers('x-appenlight-uid');
10667 10669 if (!uid) {
10668 10670 window.location = '/register?came_from=' + encodeURIComponent(window.location);
10669 10671 }
10670 10672 }
10671 10673 vm.is_loading.report = false;
10672 10674 });
10673 10675 };
10674 10676
10675 10677 vm.selectedTab = function(tab_name){
10676 10678 $cookies.selectedReportTab = tab_name;
10677 10679 if (tab_name == 'logs' && vm.reportLogs === null) {
10678 10680 vm.fetchLogs();
10679 10681 }
10680 10682 };
10681 10683
10682 10684 vm.markFixed = function () {
10683 10685 reportGroupResource.update({
10684 10686 groupId: vm.report.group_id
10685 10687 }, {fixed: !vm.report.group.fixed},
10686 10688 function (data) {
10687 10689 vm.report.group.fixed = data.fixed;
10688 10690 });
10689 10691 };
10690 10692
10691 10693 vm.markPublic = function () {
10692 10694 reportGroupResource.update({
10693 10695 groupId: vm.report.group_id
10694 10696 }, {public: !vm.report.group.public},
10695 10697 function (data) {
10696 10698 vm.report.group.public = data.public;
10697 10699 });
10698 10700 };
10699 10701
10700 10702 vm.delete = function () {
10701 10703 reportGroupResource.delete({'groupId': vm.report.group_id},
10702 10704 function (data) {
10703 10705 $state.go('report.list');
10704 10706 })
10705 10707 };
10706 10708
10707 10709 vm.assignUsersModal = function (index) {
10708 10710 vm.opts = {
10709 10711 backdrop: 'static',
10710 10712 templateUrl: 'AssignReportCtrl.html',
10711 10713 controller: 'AssignReportCtrl as ctrl',
10712 10714 resolve: {
10713 10715 report: function () {
10714 10716 return vm.report;
10715 10717 }
10716 10718 }
10717 10719 };
10718 10720 var modalInstance = $uibModal.open(vm.opts);
10719 10721 modalInstance.result.then(function (report) {
10720 10722
10721 10723 }, function () {
10722 10724 console.info('Modal dismissed at: ' + new Date());
10723 10725 });
10724 10726
10725 10727 };
10726 10728
10727 10729 vm.fetchHistory = function () {
10728 10730 reportGroupPropertyResource.query({
10729 10731 groupId: vm.report.group_id,
10730 10732 key: 'history'
10731 10733 }, function (data) {
10732 10734 vm.reportHistoryData = {
10733 10735 json: data,
10734 10736 keys: {
10735 10737 x: 'x',
10736 10738 value: ["reports"]
10737 10739 },
10738 10740 names: {
10739 10741 reports: 'Reports history'
10740 10742 },
10741 10743 type: 'bar'
10742 10744 };
10743 10745 vm.is_loading.history = false;
10744 10746 });
10745 10747 };
10746 10748
10747 10749 vm.nextDetail = function () {
10748 10750 $state.go('report.view_detail', {
10749 10751 groupId: vm.report.group_id,
10750 10752 reportId: vm.report.group.next_report
10751 10753 });
10752 10754 };
10753 10755 vm.previousDetail = function () {
10754 10756 $state.go('report.view_detail', {
10755 10757 groupId: vm.report.group_id,
10756 10758 reportId: vm.report.group.previous_report
10757 10759 });
10758 10760 };
10759 10761
10760 10762 vm.runIntegration = function (integration_name) {
10761 10763
10762 10764 if (integration_name == 'bitbucket') {
10763 10765 var controller = 'BitbucketIntegrationCtrl as ctrl';
10764 10766 var template_url = 'templates/integrations/bitbucket.html';
10765 10767 }
10766 10768 else if (integration_name == 'github') {
10767 10769 var controller = 'GithubIntegrationCtrl as ctrl';
10768 10770 var template_url = 'templates/integrations/github.html';
10769 10771 }
10770 10772 else if (integration_name == 'jira') {
10771 10773 var controller = 'JiraIntegrationCtrl as ctrl';
10772 10774 var template_url = 'templates/integrations/jira.html';
10773 10775 }
10774 10776 else {
10775 10777 return false;
10776 10778 }
10777 10779
10778 10780 vm.opts = {
10779 10781 backdrop: 'static',
10780 10782 templateUrl: template_url,
10781 10783 controller: controller,
10782 10784 resolve: {
10783 10785 integrationName: function () {
10784 10786 return integration_name
10785 10787 },
10786 10788 report: function () {
10787 10789 return vm.report;
10788 10790 }
10789 10791 }
10790 10792 };
10791 10793 var modalInstance = $uibModal.open(vm.opts);
10792 10794 modalInstance.result.then(function (report) {
10793 10795
10794 10796 }, function () {
10795 10797 console.info('Modal dismissed at: ' + new Date());
10796 10798 });
10797 10799
10798 10800 };
10799 10801
10800 10802 // load report
10801 10803 vm.fetchReport();
10802 10804
10803 10805
10804 10806 }
10805 10807
10806 10808 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
10807 10809 // #
10808 10810 // # This program is free software: you can redistribute it and/or modify
10809 10811 // # it under the terms of the GNU Affero General Public License, version 3
10810 10812 // # (only), as published by the Free Software Foundation.
10811 10813 // #
10812 10814 // # This program is distributed in the hope that it will be useful,
10813 10815 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
10814 10816 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10815 10817 // # GNU General Public License for more details.
10816 10818 // #
10817 10819 // # You should have received a copy of the GNU Affero General Public License
10818 10820 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
10819 10821 // #
10820 10822 // # This program is dual-licensed. If you wish to learn more about the
10821 10823 // # AppEnlight Enterprise Edition, including its added features, Support
10822 10824 // # services, and proprietary license terms, please see
10823 10825 // # https://rhodecode.com/licenses/
10824 10826
10825 10827 angular.module('appenlight.controllers')
10826 10828 .controller('AlertChannelsEmailController', AlertChannelsEmailController)
10827 10829
10828 10830 AlertChannelsEmailController.$inject = ['$state','userSelfPropertyResource'];
10829 10831
10830 10832 function AlertChannelsEmailController($state, userSelfPropertyResource) {
10831 10833
10832 10834 var vm = this;
10833 10835 vm.loading = {email: false};
10834 10836 vm.form = {};
10835 10837
10836 10838 vm.createChannel = function () {
10837 10839 vm.loading.email = true;
10838 10840
10839 10841 userSelfPropertyResource.save({key: 'alert_channels'}, vm.form, function () {
10840 10842 //vm.loading.email = false;
10841 10843 //setServerValidation(vm.channelForm);
10842 10844 //vm.form = {};
10843 10845 $state.go('user.alert_channels.list');
10844 10846 }, function (response) {
10845 10847 if (response.status == 422) {
10846 10848 setServerValidation(vm.channelForm, response.data);
10847 10849 }
10848 10850 vm.loading.email = false;
10849 10851 });
10850 10852 }
10851 10853 }
10852 10854
10853 10855 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
10854 10856 // #
10855 10857 // # This program is free software: you can redistribute it and/or modify
10856 10858 // # it under the terms of the GNU Affero General Public License, version 3
10857 10859 // # (only), as published by the Free Software Foundation.
10858 10860 // #
10859 10861 // # This program is distributed in the hope that it will be useful,
10860 10862 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
10861 10863 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10862 10864 // # GNU General Public License for more details.
10863 10865 // #
10864 10866 // # You should have received a copy of the GNU Affero General Public License
10865 10867 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
10866 10868 // #
10867 10869 // # This program is dual-licensed. If you wish to learn more about the
10868 10870 // # AppEnlight Enterprise Edition, including its added features, Support
10869 10871 // # services, and proprietary license terms, please see
10870 10872 // # https://rhodecode.com/licenses/
10871 10873
10872 10874 angular.module('appenlight.controllers').controller('AlertChannelsController', AlertChannelsController);
10873 10875
10874 10876 AlertChannelsController.$inject = ['userSelfPropertyResource', 'applicationsNoIdResource'];
10875 10877
10876 10878 function AlertChannelsController(userSelfPropertyResource, applicationsNoIdResource) {
10877 10879
10878 10880 var vm = this;
10879 10881 vm.loading = {channels: true, applications: true, actions:true};
10880 10882
10881 10883 vm.alertChannels = userSelfPropertyResource.query({key: 'alert_channels'},
10882 10884 function (data) {
10883 10885 vm.loading.channels = false;
10884 10886 });
10885 10887
10886 10888 vm.alertActions = userSelfPropertyResource.query({key: 'alert_actions'},
10887 10889 function (data) {
10888 10890 vm.loading.actions = false;
10889 10891 });
10890 10892
10891 10893 vm.applications = applicationsNoIdResource.query({permission: 'view'},
10892 10894 function (data) {
10893 10895 vm.loading.applications = false;
10894 10896 });
10895 10897
10896 10898 var allOps = {
10897 10899 'eq': 'Equal',
10898 10900 'ne': 'Not equal',
10899 10901 'ge': 'Greater or equal',
10900 10902 'gt': 'Greater than',
10901 10903 'le': 'Lesser or equal',
10902 10904 'lt': 'Lesser than',
10903 10905 'startswith': 'Starts with',
10904 10906 'endswith': 'Ends with',
10905 10907 'contains': 'Contains'
10906 10908 };
10907 10909
10908 10910 var fieldOps = {};
10909 10911 fieldOps['http_status'] = ['eq', 'ne', 'ge', 'le'];
10910 10912 fieldOps['group:priority'] = ['eq', 'ne', 'ge', 'le'];
10911 10913 fieldOps['duration'] = ['ge', 'le'];
10912 10914 fieldOps['url_domain'] = ['eq', 'ne', 'startswith', 'endswith',
10913 10915 'contains'];
10914 10916 fieldOps['url_path'] = ['eq', 'ne', 'startswith', 'endswith',
10915 10917 'contains'];
10916 10918 fieldOps['error'] = ['eq', 'ne', 'startswith', 'endswith',
10917 10919 'contains'];
10918 10920 fieldOps['tags:server_name'] = ['eq', 'ne', 'startswith', 'endswith',
10919 10921 'contains'];
10920 10922 fieldOps['group:occurences'] = ['eq', 'ne', 'ge', 'le'];
10921 10923
10922 10924 var possibleFields = {
10923 10925 '__AND__': 'All met (composite rule)',
10924 10926 '__OR__': 'One met (composite rule)',
10925 10927 '__NOT__': 'Not met (composite rule)',
10926 10928 'http_status': 'HTTP Status',
10927 10929 'duration': 'Request duration',
10928 10930 'group:priority': 'Group -> Priority',
10929 10931 'url_domain': 'Domain',
10930 10932 'url_path': 'URL Path',
10931 10933 'error': 'Error',
10932 10934 'tags:server_name': 'Tag -> Server name',
10933 10935 'group:occurences': 'Group -> Occurences'
10934 10936 };
10935 10937
10936 10938 vm.ruleDefinitions = {
10937 10939 fieldOps: fieldOps,
10938 10940 allOps: allOps,
10939 10941 possibleFields: possibleFields
10940 10942 };
10941 10943
10942 10944 vm.addAction = function (channel) {
10943 10945
10944 10946 userSelfPropertyResource.save({key: 'alert_channels_rules'}, {}, function (data) {
10945 10947 vm.alertActions.push(data);
10946 10948 }, function (response) {
10947 10949 if (response.status == 422) {
10948 10950
10949 10951 }
10950 10952 });
10951 10953 };
10952 10954
10953 10955 vm.updateChannel = function (channel, subKey) {
10954 10956 var params = {
10955 10957 key: 'alert_channels',
10956 10958 channel_name: channel['channel_name'],
10957 10959 channel_value: channel['channel_value']
10958 10960 };
10959 10961 var toUpdate = {};
10960 10962 if (['daily_digest', 'send_alerts'].indexOf(subKey) !== -1) {
10961 10963 toUpdate[subKey] = !channel[subKey];
10962 10964 }
10963 10965 userSelfPropertyResource.update(params, toUpdate, function (data) {
10964 10966 _.extend(channel, data);
10965 10967 });
10966 10968 };
10967 10969
10968 10970 vm.removeChannel = function (channel) {
10969 10971
10970 10972 userSelfPropertyResource.delete({
10971 10973 key: 'alert_channels',
10972 10974 channel_name: channel.channel_name,
10973 10975 channel_value: channel.channel_value
10974 10976 }, function () {
10975 10977 vm.alertChannels = _.filter(vm.alertChannels, function(item){
10976 10978 return item != channel;
10977 10979 });
10978 10980 });
10979 10981
10980 10982 }
10981 10983
10982 10984 }
10983 10985
10984 10986 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
10985 10987 // #
10986 10988 // # This program is free software: you can redistribute it and/or modify
10987 10989 // # it under the terms of the GNU Affero General Public License, version 3
10988 10990 // # (only), as published by the Free Software Foundation.
10989 10991 // #
10990 10992 // # This program is distributed in the hope that it will be useful,
10991 10993 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
10992 10994 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10993 10995 // # GNU General Public License for more details.
10994 10996 // #
10995 10997 // # You should have received a copy of the GNU Affero General Public License
10996 10998 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
10997 10999 // #
10998 11000 // # This program is dual-licensed. If you wish to learn more about the
10999 11001 // # AppEnlight Enterprise Edition, including its added features, Support
11000 11002 // # services, and proprietary license terms, please see
11001 11003 // # https://rhodecode.com/licenses/
11002 11004
11003 11005 angular.module('appenlight.controllers').controller('UserAuthTokensController', UserAuthTokensController);
11004 11006
11005 11007 UserAuthTokensController.$inject = ['$filter', 'userSelfPropertyResource', 'AeConfig'];
11006 11008
11007 11009 function UserAuthTokensController($filter, userSelfPropertyResource, AeConfig) {
11008 11010
11009 11011 var vm = this;
11010 11012 vm.loading = {tokens: true};
11011 11013
11012 11014 vm.expireOptions = AeConfig.timeOptions;
11013 11015
11014 11016 vm.tokens = userSelfPropertyResource.query({key: 'auth_tokens'},
11015 11017 function (data) {
11016 11018 vm.loading.tokens = false;
11017 11019 });
11018 11020
11019 11021 vm.addToken = function () {
11020 11022 vm.loading.tokens = true;
11021 11023 userSelfPropertyResource.save({key: 'auth_tokens'},
11022 11024 vm.form,
11023 11025 function (data) {
11024 11026 vm.loading.tokens = false;
11025 11027 setServerValidation(vm.TokenForm);
11026 11028 vm.form = {};
11027 11029 vm.tokens.push(data);
11028 11030 }, function (response) {
11029 11031 vm.loading.tokens = false;
11030 11032 if (response.status == 422) {
11031 11033 setServerValidation(vm.TokenForm, response.data);
11032 11034 }
11033 11035 })
11034 11036 }
11035 11037
11036 11038 vm.removeToken = function (token) {
11037 11039 userSelfPropertyResource.delete({key: 'auth_tokens',
11038 11040 token:token.token},
11039 11041 function () {
11040 11042 var index = vm.tokens.indexOf(token);
11041 11043 if (index !== -1) {
11042 11044 vm.tokens.splice(index, 1);
11043 11045 }
11044 11046 })
11045 11047 }
11046 11048 }
11047 11049
11048 11050 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11049 11051 // #
11050 11052 // # This program is free software: you can redistribute it and/or modify
11051 11053 // # it under the terms of the GNU Affero General Public License, version 3
11052 11054 // # (only), as published by the Free Software Foundation.
11053 11055 // #
11054 11056 // # This program is distributed in the hope that it will be useful,
11055 11057 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11056 11058 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11057 11059 // # GNU General Public License for more details.
11058 11060 // #
11059 11061 // # You should have received a copy of the GNU Affero General Public License
11060 11062 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11061 11063 // #
11062 11064 // # This program is dual-licensed. If you wish to learn more about the
11063 11065 // # AppEnlight Enterprise Edition, including its added features, Support
11064 11066 // # services, and proprietary license terms, please see
11065 11067 // # https://rhodecode.com/licenses/
11066 11068
11067 11069 angular.module('appenlight.controllers')
11068 11070 .controller('UserIdentitiesController', UserIdentitiesController)
11069 11071
11070 11072 UserIdentitiesController.$inject = ['userSelfPropertyResource'];
11071 11073
11072 11074 function UserIdentitiesController(userSelfPropertyResource) {
11073 11075
11074 11076 var vm = this;
11075 11077 vm.loading = {identities: true};
11076 11078
11077 11079 vm.identities = userSelfPropertyResource.query(
11078 11080 {key: 'external_identities'},
11079 11081 function (data) {
11080 11082 vm.loading.identities = false;
11081 11083
11082 11084 });
11083 11085
11084 11086 vm.removeProvider = function (provider) {
11085 11087
11086 11088 userSelfPropertyResource.delete(
11087 11089 {
11088 11090 key: 'external_identities',
11089 11091 provider: provider.provider,
11090 11092 id: provider.id
11091 11093 },
11092 11094 function (status) {
11093 11095 if (status){
11094 11096 vm.identities = _.filter(vm.identities, function (item) {
11095 11097 return item != provider
11096 11098 });
11097 11099 }
11098 11100
11099 11101 });
11100 11102 }
11101 11103 }
11102 11104
11103 11105 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11104 11106 // #
11105 11107 // # This program is free software: you can redistribute it and/or modify
11106 11108 // # it under the terms of the GNU Affero General Public License, version 3
11107 11109 // # (only), as published by the Free Software Foundation.
11108 11110 // #
11109 11111 // # This program is distributed in the hope that it will be useful,
11110 11112 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11111 11113 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11112 11114 // # GNU General Public License for more details.
11113 11115 // #
11114 11116 // # You should have received a copy of the GNU Affero General Public License
11115 11117 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11116 11118 // #
11117 11119 // # This program is dual-licensed. If you wish to learn more about the
11118 11120 // # AppEnlight Enterprise Edition, including its added features, Support
11119 11121 // # services, and proprietary license terms, please see
11120 11122 // # https://rhodecode.com/licenses/
11121 11123
11122 11124 angular.module('appenlight.controllers')
11123 11125 .controller('UserPasswordController', UserPasswordController)
11124 11126
11125 11127 UserPasswordController.$inject = ['userSelfPropertyResource'];
11126 11128
11127 11129 function UserPasswordController(userSelfPropertyResource) {
11128 11130
11129 11131 var vm = this;
11130 11132 vm.loading = {password: false};
11131 11133 vm.form = {};
11132 11134
11133 11135 vm.updatePassword = function () {
11134 11136 vm.loading.password = true;
11135 11137
11136 11138 userSelfPropertyResource.update({key: 'password'}, vm.form, function () {
11137 11139 vm.loading.password = false;
11138 11140 vm.form = {};
11139 11141 setServerValidation(vm.passwordForm);
11140 11142 }, function (response) {
11141 11143 if (response.status == 422) {
11142 11144
11143 11145 setServerValidation(vm.passwordForm, response.data);
11144 11146
11145 11147 }
11146 11148 vm.loading.password = false;
11147 11149 });
11148 11150 }
11149 11151 }
11150 11152
11151 11153 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11152 11154 // #
11153 11155 // # This program is free software: you can redistribute it and/or modify
11154 11156 // # it under the terms of the GNU Affero General Public License, version 3
11155 11157 // # (only), as published by the Free Software Foundation.
11156 11158 // #
11157 11159 // # This program is distributed in the hope that it will be useful,
11158 11160 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11159 11161 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11160 11162 // # GNU General Public License for more details.
11161 11163 // #
11162 11164 // # You should have received a copy of the GNU Affero General Public License
11163 11165 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11164 11166 // #
11165 11167 // # This program is dual-licensed. If you wish to learn more about the
11166 11168 // # AppEnlight Enterprise Edition, including its added features, Support
11167 11169 // # services, and proprietary license terms, please see
11168 11170 // # https://rhodecode.com/licenses/
11169 11171
11170 11172 angular.module('appenlight.controllers')
11171 11173 .controller('UserProfileController', UserProfileController)
11172 11174
11173 11175 UserProfileController.$inject = ['userSelfResource'];
11174 11176
11175 11177 function UserProfileController(userSelfResource) {
11176 11178
11177 11179 var vm = this;
11178 11180 vm.loading = {profile: true};
11179 11181
11180 11182 vm.user = userSelfResource.get(null, function (data) {
11181 11183 vm.loading.profile = false;
11182 11184
11183 11185 });
11184 11186
11185 11187 vm.updateProfile = function () {
11186 11188 vm.loading.profile = true;
11187 11189
11188 11190
11189 11191 vm.user.$update(null, function () {
11190 11192 vm.loading.profile = false;
11191 11193 setServerValidation(vm.profileForm);
11192 11194 }, function (response) {
11193 11195 if (response.status == 422) {
11194 11196 setServerValidation(vm.profileForm, response.data);
11195 11197 }
11196 11198 vm.loading.profile = false;
11197 11199 });
11198 11200 }
11199 11201 }
11200 11202
11201 11203 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11202 11204 // #
11203 11205 // # This program is free software: you can redistribute it and/or modify
11204 11206 // # it under the terms of the GNU Affero General Public License, version 3
11205 11207 // # (only), as published by the Free Software Foundation.
11206 11208 // #
11207 11209 // # This program is distributed in the hope that it will be useful,
11208 11210 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11209 11211 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11210 11212 // # GNU General Public License for more details.
11211 11213 // #
11212 11214 // # You should have received a copy of the GNU Affero General Public License
11213 11215 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11214 11216 // #
11215 11217 // # This program is dual-licensed. If you wish to learn more about the
11216 11218 // # AppEnlight Enterprise Edition, including its added features, Support
11217 11219 // # services, and proprietary license terms, please see
11218 11220 // # https://rhodecode.com/licenses/
11219 11221
11220 11222 // This code is inspired by https://github.com/jettro/c3-angular-sample/tree/master/js
11221 11223 // License is MIT
11222 11224
11223 11225
11224 11226 angular.module('appenlight.directives.c3chart', [])
11225 11227 .controller('ChartCtrl', ['$scope', '$timeout', function ($scope, $timeout) {
11226 11228 $scope.chart = null;
11227 11229 this.showGraph = function () {
11228 11230 var config = angular.copy($scope.config);
11229 11231 var firstLoad = true;
11230 11232 config.bindto = "#" + $scope.domid;
11231 11233 var originalXTickCount = null;
11232 11234 if ($scope.data && $scope.config) {
11233 11235 if (!_.isEmpty($scope.data)) {
11234 11236 _.extend(config.data, angular.copy($scope.data));
11235 11237 }
11236 11238
11237 11239 config.onresized = function () {
11238 11240 if (this.currentWidth < 400){
11239 11241 $scope.chart.internal.config.axis_x_tick_culling_max = 3;
11240 11242 }
11241 11243 else if (this.currentWidth < 600){
11242 11244 $scope.chart.internal.config.axis_x_tick_culling_max = 5;
11243 11245 }
11244 11246 else{
11245 11247 $scope.chart.internal.config.axis_x_tick_culling_max = originalXTickCount;
11246 11248 }
11247 11249 $scope.chart.flush();
11248 11250 };
11249 11251
11250 11252
11251 11253 $scope.chart = c3.generate(config);
11252 11254 originalXTickCount = $scope.chart.internal.config.axis_x_tick_culling_max;
11253 11255 $scope.chart.internal.config.onresized.call($scope.chart.internal);
11254 11256 }
11255 11257
11256 11258 if ($scope.update) {
11257 11259
11258 11260 $scope.$watch('data', function () {
11259 11261 if (!firstLoad) {
11260 11262
11261 11263 $scope.chart.load(angular.copy($scope.data), {unload: true});
11262 11264 if (typeof $scope.data.groups != 'undefined') {
11263 11265
11264 11266 $scope.chart.groups($scope.data.groups);
11265 11267 }
11266 11268 if (typeof $scope.data.names != 'undefined') {
11267 11269
11268 11270 $scope.chart.data.names($scope.data.names);
11269 11271 }
11270 11272 $scope.chart.flush();
11271 11273 }
11272 11274 }, true);
11273 11275 }
11274 11276 $scope.$watch('config.regions', function (newValue, oldValue) {
11275 11277 if (newValue === oldValue) {
11276 11278 return
11277 11279 }
11278 11280 if (typeof $scope.config.regions != 'undefined') {
11279 11281
11280 11282 $scope.chart.regions($scope.config.regions);
11281 11283 }
11282 11284 });
11283 11285
11284 11286 firstLoad = false;
11285 11287 $scope.$watch('resizetrigger', function (newValue, oldValue) {
11286 11288 if (newValue !== oldValue) {
11287 11289 $timeout(function () {
11288 11290 $scope.chart.resize();
11289 11291 $scope.chart.internal.config.onresized.call($scope.chart.internal);
11290 11292 });
11291 11293 }
11292 11294 });
11293 11295 };
11294 11296 }])
11295 11297 .directive('c3chart', function ($timeout) {
11296 11298 var chartLinker = function (scope, element, attrs, chartCtrl) {
11297 11299 // Trick to wait for all rendering of the DOM to be finished.
11298 11300 // then we can tell c3js to "connect" to our dom node
11299 11301 $timeout(function () {
11300 11302 chartCtrl.showGraph()
11301 11303 });
11302 11304
11303 11305 scope.$on("$destroy", function () {
11304 11306 if (scope.chart !== null) {
11305 11307 scope.chart = scope.chart.destroy();
11306 11308 delete element;
11307 11309 delete scope.chart;
11308 11310 }
11309 11311 }
11310 11312 );
11311 11313 };
11312 11314 return {
11313 11315 "restrict": "E",
11314 11316 "controller": "ChartCtrl",
11315 11317 "scope": {
11316 11318 "domid": "@domid",
11317 11319 "config": "=config",
11318 11320 "data": "=data",
11319 11321 "resizetrigger": "=resizetrigger",
11320 11322 "update": "=update"
11321 11323 },
11322 11324 "template": "<div id='{{domid}}' class='chart'></div>",
11323 11325 "replace": true,
11324 11326 "link": chartLinker
11325 11327 }
11326 11328 });
11327 11329
11328 11330 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11329 11331 // #
11330 11332 // # This program is free software: you can redistribute it and/or modify
11331 11333 // # it under the terms of the GNU Affero General Public License, version 3
11332 11334 // # (only), as published by the Free Software Foundation.
11333 11335 // #
11334 11336 // # This program is distributed in the hope that it will be useful,
11335 11337 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11336 11338 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11337 11339 // # GNU General Public License for more details.
11338 11340 // #
11339 11341 // # You should have received a copy of the GNU Affero General Public License
11340 11342 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11341 11343 // #
11342 11344 // # This program is dual-licensed. If you wish to learn more about the
11343 11345 // # AppEnlight Enterprise Edition, including its added features, Support
11344 11346 // # services, and proprietary license terms, please see
11345 11347 // # https://rhodecode.com/licenses/
11346 11348
11347 11349 angular.module('appenlight.directives.confirmValidate', []).
11348 11350 directive('confirmValidate', [function () {
11349 11351 return {
11350 11352 restrict: 'A',
11351 11353 require: 'ngModel',
11352 11354 link: function ($scope, elem, attrs, ngModel) {
11353 11355 ngModel.$validators.confirm = function (modelValue, viewValue) {
11354 11356 var value = modelValue || viewValue;
11355 11357
11356 11358 if (value.toLowerCase() == 'confirm') {
11357 11359 return true;
11358 11360 }
11359 11361 return false;
11360 11362 }
11361 11363 }
11362 11364 }
11363 11365 }])
11364 11366
11365 11367 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11366 11368 // #
11367 11369 // # This program is free software: you can redistribute it and/or modify
11368 11370 // # it under the terms of the GNU Affero General Public License, version 3
11369 11371 // # (only), as published by the Free Software Foundation.
11370 11372 // #
11371 11373 // # This program is distributed in the hope that it will be useful,
11372 11374 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11373 11375 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11374 11376 // # GNU General Public License for more details.
11375 11377 // #
11376 11378 // # You should have received a copy of the GNU Affero General Public License
11377 11379 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11378 11380 // #
11379 11381 // # This program is dual-licensed. If you wish to learn more about the
11380 11382 // # AppEnlight Enterprise Edition, including its added features, Support
11381 11383 // # services, and proprietary license terms, please see
11382 11384 // # https://rhodecode.com/licenses/
11383 11385
11384 11386 angular.module('appenlight.directives.focus', []).directive('focus', function () {
11385 11387 return function (scope, element, attrs) {
11386 11388 attrs.$observe('focus', function (newValue) {
11387 11389 newValue === 'true' && element[0].focus();
11388 11390 });
11389 11391 }
11390 11392 });
11391 11393
11392 11394 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11393 11395 // #
11394 11396 // # This program is free software: you can redistribute it and/or modify
11395 11397 // # it under the terms of the GNU Affero General Public License, version 3
11396 11398 // # (only), as published by the Free Software Foundation.
11397 11399 // #
11398 11400 // # This program is distributed in the hope that it will be useful,
11399 11401 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11400 11402 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11401 11403 // # GNU General Public License for more details.
11402 11404 // #
11403 11405 // # You should have received a copy of the GNU Affero General Public License
11404 11406 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11405 11407 // #
11406 11408 // # This program is dual-licensed. If you wish to learn more about the
11407 11409 // # AppEnlight Enterprise Edition, including its added features, Support
11408 11410 // # services, and proprietary license terms, please see
11409 11411 // # https://rhodecode.com/licenses/
11410 11412
11411 11413 angular.module('appenlight.directives.formErrors', []).
11412 11414 directive('formErrors', function() {
11413 11415 return {
11414 11416 scope: {
11415 11417 errors: '='
11416 11418 },
11417 11419 template: '<div ng-repeat="errorMessage in errors"><div class="form-error alert alert-error">{{ errorMessage }}</div></div>'
11418 11420 }
11419 11421 })
11420 11422
11421 11423 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11422 11424 // #
11423 11425 // # This program is free software: you can redistribute it and/or modify
11424 11426 // # it under the terms of the GNU Affero General Public License, version 3
11425 11427 // # (only), as published by the Free Software Foundation.
11426 11428 // #
11427 11429 // # This program is distributed in the hope that it will be useful,
11428 11430 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11429 11431 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11430 11432 // # GNU General Public License for more details.
11431 11433 // #
11432 11434 // # You should have received a copy of the GNU Affero General Public License
11433 11435 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11434 11436 // #
11435 11437 // # This program is dual-licensed. If you wish to learn more about the
11436 11438 // # AppEnlight Enterprise Edition, including its added features, Support
11437 11439 // # services, and proprietary license terms, please see
11438 11440 // # https://rhodecode.com/licenses/
11439 11441
11440 11442 angular.module('appenlight.directives.humanFormat', []).
11441 11443 directive('humanFormat', [function () {
11442 11444 /* json inspector */
11443 11445 return {
11444 11446 restrict: "A",
11445 11447 scope: {
11446 11448 vars: '=',
11447 11449 },
11448 11450 "link": function (scope, element, attrs) {
11449 11451 scope.$watch('vars', function (newValue, oldValue, scope) {
11450 11452 element.empty();
11451 11453 element.append(JsonHuman.format(scope.vars));
11452 11454 });
11453 11455
11454 11456 }
11455 11457 }
11456 11458 }])
11457 11459
11458 11460 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11459 11461 // #
11460 11462 // # This program is free software: you can redistribute it and/or modify
11461 11463 // # it under the terms of the GNU Affero General Public License, version 3
11462 11464 // # (only), as published by the Free Software Foundation.
11463 11465 // #
11464 11466 // # This program is distributed in the hope that it will be useful,
11465 11467 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11466 11468 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11467 11469 // # GNU General Public License for more details.
11468 11470 // #
11469 11471 // # You should have received a copy of the GNU Affero General Public License
11470 11472 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11471 11473 // #
11472 11474 // # This program is dual-licensed. If you wish to learn more about the
11473 11475 // # AppEnlight Enterprise Edition, including its added features, Support
11474 11476 // # services, and proprietary license terms, please see
11475 11477 // # https://rhodecode.com/licenses/
11476 11478
11477 11479 angular.module('appenlight.directives.isoToRelativeTime', []).
11478 11480 directive('isoToRelativeTime', function () {
11479 11481 return {
11480 11482 "restrict": "E",
11481 11483 scope: {
11482 11484 time: '@'
11483 11485 },
11484 11486 "link": function (scope, element) {
11485 11487 scope.$watch('time', function(newValue, oldValue, scope){
11486 11488 element.empty();
11487 11489 element.html(moment.utc(newValue).fromNow());
11488 11490 });
11489 11491 }
11490 11492 }
11491 11493 })
11492 11494
11493 11495 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11494 11496 // #
11495 11497 // # This program is free software: you can redistribute it and/or modify
11496 11498 // # it under the terms of the GNU Affero General Public License, version 3
11497 11499 // # (only), as published by the Free Software Foundation.
11498 11500 // #
11499 11501 // # This program is distributed in the hope that it will be useful,
11500 11502 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11501 11503 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11502 11504 // # GNU General Public License for more details.
11503 11505 // #
11504 11506 // # You should have received a copy of the GNU Affero General Public License
11505 11507 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11506 11508 // #
11507 11509 // # This program is dual-licensed. If you wish to learn more about the
11508 11510 // # AppEnlight Enterprise Edition, including its added features, Support
11509 11511 // # services, and proprietary license terms, please see
11510 11512 // # https://rhodecode.com/licenses/
11511 11513
11512 11514 angular.module('appenlight.controllers')
11513 11515 .controller('ApplicationPermissionsController', ApplicationPermissionsController);
11514 11516
11515 11517 ApplicationPermissionsController.$inject = ['sectionViewResource',
11516 11518 'applicationsPropertyResource', 'groupsResource']
11517 11519
11518 11520
11519 11521 function ApplicationPermissionsController(sectionViewResource, applicationsPropertyResource , groupsResource) {
11520 11522 var vm = this;
11521 11523 vm.form = {
11522 11524 autocompleteUser: '',
11523 11525 selectedGroup: null,
11524 11526 selectedUserPermissions: {},
11525 11527 selectedGroupPermissions: {}
11526 11528 }
11527 11529 vm.possibleGroups = groupsResource.query(null, function(){
11528 11530 if (vm.possibleGroups.length > 0){
11529 11531 vm.form.selectedGroup = vm.possibleGroups[0].id;
11530 11532 }
11531 11533 });
11532 11534
11533 11535 vm.possibleUsers = [];
11534 11536 _.each(vm.resource.possible_permissions, function (perm) {
11535 11537 vm.form.selectedUserPermissions[perm] = false;
11536 11538 vm.form.selectedGroupPermissions[perm] = false;
11537 11539 });
11538 11540
11539 11541 /**
11540 11542 * Converts the permission list into {user, permission_list objects}
11541 11543 * for rendering in templates
11542 11544 * **/
11543 11545 var tmpObj = {
11544 11546 user: {},
11545 11547 group: {}
11546 11548 };
11547 11549 _.each(vm.currentPermissions, function (perm) {
11548 11550
11549 11551 if (perm.type == 'user') {
11550 11552 if (typeof tmpObj[perm.type][perm.user_name] === 'undefined') {
11551 11553 tmpObj[perm.type][perm.user_name] = {
11552 11554 self: perm,
11553 11555 permissions: []
11554 11556 }
11555 11557 }
11556 11558 if (tmpObj[perm.type][perm.user_name].permissions.indexOf(perm.perm_name) === -1) {
11557 11559 tmpObj[perm.type][perm.user_name].permissions.push(perm.perm_name);
11558 11560 }
11559 11561 }
11560 11562 else {
11561 11563 if (typeof tmpObj[perm.type][perm.group_name] === 'undefined') {
11562 11564 tmpObj[perm.type][perm.group_name] = {
11563 11565 self: perm,
11564 11566 permissions: []
11565 11567 }
11566 11568 }
11567 11569 if (tmpObj[perm.type][perm.group_name].permissions.indexOf(perm.perm_name) === -1) {
11568 11570 tmpObj[perm.type][perm.group_name].permissions.push(perm.perm_name);
11569 11571 }
11570 11572
11571 11573 }
11572 11574 });
11573 11575 vm.currentPermissions = {
11574 11576 user: _.values(tmpObj.user),
11575 11577 group: _.values(tmpObj.group),
11576 11578 };
11577 11579
11578 11580
11579 11581
11580 11582 vm.searchUsers = function (searchPhrase) {
11581 11583
11582 11584 vm.searchingUsers = true;
11583 11585 return sectionViewResource.query({
11584 11586 section: 'users_section',
11585 11587 view: 'search_users',
11586 11588 'user_name': searchPhrase
11587 11589 }).$promise.then(function (data) {
11588 11590 vm.searchingUsers = false;
11589 11591 return _.map(data, function (item) {
11590 11592 return item;
11591 11593 });
11592 11594 });
11593 11595 };
11594 11596
11595 11597
11596 11598 vm.setGroupPermission = function(){
11597 11599 var POSTObj = {
11598 11600 'group_id': vm.form.selectedGroup,
11599 11601 'permissions': []
11600 11602 };
11601 11603 for (var key in vm.form.selectedGroupPermissions) {
11602 11604 if (vm.form.selectedGroupPermissions[key]) {
11603 11605 POSTObj.permissions.push(key)
11604 11606 }
11605 11607 }
11606 11608 applicationsPropertyResource.save({
11607 11609 key: 'group_permissions',
11608 11610 resourceId: vm.resource.resource_id
11609 11611 }, POSTObj,
11610 11612 function (data) {
11611 11613 var found_row = false;
11612 11614 _.each(vm.currentPermissions.group, function (perm) {
11613 11615 if (perm.self.group_id == data.group.id) {
11614 11616 perm['permissions'] = data['permissions'];
11615 11617 found_row = true;
11616 11618 }
11617 11619 });
11618 11620 if (!found_row) {
11619 11621 data.self = data.group;
11620 11622 // normalize data format
11621 11623 data.self.group_id = data.self.id;
11622 11624 vm.currentPermissions.group.push(data);
11623 11625 }
11624 11626 });
11625 11627
11626 11628 }
11627 11629
11628 11630
11629 11631 vm.setUserPermission = function () {
11630 11632
11631 11633 var POSTObj = {
11632 11634 'user_name': vm.form.autocompleteUser,
11633 11635 'permissions': []
11634 11636 };
11635 11637 for (var key in vm.form.selectedUserPermissions) {
11636 11638 if (vm.form.selectedUserPermissions[key]) {
11637 11639 POSTObj.permissions.push(key)
11638 11640 }
11639 11641 }
11640 11642 applicationsPropertyResource.save({
11641 11643 key: 'user_permissions',
11642 11644 resourceId: vm.resource.resource_id
11643 11645 }, POSTObj,
11644 11646 function (data) {
11645 11647 var found_row = false;
11646 11648 _.each(vm.currentPermissions.user, function (perm) {
11647 11649 if (perm.self.user_name == data['user_name']) {
11648 11650 perm['permissions'] = data['permissions'];
11649 11651 found_row = true;
11650 11652 }
11651 11653 });
11652 11654 if (!found_row) {
11653 11655 data.self = data;
11654 11656 vm.currentPermissions.user.push(data);
11655 11657 }
11656 11658 });
11657 11659 }
11658 11660
11659 11661 vm.removeUserPermission = function (perm_name, curr_perm) {
11660 11662
11661 11663
11662 11664 var POSTObj = {
11663 11665 key: 'user_permissions',
11664 11666 user_name: curr_perm.self.user_name,
11665 11667 permissions: [perm_name],
11666 11668 resourceId: vm.resource.resource_id
11667 11669 }
11668 11670 applicationsPropertyResource.delete(POSTObj, function (data) {
11669 11671 _.each(vm.currentPermissions.user, function (perm) {
11670 11672 if (perm.self.user_name == data['user_name']) {
11671 11673 perm['permissions'] = data['permissions']
11672 11674 }
11673 11675 });
11674 11676 });
11675 11677 }
11676 11678
11677 11679 vm.removeGroupPermission = function (perm_name, curr_perm) {
11678 11680
11679 11681 var POSTObj = {
11680 11682 key: 'group_permissions',
11681 11683 group_id: curr_perm.self.group_id,
11682 11684 permissions: [perm_name],
11683 11685 resourceId: vm.resource.resource_id
11684 11686 }
11685 11687 applicationsPropertyResource.delete(POSTObj, function (data) {
11686 11688 _.each(vm.currentPermissions.group, function (perm) {
11687 11689 if (perm.self.group_id == data.group.id) {
11688 11690 perm['permissions'] = data['permissions']
11689 11691 }
11690 11692 });
11691 11693 });
11692 11694 }
11693 11695 }
11694 11696
11695 11697 angular.module('appenlight.directives.permissionsForm',[])
11696 11698 .directive('permissionsForm', function () {
11697 11699 return {
11698 11700 "restrict": "E",
11699 11701 "controller": "ApplicationPermissionsController",
11700 11702 controllerAs: 'permissions',
11701 11703 bindToController: true,
11702 11704 scope: {
11703 11705 currentPermissions: '=',
11704 11706 possiblePermissions: '=',
11705 11707 resource: '='
11706 11708 },
11707 11709 templateUrl: 'directives/permissions/permissions.html'
11708 11710 }
11709 11711 })
11710 11712
11711 11713 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11712 11714 // #
11713 11715 // # This program is free software: you can redistribute it and/or modify
11714 11716 // # it under the terms of the GNU Affero General Public License, version 3
11715 11717 // # (only), as published by the Free Software Foundation.
11716 11718 // #
11717 11719 // # This program is distributed in the hope that it will be useful,
11718 11720 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11719 11721 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11720 11722 // # GNU General Public License for more details.
11721 11723 // #
11722 11724 // # You should have received a copy of the GNU Affero General Public License
11723 11725 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11724 11726 // #
11725 11727 // # This program is dual-licensed. If you wish to learn more about the
11726 11728 // # AppEnlight Enterprise Edition, including its added features, Support
11727 11729 // # services, and proprietary license terms, please see
11728 11730 // # https://rhodecode.com/licenses/
11729 11731
11730 11732 angular.module('appenlight.directives.pluginConfig', []).directive('pluginConfig', function () {
11731 11733 return {
11732 11734 scope: {},
11733 11735 bindToController: {
11734 11736 resource: '=',
11735 11737 section: '='
11736 11738 },
11737 11739 restrict: 'E',
11738 11740 templateUrl: 'directives/plugin_config/plugin_config.html',
11739 11741 controller: PluginConfig,
11740 11742 controllerAs: 'plugin_ctrlr'
11741 11743 };
11742 11744
11743 11745 PluginConfig.$inject = ['stateHolder'];
11744 11746
11745 11747 function PluginConfig(stateHolder) {
11746 11748 var vm = this;
11747 11749 vm.plugins = {};
11748 11750 vm.inclusions = stateHolder.plugins.inclusions[vm.section];
11749 11751 }
11750 11752 });
11751 11753
11752 11754 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11753 11755 // #
11754 11756 // # This program is free software: you can redistribute it and/or modify
11755 11757 // # it under the terms of the GNU Affero General Public License, version 3
11756 11758 // # (only), as published by the Free Software Foundation.
11757 11759 // #
11758 11760 // # This program is distributed in the hope that it will be useful,
11759 11761 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11760 11762 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11761 11763 // # GNU General Public License for more details.
11762 11764 // #
11763 11765 // # You should have received a copy of the GNU Affero General Public License
11764 11766 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11765 11767 // #
11766 11768 // # This program is dual-licensed. If you wish to learn more about the
11767 11769 // # AppEnlight Enterprise Edition, including its added features, Support
11768 11770 // # services, and proprietary license terms, please see
11769 11771 // # https://rhodecode.com/licenses/
11770 11772
11771 11773 angular.module('appenlight.directives.postProcessAction', []).directive('postProcessAction', ['applicationsPropertyResource', function (applicationsPropertyResource) {
11772 11774 return {
11773 11775 scope: {},
11774 11776 bindToController:{
11775 11777 action: '=',
11776 11778 resource: '='
11777 11779 },
11778 11780 controller:postProcessActionController,
11779 11781 controllerAs:'ctrl',
11780 11782 restrict: 'E',
11781 11783 templateUrl: 'directives/postprocess_action/postprocess_action.html'
11782 11784 };
11783 11785 function postProcessActionController(){
11784 11786 var vm = this;
11785 11787
11786 11788 var allOps = {
11787 11789 'eq': 'Equal',
11788 11790 'ne': 'Not equal',
11789 11791 'ge': 'Greater or equal',
11790 11792 'gt': 'Greater than',
11791 11793 'le': 'Lesser or equal',
11792 11794 'lt': 'Lesser than',
11793 11795 'startswith': 'Starts with',
11794 11796 'endswith': 'Ends with',
11795 11797 'contains': 'Contains'
11796 11798 };
11797 11799
11798 11800 var fieldOps = {};
11799 11801 fieldOps['http_status'] = ['eq', 'ne', 'ge', 'le'];
11800 11802 fieldOps['group:priority'] = ['eq', 'ne', 'ge', 'le'];
11801 11803 fieldOps['duration'] = ['ge', 'le'];
11802 11804 fieldOps['url_domain'] = ['eq', 'ne', 'startswith', 'endswith',
11803 11805 'contains'];
11804 11806 fieldOps['url_path'] = ['eq', 'ne', 'startswith', 'endswith',
11805 11807 'contains'];
11806 11808 fieldOps['error'] = ['eq', 'ne', 'startswith', 'endswith',
11807 11809 'contains'];
11808 11810 fieldOps['tags:server_name'] = ['eq', 'ne', 'startswith', 'endswith',
11809 11811 'contains'];
11810 11812 fieldOps['group:occurences'] = ['eq', 'ne', 'ge', 'le'];
11811 11813
11812 11814 var possibleFields = {
11813 11815 '__AND__': 'All met (composite rule)',
11814 11816 '__OR__': 'One met (composite rule)',
11815 11817 '__NOT__': 'Not met (composite rule)',
11816 11818 'http_status': 'HTTP Status',
11817 11819 'duration': 'Request duration',
11818 11820 'group:priority': 'Group -> Priority',
11819 11821 'url_domain': 'Domain',
11820 11822 'url_path': 'URL Path',
11821 11823 'error': 'Error',
11822 11824 'tags:server_name': 'Tag -> Server name',
11823 11825 'group:occurences': 'Group -> Occurences'
11824 11826 };
11825 11827
11826 11828 vm.ruleDefinitions = {
11827 11829 fieldOps: fieldOps,
11828 11830 allOps: allOps,
11829 11831 possibleFields: possibleFields
11830 11832 };
11831 11833
11832 11834 vm.possibleActions = [
11833 11835 ['1', 'Priority +1'],
11834 11836 ['-1', 'Priority -1']
11835 11837 ];
11836 11838
11837 11839 vm.deleteAction = function (action) {
11838 11840 applicationsPropertyResource.remove({
11839 11841 pkey: vm.action.pkey,
11840 11842 resourceId: vm.resource.resource_id,
11841 11843 key: 'postprocessing_rules'
11842 11844 }, function () {
11843 11845 vm.resource.postprocessing_rules.splice(
11844 11846 vm.resource.postprocessing_rules.indexOf(action), 1);
11845 11847 });
11846 11848 };
11847 11849
11848 11850
11849 11851 vm.saveAction = function () {
11850 11852 var params = {
11851 11853 'pkey': vm.action.pkey,
11852 11854 'resourceId': vm.resource.resource_id,
11853 11855 key: 'postprocessing_rules'
11854 11856 };
11855 11857 applicationsPropertyResource.update(params, vm.action,
11856 11858 function (data) {
11857 11859 vm.action.dirty = false;
11858 11860 vm.errors = [];
11859 11861 }, function (response) {
11860 11862 if (response.status == 422) {
11861 11863 var errorDict = angular.fromJson(response.data);
11862 11864 vm.errors = _.values(errorDict);
11863 11865 }
11864 11866 });
11865 11867 };
11866 11868
11867 11869 vm.setDirty = function() {
11868 11870 vm.action.dirty = true;
11869 11871
11870 11872 };
11871 11873 }
11872 11874
11873 11875 }]);
11874 11876
11875 11877 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11876 11878 // #
11877 11879 // # This program is free software: you can redistribute it and/or modify
11878 11880 // # it under the terms of the GNU Affero General Public License, version 3
11879 11881 // # (only), as published by the Free Software Foundation.
11880 11882 // #
11881 11883 // # This program is distributed in the hope that it will be useful,
11882 11884 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11883 11885 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11884 11886 // # GNU General Public License for more details.
11885 11887 // #
11886 11888 // # You should have received a copy of the GNU Affero General Public License
11887 11889 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11888 11890 // #
11889 11891 // # This program is dual-licensed. If you wish to learn more about the
11890 11892 // # AppEnlight Enterprise Edition, including its added features, Support
11891 11893 // # services, and proprietary license terms, please see
11892 11894 // # https://rhodecode.com/licenses/
11893 11895
11894 11896 angular.module('appenlight.directives.recursive', []).directive("recursive", function ($compile) {
11895 11897 return {
11896 11898 restrict: "EACM",
11897 11899 priority: 100000,
11898 11900 compile: function (tElement, tAttr) {
11899 11901 var contents = tElement.contents().remove();
11900 11902 var compiledContents;
11901 11903 return function (scope, iElement, iAttr) {
11902 11904 if (!compiledContents) {
11903 11905 compiledContents = $compile(contents);
11904 11906 }
11905 11907 iElement.append(compiledContents(scope, function (clone) {
11906 11908 return clone;
11907 11909 }));
11908 11910 };
11909 11911 }
11910 11912 };
11911 11913 });
11912 11914
11913 11915 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
11914 11916 // #
11915 11917 // # This program is free software: you can redistribute it and/or modify
11916 11918 // # it under the terms of the GNU Affero General Public License, version 3
11917 11919 // # (only), as published by the Free Software Foundation.
11918 11920 // #
11919 11921 // # This program is distributed in the hope that it will be useful,
11920 11922 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
11921 11923 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11922 11924 // # GNU General Public License for more details.
11923 11925 // #
11924 11926 // # You should have received a copy of the GNU Affero General Public License
11925 11927 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
11926 11928 // #
11927 11929 // # This program is dual-licensed. If you wish to learn more about the
11928 11930 // # AppEnlight Enterprise Edition, including its added features, Support
11929 11931 // # services, and proprietary license terms, please see
11930 11932 // # https://rhodecode.com/licenses/
11931 11933
11932 11934 angular.module('appenlight.directives.reportAlertAction', []).directive('reportAlertAction', ['userSelfPropertyResource', function (userSelfPropertyResource) {
11933 11935 return {
11934 11936 scope: {},
11935 11937 bindToController:{
11936 11938 action: '=',
11937 11939 applications: '=',
11938 11940 possibleChannels: '=',
11939 11941 actions: '=',
11940 11942 ruleDefinitions: '='
11941 11943 },
11942 11944 controller:reportAlertActionController,
11943 11945 controllerAs:'ctrl',
11944 11946 restrict: 'E',
11945 11947 templateUrl: 'directives/report_alert_action/report_alert_action.html'
11946 11948 };
11947 11949 function reportAlertActionController(){
11948 11950 var vm = this;
11949 11951 vm.deleteAction = function (actions, action) {
11950 11952 var get = {
11951 11953 key: 'alert_channels_rules',
11952 11954 pkey: action.pkey
11953 11955 };
11954 11956 userSelfPropertyResource.remove(get, function (data) {
11955 11957 actions.splice(actions.indexOf(action), 1);
11956 11958 });
11957 11959
11958 11960 };
11959 11961
11960 11962 vm.bindChannel = function(){
11961 11963 var post = {
11962 11964 channel_pkey: vm.channelToBind.pkey,
11963 11965 action_pkey: vm.action.pkey
11964 11966 };
11965 11967
11966 11968 userSelfPropertyResource.save({key: 'alert_channels_actions_binds'}, post,
11967 11969 function (data) {
11968 11970 vm.action.channels = [];
11969 11971 vm.action.channels = data.channels;
11970 11972 }, function (response) {
11971 11973 if (response.status == 422) {
11972 11974
11973 11975 }
11974 11976 });
11975 11977 };
11976 11978
11977 11979 vm.unBindChannel = function(channel){
11978 11980 userSelfPropertyResource.delete({
11979 11981 key: 'alert_channels_actions_binds',
11980 11982 channel_pkey: channel.pkey,
11981 11983 action_pkey: vm.action.pkey
11982 11984 },
11983 11985 function (data) {
11984 11986 vm.action.channels = [];
11985 11987 vm.action.channels = data.channels;
11986 11988 }, function (response) {
11987 11989 if (response.status == 422) {
11988 11990
11989 11991 }
11990 11992 });
11991 11993 };
11992 11994
11993 11995 vm.saveAction = function () {
11994 11996 var params = {
11995 11997 key: 'alert_channels_rules',
11996 11998 pkey: vm.action.pkey
11997 11999 };
11998 12000 userSelfPropertyResource.update(params, vm.action,
11999 12001 function (data) {
12000 12002 vm.action.dirty = false;
12001 12003 vm.errors = [];
12002 12004 }, function (response) {
12003 12005 if (response.status == 422) {
12004 12006 var errorDict = angular.fromJson(response.data);
12005 12007 vm.errors = _.values(errorDict);
12006 12008 }
12007 12009 });
12008 12010 };
12009 12011
12010 12012 vm.possibleNotifications = [
12011 12013 ['always', 'Always'],
12012 12014 ['only_first', 'Only New'],
12013 12015 ];
12014 12016
12015 12017 vm.possibleChannels = _.filter(vm.possibleChannels, function(c){
12016 12018 return c.supports_report_alerting }
12017 12019 );
12018 12020
12019 12021 if (vm.possibleChannels.length > 0){
12020 12022 vm.channelToBind = vm.possibleChannels[0];
12021 12023 }
12022 12024
12023 12025 vm.setDirty = function() {
12024 12026 vm.action.dirty = true;
12025 12027
12026 12028 };
12027 12029 }
12028 12030
12029 12031 }]);
12030 12032
12031 12033 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12032 12034 // #
12033 12035 // # This program is free software: you can redistribute it and/or modify
12034 12036 // # it under the terms of the GNU Affero General Public License, version 3
12035 12037 // # (only), as published by the Free Software Foundation.
12036 12038 // #
12037 12039 // # This program is distributed in the hope that it will be useful,
12038 12040 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12039 12041 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12040 12042 // # GNU General Public License for more details.
12041 12043 // #
12042 12044 // # You should have received a copy of the GNU Affero General Public License
12043 12045 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12044 12046 // #
12045 12047 // # This program is dual-licensed. If you wish to learn more about the
12046 12048 // # AppEnlight Enterprise Edition, including its added features, Support
12047 12049 // # services, and proprietary license terms, please see
12048 12050 // # https://rhodecode.com/licenses/
12049 12051
12050 12052 angular.module('appenlight.directives.ruleReadOnly', []).directive('ruleReadOnly', ['userSelfPropertyResource', function (userSelfPropertyResource) {
12051 12053 return {
12052 12054 scope: {},
12053 12055 bindToController:{
12054 12056 parentObj: '=',
12055 12057 rule: '=',
12056 12058 ruleDefinitions: '=',
12057 12059 parentRule: "=",
12058 12060 config: "="
12059 12061 },
12060 12062 restrict: 'E',
12061 12063 templateUrl: 'directives/rule_read_only/rule_read_only.html',
12062 12064 controller:RuleController,
12063 12065 controllerAs:'rule_ctrlr'
12064 12066 }
12065 12067 function RuleController(){
12066 12068 var vm = this;
12067 12069 vm.readOnlyPossibleFields = {};
12068 12070 var labelPairs = _.pairs(vm.parentObj.config);
12069 12071 _.each(labelPairs, function (entry) {
12070 12072 vm.readOnlyPossibleFields[entry[0]] = entry[1].human_label;
12071 12073 });
12072 12074 }
12073 12075 }]);
12074 12076
12075 12077 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12076 12078 // #
12077 12079 // # This program is free software: you can redistribute it and/or modify
12078 12080 // # it under the terms of the GNU Affero General Public License, version 3
12079 12081 // # (only), as published by the Free Software Foundation.
12080 12082 // #
12081 12083 // # This program is distributed in the hope that it will be useful,
12082 12084 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12083 12085 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12084 12086 // # GNU General Public License for more details.
12085 12087 // #
12086 12088 // # You should have received a copy of the GNU Affero General Public License
12087 12089 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12088 12090 // #
12089 12091 // # This program is dual-licensed. If you wish to learn more about the
12090 12092 // # AppEnlight Enterprise Edition, including its added features, Support
12091 12093 // # services, and proprietary license terms, please see
12092 12094 // # https://rhodecode.com/licenses/
12093 12095
12094 12096 angular.module('appenlight.directives.rule', []).directive('rule', function () {
12095 12097 return {
12096 12098 scope: {},
12097 12099 bindToController:{
12098 12100 parentObj: '=',
12099 12101 rule: '=',
12100 12102 ruleDefinitions: '=',
12101 12103 parentRule: "=",
12102 12104 config: "="
12103 12105 },
12104 12106 restrict: 'E',
12105 12107 templateUrl: 'directives/rule/rule.html',
12106 12108 controller:RuleController,
12107 12109 controllerAs:'rule_ctrlr'
12108 12110 };
12109 12111 function RuleController(){
12110 12112 var vm = this;
12111 12113
12112 12114 vm.rule.dirty = false;
12113 12115 vm.oldField = vm.rule.field;
12114 12116
12115 12117 vm.add = function () {
12116 12118 vm.rule.rules.push(
12117 12119 {op: "eq", field: 'http_status', value: ""}
12118 12120 );
12119 12121 vm.setDirty();
12120 12122 };
12121 12123
12122 12124 vm.setDirty = function() {
12123 12125 vm.rule.dirty = true;
12124 12126
12125 12127 if (vm.parentObj){
12126 12128
12127 12129
12128 12130 vm.parentObj.dirty = true;
12129 12131 }
12130 12132 };
12131 12133
12132 12134 vm.fieldChange = function () {
12133 12135 var compound_types = ['__AND__', '__OR__', '__NOT__'];
12134 12136 var new_is_compound = compound_types.indexOf(vm.rule.field) !== -1;
12135 12137 var old_was_compound = compound_types.indexOf(vm.oldField) !== -1;
12136 12138
12137 12139 if (!new_is_compound) {
12138 12140 vm.rule.op = vm.ruleDefinitions.fieldOps[vm.rule.field][0];
12139 12141 }
12140 12142 if ((new_is_compound && !old_was_compound)) {
12141 12143
12142 12144 delete vm.rule.value;
12143 12145 vm.rule.rules = [];
12144 12146 vm.add();
12145 12147 }
12146 12148 else if (!new_is_compound && old_was_compound) {
12147 12149
12148 12150 delete vm.rule.rules;
12149 12151 vm.rule.value = '';
12150 12152 }
12151 12153 vm.oldField = vm.rule.field;
12152 12154 vm.setDirty();
12153 12155 };
12154 12156
12155 12157 vm.deleteRule = function (parent, rule) {
12156 12158 parent.rules.splice(parent.rules.indexOf(rule), 1);
12157 12159 vm.setDirty();
12158 12160 }
12159 12161 }
12160 12162 });
12161 12163
12162 12164 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12163 12165 // #
12164 12166 // # This program is free software: you can redistribute it and/or modify
12165 12167 // # it under the terms of the GNU Affero General Public License, version 3
12166 12168 // # (only), as published by the Free Software Foundation.
12167 12169 // #
12168 12170 // # This program is distributed in the hope that it will be useful,
12169 12171 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12170 12172 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12171 12173 // # GNU General Public License for more details.
12172 12174 // #
12173 12175 // # You should have received a copy of the GNU Affero General Public License
12174 12176 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12175 12177 // #
12176 12178 // # This program is dual-licensed. If you wish to learn more about the
12177 12179 // # AppEnlight Enterprise Edition, including its added features, Support
12178 12180 // # services, and proprietary license terms, please see
12179 12181 // # https://rhodecode.com/licenses/
12180 12182
12181 12183 angular.module('appenlight.directives.smallReportGroupList',[]).
12182 12184 directive('smallReportGroupList', [function () {
12183 12185 return {
12184 12186 restrict: "A",
12185 12187 scope: {
12186 12188 groups: '=',
12187 12189 applications: '='
12188 12190 },
12189 12191 templateUrl: 'templates/reports/small_report_group_list.html'
12190 12192 }
12191 12193 }])
12192 12194
12193 12195 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12194 12196 // #
12195 12197 // # This program is free software: you can redistribute it and/or modify
12196 12198 // # it under the terms of the GNU Affero General Public License, version 3
12197 12199 // # (only), as published by the Free Software Foundation.
12198 12200 // #
12199 12201 // # This program is distributed in the hope that it will be useful,
12200 12202 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12201 12203 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12202 12204 // # GNU General Public License for more details.
12203 12205 // #
12204 12206 // # You should have received a copy of the GNU Affero General Public License
12205 12207 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12206 12208 // #
12207 12209 // # This program is dual-licensed. If you wish to learn more about the
12208 12210 // # AppEnlight Enterprise Edition, including its added features, Support
12209 12211 // # services, and proprietary license terms, please see
12210 12212 // # https://rhodecode.com/licenses/
12211 12213
12212 12214 angular.module('appenlight.directives.smallReportList', []).
12213 12215 directive('smallReportList', [function () {
12214 12216 return {
12215 12217 restrict: "A",
12216 12218 scope: {
12217 12219 reports: '=',
12218 12220 applications: '='
12219 12221 },
12220 12222 templateUrl: 'templates/reports/small_report_list.html'
12221 12223 }
12222 12224 }])
12223 12225
12224 12226 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12225 12227 // #
12226 12228 // # This program is free software: you can redistribute it and/or modify
12227 12229 // # it under the terms of the GNU Affero General Public License, version 3
12228 12230 // # (only), as published by the Free Software Foundation.
12229 12231 // #
12230 12232 // # This program is distributed in the hope that it will be useful,
12231 12233 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12232 12234 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12233 12235 // # GNU General Public License for more details.
12234 12236 // #
12235 12237 // # You should have received a copy of the GNU Affero General Public License
12236 12238 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12237 12239 // #
12238 12240 // # This program is dual-licensed. If you wish to learn more about the
12239 12241 // # AppEnlight Enterprise Edition, including its added features, Support
12240 12242 // # services, and proprietary license terms, please see
12241 12243 // # https://rhodecode.com/licenses/
12242 12244
12243 12245 'use strict';
12244 12246
12245 12247 /* Filters */
12246 12248
12247 12249 angular.module('appenlight.filters').
12248 12250 filter('interpolate', ['version', function (version) {
12249 12251 return function (text) {
12250 12252 return String(text).replace(/\%VERSION\%/mg, version);
12251 12253 }
12252 12254 }])
12253 12255 .filter('isoToRelativeTime', function () {
12254 12256 return function (input) {
12255 12257 return moment.utc(input).fromNow();
12256 12258 }
12257 12259 })
12258 12260
12259 12261 .filter('round', function () {
12260 12262 return function (input, precision) {
12261 12263 return input.toFixed(precision)
12262 12264 }
12263 12265 })
12264 12266
12265 12267 .filter('numberToThousands', function () {
12266 12268 return function (input) {
12267 12269 if (input > 1000000) {
12268 12270 var i = input / 1000000;
12269 12271 return i.toFixed(1).toString() + 'M'
12270 12272 }
12271 12273 else if (input > 1000) {
12272 12274 var i = input / 1000;
12273 12275 return i.toFixed(1).toString() + 'k'
12274 12276 }
12275 12277 else {
12276 12278 return input;
12277 12279 }
12278 12280 }
12279 12281 })
12280 12282 .filter('getOrdered', function () {
12281 12283 return function (input, filterOn) {
12282 12284 var ordered = {};
12283 12285 for (var key in input) {
12284 12286 ordered[input[key][filterOn]] = input[key];
12285 12287 }
12286 12288 return ordered;
12287 12289 };
12288 12290 })
12289 12291 .filter('objectToOrderedArray', function(){
12290 12292 return function(items, field, reverse) {
12291 12293 var filtered = [];
12292 12294 angular.forEach(items, function(item) {
12293 12295 filtered.push(item);
12294 12296 });
12295 12297 filtered.sort(function (a, b) {
12296 12298 return (a[field] > b[field] ? 1 : -1);
12297 12299 });
12298 12300 if(reverse) filtered.reverse();
12299 12301 return filtered;
12300 12302 };
12301 12303 })
12302 12304 .filter('apdexValue', function () {
12303 12305 return function (input) {
12304 12306 if (input.apdex >= 95) {
12305 12307 return 'satisfactory';
12306 12308 } else if (input.apdex >= 80) {
12307 12309 return 'tolerating';
12308 12310 } else {
12309 12311 return 'frustrating';
12310 12312 }
12311 12313 };
12312 12314 })
12313 12315 .filter('truncate', function(){
12314 12316 return function (text, length, end) {
12315 12317 if (isNaN(length))
12316 12318 length = 10;
12317 12319
12318 12320 if (end === undefined)
12319 12321 end = "...";
12320 12322
12321 12323 if (text.length <= length || text.length - end.length <= length) {
12322 12324 return text;
12323 12325 }
12324 12326 else {
12325 12327 return String(text).substring(0, length-end.length) + end;
12326 12328 }
12327 12329
12328 12330 };
12329 12331 })
12330 12332
12331 12333 ;
12332 12334
12333 12335 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12334 12336 // #
12335 12337 // # This program is free software: you can redistribute it and/or modify
12336 12338 // # it under the terms of the GNU Affero General Public License, version 3
12337 12339 // # (only), as published by the Free Software Foundation.
12338 12340 // #
12339 12341 // # This program is distributed in the hope that it will be useful,
12340 12342 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12341 12343 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12342 12344 // # GNU General Public License for more details.
12343 12345 // #
12344 12346 // # You should have received a copy of the GNU Affero General Public License
12345 12347 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12346 12348 // #
12347 12349 // # This program is dual-licensed. If you wish to learn more about the
12348 12350 // # AppEnlight Enterprise Edition, including its added features, Support
12349 12351 // # services, and proprietary license terms, please see
12350 12352 // # https://rhodecode.com/licenses/
12351 12353
12352 12354 angular.module('appenlight').config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
12353 12355
12354 12356 $urlRouterProvider.otherwise('/ui');
12355 12357
12356 12358 $stateProvider.state('logs', {
12357 12359 url: '/ui/logs?resource',
12358 12360 templateUrl: 'templates/logs.html',
12359 12361 controller: 'LogsController as logs'
12360 12362 });
12361 12363
12362 12364 $stateProvider.state('front_dashboard', {
12363 12365 url: '/ui',
12364 templateUrl: 'templates/dashboard.html',
12365 controller: 'IndexDashboardController as index'
12366 component: 'indexDashboardView'
12366 12367 });
12367 12368
12368 12369 $stateProvider.state('report', {
12369 12370 abstract: true,
12370 12371 url: '/ui/report',
12371 12372 templateUrl: 'templates/reports/parent_view.html'
12372 12373 });
12373 12374
12374 12375 $stateProvider.state('report.list', {
12375 12376 url: '?start_date&min_duration&max_duration&{view_name:any}&{server_name:any}&resource',
12376 12377 templateUrl: 'templates/reports/list.html',
12377 12378 controller: 'ReportsListController as reports_list'
12378 12379 });
12379 12380
12380 12381 $stateProvider.state('report.list_slow', {
12381 12382 url: '/list_slow?start_date&min_duration&max_duration&{view_name:any}&{server_name:any}&resource',
12382 12383 templateUrl: 'templates/reports/list_slow.html',
12383 12384 controller: 'ReportsListSlowController as reports_list'
12384 12385 });
12385 12386
12386 12387 $stateProvider.state('report.view_detail', {
12387 12388 url: '/:groupId/:reportId',
12388 12389 templateUrl: 'templates/reports/view.html',
12389 12390 controller: 'ReportsViewController as report'
12390 12391 });
12391 12392 $stateProvider.state('report.view_group', {
12392 12393 url: '/:groupId',
12393 12394 templateUrl: 'templates/reports/view.html',
12394 12395 controller: 'ReportsViewController as report'
12395 12396 });
12396 12397 $stateProvider.state('events', {
12397 12398 url: '/ui/events',
12398 12399 templateUrl: 'templates/events.html',
12399 12400 controller: 'EventsController as events'
12400 12401 });
12401 12402 $stateProvider.state('admin', {
12402 12403 url: '/ui/admin',
12403 12404 templateUrl: 'templates/admin/parent_view.html'
12404 12405 });
12405 12406 $stateProvider.state('admin.user', {
12406 12407 abstract: true,
12407 12408 url: '/user',
12408 12409 templateUrl: 'templates/admin/users/parent_view.html'
12409 12410 });
12410 12411 $stateProvider.state('admin.user.list', {
12411 12412 url: '/list',
12412 12413 templateUrl: 'templates/admin/users/users_list.html',
12413 12414 controller: 'AdminUsersController as users'
12414 12415 });
12415 12416 $stateProvider.state('admin.user.create', {
12416 12417 url: '/create',
12417 12418 templateUrl: 'templates/admin/users/users_create.html',
12418 12419 controller: 'AdminUsersCreateController as user'
12419 12420 });
12420 12421 $stateProvider.state('admin.user.update', {
12421 12422 url: '/{userId}/update',
12422 12423 templateUrl: 'templates/admin/users/users_create.html',
12423 12424 controller: 'AdminUsersCreateController as user'
12424 12425 });
12425 12426
12426 12427
12427 12428 $stateProvider.state('admin.group', {
12428 12429 abstract: true,
12429 12430 url: '/group',
12430 12431 templateUrl: 'templates/admin/groups/parent_view.html'
12431 12432 });
12432 12433 $stateProvider.state('admin.group.list', {
12433 12434 url: '/list',
12434 12435 templateUrl: 'templates/admin/groups/groups_list.html',
12435 12436 controller: 'AdminGroupsController as groups'
12436 12437 });
12437 12438 $stateProvider.state('admin.group.create', {
12438 12439 url: '/create',
12439 12440 templateUrl: 'templates/admin/groups/groups_create.html',
12440 12441 controller: 'AdminGroupsCreateController as group'
12441 12442 });
12442 12443 $stateProvider.state('admin.group.update', {
12443 12444 url: '/{groupId}/update',
12444 12445 templateUrl: 'templates/admin/groups/groups_create.html',
12445 12446 controller: 'AdminGroupsCreateController as group'
12446 12447 });
12447 12448
12448 12449 $stateProvider.state('admin.application', {
12449 12450 abstract: true,
12450 12451 url: '/application',
12451 12452 templateUrl: 'templates/admin/users/parent_view.html'
12452 12453 });
12453 12454
12454 12455 $stateProvider.state('admin.application.list', {
12455 12456 url: '/list',
12456 12457 templateUrl: 'templates/admin/applications/applications_list.html',
12457 12458 controller: 'AdminApplicationsListController as applications'
12458 12459 });
12459 12460
12460 12461 $stateProvider.state('admin.partitions', {
12461 12462 url: '/partitions',
12462 12463 templateUrl: 'templates/admin/partitions.html',
12463 12464 controller: 'AdminPartitionsController as partitions'
12464 12465 });
12465 12466 $stateProvider.state('admin.system', {
12466 12467 url: '/system',
12467 12468 templateUrl: 'templates/admin/system.html',
12468 12469 controller: 'AdminSystemController as system'
12469 12470 });
12470 12471
12471 12472 $stateProvider.state('admin.configs', {
12472 12473 abstract: true,
12473 12474 url: '/configs',
12474 12475 templateUrl: 'templates/admin/configs/parent_view.html'
12475 12476 });
12476 12477
12477 12478 $stateProvider.state('admin.configs.list', {
12478 12479 url: '',
12479 12480 templateUrl: 'templates/admin/configs/edit.html',
12480 12481 controller: 'ConfigsListController as configs'
12481 12482 });
12482 12483
12483 12484 $stateProvider.state('user', {
12484 12485 url: '/ui/user',
12485 12486 templateUrl: 'templates/user/parent_view.html'
12486 12487 });
12487 12488
12488 12489 $stateProvider.state('user.profile', {
12489 12490 abstract: true,
12490 12491 url: '/profile',
12491 12492 templateUrl: 'templates/user/profile.html'
12492 12493 });
12493 12494 $stateProvider.state('user.profile.edit', {
12494 12495 url: '',
12495 12496 templateUrl: 'templates/user/profile_edit.html',
12496 12497 controller: 'UserProfileController as profile'
12497 12498 });
12498 12499
12499 12500
12500 12501 $stateProvider.state('user.profile.password', {
12501 12502 url: '/password',
12502 12503 templateUrl: 'templates/user/profile_password.html',
12503 12504 controller: 'UserPasswordController as password'
12504 12505 });
12505 12506
12506 12507 $stateProvider.state('user.profile.identities', {
12507 12508 url: '/identities',
12508 12509 templateUrl: 'templates/user/profile_identities.html',
12509 12510 controller: 'UserIdentitiesController as identities'
12510 12511 });
12511 12512
12512 12513 $stateProvider.state('user.profile.auth_tokens', {
12513 12514 url: '/auth_tokens',
12514 12515 templateUrl: 'templates/user/auth_tokens.html',
12515 12516 controller: 'UserAuthTokensController as auth_tokens'
12516 12517 });
12517 12518
12518 12519 $stateProvider.state('user.alert_channels', {
12519 12520 abstract: true,
12520 12521 url: '/alert_channels',
12521 12522 templateUrl: 'templates/user/alert_channels.html'
12522 12523 });
12523 12524
12524 12525 $stateProvider.state('user.alert_channels.list', {
12525 12526 url: '',
12526 12527 templateUrl: 'templates/user/alert_channels_list.html',
12527 12528 controller: 'AlertChannelsController as channels'
12528 12529 });
12529 12530
12530 12531 $stateProvider.state('user.alert_channels.email', {
12531 12532 url: '/email',
12532 12533 templateUrl: 'templates/user/alert_channels_email.html',
12533 12534 controller: 'AlertChannelsEmailController as email'
12534 12535 });
12535 12536
12536 12537 $stateProvider.state('applications', {
12537 12538 abstract: true,
12538 12539 url: '/ui/applications',
12539 12540 templateUrl: 'templates/applications/parent_view.html'
12540 12541 });
12541 12542
12542 12543 $stateProvider.state('applications.list', {
12543 12544 url: '',
12544 12545 templateUrl: 'templates/applications/list.html',
12545 12546 controller: 'ApplicationsListController as applications'
12546 12547 });
12547 12548 $stateProvider.state('applications.update', {
12548 12549 url: '/{resourceId}/update',
12549 12550 templateUrl: 'templates/applications/applications_update.html',
12550 12551 controller: 'ApplicationsUpdateController as application'
12551 12552 });
12552 12553
12553 12554 $stateProvider.state('applications.integrations', {
12554 12555 url: '/{resourceId}/integrations',
12555 12556 templateUrl: 'templates/applications/integrations.html',
12556 12557 controller: 'IntegrationsListController as integrations',
12557 12558 data: {
12558 12559 resource: null
12559 12560 }
12560 12561 });
12561 12562
12562 12563 $stateProvider.state('applications.purge_logs', {
12563 12564 url: '/purge_logs',
12564 12565 templateUrl: 'templates/applications/applications_purge_logs.html',
12565 12566 controller: 'ApplicationsPurgeLogsController as applications_purge'
12566 12567 });
12567 12568
12568 12569 $stateProvider.state('applications.integrations.edit', {
12569 12570 url: '/{integration}',
12570 12571 templateUrl: function ($stateParams) {
12571 12572 return 'templates/applications/integrations/' + $stateParams.integration + '.html'
12572 12573 },
12573 12574 controller: 'IntegrationController as integration'
12574 12575 });
12575 12576
12576 12577 $stateProvider.state('tests', {
12577 12578 url: '/ui/tests',
12578 12579 templateUrl: 'templates/user/alert_channels_test.html',
12579 12580 controller: 'AlertChannelsTestController as test_action'
12580 12581 });
12581 12582
12582 12583 }]);
12583 12584
12584 12585 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12585 12586 // #
12586 12587 // # This program is free software: you can redistribute it and/or modify
12587 12588 // # it under the terms of the GNU Affero General Public License, version 3
12588 12589 // # (only), as published by the Free Software Foundation.
12589 12590 // #
12590 12591 // # This program is distributed in the hope that it will be useful,
12591 12592 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12592 12593 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12593 12594 // # GNU General Public License for more details.
12594 12595 // #
12595 12596 // # You should have received a copy of the GNU Affero General Public License
12596 12597 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12597 12598 // #
12598 12599 // # This program is dual-licensed. If you wish to learn more about the
12599 12600 // # AppEnlight Enterprise Edition, including its added features, Support
12600 12601 // # services, and proprietary license terms, please see
12601 12602 // # https://rhodecode.com/licenses/
12602 12603
12603 12604 angular.module('appenlight.services.chartResultParser',[]).factory('chartResultParser', function () {
12604 12605
12605 12606 function transform(data) {
12606 12607
12607 12608 /** transform result to a format that is more friendly
12608 12609 * to c3js we don't want to export this way as default
12609 12610 * as TSV stuff is less readable overall
12610 12611 *
12611 12612 * we want format of:
12612 12613 * {x: [unix_timestamps],
12613 12614 * key1: [val,list],
12614 12615 * key2: [val,list]...}
12615 12616 *
12616 12617 * OR
12617 12618 *
12618 12619 * handle special case where we want pie/donut for
12619 12620 * aggregation with a single metric, we need to transform
12620 12621 * the data from:
12621 12622 * [y:list, categories:[cat1,cat2,...]]
12622 12623 * to
12623 12624 * [cat1: val, cat2:val...] format to render properly
12624 12625 */
12625 12626 var chartC3Config = {
12626 12627 data: {
12627 12628 json: [],
12628 12629 type: 'bar'
12629 12630 },
12630 12631 point: {
12631 12632 show: false
12632 12633 },
12633 12634 tooltip: {
12634 12635 format: {
12635 12636 title: function (d) {
12636 12637 if (d) {
12637 12638 return '' + d;
12638 12639 }
12639 12640 return '';
12640 12641 },
12641 12642 value: function (value, ratio, id, index) {
12642 12643 return d3.round(value, 3);
12643 12644 }
12644 12645 }
12645 12646 },
12646 12647 regions: data.rect_regions
12647 12648 };
12648 12649 var labels = _.keys(data.system_labels);
12649 12650 var specialCases = ['pie', 'donut', 'gauge'];
12650 12651 if (labels.length === 1 && _.contains(specialCases,
12651 12652 data.chart_type.type)) {
12652 12653 var transformedData = {};
12653 12654
12654 12655 _.each(data.series, function (item) {
12655 12656 transformedData[item['key']] = item[labels[0]];
12656 12657 });
12657 12658 }
12658 12659 else {
12659 12660 var transformedData = {'key': []};
12660 12661
12661 12662 _.each(labels, function (label) {
12662 12663 transformedData[label] = [];
12663 12664 });
12664 12665
12665 12666 _.each(data.series, function (item) {
12666 12667 for (key in item) {
12667 12668 transformedData[key].push(item[key])
12668 12669 }
12669 12670 });
12670 12671 }
12671 12672
12672 12673
12673 12674 if (data.parent_agg.type === 'time_histogram') {
12674 12675 chartC3Config.axis = {
12675 12676 x: {
12676 12677 type: 'timeseries',
12677 12678 tick: {
12678 12679 format: '%Y-%m-%d'
12679 12680 }
12680 12681 }
12681 12682 };
12682 12683 chartC3Config.data.xFormat = '%Y-%m-%dT%H:%M:%S';
12683 12684 }
12684 12685 else if (data.categories) {
12685 12686 chartC3Config.axis = {
12686 12687 x: {
12687 12688 type: 'category',
12688 12689 categories: data.categories
12689 12690 }
12690 12691 };
12691 12692 // we don't want to show key as label if it is being
12692 12693 // used as a category instead
12693 12694 if (data.categories) {
12694 12695 delete transformedData['key'];
12695 12696 }
12696 12697 }
12697 12698
12698 12699 var human_labels = {};
12699 12700 _.each(_.pairs(data.system_labels), function(entry){
12700 12701 human_labels[entry[0]] = entry[1].human_label;
12701 12702 });
12702 12703 var chartC3Data = {
12703 12704 json: transformedData,
12704 12705 names: human_labels,
12705 12706 groups: data.groups,
12706 12707 type: data.chart_type.type
12707 12708 };
12708 12709
12709 12710 if (data.parent_agg.type == 'time_histogram') {
12710 12711 chartC3Data.x = 'key';
12711 12712 }
12712 12713 return {chartC3Data: chartC3Data, chartC3Config: chartC3Config}
12713 12714 }
12714 12715
12715 12716 return transform
12716 12717 });
12717 12718
12718 12719 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12719 12720 // #
12720 12721 // # This program is free software: you can redistribute it and/or modify
12721 12722 // # it under the terms of the GNU Affero General Public License, version 3
12722 12723 // # (only), as published by the Free Software Foundation.
12723 12724 // #
12724 12725 // # This program is distributed in the hope that it will be useful,
12725 12726 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12726 12727 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12727 12728 // # GNU General Public License for more details.
12728 12729 // #
12729 12730 // # You should have received a copy of the GNU Affero General Public License
12730 12731 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12731 12732 // #
12732 12733 // # This program is dual-licensed. If you wish to learn more about the
12733 12734 // # AppEnlight Enterprise Edition, including its added features, Support
12734 12735 // # services, and proprietary license terms, please see
12735 12736 // # https://rhodecode.com/licenses/
12736 12737
12737 12738 var DEFAULT_ACTIONS = {
12738 12739 'get': {method: 'GET', timeout: 60000 * 2},
12739 12740 'save': {method: 'POST', timeout: 60000 * 2},
12740 12741 'query': {method: 'GET', isArray: true, timeout: 60000 * 2},
12741 12742 'remove': {method: 'DELETE', timeout: 30000},
12742 12743 'update': {method: 'PATCH', timeout: 30000},
12743 12744 'delete': {method: 'DELETE', timeout: 30000}
12744 12745 };
12745 12746
12746 12747 angular.module('appenlight.services.resources', []).factory('usersResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12747 12748 return $resource(AeConfig.urls.users, {userId: '@id'}, angular.copy(DEFAULT_ACTIONS));
12748 12749 }]);
12749 12750
12750 12751 angular.module('appenlight.services.resources').factory('userResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12751 12752 return $resource(AeConfig.urls.user, null, angular.copy(DEFAULT_ACTIONS));
12752 12753 }]);
12753 12754
12754 12755 angular.module('appenlight.services.resources').factory('usersPropertyResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12755 12756 return $resource(AeConfig.urls.usersProperty, null, angular.copy(DEFAULT_ACTIONS));
12756 12757 }]);
12757 12758
12758 12759 angular.module('appenlight.services.resources').factory('userSelfResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12759 12760 return $resource(AeConfig.urls.userSelf, null, angular.copy(DEFAULT_ACTIONS));
12760 12761 }]);
12761 12762
12762 12763 angular.module('appenlight.services.resources').factory('userSelfPropertyResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12763 12764 return $resource(AeConfig.urls.userSelfProperty, null, angular.copy(DEFAULT_ACTIONS));
12764 12765 }]);
12765 12766
12766 12767 angular.module('appenlight.services.resources').factory('logsNoIdResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12767 12768 return $resource(AeConfig.urls.logsNoId, null, angular.copy(DEFAULT_ACTIONS));
12768 12769 }]);
12769 12770
12770 12771 angular.module('appenlight.services.resources').factory('reportsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12771 12772 return $resource(AeConfig.urls.reports, null, angular.copy(DEFAULT_ACTIONS));
12772 12773 }]);
12773 12774
12774 12775 angular.module('appenlight.services.resources').factory('slowReportsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12775 12776 return $resource(AeConfig.urls.slowReports, null, angular.copy(DEFAULT_ACTIONS));
12776 12777 }]);
12777 12778
12778 12779 angular.module('appenlight.services.resources').factory('reportGroupResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12779 12780 return $resource(AeConfig.urls.reportGroup, null, angular.copy(DEFAULT_ACTIONS));
12780 12781 }]);
12781 12782
12782 12783 angular.module('appenlight.services.resources').factory('reportGroupPropertyResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12783 12784 return $resource(AeConfig.urls.reportGroupProperty, null, angular.copy(DEFAULT_ACTIONS));
12784 12785 }]);
12785 12786
12786 12787
12787 12788 angular.module('appenlight.services.resources').factory('reportResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12788 12789 return $resource(AeConfig.urls.reports, null, angular.copy(DEFAULT_ACTIONS));
12789 12790 }]);
12790 12791
12791 12792 angular.module('appenlight.services.resources').factory('analyticsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12792 12793 return $resource(AeConfig.urls.analyticsAction, null, angular.copy(DEFAULT_ACTIONS));
12793 12794 }]);
12794 12795
12795 12796 angular.module('appenlight.services.resources').factory('reportsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12796 12797 return $resource(AeConfig.urls.reports, null, angular.copy(DEFAULT_ACTIONS));
12797 12798 }]);
12798 12799
12799 12800 angular.module('appenlight.services.resources').factory('integrationResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12800 12801 return $resource(AeConfig.urls.integrationAction, null, angular.copy(DEFAULT_ACTIONS));
12801 12802 }]);
12802 12803
12803 12804
12804 12805 angular.module('appenlight.services.resources').factory('adminResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12805 12806 return $resource(AeConfig.urls.adminAction, null, angular.copy(DEFAULT_ACTIONS));
12806 12807 }]);
12807 12808
12808 12809 angular.module('appenlight.services.resources').factory('applicationsNoIdResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12809 12810 return $resource(AeConfig.urls.applicationsNoId, null, angular.copy(DEFAULT_ACTIONS));
12810 12811 }]);
12811 12812
12812 12813 angular.module('appenlight.services.resources').factory('applicationsPropertyResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12813 12814 return $resource(AeConfig.urls.applicationsProperty, null, angular.copy(DEFAULT_ACTIONS));
12814 12815 }]);
12815 12816 angular.module('appenlight.services.resources').factory('applicationsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12816 12817 return $resource(AeConfig.urls.applications, null, angular.copy(DEFAULT_ACTIONS));
12817 12818 }]);
12818 12819
12819 12820 angular.module('appenlight.services.resources').factory('sectionViewResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12820 12821 return $resource(AeConfig.urls.sectionView, null, angular.copy(DEFAULT_ACTIONS));
12821 12822 }]);
12822 12823
12823 12824 angular.module('appenlight.services.resources').factory('groupsNoIdResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12824 12825 return $resource(AeConfig.urls.groupsNoId, null, angular.copy(DEFAULT_ACTIONS));
12825 12826 }]);
12826 12827
12827 12828
12828 12829 angular.module('appenlight.services.resources').factory('groupsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12829 12830 return $resource(AeConfig.urls.groups, {userId: '@id'}, angular.copy(DEFAULT_ACTIONS));
12830 12831 }]);
12831 12832
12832 12833 angular.module('appenlight.services.resources').factory('groupsPropertyResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12833 12834 return $resource(AeConfig.urls.groupsProperty, null, angular.copy(DEFAULT_ACTIONS));
12834 12835 }]);
12835 12836
12836 12837
12837 12838 angular.module('appenlight.services.resources').factory('eventsNoIdResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12838 12839 return $resource(AeConfig.urls.eventsNoId, null, angular.copy(DEFAULT_ACTIONS));
12839 12840 }]);
12840 12841
12841 12842
12842 12843 angular.module('appenlight.services.resources').factory('eventsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12843 12844 return $resource(AeConfig.urls.events, {userId: '@id'}, angular.copy(DEFAULT_ACTIONS));
12844 12845 }]);
12845 12846
12846 12847 angular.module('appenlight.services.resources').factory('eventsPropertyResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12847 12848 return $resource(AeConfig.urls.eventsProperty, null, angular.copy(DEFAULT_ACTIONS));
12848 12849 }]);
12849 12850
12850 12851 angular.module('appenlight.services.resources').factory('configsNoIdResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12851 12852 return $resource(AeConfig.urls.configsNoId, null, angular.copy(DEFAULT_ACTIONS));
12852 12853 }]);
12853 12854
12854 12855 angular.module('appenlight.services.resources').factory('configsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12855 12856 return $resource(AeConfig.urls.configs, {
12856 12857 key: '@key',
12857 12858 section: '@section'
12858 12859 }, angular.copy(DEFAULT_ACTIONS));
12859 12860 }]);
12860 12861
12861 12862 angular.module('appenlight.services.resources').factory('pluginConfigsResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12862 12863 return $resource(AeConfig.urls.pluginConfigs, {
12863 12864 id: '@id',
12864 12865 plugin_name: '@plugin_name'
12865 12866 }, angular.copy(DEFAULT_ACTIONS));
12866 12867 }]);
12867 12868
12868 12869 angular.module('appenlight.services.resources').factory('resourcesPropertyResource', ['$resource', 'AeConfig', function ($resource, AeConfig) {
12869 12870 return $resource(AeConfig.urls.resourceProperty, null, angular.copy(DEFAULT_ACTIONS));
12870 12871 }]);
12871 12872
12872 12873 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
12873 12874 // #
12874 12875 // # This program is free software: you can redistribute it and/or modify
12875 12876 // # it under the terms of the GNU Affero General Public License, version 3
12876 12877 // # (only), as published by the Free Software Foundation.
12877 12878 // #
12878 12879 // # This program is distributed in the hope that it will be useful,
12879 12880 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
12880 12881 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12881 12882 // # GNU General Public License for more details.
12882 12883 // #
12883 12884 // # You should have received a copy of the GNU Affero General Public License
12884 12885 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
12885 12886 // #
12886 12887 // # This program is dual-licensed. If you wish to learn more about the
12887 12888 // # AppEnlight Enterprise Edition, including its added features, Support
12888 12889 // # services, and proprietary license terms, please see
12889 12890 // # https://rhodecode.com/licenses/
12890 12891
12891 12892 angular.module('appenlight.services.stateHolder', []).factory('stateHolder',
12892 12893 ['$timeout', 'AeConfig', function ($timeout, AeConfig) {
12893 12894
12894 12895 var AeUser = {"user_name": null, "id": null};
12895 12896 AeUser.update = function (jsonData) {
12896 12897 jsonData = jsonData || {};
12897 12898 this.applications_map = {};
12898 12899 this.dashboards_map = {};
12899 12900 this.user_name = jsonData.user_name || null;
12900 12901 this.id = jsonData.id;
12901 12902 this.assigned_reports = jsonData.assigned_reports || null;
12902 12903 this.latest_events = jsonData.latest_events || null;
12903 12904 this.permissions = jsonData.permissions || null;
12904 12905 this.groups = jsonData.groups || null;
12905 12906 this.applications = [];
12906 12907 this.dashboards = [];
12907 12908 _.each(jsonData.applications, function (item) {
12908 12909 this.addApplication(item);
12909 12910 }.bind(this));
12910 12911 _.each(jsonData.dashboards, function (item) {
12911 12912 this.addDashboard(item);
12912 12913 }.bind(this));
12913 12914 };
12914 12915 AeUser.addApplication = function (item) {
12915 12916 this.applications.push(item);
12916 12917 this.applications_map[item.resource_id] = item;
12917 12918 };
12918 12919 AeUser.addDashboard = function (item) {
12919 12920 this.dashboards.push(item);
12920 12921 this.dashboards_map[item.resource_id] = item;
12921 12922 };
12922 12923
12923 12924 AeUser.removeApplicationById = function (applicationId) {
12924 12925 this.applications = _.filter(this.applications, function (item) {
12925 12926 return item.resource_id != applicationId;
12926 12927 });
12927 12928 delete this.applications_map[applicationId];
12928 12929 };
12929 12930 AeUser.removeDashboardById = function (dashboardId) {
12930 12931 this.dashboards = _.filter(this.dashboards, function (item) {
12931 12932 return item.resource_id != dashboardId;
12932 12933 });
12933 12934 delete this.dashboards_map[dashboardId];
12934 12935 };
12935 12936
12936 12937 AeUser.hasAppPermission = function (perm_name) {
12937 12938 if (this.permissions.indexOf('root_administration') !== -1) {
12938 12939 return true
12939 12940 }
12940 12941 return this.permissions.indexOf(perm_name) !== -1;
12941 12942 };
12942 12943
12943 12944 AeUser.hasContextPermission = function (permName, ACLList) {
12944 12945 var hasPerm = false;
12945 12946 _.each(ACLList, function (ACL) {
12946 12947 // is this the right perm?
12947 12948 if (ACL.perm_name == permName ||
12948 12949 ACL.perm_name == '__all_permissions__') {
12949 12950 // perm for this user or a group user belongs to
12950 12951 if (ACL.user_name === this.user_name ||
12951 12952 this.groups.indexOf(ACL.group_name) !== -1) {
12952 12953 hasPerm = true
12953 12954 }
12954 12955 }
12955 12956 }.bind(this));
12956 12957
12957 12958 return hasPerm;
12958 12959 };
12959 12960
12960 12961 /**
12961 12962 * Holds some common stuff like flash messages, but important part is
12962 12963 * plugins property that is a registry that holds all information about
12963 12964 * loaded plugins, its mutated via .run() functions on inclusion
12964 12965 * @type {{list: Array, timeout: null, extend: flashMessages.extend, pop: flashMessages.pop, cancelTimeout: flashMessages.cancelTimeout, removeMessages: flashMessages.removeMessages}}
12965 12966 */
12966 12967 var flashMessages = {
12967 12968 list: [],
12968 12969 timeout: null,
12969 12970 extend: function (values) {
12970 12971
12971 12972 if (this.list.length > 2) {
12972 12973 this.list.splice(0, this.list.length - 2);
12973 12974 }
12974 12975 this.list.push.apply(this.list, values);
12975 12976 this.cancelTimeout();
12976 12977 this.removeMessages();
12977 12978 },
12978 12979 pop: function () {
12979 12980
12980 12981 this.list.pop();
12981 12982 },
12982 12983 cancelTimeout: function () {
12983 12984 if (this.timeout) {
12984 12985 $timeout.cancel(this.timeout);
12985 12986 }
12986 12987 },
12987 12988 removeMessages: function () {
12988 12989 var self = this;
12989 12990 this.timeout = $timeout(function () {
12990 12991 while (self.list.length > 0) {
12991 12992 self.list.pop();
12992 12993 }
12993 12994 }, 10000);
12994 12995 }
12995 12996 };
12996 12997 flashMessages.closeAlert = angular.bind(flashMessages, function (index) {
12997 12998 this.list.splice(index, 1);
12998 12999 this.cancelTimeout();
12999 13000 });
13000 13001 /* add flash messages from template generated on non-xhr request level */
13001 13002 try {
13002 13003 if (AeConfig.flashMessages.length > 0) {
13003 13004 flashMessages.list = AeConfig.flashMessages;
13004 13005 }
13005 13006 }
13006 13007 catch (exc) {
13007 13008
13008 13009 }
13009 13010
13010 13011 var Plugins = {
13011 13012 enabled: [],
13012 13013 configs: {},
13013 13014 inclusions: {},
13014 13015 addInclusion: function (name, inclusion) {
13015 13016 var self = this;
13016 13017 if (self.inclusions.hasOwnProperty(name) === false) {
13017 13018 self.inclusions[name] = [];
13018 13019 }
13019 13020 self.inclusions[name].push(inclusion);
13020 13021 }
13021 13022 };
13022 13023
13023 13024 var stateHolder = {
13024 13025 section: 'settings',
13025 13026 resource: null,
13026 13027 plugins: Plugins,
13027 13028 flashMessages: flashMessages,
13028 13029 AeUser: AeUser,
13029 13030 AeConfig: AeConfig
13030 13031 };
13031 13032 return stateHolder;
13032 13033 }]);
13033 13034
13034 13035 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
13035 13036 // #
13036 13037 // # This program is free software: you can redistribute it and/or modify
13037 13038 // # it under the terms of the GNU Affero General Public License, version 3
13038 13039 // # (only), as published by the Free Software Foundation.
13039 13040 // #
13040 13041 // # This program is distributed in the hope that it will be useful,
13041 13042 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
13042 13043 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13043 13044 // # GNU General Public License for more details.
13044 13045 // #
13045 13046 // # You should have received a copy of the GNU Affero General Public License
13046 13047 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
13047 13048 // #
13048 13049 // # This program is dual-licensed. If you wish to learn more about the
13049 13050 // # AppEnlight Enterprise Edition, including its added features, Support
13050 13051 // # services, and proprietary license terms, please see
13051 13052 // # https://rhodecode.com/licenses/
13052 13053
13053 13054 angular.module('appenlight.services.typeAheadTagHelper', []).factory('typeAheadTagHelper', function () {
13054 13055 var typeAheadTagHelper = {tags: []};
13055 13056 typeAheadTagHelper.aheadFilter = function (item, viewValue) {
13056 13057 //dont show "deeper" autocomplete like level:foo with exception of application ones
13057 13058 var label_text = item.text || item;
13058 13059 if (label_text.charAt(label_text.length - 1) != ':' && viewValue.indexOf(':') === -1 && label_text.indexOf('resource:') !== 0) {
13059 13060 return false;
13060 13061 }
13061 13062 if (viewValue.length > 2) {
13062 13063 // with apps we need to do it differently
13063 13064 if (viewValue.toLowerCase().indexOf('resource:') == 0) {
13064 13065 viewValue = viewValue.split(':').pop();
13065 13066 }
13066 13067 // check if tags match
13067 13068 if (label_text.toLowerCase().indexOf(viewValue.toLowerCase()) === -1) {
13068 13069 return false;
13069 13070 }
13070 13071 }
13071 13072 return true;
13072 13073 };
13073 13074 typeAheadTagHelper.removeSearchTag = function (tag) {
13074 13075
13075 13076 var indexValue = _.indexOf(typeAheadTagHelper.tags, tag);
13076 13077 typeAheadTagHelper.tags.splice(indexValue, 1);
13077 13078
13078 13079 };
13079 13080 typeAheadTagHelper.addSearchTag = function (tag) {
13080 13081 // do not allow dupes - angular will complain
13081 13082 var found = _.find(typeAheadTagHelper.tags, function (existingTag) {
13082 13083 return existingTag.type == tag.type && existingTag.value == tag.value
13083 13084 });
13084 13085 if (!found) {
13085 13086 typeAheadTagHelper.tags.push(tag);
13086 13087 }
13087 13088 };
13088 13089
13089 13090 return typeAheadTagHelper;
13090 13091 });
13091 13092
13092 13093 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
13093 13094 // #
13094 13095 // # This program is free software: you can redistribute it and/or modify
13095 13096 // # it under the terms of the GNU Affero General Public License, version 3
13096 13097 // # (only), as published by the Free Software Foundation.
13097 13098 // #
13098 13099 // # This program is distributed in the hope that it will be useful,
13099 13100 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
13100 13101 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13101 13102 // # GNU General Public License for more details.
13102 13103 // #
13103 13104 // # You should have received a copy of the GNU Affero General Public License
13104 13105 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
13105 13106 // #
13106 13107 // # This program is dual-licensed. If you wish to learn more about the
13107 13108 // # AppEnlight Enterprise Edition, including its added features, Support
13108 13109 // # services, and proprietary license terms, please see
13109 13110 // # https://rhodecode.com/licenses/
13110 13111
13111 13112 angular.module('appenlight.services.UUIDProvider', []).factory('UUIDProvider', function () {
13112 13113 var provider = {
13113 13114 genUUID4: function () {
13114 13115 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
13115 13116 /[xy]/g, function (c) {
13116 13117 var r = Math.random() * 16 | 0, v = c == 'x' ? r : r & 0x3 | 0x8;
13117 13118 return v.toString(16);
13118 13119 }
13119 13120 );
13120 13121 }
13121 13122 };
13122 13123 return provider;
13123 13124 });
13124 13125
13125 13126 ;// # Copyright (C) 2010-2016 RhodeCode GmbH
13126 13127 // #
13127 13128 // # This program is free software: you can redistribute it and/or modify
13128 13129 // # it under the terms of the GNU Affero General Public License, version 3
13129 13130 // # (only), as published by the Free Software Foundation.
13130 13131 // #
13131 13132 // # This program is distributed in the hope that it will be useful,
13132 13133 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
13133 13134 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13134 13135 // # GNU General Public License for more details.
13135 13136 // #
13136 13137 // # You should have received a copy of the GNU Affero General Public License
13137 13138 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
13138 13139 // #
13139 13140 // # This program is dual-licensed. If you wish to learn more about the
13140 13141 // # AppEnlight Enterprise Edition, including its added features, Support
13141 13142 // # services, and proprietary license terms, please see
13142 13143 // # https://rhodecode.com/licenses/
13143 13144
13144 13145 var underscore = angular.module('underscore', []);
13145 13146 underscore.factory('_', function () {
13146 13147 return window._; // assumes underscore has already been loaded on the page
13147 13148 });
@@ -1,200 +1,201 b''
1 1 // # Copyright (C) 2010-2016 RhodeCode GmbH
2 2 // #
3 3 // # This program is free software: you can redistribute it and/or modify
4 4 // # it under the terms of the GNU Affero General Public License, version 3
5 5 // # (only), as published by the Free Software Foundation.
6 6 // #
7 7 // # This program is distributed in the hope that it will be useful,
8 8 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 // # GNU General Public License for more details.
11 11 // #
12 12 // # You should have received a copy of the GNU Affero General Public License
13 13 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 // #
15 15 // # This program is dual-licensed. If you wish to learn more about the
16 16 // # AppEnlight Enterprise Edition, including its added features, Support
17 17 // # services, and proprietary license terms, please see
18 18 // # https://rhodecode.com/licenses/
19 19
20 20 'use strict';
21 21
22 22 // Declare app level module which depends on filters, and services
23 23 angular.module('appenlight.base', [
24 24 'ngRoute',
25 25 'ui.router',
26 26 'ui.router.router',
27 27 'underscore',
28 28 'ui.bootstrap',
29 29 'ngResource',
30 30 'ngAnimate',
31 31 'ngCookies',
32 32 'smart-table',
33 33 'angular-toArrayFilter',
34 34 'mentio'
35 35 ]);
36 36
37 37 angular.module('appenlight.filters', []);
38 38 angular.module('appenlight.templates', []);
39 39 angular.module('appenlight.controllers', [
40 40 'appenlight.base'
41 41 ]);
42 42 angular.module('appenlight.components', [
43 43 'appenlight.components.channelstream',
44 44 'appenlight.components.appenlightApp',
45 'appenlight.components.appenlightHeader'
45 'appenlight.components.appenlightHeader',
46 'appenlight.components.indexDashboardView'
46 47 ]);
47 48 angular.module('appenlight.directives', [
48 49 'appenlight.directives.c3chart',
49 50 'appenlight.directives.confirmValidate',
50 51 'appenlight.directives.focus',
51 52 'appenlight.directives.formErrors',
52 53 'appenlight.directives.humanFormat',
53 54 'appenlight.directives.isoToRelativeTime',
54 55 'appenlight.directives.permissionsForm',
55 56 'appenlight.directives.smallReportGroupList',
56 57 'appenlight.directives.smallReportList',
57 58 'appenlight.directives.pluginConfig',
58 59 'appenlight.directives.recursive',
59 60 'appenlight.directives.reportAlertAction',
60 61 'appenlight.directives.postProcessAction',
61 62 'appenlight.directives.rule',
62 63 'appenlight.directives.ruleReadOnly'
63 64 ]);
64 65 angular.module('appenlight.services', [
65 66 'appenlight.services.chartResultParser',
66 67 'appenlight.services.resources',
67 68 'appenlight.services.stateHolder',
68 69 'appenlight.services.typeAheadTagHelper',
69 70 'appenlight.services.UUIDProvider'
70 71 ]).value('version', '0.1');
71 72
72 73
73 74 var pluginsToLoad = _.map(decodeEncodedJSON(window.AE.plugins),
74 75 function(item){
75 76 return item.config.angular_module
76 77 });
77 78 console.log(pluginsToLoad);
78 79 angular.module('appenlight.plugins', pluginsToLoad);
79 80
80 81 var app = angular.module('appenlight', [
81 82 'appenlight.base',
82 83 'appenlight.config',
83 84 'appenlight.templates',
84 85 'appenlight.filters',
85 86 'appenlight.services',
86 87 'appenlight.directives',
87 88 'appenlight.controllers',
88 89 'appenlight.components',
89 90 'appenlight.plugins'
90 91 ]);
91 92
92 93 // needs manual execution because of plugin files
93 94 function kickstartAE(initialUserData) {
94 95 app.config(['$httpProvider', '$uibTooltipProvider', '$locationProvider', function ($httpProvider, $uibTooltipProvider, $locationProvider) {
95 96 $locationProvider.html5Mode(true);
96 97 $httpProvider.interceptors.push(['$q', '$rootScope', '$timeout', 'stateHolder', function ($q, $rootScope, $timeout, stateHolder) {
97 98 return {
98 99 'response': function (response) {
99 100 var flashMessages = angular.fromJson(response.headers('x-flash-messages'));
100 101 if (flashMessages && flashMessages.length > 0) {
101 102 stateHolder.flashMessages.extend(flashMessages);
102 103 }
103 104 return response;
104 105 },
105 106 'responseError': function (rejection) {
106 107 if (rejection.status > 299 && rejection.status !== 422) {
107 108 stateHolder.flashMessages.extend([{
108 109 msg: 'Response status code: ' + rejection.status + ', "' + rejection.statusText + '", url: ' + rejection.config.url,
109 110 type: 'error'
110 111 }]);
111 112 }
112 113 if (rejection.status == 0) {
113 114 stateHolder.flashMessages.extend([{
114 115 msg: 'Response timeout',
115 116 type: 'error'
116 117 }]);
117 118 }
118 119 var flashMessages = angular.fromJson(rejection.headers('x-flash-messages'));
119 120 if (flashMessages && flashMessages.length > 0) {
120 121 stateHolder.flashMessages.extend(flashMessages);
121 122 }
122 123
123 124 return $q.reject(rejection);
124 125 }
125 126 }
126 127 }]);
127 128
128 129 $uibTooltipProvider.options({appendToBody: true});
129 130
130 131 }]);
131 132
132 133
133 134 app.config(function ($provide) {
134 135 $provide.decorator("$exceptionHandler", function ($delegate) {
135 136 return function (exception, cause) {
136 137 $delegate(exception, cause);
137 138 if (typeof AppEnlight !== 'undefined') {
138 139 AppEnlight.grabError(exception);
139 140 }
140 141 };
141 142 });
142 143 });
143 144
144 145 app.run(['$rootScope', '$timeout', 'stateHolder', '$state', '$location', '$transitions', '$window', 'AeConfig',
145 146 function ($rootScope, $timeout, stateHolder, $state, $location, $transitions, $window, AeConfig) {
146 147 if (initialUserData){
147 148 stateHolder.AeUser.update(initialUserData);
148 149 }
149 150 $rootScope.$state = $state;
150 151 $rootScope.stateHolder = stateHolder;
151 152 $rootScope.flash = stateHolder.flashMessages.list;
152 153 $rootScope.closeAlert = stateHolder.flashMessages.closeAlert;
153 154 $rootScope.AeConfig = AeConfig;
154 155
155 156 var transitionApp = function($transition$, $state) {
156 157 // redirect user to /register unless its one of open views
157 158 var isGuestState = [
158 159 'report.view_detail',
159 160 'report.view_group',
160 161 'dashboard.view'
161 162 ].indexOf($transition$.to().name) !== -1;
162 163
163 164 var path = $window.location.pathname;
164 165 // strip trailing slash
165 166 if (path.substr(path.length - 1) === '/') {
166 167 path = path.substr(0, path.length - 1);
167 168 }
168 169 var isOpenView = false;
169 170 var openViews = [
170 171 AeConfig.urls.otherRoutes.lostPassword,
171 172 AeConfig.urls.otherRoutes.lostPasswordGenerate
172 173 ];
173 174 console.log('$transitions.onBefore', path, $transition$.to().name, $state);
174 175 _.each(openViews, function (url) {
175 176 var url = '/' + url.split('/').slice(3).join('/');
176 177 if (url === path) {
177 178 isOpenView = true;
178 179 }
179 180 });
180 181 if (stateHolder.AeUser.id === null && !isGuestState && !isOpenView) {
181 182 if (window.location.toString().indexOf(AeConfig.urls.otherRoutes.register) === -1) {
182 183 console.log('redirect to register');
183 184 var newLocation = AeConfig.urls.otherRoutes.register + '?came_from=' + encodeURIComponent(window.location);
184 185 // fix infinite digest here
185 186 $rootScope.$on('$locationChangeStart',
186 187 function(event, toState, toParams, fromState, fromParams, options){
187 188 event.preventDefault();
188 189 $window.location = newLocation;
189 190 });
190 191 $window.location = newLocation;
191 192 return false;
192 193 }
193 194 return false;
194 195 }
195 196 return true;
196 197 };
197 198 $transitions.onBefore({}, transitionApp);
198 199
199 200 }]);
200 201 }
@@ -1,348 +1,346 b''
1 1 <style type="text/css">
2 2 #metrics_chart .c3-line {
3 3 stroke-width: 0px;
4 4 }
5 5
6 6 #metrics_chart .c3-area {
7 7 stroke-width: 0;
8 8 opacity: 0.75;
9 9 }
10
11
12 10 </style>
13 11
14 12 <div class="row">
15 13 <div class="col-sm-12 dashboard" id="content">
16 <div ng-if="!index.stateHolder.AeUser.applications.length">
14 <div ng-if="!$ctrl.stateHolder.AeUser.applications.length">
17 15
18 16 <div ng-include="'templates/quickstart.html'"></div>
19 17
20 18 </div>
21 19
22 <div ng-if="index.stateHolder.AeUser.applications.length">
20 <div ng-if="$ctrl.stateHolder.AeUser.applications.length">
23 21
24 22 <div class="row">
25 23 <div class="col-sm-6">
26 24 <div class="panel panel-default">
27 25 <div class="panel-body">
28 26 <form class="graph-type form-inline">
29 <select ng-model="index.resource" ng-options="r.resource_id as r.resource_name for r in index.stateHolder.AeUser.applications" ng-change="index.updateSearchParams()"
27 <select ng-model="$ctrl.resource" ng-options="r.resource_id as r.resource_name for r in $ctrl.stateHolder.AeUser.applications" ng-change="$ctrl.updateSearchParams()"
30 28 class="SelectField form-control input-sm slim-input"></select>
31 29
32 <select class="SelectField form-control input-sm slim-input" ng-model="index.timeSpan"
33 ng-options="i as i.label for i in index.timeOptions | objectToOrderedArray:'minutes'" ng-change="index.updateSearchParams()"
30 <select class="SelectField form-control input-sm slim-input" ng-model="$ctrl.timeSpan"
31 ng-options="i as i.label for i in $ctrl.timeOptions | objectToOrderedArray:'minutes'" ng-change="$ctrl.updateSearchParams()"
34 32 class="SelectField"></select>
35 33
36 34
37 35 <div class="btn-group">
38 <button type="button" class="btn btn-primary btn-sm" ng-model="index.graphType.selected" ng-change="index.updateSearchParams()"
36 <button type="button" class="btn btn-primary btn-sm" ng-model="$ctrl.graphType.selected" ng-change="$ctrl.updateSearchParams()"
39 37 uib-btn-radio="'requests_graphs'" data-uib-tooltip="Requests per second">
40 38 <span class="fa fa-line-chart"></span>
41 39 </button>
42 <button type="button" class="btn btn-primary btn-sm" ng-model="index.graphType.selected" ng-change="index.updateSearchParams()"
40 <button type="button" class="btn btn-primary btn-sm" ng-model="$ctrl.graphType.selected" ng-change="$ctrl.updateSearchParams()"
43 41 uib-btn-radio="'response_graphs'" data-uib-tooltip="Average response time">
44 42 <span class="fa fa-random"></span>
45 43 </button>
46 <button type="button" class="btn btn-primary btn-sm" ng-model="index.graphType.selected" ng-change="index.updateSearchParams()"
44 <button type="button" class="btn btn-primary btn-sm" ng-model="$ctrl.graphType.selected" ng-change="$ctrl.updateSearchParams()"
47 45 uib-btn-radio="'metrics_graphs'" data-uib-tooltip="Time spent per request">
48 46 <span class="fa fa-bar-chart-o"></span>
49 47 </button>
50 <button type="button" class="btn btn-primary btn-sm" ng-model="index.graphType.selected" ng-change="index.updateSearchParams()"
48 <button type="button" class="btn btn-primary btn-sm" ng-model="$ctrl.graphType.selected" ng-change="$ctrl.updateSearchParams()"
51 49 uib-btn-radio="'report_graphs'" data-uib-tooltip="Errors">
52 50 <span class="fa fa-exclamation-triangle"></span>
53 51 </button>
54 <button type="button" class="btn btn-primary btn-sm" ng-model="index.graphType.selected" ng-change="index.updateSearchParams()"
52 <button type="button" class="btn btn-primary btn-sm" ng-model="$ctrl.graphType.selected" ng-change="$ctrl.updateSearchParams()"
55 53 uib-btn-radio="'slow_report_graphs'" data-uib-tooltip="Slow reports">
56 54 <span class="fa fa-clock-o"></span>
57 55 </button>
58 56 </div>
59 57 </form>
60 58 <div class="clearfix"></div>
61 59
62 <p ng-if="index.loading.series != false" class="text-center">
60 <p ng-if="$ctrl.loading.series != false" class="text-center">
63 61 <span class="fa fa-cog fa-spin fa-5x loader"></span>
64 62 </p>
65 63
66 <div ng-if="index.loading.series == false">
67 <div ng-if="index.graphType.selected == 'requests_graphs'">
68 <c3chart data-domid="reponse_chart" data-data="index.requestsChartData" data-config="index.requestsChartConfig" update="true">
64 <div ng-if="$ctrl.loading.series == false">
65 <div ng-if="$ctrl.graphType.selected == 'requests_graphs'">
66 <c3chart data-domid="reponse_chart" data-data="$ctrl.requestsChartData" data-config="$ctrl.requestsChartConfig" update="true">
69 67 </c3chart>
70 68 </div>
71 69
72 <div ng-if="index.graphType.selected == 'response_graphs'">
73 <c3chart data-domid="reponse_chart" data-data="index.responseChartData" data-config="index.responseChartConfig" update="true">
70 <div ng-if="$ctrl.graphType.selected == 'response_graphs'">
71 <c3chart data-domid="reponse_chart" data-data="$ctrl.responseChartData" data-config="$ctrl.responseChartConfig" update="true">
74 72 </c3chart>
75 73 </div>
76 74
77 <div ng-if="index.graphType.selected == 'metrics_graphs'">
78 <c3chart data-domid="metrics_chart" data-data="index.metricsChartData" data-config="index.metricsChartConfig" update="true">
75 <div ng-if="$ctrl.graphType.selected == 'metrics_graphs'">
76 <c3chart data-domid="metrics_chart" data-data="$ctrl.metricsChartData" data-config="$ctrl.metricsChartConfig" update="true">
79 77 </c3chart>
80 78 </div>
81 <div ng-if="index.graphType.selected == 'report_graphs'">
82 <c3chart data-domid="reports_chart" data-data="index.reportChartData" data-config="index.reportChartConfig" update="true">
79 <div ng-if="$ctrl.graphType.selected == 'report_graphs'">
80 <c3chart data-domid="reports_chart" data-data="$ctrl.reportChartData" data-config="$ctrl.reportChartConfig" update="true">
83 81 </c3chart>
84 82 </div>
85 83
86 <div ng-if="index.graphType.selected == 'slow_report_graphs'">
87 <c3chart data-domid="slow_reports_chart" data-data="index.reportSlowChartData" data-config="index.reportSlowChartConfig" update="true">
84 <div ng-if="$ctrl.graphType.selected == 'slow_report_graphs'">
85 <c3chart data-domid="slow_reports_chart" data-data="$ctrl.reportSlowChartData" data-config="$ctrl.reportSlowChartConfig" update="true">
88 86 </c3chart>
89 87 </div>
90 88
91 <p ng-if="index.graphType.selected == 'requests_graphs'" class="text-center">
89 <p ng-if="$ctrl.graphType.selected == 'requests_graphs'" class="text-center">
92 90 <small>Average requests per second from all servers</small>
93 91 </p>
94 92
95 <p ng-if="index.graphType.selected == 'response_graphs'" class="text-center">
93 <p ng-if="$ctrl.graphType.selected == 'response_graphs'" class="text-center">
96 94 <small>Average response time from all servers</small>
97 95 </p>
98 96
99 <p ng-if="index.graphType.selected == 'metrics_graphs'" class="text-center">
97 <p ng-if="$ctrl.graphType.selected == 'metrics_graphs'" class="text-center">
100 98 <small>Aggregated average time spent per request - broken to layers</small>
101 99 </p>
102 100
103 <p ng-if="index.graphType.selected == 'report_graphs'" class="text-center">
101 <p ng-if="$ctrl.graphType.selected == 'report_graphs'" class="text-center">
104 102 <small>Aggregated reports sent by your application</small>
105 103 </p>
106 104
107 <p ng-if="index.graphType.selected == 'slow_report_graphs'" class="text-center">
105 <p ng-if="$ctrl.graphType.selected == 'slow_report_graphs'" class="text-center">
108 106 <small>Aggregated slow reports sent by your application</small>
109 107 </p>
110 108 </div>
111 109 </div>
112 110 </div>
113 111 </div>
114 112
115 113
116 114 <div class="col-sm-6">
117 115
118 116 <div id="server-container">
119 117
120 <div ng-if="index.loading.apdex==false" class="text-center m-b-1">
118 <div ng-if="$ctrl.loading.apdex==false" class="text-center m-b-1">
121 119
122 <a data-ui-sref="report.list({resource:index.resource, start_date:index.startDateFilter})" class="combined-stat text-center" id="error-rate">
120 <a data-ui-sref="report.list({resource:$ctrl.resource, start_date:$ctrl.startDateFilter})" class="combined-stat text-center" id="error-rate">
123 121 <small>Exceptions</small>
124 122 <br/>
125 <strong>{{ index.exceptions|numberToThousands}}</strong>
123 <strong>{{ $ctrl.exceptions|numberToThousands}}</strong>
126 124 <span class="fa fa-chevron-right"></span>
127 125 </a><!--
128 126
129 --><a data-ui-sref="report.list_slow({resource:index.resource, min_duration:4, start_date:index.startDateFilter})" class="combined-stat text-center" id="frustrating-requests" data-uib-tooltip="Requests over 4s">
127 --><a data-ui-sref="report.list_slow({resource:$ctrl.resource, min_duration:4, start_date:$ctrl.startDateFilter})" class="combined-stat text-center" id="frustrating-requests" data-uib-tooltip="Requests over 4s">
130 128 <small>Frustrating req.</small>
131 129 <br/>
132 <strong>{{index.frustratingRequests|numberToThousands}}</strong>
130 <strong>{{$ctrl.frustratingRequests|numberToThousands}}</strong>
133 131 <span class="fa fa-chevron-right"></span>
134 132 </a><!--
135 133
136 --><a data-ui-sref="report.list_slow({resource:index.resource, min_duration:1, max_duration:4, start_date:index.startDateFilter})" class="combined-stat text-center" id="tolerated-requests"
134 --><a data-ui-sref="report.list_slow({resource:$ctrl.resource, min_duration:1, max_duration:4, start_date:$ctrl.startDateFilter})" class="combined-stat text-center" id="tolerated-requests"
137 135 data-uib-tooltip="Requests under 4s">
138 136 <small>Tolerated req.</small>
139 137 <br/>
140 <strong>{{index.toleratedRequests|numberToThousands}}</strong>
138 <strong>{{$ctrl.toleratedRequests|numberToThousands}}</strong>
141 139 <span class="fa fa-chevron-right"></span>
142 140 </a><!--
143 141
144 142 --><a class="combined-stat text-center" id="satisfying-requests" data-uib-tooltip="Requests under 1s">
145 143 <small>Satisfying req.</small>
146 144 <br/>
147 <strong>{{index.satisfyingRequests|numberToThousands}}</strong>
145 <strong>{{$ctrl.satisfyingRequests|numberToThousands}}</strong>
148 146 </a><!--
149 147
150 --><a data-ui-sref="uptime({resource:index.resource})" class="combined-stat text-center" id="uptime-stats" data-uib-tooltip="Uptime">
148 --><a data-ui-sref="uptime({resource:$ctrl.resource})" class="combined-stat text-center" id="uptime-stats" data-uib-tooltip="Uptime">
151 149 <small>Uptime</small>
152 150 <br/>
153 <strong>{{index.uptimeStats}}%</strong>
151 <strong>{{$ctrl.uptimeStats}}%</strong>
154 152 <span class="fa fa-chevron-right"></span>
155 153 </a>
156 154
157 155 <div class="clearfix"></div>
158 156 </div>
159 157
160 158 <div id="apdex-rate" class="m-b-1 panel panel-default">
161 159 <table class="servers table table-striped">
162 160 <thead>
163 161 <tr>
164 162 <th></th>
165 163 <th>Server</th>
166 164 <th>Apdex
167 165 <span class="fa fa-question-circle"
168 166 data-uib-tooltip="Application Performance Index - measures viewer satisfaction based on response times and error rates"></span>
169 167 </th>
170 168 <th>rpm</th>
171 169 <th>avg. response</th>
172 170 </tr>
173 171 </thead>
174 172 <tbody>
175 <tr ng-if="index.loading.apdex!=false" class="text-center">
173 <tr ng-if="$ctrl.loading.apdex!=false" class="text-center">
176 174 <td colspan="5"><span class="fa fa-cog fa-spin fa-5x loader"></span></td>
177 175 </tr>
178 <tr ng-repeat="server in index.apdexStats" class="{{ server | apdexValue }}"
179 ng-if="index.loading.apdex==false">
176 <tr ng-repeat="server in $ctrl.apdexStats" class="{{ server | apdexValue }}"
177 ng-if="$ctrl.loading.apdex==false">
180 178 <td><span class="fa fa-hdd-o"></span></td>
181 179 <td>
182 180 <small><strong>{{ server.name }}</strong></small>
183 181 </td>
184 182 <td class="apdex">
185 183 <small><strong>{{ server.apdex }} %</strong></small>
186 184 </td>
187 185 <td>
188 186 <small><strong>{{ server.rpm }}rpm</strong></small>
189 187 </td>
190 188 <td>
191 189 <small><strong>{{ server.avg_response_time }}s</strong></small>
192 190 </td>
193 191 </tr>
194 192 </tbody>
195 193 </table>
196 194
197 195 </div>
198 196 </div>
199 197
200 198 </div>
201 199
202 200
203 201 </div>
204 202
205 203 <div class="row">
206 204 <div class="col-sm-6">
207 205
208 206 <div class="panel panel-default">
209 207 <div class="panel-heading position-relative">
210 208 <h3 class="panel-title"><span class="fa fa-exclamation-triangle"></span> Newest errors (real-time)
211 209 </h3>
212 <a tooltip-append-to-body="true" data-uib-tooltip="Play/Pause stream" class="btn btn-primary btn-sm pause_stream" ng-model="index.stream.paused" uib-btn-checkbox>
210 <a tooltip-append-to-body="true" data-uib-tooltip="Play/Pause stream" class="btn btn-primary btn-sm pause_stream" ng-model="$ctrl.stream.paused" uib-btn-checkbox>
213 211 <span class="fa {{stream.paused ? 'fa-play' : 'fa-pause'}}"></span>
214 212 </a>
215 <a tooltip-append-to-body="true" data-uib-tooltip="Limit reports to current application" class="btn btn-primary btn-sm limit_stream" ng-model="index.stream.filtered" uib-btn-checkbox>
213 <a tooltip-append-to-body="true" data-uib-tooltip="Limit reports to current application" class="btn btn-primary btn-sm limit_stream" ng-model="$ctrl.stream.filtered" uib-btn-checkbox>
216 214 <span class="fa fa-lock"></span>
217 215 </a>
218 216
219 217
220 218 </div>
221 219 <div class="panel-body">
222 220
223 <p ng-if="index.stream.reports.length === 0">No new reports</p>
221 <p ng-if="$ctrl.stream.reports.length === 0">No new reports</p>
224 222
225 <div small-report-list reports="index.stream.reports" applications="index.applications"></div>
223 <div small-report-list reports="$ctrl.stream.reports" applications="$ctrl.applications"></div>
226 224 </div>
227 225 </div>
228 226 </div>
229 227
230 228 <div class="col-sm-6">
231 229
232 230 <div class="panel panel-default">
233 231 <div class="panel-heading">
234 <h3 class="panel-title"><span class="fa fa-sort-amount-desc"></span> Request breakdown over {{ index.timeSpan.label }}</h3>
232 <h3 class="panel-title"><span class="fa fa-sort-amount-desc"></span> Request breakdown over {{ $ctrl.timeSpan.label }}</h3>
235 233 </div>
236 234 <div class="panel-body" id="view-breakdown-container">
237 <p ng-if="index.loading.requestsBreakdown!=false" class="text-center">
235 <p ng-if="$ctrl.loading.requestsBreakdown!=false" class="text-center">
238 236 <span class="fa fa-cog fa-spin fa-5x loader"></span>
239 237 </p>
240 238
241 239 <div class="report-list">
242 <div ng-if="index.loading.requestsBreakdown==false" ng-repeat="view in index.requestsBreakdown">
240 <div ng-if="$ctrl.loading.requestsBreakdown==false" ng-repeat="view in $ctrl.requestsBreakdown">
243 241 <div class="view-info">
244 242 <div class="view-name">
245 243 <div class="bar" style="width: {{view.percentage}}%">
246 244 </div>
247 245 </div>
248 246 <strong ng-if="view.latest_details.length">
249 247 <a data-ui-sref="report.list_slow({view_name:view.view_name})">{{view.view_name}}</a></strong>
250 248 <strong ng-if="!view.latest_details.length">{{view.view_name}}</strong>
251 249
252 250 <div class="stats">
253 251 <small>
254 252 avg. response <strong>{{view.avg_response}}s</strong> in
255 253 <span class="requests"
256 254 data-uib-tooltip="Requests"><strong>{{view.requests|numberToThousands}}</strong> requests</span>
257 255
258 256 <span ng-if="view.latest_details">
259 257 &nbsp;&nbsp; Latest reports:
260 258 <a ng-repeat="d in view.latest_details" target="_blank" ui-sref="report.view_detail({groupId:d.group_id, reportId:d.report_id})"> <strong>{{$index+1}}</strong></a>
261 259 </span>
262 260 </small>
263 261 </div>
264 262
265 263 </div>
266 264
267 265 </div>
268 266 </div>
269 267
270 268
271 269 </div>
272 270 </div>
273 271
274 272 </div>
275 273
276 274 </div>
277 275
278 276 <div class="row">
279 277 <div class="col-sm-6">
280 278
281 279 <div class="panel panel-default">
282 280 <div class="panel-heading">
283 281 <h3 class="panel-title">
284 <span class="fa fa-exclamation-triangle"></span> Report groups trending over {{ index.timeSpan.label }}
282 <span class="fa fa-exclamation-triangle"></span> Report groups trending over {{ $ctrl.timeSpan.label }}
285 283 </h3>
286 284 </div>
287 285 <div class="panel-body">
288 <p ng-if="index.loading.reports != false" class="text-center">
286 <p ng-if="$ctrl.loading.reports != false" class="text-center">
289 287 <span class="fa fa-cog fa-spin fa-5x loader"></span>
290 288 </p>
291 289
292 <p ng-if="index.trendingReports.length == 0 && index.loading.reports == false">
290 <p ng-if="$ctrl.trendingReports.length == 0 && $ctrl.loading.reports == false">
293 291 No reports found
294 292 </p>
295 293
296 <div small-report-group-list groups="index.trendingReports" applications="index.applications" ng-if="index.loading.reports==false"></div>
294 <div small-report-group-list groups="$ctrl.trendingReports" applications="$ctrl.applications" ng-if="$ctrl.loading.reports==false"></div>
297 295 </div>
298 296 </div>
299 297
300 298 </div>
301 299
302 300 <div class="col-sm-6">
303 301
304 302
305 303 <div class="panel panel-default">
306 304 <div class="panel-heading">
307 305 <h3 class="panel-title">
308 Most common slow calls over {{ index.timeSpan.label }}
306 Most common slow calls over {{ $ctrl.timeSpan.label }}
309 307 </h3>
310 308 </div>
311 309 <div class="panel-body">
312 310
313 <div ng-if="index.loading.slowCalls!=false" class="text-center">
311 <div ng-if="$ctrl.loading.slowCalls!=false" class="text-center">
314 312 <span class="fa fa-cog fa-spin fa-5x loader"></span>
315 313 </div>
316 314
317 <table id="slow-statements" ng-if="index.loading.slowCalls==false">
315 <table id="slow-statements" ng-if="$ctrl.loading.slowCalls==false">
318 316 <tbody>
319 <tr ng-repeat="call in index.slowCalls">
317 <tr ng-repeat="call in $ctrl.slowCalls">
320 318 <td class="occurences">
321 319 <span class="occurences" data-uib-tooltip="Occurences">{{call.occurences|numberToThousands}}</span>
322 320 </td>
323 321 <td class="ellipsis">
324 322 <small title="{{call.statement}}" class="statement">{{call.statement}}</small>
325 323 <br/>
326 324 <span class="type">{{call.statement_type}}</span>
327 325 <span class="subtype">{{call.statement_subtype}}</span>
328 326 <span class="duration" data-uib-tooltip="Average duration">{{call.total_duration/call.occurences|round:2}}s</span>
329 327 <span class="report-list">
330 328 Latest reports:
331 329 <a ng-repeat="d in call.latest_details" target="_blank" ui-sref="report.view_detail({groupId:d.group_id, reportId:d.report_id})"> <strong>{{$index+1}}</strong> </a>
332 330 </span>
333 331 </td>
334 332 </tr>
335 333 </tbody>
336 334 </table>
337 335
338 336
339 337 </div>
340 338 </div>
341 339
342 340
343 341 </div>
344 342
345 343 </div>
346 344 </div>
347 345 </div>
348 346 </div>
@@ -1,664 +1,667 b''
1 1 // # Copyright (C) 2010-2016 RhodeCode GmbH
2 2 // #
3 3 // # This program is free software: you can redistribute it and/or modify
4 4 // # it under the terms of the GNU Affero General Public License, version 3
5 5 // # (only), as published by the Free Software Foundation.
6 6 // #
7 7 // # This program is distributed in the hope that it will be useful,
8 8 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 // # GNU General Public License for more details.
11 11 // #
12 12 // # You should have received a copy of the GNU Affero General Public License
13 13 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 // #
15 15 // # This program is dual-licensed. If you wish to learn more about the
16 16 // # AppEnlight Enterprise Edition, including its added features, Support
17 17 // # services, and proprietary license terms, please see
18 18 // # https://rhodecode.com/licenses/
19 19
20 angular.module('appenlight.controllers')
21 .controller('IndexDashboardController', IndexDashboardController);
20 angular.module('appenlight.components.indexDashboardView', [])
21 .component('indexDashboardView', {
22 templateUrl: 'components/views/index-dashboard/index-dashboard.html',
23 controller: IndexDashboardController
24 });
22 25
23 26 IndexDashboardController.$inject = ['$rootScope', '$scope', '$location','$cookies', '$interval', 'stateHolder', 'applicationsPropertyResource', 'AeConfig'];
24 27
25 28 function IndexDashboardController($rootScope, $scope, $location, $cookies, $interval, stateHolder, applicationsPropertyResource, AeConfig) {
26 29 var vm = this;
27 30 stateHolder.section = 'dashboard';
28 31 vm.timeOptions = {};
29 32 var allowed = ['1h', '4h', '12h', '24h', '1w', '2w', '1M'];
30 33 _.each(allowed, function (key) {
31 34 if (allowed.indexOf(key) !== -1) {
32 35 vm.timeOptions[key] = AeConfig.timeOptions[key];
33 36 }
34 37 });
35 38 vm.stateHolder = stateHolder;
36 39 vm.urls = AeConfig.urls;
37 40 vm.applications = stateHolder.AeUser.applications_map;
38 41 vm.show_dashboard = false;
39 42 vm.resource = null;
40 43 vm.graphType = {selected: null};
41 44 vm.timeSpan = vm.timeOptions['1h'];
42 45 vm.trendingReports = [];
43 46 vm.exceptions = 0;
44 47 vm.satisfyingRequests = 0;
45 48 vm.toleratedRequests = 0;
46 49 vm.frustratingRequests = 0;
47 50 vm.uptimeStats = 0;
48 51 vm.apdexStats = [];
49 52 vm.seriesRequestsData = [];
50 53 vm.seriesMetricsData = [];
51 54 vm.seriesSlowData = [];
52 55 vm.slowCalls = [];
53 56 vm.slowURIS = [];
54 57
55 58 vm.reportChartConfig = {
56 59 data: {
57 60 json: [],
58 61 xFormat: '%Y-%m-%dT%H:%M:%S'
59 62 },
60 63 color: {
61 64 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
62 65 },
63 66 axis: {
64 67 x: {
65 68 type: 'timeseries',
66 69 tick: {
67 70 culling: {
68 71 max: 6 // the number of tick texts will be adjusted to less than this value
69 72 },
70 73 format: '%Y-%m-%d %H:%M'
71 74 }
72 75 },
73 76 y: {
74 77 tick: {
75 78 count: 5,
76 79 format: d3.format('.2s')
77 80 }
78 81 }
79 82 },
80 83 subchart: {
81 84 show: true,
82 85 size: {
83 86 height: 20
84 87 }
85 88 },
86 89 size: {
87 90 height: 250
88 91 },
89 92 zoom: {
90 93 rescale: true
91 94 },
92 95 grid: {
93 96 x: {
94 97 show: true
95 98 },
96 99 y: {
97 100 show: true
98 101 }
99 102 },
100 103 tooltip: {
101 104 format: {
102 105 title: function (d) {
103 106 return '' + d;
104 107 },
105 108 value: function (v) {
106 109 return v
107 110 }
108 111 }
109 112 }
110 113 };
111 114 vm.reportChartData = {};
112 115
113 116 vm.reportSlowChartConfig = {
114 117 data: {
115 118 json: [],
116 119 xFormat: '%Y-%m-%dT%H:%M:%S'
117 120 },
118 121 color: {
119 122 pattern: ['#6baed6', '#e6550d', '#74c476', '#fdd0a2', '#8c564b']
120 123 },
121 124 axis: {
122 125 x: {
123 126 type: 'timeseries',
124 127 tick: {
125 128 culling: {
126 129 max: 6 // the number of tick texts will be adjusted to less than this value
127 130 },
128 131 format: '%Y-%m-%d %H:%M'
129 132 }
130 133 },
131 134 y: {
132 135 tick: {
133 136 count: 5,
134 137 format: d3.format('.2s')
135 138 }
136 139 }
137 140 },
138 141 subchart: {
139 142 show: true,
140 143 size: {
141 144 height: 20
142 145 }
143 146 },
144 147 size: {
145 148 height: 250
146 149 },
147 150 zoom: {
148 151 rescale: true
149 152 },
150 153 grid: {
151 154 x: {
152 155 show: true
153 156 },
154 157 y: {
155 158 show: true
156 159 }
157 160 },
158 161 tooltip: {
159 162 format: {
160 163 title: function (d) {
161 164 return '' + d;
162 165 },
163 166 value: function (v) {
164 167 return v
165 168 }
166 169 }
167 170 }
168 171 };
169 172 vm.reportSlowChartData = {};
170 173
171 174 vm.metricsChartConfig = {
172 175 data: {
173 176 json: [],
174 177 xFormat: '%Y-%m-%dT%H:%M:%S',
175 178 keys: {
176 179 x: 'x',
177 180 value: ["main", "sql", "nosql", "tmpl", "remote", "custom"]
178 181 },
179 182 names: {
180 183 main: 'View/Application logic',
181 184 sql: 'Relational database queries',
182 185 nosql: 'NoSql datastore calls',
183 186 tmpl: 'Template rendering',
184 187 custom: 'Custom timed calls',
185 188 remote: 'Requests to remote resources'
186 189 },
187 190 type: 'area',
188 191 groups: [["main", "sql", "nosql", "remote", "custom", "tmpl"]],
189 192 order: null
190 193 },
191 194 color: {
192 195 pattern: ['#6baed6', '#c7e9c0', '#fd8d3c', '#d6616b', '#ffcc00', '#c6dbef']
193 196 },
194 197 axis: {
195 198 x: {
196 199 type: 'timeseries',
197 200 tick: {
198 201 culling: {
199 202 max: 6 // the number of tick texts will be adjusted to less than this value
200 203 },
201 204 format: '%Y-%m-%d %H:%M'
202 205 }
203 206 },
204 207 y: {
205 208 tick: {
206 209 count: 5,
207 210 format: d3.format('.2f')
208 211 }
209 212 }
210 213 },
211 214 point: {
212 215 show: false
213 216 },
214 217 subchart: {
215 218 show: true,
216 219 size: {
217 220 height: 20
218 221 }
219 222 },
220 223 size: {
221 224 height: 350
222 225 },
223 226 zoom: {
224 227 rescale: true
225 228 },
226 229 grid: {
227 230 x: {
228 231 show: true
229 232 },
230 233 y: {
231 234 show: true
232 235 }
233 236 },
234 237 tooltip: {
235 238 format: {
236 239 title: function (d) {
237 240 return '' + d;
238 241 },
239 242 value: function (v) {
240 243 return v
241 244 }
242 245 }
243 246 }
244 247 };
245 248 vm.metricsChartData = {};
246 249
247 250 vm.responseChartConfig = {
248 251 data: {
249 252 json: [],
250 253 xFormat: '%Y-%m-%dT%H:%M:%S'
251 254 },
252 255 color: {
253 256 pattern: ['#d6616b', '#6baed6', '#fd8d3c']
254 257 },
255 258 axis: {
256 259 x: {
257 260 type: 'timeseries',
258 261 tick: {
259 262 culling: {
260 263 max: 6 // the number of tick texts will be adjusted to less than this value
261 264 },
262 265 format: '%Y-%m-%d %H:%M'
263 266 }
264 267 },
265 268 y: {
266 269 tick: {
267 270 count: 5,
268 271 format: d3.format('.2f')
269 272 }
270 273 }
271 274 },
272 275 point: {
273 276 show: false
274 277 },
275 278 subchart: {
276 279 show: true,
277 280 size: {
278 281 height: 20
279 282 }
280 283 },
281 284 size: {
282 285 height: 350
283 286 },
284 287 zoom: {
285 288 rescale: true
286 289 },
287 290 grid: {
288 291 x: {
289 292 show: true
290 293 },
291 294 y: {
292 295 show: true
293 296 }
294 297 },
295 298 tooltip: {
296 299 format: {
297 300 title: function (d) {
298 301 return '' + d;
299 302 },
300 303 value: function (v) {
301 304 return v
302 305 }
303 306 }
304 307 }
305 308 };
306 309 vm.responseChartData = {};
307 310
308 311 vm.requestsChartConfig = {
309 312 data: {
310 313 json: [],
311 314 xFormat: '%Y-%m-%dT%H:%M:%S'
312 315 },
313 316 color: {
314 317 pattern: ['#d6616b', '#6baed6', '#fd8d3c']
315 318 },
316 319 axis: {
317 320 x: {
318 321 type: 'timeseries',
319 322 tick: {
320 323 culling: {
321 324 max: 6 // the number of tick texts will be adjusted to less than this value
322 325 },
323 326 format: '%Y-%m-%d %H:%M'
324 327 }
325 328 },
326 329 y: {
327 330 tick: {
328 331 count: 5,
329 332 format: d3.format('.2f')
330 333 }
331 334 }
332 335 },
333 336 point: {
334 337 show: false
335 338 },
336 339 subchart: {
337 340 show: true,
338 341 size: {
339 342 height: 20
340 343 }
341 344 },
342 345 size: {
343 346 height: 350
344 347 },
345 348 zoom: {
346 349 rescale: true
347 350 },
348 351 grid: {
349 352 x: {
350 353 show: true
351 354 },
352 355 y: {
353 356 show: true
354 357 }
355 358 },
356 359 tooltip: {
357 360 format: {
358 361 title: function (d) {
359 362 return '' + d;
360 363 },
361 364 value: function (v) {
362 365 return v
363 366 }
364 367 }
365 368 }
366 369 };
367 370 vm.requestsChartData = {};
368 371
369 372 vm.loading = {
370 373 'apdex': true,
371 374 'reports': true,
372 375 'graphs': true,
373 376 'slowCalls': true,
374 377 'slowURIS': true,
375 378 'requestsBreakdown': true,
376 379 'series': true
377 380 };
378 381 vm.stream = {paused: false, filtered: false, messages: [], reports: []};
379 382
380 383 $rootScope.$on('channelstream-message.front_dashboard.new_topic', function(event, message){
381 384 var ws_report = message.message.report;
382 385 if (ws_report.http_status != 500) {
383 386 return
384 387 }
385 388 if (vm.stream.paused == true) {
386 389 return
387 390 }
388 391 if (vm.stream.filtered && ws_report.resource_id != vm.resource) {
389 392 return
390 393 }
391 394 var should_insert = true;
392 395 _.each(vm.stream.reports, function (report) {
393 396 if (report.report_id == ws_report.report_id) {
394 397 report.occurences = ws_report.occurences;
395 398 should_insert = false;
396 399 }
397 400 });
398 401 if (should_insert) {
399 402 if (vm.stream.reports.length > 7) {
400 403 vm.stream.reports.pop();
401 404 }
402 405 vm.stream.reports.unshift(ws_report);
403 406 }
404 407 });
405 408
406 409 vm.determineStartState = function () {
407 410 if (stateHolder.AeUser.applications.length) {
408 411 vm.resource = Number($location.search().resource);
409 412
410 413 if (!vm.resource){
411 414 var cookieResource = $cookies.getObject('resource');
412 415 console.log('cookieResource', cookieResource);
413 416
414 417 if (cookieResource) {
415 418 vm.resource = cookieResource;
416 419 }
417 420 else{
418 421 vm.resource = stateHolder.AeUser.applications[0].resource_id;
419 422 }
420 423 }
421 424 }
422 425
423 426 var timespan = $location.search().timespan;
424 427
425 428 if(_.has(vm.timeOptions, timespan)){
426 429 vm.timeSpan = vm.timeOptions[timespan];
427 430 }
428 431 else{
429 432 vm.timeSpan = vm.timeOptions['1h'];
430 433 }
431 434
432 435 var graphType = $location.search().graphtype;
433 436 if(!graphType){
434 437 vm.graphType = {selected: 'metrics_graphs'};
435 438 }
436 439 else{
437 440 vm.graphType = {selected: graphType};
438 441 }
439 442 vm.updateSearchParams();
440 443 };
441 444
442 445 vm.updateSearchParams = function () {
443 446 $location.search('resource', vm.resource);
444 447 $location.search('timespan', vm.timeSpan.key);
445 448 $location.search('graphtype', vm.graphType.selected);
446 449 stateHolder.resource = vm.resource;
447 450
448 451 if (vm.resource){
449 452 $cookies.putObject('resource', vm.resource,
450 453 {expires:new Date(3000, 1, 1)});
451 454 }
452 455 vm.refreshData();
453 456 };
454 457
455 458 vm.refreshData = function () {
456 459 vm.fetchApdexStats();
457 460 vm.fetchTrendingReports();
458 461 vm.fetchMetrics();
459 462 vm.fetchRequestsBreakdown();
460 463 vm.fetchSlowCalls();
461 464 };
462 465
463 466 vm.changedTimeSpan = function(){
464 467 vm.startDateFilter = timeSpanToStartDate(vm.timeSpan.key);
465 468 vm.refreshData();
466 469 };
467 470
468 471 vm.intervalId = $interval(function () {
469 472 if (_.contains(['30m', "1h"], vm.timeSpan.key)) {
470 473 // don't do anything if window is unfocused
471 474 if(document.hidden === true){
472 475 return ;
473 476 }
474 477 vm.refreshData();
475 478 }
476 479 }, 60000);
477 480
478 481 vm.fetchApdexStats = function () {
479 482 vm.loading.apdex = true;
480 483 vm.apdexStats = applicationsPropertyResource.query({
481 484 'key': 'apdex_stats',
482 485 'resourceId': vm.resource,
483 486 "start_date": timeSpanToStartDate(vm.timeSpan.key)
484 487 },
485 488 function (data) {
486 489 vm.loading.apdex = false;
487 490
488 491 vm.exceptions = _.reduce(data, function (memo, row) {
489 492 return memo + row.errors;
490 493 }, 0);
491 494 vm.satisfyingRequests = _.reduce(data, function (memo, row) {
492 495 return memo + row.satisfying_requests;
493 496 }, 0);
494 497 vm.toleratedRequests = _.reduce(data, function (memo, row) {
495 498 return memo + row.tolerated_requests;
496 499 }, 0);
497 500 vm.frustratingRequests = _.reduce(data, function (memo, row) {
498 501 return memo + row.frustrating_requests;
499 502 }, 0);
500 503 if (data.length) {
501 504 vm.uptimeStats = data[0].uptime;
502 505 }
503 506
504 507 },
505 508 function () {
506 509 vm.loading.apdex = false;
507 510 }
508 511 );
509 512 }
510 513
511 514 vm.fetchMetrics = function () {
512 515 vm.loading.series = true;
513 516 applicationsPropertyResource.query({
514 517 'resourceId': vm.resource,
515 518 'key': vm.graphType.selected,
516 519 "start_date": timeSpanToStartDate(vm.timeSpan.key)
517 520 }, function (data) {
518 521 if (vm.graphType.selected == 'metrics_graphs') {
519 522 vm.metricsChartData = {
520 523 json: data,
521 524 xFormat: '%Y-%m-%dT%H:%M:%S',
522 525 keys: {
523 526 x: 'x',
524 527 value: ["main", "sql", "nosql", "tmpl", "remote", "custom"]
525 528 },
526 529 names: {
527 530 main: 'View/Application logic',
528 531 sql: 'Relational database queries',
529 532 nosql: 'NoSql datastore calls',
530 533 tmpl: 'Template rendering',
531 534 custom: 'Custom timed calls',
532 535 remote: 'Requests to remote resources'
533 536 },
534 537 type: 'area',
535 538 groups: [["main", "sql", "nosql", "remote", "custom", "tmpl"]],
536 539 order: null
537 540 };
538 541 }
539 542 else if (vm.graphType.selected == 'report_graphs') {
540 543 vm.reportChartData = {
541 544 json: data,
542 545 xFormat: '%Y-%m-%dT%H:%M:%S',
543 546 keys: {
544 547 x: 'x',
545 548 value: ["not_found", "report"]
546 549 },
547 550 names: {
548 551 report: 'Errors',
549 552 not_found: '404\'s requests'
550 553 },
551 554 type: 'bar'
552 555 };
553 556 }
554 557 else if (vm.graphType.selected == 'slow_report_graphs') {
555 558 vm.reportSlowChartData = {
556 559 json: data,
557 560 xFormat: '%Y-%m-%dT%H:%M:%S',
558 561 keys: {
559 562 x: 'x',
560 563 value: ["slow_report"]
561 564 },
562 565 names: {
563 566 slow_report: 'Slow reports'
564 567 },
565 568 type: 'bar'
566 569 };
567 570 }
568 571 else if (vm.graphType.selected == 'response_graphs') {
569 572 vm.responseChartData = {
570 573 json: data,
571 574 xFormat: '%Y-%m-%dT%H:%M:%S',
572 575 keys: {
573 576 x: 'x',
574 577 value: ["today", "days_ago_2", "days_ago_7"]
575 578 },
576 579 names: {
577 580 today: 'Today',
578 581 "days_ago_2": '2 days ago',
579 582 "days_ago_7": '7 days ago'
580 583 }
581 584 };
582 585 }
583 586 else if (vm.graphType.selected == 'requests_graphs') {
584 587 vm.requestsChartData = {
585 588 json: data,
586 589 xFormat: '%Y-%m-%dT%H:%M:%S',
587 590 keys: {
588 591 x: 'x',
589 592 value: ["requests"]
590 593 },
591 594 names: {
592 595 requests: 'Requests/s'
593 596 }
594 597 };
595 598 }
596 599 vm.loading.series = false;
597 600 }, function(){
598 601 vm.loading.series = false;
599 602 });
600 603 }
601 604
602 605 vm.fetchSlowCalls = function () {
603 606 vm.loading.slowCalls = true;
604 607 applicationsPropertyResource.query({
605 608 'resourceId': vm.resource,
606 609 "start_date": timeSpanToStartDate(vm.timeSpan.key),
607 610 'key': 'slow_calls'
608 611 }, function (data) {
609 612 vm.slowCalls = data;
610 613 vm.loading.slowCalls = false;
611 614 }, function () {
612 615 vm.loading.slowCalls = false;
613 616 });
614 617 }
615 618
616 619 vm.fetchRequestsBreakdown = function () {
617 620 vm.loading.requestsBreakdown = true;
618 621 applicationsPropertyResource.query({
619 622 'resourceId': vm.resource,
620 623 "start_date": timeSpanToStartDate(vm.timeSpan.key),
621 624 'key': 'requests_breakdown'
622 625 }, function (data) {
623 626 vm.requestsBreakdown = data;
624 627 vm.loading.requestsBreakdown = false;
625 628 }, function () {
626 629 vm.loading.requestsBreakdown = false;
627 630 });
628 631 }
629 632
630 633 vm.fetchTrendingReports = function () {
631 634
632 635 if (vm.graphType.selected == 'slow_report_graphs') {
633 636 var report_type = 'slow';
634 637 }
635 638 else {
636 639 var report_type = 'error';
637 640 }
638 641
639 642 vm.loading.reports = true;
640 643 vm.trendingReports = applicationsPropertyResource.query({
641 644 'key': 'trending_reports',
642 645 'resourceId': vm.resource,
643 646 "start_date": timeSpanToStartDate(vm.timeSpan.key),
644 647 "report_type": report_type
645 648 },
646 649 function () {
647 650 vm.loading.reports = false;
648 651 },
649 652 function () {
650 653 vm.loading.reports = false;
651 654 }
652 655 );
653 656 };
654 657
655 658 $scope.$on('$destroy',function(){
656 659 $interval.cancel(vm.intervalId);
657 660 });
658 661
659 662 if (stateHolder.AeUser.applications.length){
660 663 vm.show_dashboard = true;
661 664 vm.determineStartState();
662 665 vm.refreshData();
663 666 }
664 667 }
@@ -1,250 +1,249 b''
1 1 // # Copyright (C) 2010-2016 RhodeCode GmbH
2 2 // #
3 3 // # This program is free software: you can redistribute it and/or modify
4 4 // # it under the terms of the GNU Affero General Public License, version 3
5 5 // # (only), as published by the Free Software Foundation.
6 6 // #
7 7 // # This program is distributed in the hope that it will be useful,
8 8 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 // # GNU General Public License for more details.
11 11 // #
12 12 // # You should have received a copy of the GNU Affero General Public License
13 13 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 // #
15 15 // # This program is dual-licensed. If you wish to learn more about the
16 16 // # AppEnlight Enterprise Edition, including its added features, Support
17 17 // # services, and proprietary license terms, please see
18 18 // # https://rhodecode.com/licenses/
19 19
20 20 angular.module('appenlight').config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
21 21
22 22 $urlRouterProvider.otherwise('/ui');
23 23
24 24 $stateProvider.state('logs', {
25 25 url: '/ui/logs?resource',
26 26 templateUrl: 'templates/logs.html',
27 27 controller: 'LogsController as logs'
28 28 });
29 29
30 30 $stateProvider.state('front_dashboard', {
31 31 url: '/ui',
32 templateUrl: 'templates/dashboard.html',
33 controller: 'IndexDashboardController as index'
32 component: 'indexDashboardView'
34 33 });
35 34
36 35 $stateProvider.state('report', {
37 36 abstract: true,
38 37 url: '/ui/report',
39 38 templateUrl: 'templates/reports/parent_view.html'
40 39 });
41 40
42 41 $stateProvider.state('report.list', {
43 42 url: '?start_date&min_duration&max_duration&{view_name:any}&{server_name:any}&resource',
44 43 templateUrl: 'templates/reports/list.html',
45 44 controller: 'ReportsListController as reports_list'
46 45 });
47 46
48 47 $stateProvider.state('report.list_slow', {
49 48 url: '/list_slow?start_date&min_duration&max_duration&{view_name:any}&{server_name:any}&resource',
50 49 templateUrl: 'templates/reports/list_slow.html',
51 50 controller: 'ReportsListSlowController as reports_list'
52 51 });
53 52
54 53 $stateProvider.state('report.view_detail', {
55 54 url: '/:groupId/:reportId',
56 55 templateUrl: 'templates/reports/view.html',
57 56 controller: 'ReportsViewController as report'
58 57 });
59 58 $stateProvider.state('report.view_group', {
60 59 url: '/:groupId',
61 60 templateUrl: 'templates/reports/view.html',
62 61 controller: 'ReportsViewController as report'
63 62 });
64 63 $stateProvider.state('events', {
65 64 url: '/ui/events',
66 65 templateUrl: 'templates/events.html',
67 66 controller: 'EventsController as events'
68 67 });
69 68 $stateProvider.state('admin', {
70 69 url: '/ui/admin',
71 70 templateUrl: 'templates/admin/parent_view.html'
72 71 });
73 72 $stateProvider.state('admin.user', {
74 73 abstract: true,
75 74 url: '/user',
76 75 templateUrl: 'templates/admin/users/parent_view.html'
77 76 });
78 77 $stateProvider.state('admin.user.list', {
79 78 url: '/list',
80 79 templateUrl: 'templates/admin/users/users_list.html',
81 80 controller: 'AdminUsersController as users'
82 81 });
83 82 $stateProvider.state('admin.user.create', {
84 83 url: '/create',
85 84 templateUrl: 'templates/admin/users/users_create.html',
86 85 controller: 'AdminUsersCreateController as user'
87 86 });
88 87 $stateProvider.state('admin.user.update', {
89 88 url: '/{userId}/update',
90 89 templateUrl: 'templates/admin/users/users_create.html',
91 90 controller: 'AdminUsersCreateController as user'
92 91 });
93 92
94 93
95 94 $stateProvider.state('admin.group', {
96 95 abstract: true,
97 96 url: '/group',
98 97 templateUrl: 'templates/admin/groups/parent_view.html'
99 98 });
100 99 $stateProvider.state('admin.group.list', {
101 100 url: '/list',
102 101 templateUrl: 'templates/admin/groups/groups_list.html',
103 102 controller: 'AdminGroupsController as groups'
104 103 });
105 104 $stateProvider.state('admin.group.create', {
106 105 url: '/create',
107 106 templateUrl: 'templates/admin/groups/groups_create.html',
108 107 controller: 'AdminGroupsCreateController as group'
109 108 });
110 109 $stateProvider.state('admin.group.update', {
111 110 url: '/{groupId}/update',
112 111 templateUrl: 'templates/admin/groups/groups_create.html',
113 112 controller: 'AdminGroupsCreateController as group'
114 113 });
115 114
116 115 $stateProvider.state('admin.application', {
117 116 abstract: true,
118 117 url: '/application',
119 118 templateUrl: 'templates/admin/users/parent_view.html'
120 119 });
121 120
122 121 $stateProvider.state('admin.application.list', {
123 122 url: '/list',
124 123 templateUrl: 'templates/admin/applications/applications_list.html',
125 124 controller: 'AdminApplicationsListController as applications'
126 125 });
127 126
128 127 $stateProvider.state('admin.partitions', {
129 128 url: '/partitions',
130 129 templateUrl: 'templates/admin/partitions.html',
131 130 controller: 'AdminPartitionsController as partitions'
132 131 });
133 132 $stateProvider.state('admin.system', {
134 133 url: '/system',
135 134 templateUrl: 'templates/admin/system.html',
136 135 controller: 'AdminSystemController as system'
137 136 });
138 137
139 138 $stateProvider.state('admin.configs', {
140 139 abstract: true,
141 140 url: '/configs',
142 141 templateUrl: 'templates/admin/configs/parent_view.html'
143 142 });
144 143
145 144 $stateProvider.state('admin.configs.list', {
146 145 url: '',
147 146 templateUrl: 'templates/admin/configs/edit.html',
148 147 controller: 'ConfigsListController as configs'
149 148 });
150 149
151 150 $stateProvider.state('user', {
152 151 url: '/ui/user',
153 152 templateUrl: 'templates/user/parent_view.html'
154 153 });
155 154
156 155 $stateProvider.state('user.profile', {
157 156 abstract: true,
158 157 url: '/profile',
159 158 templateUrl: 'templates/user/profile.html'
160 159 });
161 160 $stateProvider.state('user.profile.edit', {
162 161 url: '',
163 162 templateUrl: 'templates/user/profile_edit.html',
164 163 controller: 'UserProfileController as profile'
165 164 });
166 165
167 166
168 167 $stateProvider.state('user.profile.password', {
169 168 url: '/password',
170 169 templateUrl: 'templates/user/profile_password.html',
171 170 controller: 'UserPasswordController as password'
172 171 });
173 172
174 173 $stateProvider.state('user.profile.identities', {
175 174 url: '/identities',
176 175 templateUrl: 'templates/user/profile_identities.html',
177 176 controller: 'UserIdentitiesController as identities'
178 177 });
179 178
180 179 $stateProvider.state('user.profile.auth_tokens', {
181 180 url: '/auth_tokens',
182 181 templateUrl: 'templates/user/auth_tokens.html',
183 182 controller: 'UserAuthTokensController as auth_tokens'
184 183 });
185 184
186 185 $stateProvider.state('user.alert_channels', {
187 186 abstract: true,
188 187 url: '/alert_channels',
189 188 templateUrl: 'templates/user/alert_channels.html'
190 189 });
191 190
192 191 $stateProvider.state('user.alert_channels.list', {
193 192 url: '',
194 193 templateUrl: 'templates/user/alert_channels_list.html',
195 194 controller: 'AlertChannelsController as channels'
196 195 });
197 196
198 197 $stateProvider.state('user.alert_channels.email', {
199 198 url: '/email',
200 199 templateUrl: 'templates/user/alert_channels_email.html',
201 200 controller: 'AlertChannelsEmailController as email'
202 201 });
203 202
204 203 $stateProvider.state('applications', {
205 204 abstract: true,
206 205 url: '/ui/applications',
207 206 templateUrl: 'templates/applications/parent_view.html'
208 207 });
209 208
210 209 $stateProvider.state('applications.list', {
211 210 url: '',
212 211 templateUrl: 'templates/applications/list.html',
213 212 controller: 'ApplicationsListController as applications'
214 213 });
215 214 $stateProvider.state('applications.update', {
216 215 url: '/{resourceId}/update',
217 216 templateUrl: 'templates/applications/applications_update.html',
218 217 controller: 'ApplicationsUpdateController as application'
219 218 });
220 219
221 220 $stateProvider.state('applications.integrations', {
222 221 url: '/{resourceId}/integrations',
223 222 templateUrl: 'templates/applications/integrations.html',
224 223 controller: 'IntegrationsListController as integrations',
225 224 data: {
226 225 resource: null
227 226 }
228 227 });
229 228
230 229 $stateProvider.state('applications.purge_logs', {
231 230 url: '/purge_logs',
232 231 templateUrl: 'templates/applications/applications_purge_logs.html',
233 232 controller: 'ApplicationsPurgeLogsController as applications_purge'
234 233 });
235 234
236 235 $stateProvider.state('applications.integrations.edit', {
237 236 url: '/{integration}',
238 237 templateUrl: function ($stateParams) {
239 238 return 'templates/applications/integrations/' + $stateParams.integration + '.html'
240 239 },
241 240 controller: 'IntegrationController as integration'
242 241 });
243 242
244 243 $stateProvider.state('tests', {
245 244 url: '/ui/tests',
246 245 templateUrl: 'templates/user/alert_channels_test.html',
247 246 controller: 'AlertChannelsTestController as test_action'
248 247 });
249 248
250 249 }]);
General Comments 0
You need to be logged in to leave comments. Login now