(function (window, document, undefined){ 'use strict'; function minErr(module){ return function (){ var code = arguments[0], prefix = '[' + (module? module + ':': '') + code + '] ', template = arguments[1], templateArgs = arguments, stringify = function (obj){ if (typeof obj === 'function') { return _AN_Call_replace('replace', obj.toString(), / \{[\s\S]*$/, ''); } else if (typeof obj === 'undefined') { return 'undefined'; } else if (typeof obj !== 'string') { return JSON.stringify(obj); } return obj; } , message, i; message = prefix + _AN_Call_replace('replace', template, /\{\d+\}/g, function (match){ var index = + match.slice(1, -1), arg; if (index + 2 < _AN_Read_length('length', templateArgs)) { arg = templateArgs[index + 2]; if (typeof arg === 'function') { return _AN_Call_replace('replace', arg.toString(), / ?\{[\s\S]*$/, ''); } else if (typeof arg === 'undefined') { return 'undefined'; } else if (typeof arg !== 'string') { return toJson(arg); } return arg; } return match; } ); message = message + '\nhttp://errors.angularjs.org/1.2.9/' + (module? module + '/': '') + code; for (i = 2; i < _AN_Read_length('length', arguments); i++ ){ message = message + (i == 2? '?': '&') + 'p' + (i - 2) + '=' + encodeURIComponent(stringify(arguments[i])); } return new Error(message); } ; } var lowercase = function (string){ return isString(string)? string.toLowerCase(): string; } ; var uppercase = function (string){ return isString(string)? string.toUpperCase(): string; } ; var manualLowercase = function (s){ return isString(s)? _AN_Call_replace('replace', s, /[A-Z]/g, function (ch){ return String.fromCharCode(ch.charCodeAt(0) | 32); } ): s; } ; var manualUppercase = function (s){ return isString(s)? _AN_Call_replace('replace', s, /[a-z]/g, function (ch){ return String.fromCharCode(ch.charCodeAt(0) & -33); } ): s; } ; if ('i' !== 'I'.toLowerCase()) { lowercase = manualLowercase; uppercase = manualUppercase; } var msie, jqLite, jQuery, slice = [] .slice, push = [] .push, toString = Object.prototype.toString, ngMinErr = minErr('ng'), _angular = window.angular, angular = window.angular || (window.angular = { } ), angularModule, nodeName_, uid = ['0', '0', '0'] ; msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [] )[1]); if (isNaN(msie)) { msie = int((/trident\/.*; rv:(\d+)/.exec(lowercase(navigator.userAgent)) || [] )[1]); } function isArrayLike(obj){ if (obj == null || isWindow(obj)) { return false ; } var length = _AN_Read_length('length', obj); if (obj.nodeType === 1 && length) { return true ; } return isString(obj) || isArray(obj) || length === 0 || typeof length === 'number' && length > 0 && (length - 1) in obj; } function forEach(obj, iterator, context){ var key; if (obj) { if (isFunction(obj)) { for (key in obj){ if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { iterator.call(context, obj[key], key); } } } else if (obj.forEach && obj.forEach !== forEach) { obj.forEach(iterator, context); } else if (isArrayLike(obj)) { for (key = 0; key < _AN_Read_length('length', obj); key++ )iterator.call(context, obj[key], key); } else { for (key in obj){ if (obj.hasOwnProperty(key)) { iterator.call(context, obj[key], key); } } } } return obj; } function sortedKeys(obj){ var keys = [] ; for (var key in obj){ if (obj.hasOwnProperty(key)) { keys.push(key); } } return keys.sort(); } function forEachSorted(obj, iterator, context){ var keys = sortedKeys(obj); for (var i = 0; i < _AN_Read_length('length', keys); i++ ){ iterator.call(context, obj[keys[i]], keys[i]); } return keys; } function reverseParams(iteratorFn){ return function (value, key){ iteratorFn(key, value); } ; } function nextUid(){ var index = _AN_Read_length('length', uid); var digit; while (index){ index-- ; digit = uid[index].charCodeAt(0); if (digit == 57) { uid[index] = 'A'; return uid.join(''); } if (digit == 90) { uid[index] = '0'; } else { uid[index] = String.fromCharCode(digit + 1); return uid.join(''); } } uid.unshift('0'); return uid.join(''); } function setHashKey(obj, h){ if (h) { obj.$$hashKey = h; } else { delete obj.$$hashKey; } } function extend(dst){ var h = dst.$$hashKey; forEach(arguments, function (obj){ if (obj !== dst) { forEach(obj, function (value, key){ dst[key] = value; } ); } } ); setHashKey(dst, h); return dst; } function int(str){ return parseInt(str, 10); } function inherit(parent, extra){ return extend(new (extend(function (){ } , { prototype: parent} ))(), extra); } function noop(){ } noop.$inject = [] ; function identity($){ return $; } identity.$inject = [] ; function valueFn(value){ return function (){ return value; } ; } function isUndefined(value){ return typeof value === 'undefined'; } function isDefined(value){ return typeof value !== 'undefined'; } function isObject(value){ return value != null && typeof value === 'object'; } function isString(value){ return typeof value === 'string'; } function isNumber(value){ return typeof value === 'number'; } function isDate(value){ return toString.call(value) === '[object Date]'; } function isArray(value){ return toString.call(value) === '[object Array]'; } function isFunction(value){ return typeof value === 'function'; } function isRegExp(value){ return toString.call(value) === '[object RegExp]'; } function isWindow(obj){ return obj && obj.document && _AN_Read_location('location', obj) && obj.alert && obj.setInterval; } function isScope(obj){ return obj && obj.$evalAsync && obj.$watch; } function isFile(obj){ return toString.call(obj) === '[object File]'; } function isBoolean(value){ return typeof value === 'boolean'; } var trim = (function (){ if (!String.prototype.trim) { return function (value){ return isString(value)? _AN_Call_replace('replace', _AN_Call_replace('replace', value, /^\s\s*/, ''), /\s\s*$/, ''): value; } ; } return function (value){ return isString(value)? value.trim(): value; } ; } )(); function isElement(node){ return !!(node && (node.nodeName || (node.on && node.find))); } function makeMap(str){ var obj = { } , items = str.split(","), i; for (i = 0; i < _AN_Read_length("length", items); i++ )obj[items[i]] = true ; return obj; } if (msie < 9) { nodeName_ = function (element){ element = element.nodeName? element: element[0]; return (element.scopeName && element.scopeName != 'HTML')? uppercase(element.scopeName + ':' + element.nodeName): element.nodeName; } ; } else { nodeName_ = function (element){ return element.nodeName? element.nodeName: element[0].nodeName; } ; } function map(obj, iterator, context){ var results = [] ; forEach(obj, function (value, index, list){ results.push(iterator.call(context, value, index, list)); } ); return results; } function size(obj, ownPropsOnly){ var count = 0, key; if (isArray(obj) || isString(obj)) { return _AN_Read_length('length', obj); } else if (isObject(obj)) { for (key in obj)if (!ownPropsOnly || obj.hasOwnProperty(key)) count++ ; } return count; } function includes(array, obj){ return indexOf(array, obj) != -1; } function indexOf(array, obj){ if (array.indexOf) return array.indexOf(obj); for (var i = 0; i < _AN_Read_length('length', array); i++ ){ if (obj === array[i]) return i; } return -1; } function arrayRemove(array, value){ var index = indexOf(array, value); if (index >= 0) array.splice(index, 1); return value; } function isLeafNode(node){ if (node) { switch (node.nodeName){ case "OPTION": case "PRE": case "TITLE": return true ; } } return false ; } function copy(source, destination){ if (isWindow(source) || isScope(source)) { throw ngMinErr('cpws', "Can't copy! Making copies of Window or Scope instances is not supported.") } if (!destination) { destination = source; if (source) { if (isArray(source)) { destination = copy(source, [] ); } else if (isDate(source)) { destination = new Date(source.getTime()); } else if (isRegExp(source)) { destination = new RegExp(source.source); } else if (isObject(source)) { destination = copy(source, { } ); } } } else { if (source === destination) throw ngMinErr('cpi', "Can't copy! Source and destination are identical.") if (isArray(source)) { destination.length = 0; for (var i = 0; i < _AN_Read_length("length", source); i++ ){ destination.push(copy(source[i])); } } else { var h = destination.$$hashKey; forEach(destination, function (value, key){ delete destination[key]; } ); for (var key in source){ destination[key] = copy(source[key]); } setHashKey(destination, h); } } return destination; } function shallowCopy(src, dst){ dst = dst || { } ; for (var key in src){ if (src.hasOwnProperty(key) && key.charAt(0) !== '$' && key.charAt(1) !== '$') { dst[key] = src[key]; } } return dst; } function equals(o1, o2){ if (o1 === o2) return true ; if (o1 === null || o2 === null ) return false ; if (o1 !== o1 && o2 !== o2) return true ; var t1 = typeof o1, t2 = typeof o2, length, key, keySet; if (t1 == t2) { if (t1 == 'object') { if (isArray(o1)) { if (!isArray(o2)) return false ; if ((length = _AN_Read_length('length', o1)) == _AN_Read_length('length', o2)) { for (key = 0; key < length; key++ ){ if (!equals(o1[key], o2[key])) return false ; } return true ; } } else if (isDate(o1)) { return isDate(o2) && o1.getTime() == o2.getTime(); } else if (isRegExp(o1) && isRegExp(o2)) { return o1.toString() == o2.toString(); } else { if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false ; keySet = { } ; for (key in o1){ if (key.charAt(0) === '$' || isFunction(o1[key])) continue ; if (!equals(o1[key], o2[key])) return false ; keySet[key] = true ; } for (key in o2){ if (!keySet.hasOwnProperty(key) && key.charAt(0) !== '$' && o2[key] !== undefined && !isFunction(o2[key])) return false ; } return true ; } } } return false ; } function csp(){ return (document.securityPolicy && document.securityPolicy.isActive) || (document.querySelector && !!(document.querySelector('[ng-csp]') || document.querySelector('[data-ng-csp]'))); } function concat(array1, array2, index){ return array1.concat(slice.call(array2, index)); } function sliceArgs(args, startIndex){ return slice.call(args, startIndex || 0); } function bind(self, fn){ var curryArgs = _AN_Read_length('length', arguments) > 2? sliceArgs(arguments, 2): [] ; if (isFunction(fn) && !(fn instanceof RegExp)) { return _AN_Read_length('length', curryArgs)? function (){ return _AN_Read_length('length', arguments)? fn.apply(self, curryArgs.concat(slice.call(arguments, 0))): fn.apply(self, curryArgs); } : function (){ return _AN_Read_length('length', arguments)? fn.apply(self, arguments): fn.call(self); } ; } else { return fn; } } function toJsonReplacer(key, value){ var val = value; if (typeof key === 'string' && key.charAt(0) === '$') { val = undefined; } else if (isWindow(value)) { val = '$WINDOW'; } else if (value && document === value) { val = '$DOCUMENT'; } else if (isScope(value)) { val = '$SCOPE'; } return val; } function toJson(obj, pretty){ if (typeof obj === 'undefined') return undefined; return JSON.stringify(obj, toJsonReplacer, pretty? ' ': null ); } function fromJson(json){ return isString(json)? JSON.parse(json): json; } function toBoolean(value){ if (typeof value === 'function') { value = true ; } else if (value && _AN_Read_length('length', value) !== 0) { var v = lowercase("" + value); value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]'); } else { value = false ; } return value; } function startingTag(element){ element = jqLite(element).clone(); try { element.empty(); } catch (e) { } var TEXT_NODE = 3; var elemHtml = jqLite('
').append(element).html(); try { return element[0].nodeType === TEXT_NODE? lowercase(elemHtml): _AN_Call_replace('replace', elemHtml.match(/^(<[^>]+>)/)[1], /^<([\w\-]+)/, function (match, nodeName){ return '<' + lowercase(nodeName); } ); } catch (e) { return lowercase(elemHtml); } } function tryDecodeURIComponent(value){ try { return decodeURIComponent(value); } catch (e) { } } function parseKeyValue(keyValue){ var obj = { } , key_value, key; forEach((keyValue || "").split('&'), function (keyValue){ if (keyValue) { key_value = keyValue.split('='); key = tryDecodeURIComponent(key_value[0]); if (isDefined(key)) { var val = isDefined(key_value[1])? tryDecodeURIComponent(key_value[1]): true ; if (!obj[key]) { obj[key] = val; } else if (isArray(obj[key])) { obj[key].push(val); } else { obj[key] = [obj[key], val] ; } } } } ); return obj; } function toKeyValue(obj){ var parts = [] ; forEach(obj, function (value, key){ if (isArray(value)) { forEach(value, function (arrayValue){ parts.push(encodeUriQuery(key, true ) + (arrayValue === true ? '': '=' + encodeUriQuery(arrayValue, true ))); } ); } else { parts.push(encodeUriQuery(key, true ) + (value === true ? '': '=' + encodeUriQuery(value, true ))); } } ); return _AN_Read_length('length', parts)? parts.join('&'): ''; } function encodeUriSegment(val){ return _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', encodeUriQuery(val, true ), /%26/gi, '&'), /%3D/gi, '='), /%2B/gi, '+'); } function encodeUriQuery(val, pctEncodeSpaces){ return _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', _AN_Call_replace('replace', encodeURIComponent(val), /%40/gi, '@'), /%3A/gi, ':'), /%24/g, '$'), /%2C/gi, ','), /%20/g, (pctEncodeSpaces? '%20': '+')); } function angularInit(element, bootstrap){ var elements = [element] , appElement, module, names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'] , NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/; function append(element){ element && elements.push(element); } forEach(names, function (name){ names[name] = true ; append(document.getElementById(name)); name = _AN_Call_replace('replace', name, ':', '\\:'); if (element.querySelectorAll) { forEach(element.querySelectorAll('.' + name), append); forEach(element.querySelectorAll('.' + name + '\\:'), append); forEach(element.querySelectorAll('[' + name + ']'), append); } } ); forEach(elements, function (element){ if (!appElement) { var className = ' ' + element.className + ' '; var match = NG_APP_CLASS_REGEXP.exec(className); if (match) { appElement = element; module = _AN_Call_replace('replace', (match[2] || ''), /\s+/g, ','); } else { forEach(element.attributes, function (attr){ if (!appElement && names[attr.name]) { appElement = element; module = attr.value; } } ); } } } ); if (appElement) { bootstrap(appElement, module? [module] : [] ); } } function bootstrap(element, modules){ var doBootstrap = function (){ element = jqLite(element); if (element.injector()) { var tag = (element[0] === document)? 'document': startingTag(element); throw ngMinErr('btstrpd', "App Already Bootstrapped with this Element '{0}'", tag) } modules = modules || [] ; modules.unshift(['$provide', function ($provide){ $provide.value('$rootElement', element); } ] ); modules.unshift('ng'); var injector = createInjector(modules); injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animate', function (scope, element, compile, injector, animate){ scope.$apply(function (){ element.data('$injector', injector); compile(element)(scope); } ); } ] ); return injector; } ; var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { return doBootstrap(); } window.name = _AN_Call_replace('replace', window.name, NG_DEFER_BOOTSTRAP, ''); angular.resumeBootstrap = function (extraModules){ forEach(extraModules, function (module){ modules.push(module); } ); doBootstrap(); } ; } var SNAKE_CASE_REGEXP = /[A-Z]/g; function snake_case(name, separator){ separator = separator || '_'; return _AN_Call_replace('replace', name, SNAKE_CASE_REGEXP, function (letter, pos){ return (pos? separator: '') + letter.toLowerCase(); } ); } function bindJQuery(){ jQuery = window.jQuery; if (jQuery) { jqLite = jQuery; extend(jQuery.fn, { scope: JQLitePrototype.scope, isolateScope: JQLitePrototype.isolateScope, controller: JQLitePrototype.controller, injector: JQLitePrototype.injector, inheritedData: JQLitePrototype.inheritedData} ); jqLitePatchJQueryRemove('remove', true , true , false ); jqLitePatchJQueryRemove('empty', false , false , false ); jqLitePatchJQueryRemove('html', false , false , true ); } else { jqLite = JQLite; } angular.element = jqLite; } function assertArg(arg, name, reason){ if (!arg) { throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")) } return arg; } function assertArgFn(arg, name, acceptArrayAnnotation){ if (acceptArrayAnnotation && isArray(arg)) { arg = arg[_AN_Read_length("length", arg) - 1]; } assertArg(isFunction(arg), name, 'not a function, got ' + (arg && typeof arg == 'object'? arg.constructor.name || 'Object': typeof arg)); return arg; } function assertNotHasOwnProperty(name, context){ if (name === 'hasOwnProperty') { throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context) } } function getter(obj, path, bindFnToScope){ if (!path) return obj; var keys = path.split('.'); var key; var lastInstance = obj; var len = _AN_Read_length('length', keys); for (var i = 0; i < len; i++ ){ key = keys[i]; if (obj) { obj = (lastInstance = obj)[key]; } } if (!bindFnToScope && isFunction(obj)) { return bind(lastInstance, obj); } return obj; } function getBlockElements(nodes){ var startNode = nodes[0], endNode = nodes[_AN_Read_length('length', nodes) - 1]; if (startNode === endNode) { return jqLite(startNode); } var element = startNode; var elements = [element] ; do { element = element.nextSibling; if (!element) break ; elements.push(element); } while(element !== endNode)return jqLite(elements); } function setupModuleLoader(window){ var $injectorMinErr = minErr('$injector'); var ngMinErr = minErr('ng'); function ensure(obj, name, factory){ return obj[name] || (obj[name] = factory()); } var angular = ensure(window, 'angular', Object); angular.$$minErr = angular.$$minErr || minErr; return ensure(angular, 'module', function (){ var modules = { } ; return function module(name, requires, configFn){ var assertNotHasOwnProperty = function (name, context){ if (name === 'hasOwnProperty') { throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context) } } ; assertNotHasOwnProperty(name, 'module'); if (requires && modules.hasOwnProperty(name)) { modules[name] = null ; } return ensure(modules, name, function (){ if (!requires) { throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + "the module name or forgot to load it. If registering a module ensure that you " + "specify the dependencies as the second argument.", name) } var invokeQueue = [] ; var runBlocks = [] ; var config = invokeLater('$injector', 'invoke'); var moduleInstance = { _invokeQueue: invokeQueue, _runBlocks: runBlocks, requires: requires, name: name, provider: invokeLater('$provide', 'provider'), factory: invokeLater('$provide', 'factory'), service: invokeLater('$provide', 'service'), value: invokeLater('$provide', 'value'), constant: invokeLater('$provide', 'constant', 'unshift'), animation: invokeLater('$animateProvider', 'register'), filter: invokeLater('$filterProvider', 'register'), controller: invokeLater('$controllerProvider', 'register'), directive: invokeLater('$compileProvider', 'directive'), config: config, run: function (block){ runBlocks.push(block); return this; } } ; if (configFn) { config(configFn); } return moduleInstance; function invokeLater(provider, method, insertMethod){ return function (){ invokeQueue[insertMethod || 'push']([provider, method, arguments] ); return moduleInstance; } ; } } ); } ; } ); } var version = { full: '1.2.9', major: 1, minor: 2, dot: 9, codeName: 'enchanted-articulacy'} ; function publishExternalAPI(angular){ extend(angular, { 'bootstrap': bootstrap, 'copy': copy, 'extend': extend, 'equals': equals, 'element': jqLite, 'forEach': forEach, 'injector': createInjector, 'noop': noop, 'bind': bind, 'toJson': toJson, 'fromJson': fromJson, 'identity': identity, 'isUndefined': isUndefined, 'isDefined': isDefined, 'isString': isString, 'isFunction': isFunction, 'isObject': isObject, 'isNumber': isNumber, 'isElement': isElement, 'isArray': isArray, 'version': version, 'isDate': isDate, 'lowercase': lowercase, 'uppercase': uppercase, 'callbacks': { counter: 0} , '$$minErr': minErr, '$$csp': csp} ); angularModule = setupModuleLoader(window); try { angularModule('ngLocale'); } catch (e) { angularModule('ngLocale', [] ).provider('$locale', $LocaleProvider); } angularModule('ng', ['ngLocale'] , ['$provide', function ngModule($provide){ $provide.provider({ $$sanitizeUri: $$SanitizeUriProvider} ); $provide.provider('$compile', $CompileProvider).directive({ a: htmlAnchorDirective, input: inputDirective, textarea: inputDirective, form: formDirective, script: scriptDirective, select: selectDirective, style: styleDirective, option: optionDirective, ngBind: ngBindDirective, ngBindHtml: ngBindHtmlDirective, ngBindTemplate: ngBindTemplateDirective, ngClass: ngClassDirective, ngClassEven: ngClassEvenDirective, ngClassOdd: ngClassOddDirective, ngCloak: ngCloakDirective, ngController: ngControllerDirective, ngForm: ngFormDirective, ngHide: ngHideDirective, ngIf: ngIfDirective, ngInclude: ngIncludeDirective, ngInit: ngInitDirective, ngNonBindable: ngNonBindableDirective, ngPluralize: ngPluralizeDirective, ngRepeat: ngRepeatDirective, ngShow: ngShowDirective, ngStyle: ngStyleDirective, ngSwitch: ngSwitchDirective, ngSwitchWhen: ngSwitchWhenDirective, ngSwitchDefault: ngSwitchDefaultDirective, ngOptions: ngOptionsDirective, ngTransclude: ngTranscludeDirective, ngModel: ngModelDirective, ngList: ngListDirective, ngChange: ngChangeDirective, required: requiredDirective, ngRequired: requiredDirective, ngValue: ngValueDirective} ).directive({ ngInclude: ngIncludeFillContentDirective} ).directive(ngAttributeAliasDirectives).directive(ngEventDirectives); $provide.provider({ $anchorScroll: $AnchorScrollProvider, $animate: $AnimateProvider, $browser: $BrowserProvider, $cacheFactory: $CacheFactoryProvider, $controller: $ControllerProvider, $document: $DocumentProvider, $exceptionHandler: $ExceptionHandlerProvider, $filter: $FilterProvider, $interpolate: $InterpolateProvider, $interval: $IntervalProvider, $http: $HttpProvider, $httpBackend: $HttpBackendProvider, $location: $LocationProvider, $log: $LogProvider, $parse: $ParseProvider, $rootScope: $RootScopeProvider, $q: $QProvider, $sce: $SceProvider, $sceDelegate: $SceDelegateProvider, $sniffer: $SnifferProvider, $templateCache: $TemplateCacheProvider, $timeout: $TimeoutProvider, $window: $WindowProvider} ); } ] ); } var jqCache = JQLite.cache = { } , jqName = JQLite.expando = 'ng-' + new Date().getTime(), jqId = 1, addEventListenerFn = (window.document.addEventListener? function (element, type, fn){ element.addEventListener(type, fn, false ); } : function (element, type, fn){ element.attachEvent('on' + type, fn); } ), removeEventListenerFn = (window.document.removeEventListener? function (element, type, fn){ element.removeEventListener(type, fn, false ); } : function (element, type, fn){ element.detachEvent('on' + type, fn); } ); function jqNextId(){ return ++jqId; } var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; var MOZ_HACK_REGEXP = /^moz([A-Z])/; var jqLiteMinErr = minErr('jqLite'); function camelCase(name){ return _AN_Call_replace('replace', _AN_Call_replace('replace', name, SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset){ return offset? letter.toUpperCase(): letter; } ), MOZ_HACK_REGEXP, 'Moz$1'); } function jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments){ var originalJqFn = jQuery.fn[name]; originalJqFn = originalJqFn.$original || originalJqFn; removePatch.$original = originalJqFn; jQuery.fn[name] = removePatch; function removePatch(param){ var list = filterElems && param? [this.filter(param)] : [this] , fireEvent = dispatchThis, set, setIndex, setLength, element, childIndex, childLength, children; if (!getterIfNoArguments || param != null ) { while (list.length){ set = list.shift(); for (setIndex = 0, setLength = _AN_Read_length('length', set); setIndex < setLength; setIndex++ ){ element = jqLite(set[setIndex]); if (fireEvent) { element.triggerHandler('$destroy'); } else { fireEvent = !fireEvent; } for (childIndex = 0, childLength = _AN_Read_length('length', (children = element.children())); childIndex < childLength; childIndex++ ){ list.push(jQuery(children[childIndex])); } } } } return originalJqFn.apply(this, arguments); } } function JQLite(element){ if (element instanceof JQLite) { return element; } if (!(this instanceof JQLite)) { if (isString(element) && element.charAt(0) != '<') { throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element') } return new JQLite(element); } if (isString(element)) { var div = _AN_Call_createelement('createElement', document, 'div'); _AN_Write_innerhtml('innerHTML', div, false , '
 
' + element); div.removeChild(div.firstChild); jqLiteAddNodes(this, div.childNodes); var fragment = jqLite(document.createDocumentFragment()); fragment.append(this); } else { jqLiteAddNodes(this, element); } } function jqLiteClone(element){ return element.cloneNode(true ); } function jqLiteDealoc(element){ jqLiteRemoveData(element); for (var i = 0, children = element.childNodes || [] ; i < _AN_Read_length('length', children); i++ ){ jqLiteDealoc(children[i]); } } function jqLiteOff(element, type, fn, unsupported){ if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument') var events = jqLiteExpandoStore(element, 'events'), handle = jqLiteExpandoStore(element, 'handle'); if (!handle) return ; if (isUndefined(type)) { forEach(events, function (eventHandler, type){ removeEventListenerFn(element, type, eventHandler); delete events[type]; } ); } else { forEach(type.split(' '), function (type){ if (isUndefined(fn)) { removeEventListenerFn(element, type, events[type]); delete events[type]; } else { arrayRemove(events[type] || [] , fn); } } ); } } function jqLiteRemoveData(element, name){ var expandoId = element[jqName], expandoStore = jqCache[expandoId]; if (expandoStore) { if (name) { delete jqCache[expandoId].data[name]; return ; } if (expandoStore.handle) { expandoStore.events.$destroy && expandoStore.handle({ } , '$destroy'); jqLiteOff(element); } delete jqCache[expandoId]; element[jqName] = undefined; } } function jqLiteExpandoStore(element, key, value){ var expandoId = element[jqName], expandoStore = jqCache[expandoId || -1]; if (isDefined(value)) { if (!expandoStore) { element[jqName] = expandoId = jqNextId(); expandoStore = jqCache[expandoId] = { } ; } expandoStore[key] = value; } else { return expandoStore && expandoStore[key]; } } function jqLiteData(element, key, value){ var data = jqLiteExpandoStore(element, 'data'), isSetter = isDefined(value), keyDefined = !isSetter && isDefined(key), isSimpleGetter = keyDefined && !isObject(key); if (!data && !isSimpleGetter) { jqLiteExpandoStore(element, 'data', data = { } ); } if (isSetter) { data[key] = value; } else { if (keyDefined) { if (isSimpleGetter) { return data && data[key]; } else { extend(data, key); } } else { return data; } } } function jqLiteHasClass(element, selector){ if (!element.getAttribute) return false ; return (_AN_Call_replace('replace', (" " + (_AN_Call_getattribute("getAttribute", element, 'class') || '') + " "), /[\n\t]/g, " ").indexOf(" " + selector + " ") > -1); } function jqLiteRemoveClass(element, cssClasses){ if (cssClasses && element.setAttribute) { forEach(cssClasses.split(' '), function (cssClass){ _AN_Call_setattribute('setAttribute', element, 'class', trim(_AN_Call_replace('replace', _AN_Call_replace('replace', (" " + (_AN_Call_getattribute("getAttribute", element, 'class') || '') + " "), /[\n\t]/g, " "), " " + trim(cssClass) + " ", " "))); } ); } } function jqLiteAddClass(element, cssClasses){ if (cssClasses && element.setAttribute) { var existingClasses = _AN_Call_replace("replace", (' ' + (_AN_Call_getattribute('getAttribute', element, 'class') || '') + ' '), /[\n\t]/g, " "); forEach(cssClasses.split(' '), function (cssClass){ cssClass = trim(cssClass); if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { existingClasses += cssClass + ' '; } } ); _AN_Call_setattribute('setAttribute', element, 'class', trim(existingClasses)); } } function jqLiteAddNodes(root, elements){ if (elements) { elements = (!elements.nodeName && isDefined(_AN_Read_length('length', elements)) && !isWindow(elements))? elements: [elements] ; for (var i = 0; i < _AN_Read_length('length', elements); i++ ){ root.push(elements[i]); } } } function jqLiteController(element, name){ return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); } function jqLiteInheritedData(element, name, value){ element = jqLite(element); if (element[0].nodeType == 9) { element = element.find('html'); } var names = isArray(name)? name: [name] ; while (element.length){ for (var i = 0, ii = _AN_Read_length('length', names); i < ii; i++ ){ if ((value = element.data(names[i])) !== undefined) return value; } element = element.parent(); } } function jqLiteEmpty(element){ for (var i = 0, childNodes = element.childNodes; i < _AN_Read_length('length', childNodes); i++ ){ jqLiteDealoc(childNodes[i]); } while (element.firstChild){ element.removeChild(element.firstChild); } } var JQLitePrototype = JQLite.prototype = { ready: function (fn){ var fired = false ; function trigger(){ if (fired) return ; fired = true ; fn(); } if (document.readyState === 'complete') { _AN_Call_settimeout('setTimeout', window, trigger); } else { this.on('DOMContentLoaded', trigger); JQLite(window).on('load', trigger); } } , toString: function (){ var value = [] ; forEach(this, function (e){ value.push('' + e); } ); return '[' + value.join(', ') + ']'; } , eq: function (index){ return (index >= 0)? jqLite(this[index]): jqLite(this[_AN_Read_length('length', this) + index]); } , length: 0, push: push, sort: [] .sort, splice: [] .splice} ; var BOOLEAN_ATTR = { } ; forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function (value){ BOOLEAN_ATTR[lowercase(value)] = value; } ); var BOOLEAN_ELEMENTS = { } ; forEach('input,select,option,textarea,button,form,details'.split(','), function (value){ BOOLEAN_ELEMENTS[uppercase(value)] = true ; } ); function getBooleanAttrName(element, name){ var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr; } forEach({ data: jqLiteData, inheritedData: jqLiteInheritedData, scope: function (element){ return jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope'] ); } , isolateScope: function (element){ return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate'); } , controller: jqLiteController, injector: function (element){ return jqLiteInheritedData(element, '$injector'); } , removeAttr: function (element, name){ element.removeAttribute(name); } , hasClass: jqLiteHasClass, css: function (element, name, value){ name = camelCase(name); if (isDefined(value)) { element.style[name] = value; } else { var val; if (msie <= 8) { val = element.currentStyle && element.currentStyle[name]; if (val === '') val = 'auto'; } val = val || element.style[name]; if (msie <= 8) { val = (val === '')? undefined: val; } return val; } } , attr: function (element, name, value){ var lowercasedName = lowercase(name); if (BOOLEAN_ATTR[lowercasedName]) { if (isDefined(value)) { if (!!value) { element[name] = true ; _AN_Call_setattribute('setAttribute', element, name, lowercasedName); } else { element[name] = false ; element.removeAttribute(lowercasedName); } } else { return (element[name] || (element.attributes.getNamedItem(name) || noop).specified)? lowercasedName: undefined; } } else if (isDefined(value)) { _AN_Call_setattribute('setAttribute', element, name, value); } else if (element.getAttribute) { var ret = _AN_Call_getattribute('getAttribute', element, name, 2); return ret === null ? undefined: ret; } } , prop: function (element, name, value){ if (isDefined(value)) { element[name] = value; } else { return element[name]; } } , text: (function (){ var NODE_TYPE_TEXT_PROPERTY = [] ; if (msie < 9) { NODE_TYPE_TEXT_PROPERTY[1] = 'innerText'; NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue'; } else { NODE_TYPE_TEXT_PROPERTY[1] = NODE_TYPE_TEXT_PROPERTY[3] = 'textContent'; } getText.$dv = ''; return getText; function getText(element, value){ var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType]; if (isUndefined(value)) { return textProp? element[textProp]: ''; } element[textProp] = value; } } )(), val: function (element, value){ if (isUndefined(value)) { if (nodeName_(element) === 'SELECT' && element.multiple) { var result = [] ; forEach(element.options, function (option){ if (option.selected) { result.push(option.value || option.text); } } ); return _AN_Read_length('length', result) === 0? null : result; } return element.value; } element.value = value; } , html: function (element, value){ if (isUndefined(value)) { return element.innerHTML; } for (var i = 0, childNodes = element.childNodes; i < _AN_Read_length('length', childNodes); i++ ){ jqLiteDealoc(childNodes[i]); } _AN_Write_innerhtml('innerHTML', element, false , value); } , empty: jqLiteEmpty} , function (fn, name){ JQLite.prototype[name] = function (arg1, arg2){ var i, key; if (fn !== jqLiteEmpty && (((_AN_Read_length('length', fn) == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController))? arg1: arg2) === undefined)) { if (isObject(arg1)) { for (i = 0; i < _AN_Read_length('length', this); i++ ){ if (fn === jqLiteData) { fn(this[i], arg1); } else { for (key in arg1){ fn(this[i], key, arg1[key]); } } } return this; } else { var value = fn.$dv; var jj = (value === undefined)? Math.min(_AN_Read_length('length', this), 1): _AN_Read_length('length', this); for (var j = 0; j < jj; j++ ){ var nodeValue = fn(this[j], arg1, arg2); value = value? value + nodeValue: nodeValue; } return value; } } else { for (i = 0; i < _AN_Read_length('length', this); i++ ){ fn(this[i], arg1, arg2); } return this; } } ; } ); function createEventHandler(element, events){ var eventHandler = function (event, type){ if (!event.preventDefault) { event.preventDefault = function (){ event.returnValue = false ; } ; } if (!event.stopPropagation) { event.stopPropagation = function (){ event.cancelBubble = true ; } ; } if (!_AN_Read_target('target', event)) { _AN_Write_target('target', event, false , event.srcElement || document); } if (isUndefined(event.defaultPrevented)) { var prevent = event.preventDefault; event.preventDefault = function (){ event.defaultPrevented = true ; prevent.call(event); } ; event.defaultPrevented = false ; } event.isDefaultPrevented = function (){ return event.defaultPrevented || event.returnValue === false ; } ; var eventHandlersCopy = shallowCopy(events[type || event.type] || [] ); forEach(eventHandlersCopy, function (fn){ fn.call(element, event); } ); if (msie <= 8) { event.preventDefault = null ; event.stopPropagation = null ; event.isDefaultPrevented = null ; } else { delete event.preventDefault; delete event.stopPropagation; delete event.isDefaultPrevented; } } ; eventHandler.elem = element; return eventHandler; } forEach({ removeData: jqLiteRemoveData, dealoc: jqLiteDealoc, on: function onFn(element, type, fn, unsupported){ if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters') var events = jqLiteExpandoStore(element, 'events'), handle = jqLiteExpandoStore(element, 'handle'); if (!events) jqLiteExpandoStore(element, 'events', events = { } ); if (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events)); forEach(type.split(' '), function (type){ var eventFns = events[type]; if (!eventFns) { if (type == 'mouseenter' || type == 'mouseleave') { var contains = document.body.contains || document.body.compareDocumentPosition? function (a, b){ var adown = a.nodeType === 9? a.documentElement: a, bup = b && b.parentNode; return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains? adown.contains(bup): a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16)); } : function (a, b){ if (b) { while ((b = b.parentNode)){ if (b === a) { return true ; } } } return false ; } ; events[type] = [] ; var eventmap = { mouseleave: "mouseout", mouseenter: "mouseover"} ; onFn(element, eventmap[type], function (event){ var target = this, related = event.relatedTarget; if (!related || (related !== target && !contains(target, related))) { handle(event, type); } } ); } else { addEventListenerFn(element, type, handle); events[type] = [] ; } eventFns = events[type]; } eventFns.push(fn); } ); } , off: jqLiteOff, one: function (element, type, fn){ element = jqLite(element); element.on(type, function onFn(){ element.off(type, fn); element.off(type, onFn); } ); element.on(type, fn); } , replaceWith: function (element, replaceNode){ var index, parent = element.parentNode; jqLiteDealoc(element); forEach(new JQLite(replaceNode), function (node){ if (index) { parent.insertBefore(node, index.nextSibling); } else { parent.replaceChild(node, element); } index = node; } ); } , children: function (element){ var children = [] ; forEach(element.childNodes, function (element){ if (element.nodeType === 1) children.push(element); } ); return children; } , contents: function (element){ return element.childNodes || [] ; } , append: function (element, node){ forEach(new JQLite(node), function (child){ if (element.nodeType === 1 || element.nodeType === 11) { _AN_Call_appendchild("appendChild", element, child); } } ); } , prepend: function (element, node){ if (element.nodeType === 1) { var index = element.firstChild; forEach(new JQLite(node), function (child){ element.insertBefore(child, index); } ); } } , wrap: function (element, wrapNode){ wrapNode = jqLite(wrapNode)[0]; var parent = element.parentNode; if (parent) { parent.replaceChild(wrapNode, element); } _AN_Call_appendchild("appendChild", wrapNode, element); } , remove: function (element){ jqLiteDealoc(element); var parent = element.parentNode; if (parent) parent.removeChild(element); } , after: function (element, newElement){ var index = element, parent = element.parentNode; forEach(new JQLite(newElement), function (node){ parent.insertBefore(node, index.nextSibling); index = node; } ); } , addClass: jqLiteAddClass, removeClass: jqLiteRemoveClass, toggleClass: function (element, selector, condition){ if (isUndefined(condition)) { condition = !jqLiteHasClass(element, selector); } (condition? jqLiteAddClass: jqLiteRemoveClass)(element, selector); } , parent: function (element){ var parent = element.parentNode; return parent && parent.nodeType !== 11? parent: null ; } , next: function (element){ if (element.nextElementSibling) { return element.nextElementSibling; } var elm = element.nextSibling; while (elm != null && elm.nodeType !== 1){ elm = elm.nextSibling; } return elm; } , find: function (element, selector){ if (element.getElementsByTagName) { return _AN_Call_getelementsbytagname("getElementsByTagName", element, selector); } else { return [] ; } } , clone: jqLiteClone, triggerHandler: function (element, eventName, eventData){ var eventFns = (jqLiteExpandoStore(element, 'events') || { } )[eventName]; eventData = eventData || [] ; var event = [{ preventDefault: noop, stopPropagation: noop} ] ; forEach(eventFns, function (fn){ fn.apply(element, event.concat(eventData)); } ); } } , function (fn, name){ JQLite.prototype[name] = function (arg1, arg2, arg3){ var value; for (var i = 0; i < _AN_Read_length('length', this); i++ ){ if (isUndefined(value)) { value = fn(this[i], arg1, arg2, arg3); if (isDefined(value)) { value = jqLite(value); } } else { jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); } } return isDefined(value)? value: this; } ; JQLite.prototype.bind = JQLite.prototype.on; JQLite.prototype.unbind = JQLite.prototype.off; } ); function hashKey(obj){ var objType = typeof obj, key; if (objType == 'object' && obj !== null ) { if (typeof (key = obj.$$hashKey) == 'function') { key = obj.$$hashKey(); } else if (key === undefined) { key = obj.$$hashKey = nextUid(); } } else { key = obj; } return objType + ':' + key; } function HashMap(array){ forEach(array, this.put, this); } HashMap.prototype = { put: function (key, value){ this[hashKey(key)] = value; } , get: function (key){ return this[hashKey(key)]; } , remove: function (key){ var value = this[key = hashKey(key)]; delete this[key]; return value; } } ; var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; var FN_ARG_SPLIT = /,/; var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; var $injectorMinErr = minErr('$injector'); function annotate(fn){ var $inject, fnText, argDecl, last; if (typeof fn == 'function') { if (!($inject = fn.$inject)) { $inject = [] ; if (fn.length) { fnText = _AN_Call_replace('replace', fn.toString(), STRIP_COMMENTS, ''); argDecl = fnText.match(FN_ARGS); forEach(argDecl[1].split(FN_ARG_SPLIT), function (arg){ _AN_Call_replace('replace', arg, FN_ARG, function (all, underscore, name){ $inject.push(name); } ); } ); } fn.$inject = $inject; } } else if (isArray(fn)) { last = _AN_Read_length('length', fn) - 1; assertArgFn(fn[last], 'fn'); $inject = fn.slice(0, last); } else { assertArgFn(fn, 'fn', true ); } return $inject; } function createInjector(modulesToLoad){ var INSTANTIATING = { } , providerSuffix = 'Provider', path = [] , loadedModules = new HashMap(), providerCache = { $provide: { provider: supportObject(provider), factory: supportObject(factory), service: supportObject(service), value: supportObject(value), constant: supportObject(constant), decorator: decorator} } , providerInjector = (providerCache.$injector = createInternalInjector(providerCache, function (){ throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')) } )), instanceCache = { } , instanceInjector = (instanceCache.$injector = createInternalInjector(instanceCache, function (servicename){ var provider = providerInjector.get(servicename + providerSuffix); return instanceInjector.invoke(provider.$get, provider); } )); forEach(loadModules(modulesToLoad), function (fn){ instanceInjector.invoke(fn || noop); } ); return instanceInjector; function supportObject(delegate){ return function (key, value){ if (isObject(key)) { forEach(key, reverseParams(delegate)); } else { return delegate(key, value); } } ; } function provider(name, provider_){ assertNotHasOwnProperty(name, 'service'); if (isFunction(provider_) || isArray(provider_)) { provider_ = providerInjector.instantiate(provider_); } if (!provider_.$get) { throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name) } return providerCache[name + providerSuffix] = provider_; } function factory(name, factoryFn){ return provider(name, { $get: factoryFn} ); } function service(name, constructor){ return factory(name, ['$injector', function ($injector){ return $injector.instantiate(constructor); } ] ); } function value(name, val){ return factory(name, valueFn(val)); } function constant(name, value){ assertNotHasOwnProperty(name, 'constant'); providerCache[name] = value; instanceCache[name] = value; } function decorator(serviceName, decorFn){ var origProvider = providerInjector.get(serviceName + providerSuffix), orig$get = origProvider.$get; origProvider.$get = function (){ var origInstance = instanceInjector.invoke(orig$get, origProvider); return instanceInjector.invoke(decorFn, null , { $delegate: origInstance} ); } ; } function loadModules(modulesToLoad){ var runBlocks = [] , moduleFn, invokeQueue, i, ii; forEach(modulesToLoad, function (module){ if (loadedModules.get(module)) return ; loadedModules.put(module, true ); try { if (isString(module)) { moduleFn = angularModule(module); runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); for (invokeQueue = moduleFn._invokeQueue, i = 0, ii = _AN_Read_length('length', invokeQueue); i < ii; i++ ){ var invokeArgs = invokeQueue[i], provider = providerInjector.get(invokeArgs[0]); provider[invokeArgs[1]].apply(provider, invokeArgs[2]); } } else if (isFunction(module)) { runBlocks.push(providerInjector.invoke(module)); } else if (isArray(module)) { runBlocks.push(providerInjector.invoke(module)); } else { assertArgFn(module, 'module'); } } catch (e) { if (isArray(module)) { module = module[_AN_Read_length('length', module) - 1]; } if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { e = e.message + '\n' + e.stack; } throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", module, e.stack || e.message || e) } } ); return runBlocks; } function createInternalInjector(cache, factory){ function getService(serviceName){ if (cache.hasOwnProperty(serviceName)) { if (cache[serviceName] === INSTANTIATING) { throw $injectorMinErr('cdep', 'Circular dependency found: {0}', path.join(' <- ')) } return cache[serviceName]; } else { try { path.unshift(serviceName); cache[serviceName] = INSTANTIATING; return cache[serviceName] = factory(serviceName); } catch (err) { if (cache[serviceName] === INSTANTIATING) { delete cache[serviceName]; } throw err } finally{ path.shift(); } } } function invoke(fn, self, locals){ var args = [] , $inject = annotate(fn), length, i, key; for (i = 0, length = _AN_Read_length('length', $inject); i < length; i++ ){ key = $inject[i]; if (typeof key !== 'string') { throw $injectorMinErr('itkn', 'Incorrect injection token! Expected service name as string, got {0}', key) } args.push(locals && locals.hasOwnProperty(key)? locals[key]: getService(key)); } if (!fn.$inject) { fn = fn[length]; } return fn.apply(self, args); } function instantiate(Type, locals){ var Constructor = function (){ } , instance, returnedValue; Constructor.prototype = (isArray(Type)? Type[_AN_Read_length('length', Type) - 1]: Type).prototype; instance = new Constructor(); returnedValue = invoke(Type, instance, locals); return isObject(returnedValue) || isFunction(returnedValue)? returnedValue: instance; } return { invoke: invoke, instantiate: instantiate, get: getService, annotate: annotate, has: function (name){ return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); } } ; } } function $AnchorScrollProvider(){ var autoScrollingEnabled = true ; this.disableAutoScrolling = function (){ autoScrollingEnabled = false ; } ; this.$get = ['$window', '$location', '$rootScope', function ($window, $location, $rootScope){ var document = $window.document; function getFirstAnchor(list){ var result = null ; forEach(list, function (element){ if (!result && lowercase(element.nodeName) === 'a') result = element; } ); return result; } function scroll(){ var hash = $location.hash(), elm; if (!hash) $window.scrollTo(0, 0); else if ((elm = document.getElementById(hash))) elm.scrollIntoView(); else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView(); else if (hash === 'top') $window.scrollTo(0, 0); } if (autoScrollingEnabled) { $rootScope.$watch(function autoScrollWatch(){ return $location.hash(); } , function autoScrollWatchAction(){ $rootScope.$evalAsync(scroll); } ); } return scroll; } ] ; } var $animateMinErr = minErr('$animate'); var $AnimateProvider = ['$provide', function ($provide){ this.$$selectors = { } ; this.register = function (name, factory){ var key = name + '-animation'; if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name) this.$$selectors[name.substr(1)] = key; $provide.factory(key, factory); } ; this.classNameFilter = function (expression){ if (_AN_Read_length("length", arguments) === 1) { this.$$classNameFilter = (expression instanceof RegExp)? expression: null ; } return this.$$classNameFilter; } ; this.$get = ['$timeout', function ($timeout){ return { enter: function (element, parent, after, done){ if (after) { after.after(element); } else { if (!parent || !parent[0]) { parent = after.parent(); } parent.append(element); } done && $timeout(done, 0, false ); } , leave: function (element, done){ element.remove(); done && $timeout(done, 0, false ); } , move: function (element, parent, after, done){ this.enter(element, parent, after, done); } , addClass: function (element, className, done){ className = isString(className)? className: isArray(className)? className.join(' '): ''; forEach(element, function (element){ jqLiteAddClass(element, className); } ); done && $timeout(done, 0, false ); } , removeClass: function (element, className, done){ className = isString(className)? className: isArray(className)? className.join(' '): ''; forEach(element, function (element){ jqLiteRemoveClass(element, className); } ); done && $timeout(done, 0, false ); } , enabled: noop} ; } ] ; } ] ; function Browser(window, document, $log, $sniffer){ var self = this, rawDocument = document[0], location = _AN_Read_location('location', window), history = window.history, setTimeout = window.setTimeout, clearTimeout = window.clearTimeout, pendingDeferIds = { } ; self.isMock = false ; var outstandingRequestCount = 0; var outstandingRequestCallbacks = [] ; self.$$completeOutstandingRequest = completeOutstandingRequest; self.$$incOutstandingRequestCount = function (){ outstandingRequestCount++ ; } ; function completeOutstandingRequest(fn){ try { fn.apply(null , sliceArgs(arguments, 1)); } finally{ outstandingRequestCount-- ; if (outstandingRequestCount === 0) { while (outstandingRequestCallbacks.length){ try { outstandingRequestCallbacks.pop()(); } catch (e) { $log.error(e); } } } } } self.notifyWhenNoOutstandingRequests = function (callback){ forEach(pollFns, function (pollFn){ pollFn(); } ); if (outstandingRequestCount === 0) { callback(); } else { outstandingRequestCallbacks.push(callback); } } ; var pollFns = [] , pollTimeout; self.addPollFn = function (fn){ if (isUndefined(pollTimeout)) startPoller(100, setTimeout); pollFns.push(fn); return fn; } ; function startPoller(interval, setTimeout){ (function check(){ forEach(pollFns, function (pollFn){ pollFn(); } ); pollTimeout = _AN_Call_settimeout('setTimeout', window, check, interval); } )(); } var lastBrowserUrl = _AN_Read_href('href', _AN_Read_location('location', window)), baseElement = document.find('base'), newLocation = null ; self.url = function (url, replace){ if (_AN_Read_location('location', window) !== _AN_Read_location('location', window)) _AN_Write_location('location', window, false , _AN_Read_location('location', window)); if (history !== window.history) history = window.history; if (url) { if (lastBrowserUrl == url) return ; lastBrowserUrl = url; if ($sniffer.history) { if (replace) history.replaceState(null , '', url); else { history.pushState(null , '', url); baseElement.attr('href', baseElement.attr('href')); } } else { newLocation = url; if (replace) { _AN_Call_replace('replace', _AN_Read_location('location', window), url); } else { _AN_Write_href('href', _AN_Read_location('location', window), false , url); } } return self; } else { return newLocation || _AN_Call_replace('replace', _AN_Read_href('href', _AN_Read_location('location', window)), /%27/g, "'"); } } ; var urlChangeListeners = [] , urlChangeInit = false ; function fireUrlChange(){ newLocation = null ; if (lastBrowserUrl == self.url()) return ; lastBrowserUrl = self.url(); forEach(urlChangeListeners, function (listener){ listener(self.url()); } ); } self.onUrlChange = function (callback){ if (!urlChangeInit) { if ($sniffer.history) jqLite(window).on('popstate', fireUrlChange); if ($sniffer.hashchange) jqLite(window).on('hashchange', fireUrlChange); else self.addPollFn(fireUrlChange); urlChangeInit = true ; } urlChangeListeners.push(callback); return callback; } ; self.baseHref = function (){ var href = baseElement.attr('href'); return href? _AN_Call_replace('replace', href, /^(https?\:)?\/\/[^\/]*/, ''): ''; } ; var lastCookies = { } ; var lastCookieString = ''; var cookiePath = self.baseHref(); self.cookies = function (name, value){ var cookieLength, cookieArray, cookie, i, index; if (name) { if (value === undefined) { _AN_Write_cookie('cookie', rawDocument, false , escape(name) + "=;path=" + cookiePath + ";expires=Thu, 01 Jan 1970 00:00:00 GMT"); } else { if (isString(value)) { cookieLength = _AN_Read_length("length", (_AN_Write_cookie("cookie", rawDocument, false , escape(name) + '=' + escape(value) + ';path=' + cookiePath))) + 1; if (cookieLength > 4096) { $log.warn("Cookie '" + name + "' possibly not set or overflowed because it was too large (" + cookieLength + " > 4096 bytes)!"); } } } } else { if (_AN_Read_cookie("cookie", rawDocument) !== lastCookieString) { lastCookieString = _AN_Read_cookie("cookie", rawDocument); cookieArray = lastCookieString.split("; "); lastCookies = { } ; for (i = 0; i < _AN_Read_length("length", cookieArray); i++ ){ cookie = cookieArray[i]; index = cookie.indexOf('='); if (index > 0) { name = unescape(cookie.substring(0, index)); if (lastCookies[name] === undefined) { lastCookies[name] = unescape(cookie.substring(index + 1)); } } } } return lastCookies; } } ; self.defer = function (fn, delay){ var timeoutId; outstandingRequestCount++ ; timeoutId = _AN_Call_settimeout('setTimeout', window, function (){ delete pendingDeferIds[timeoutId]; completeOutstandingRequest(fn); } , delay || 0); pendingDeferIds[timeoutId] = true ; return timeoutId; } ; self.defer.cancel = function (deferId){ if (pendingDeferIds[deferId]) { delete pendingDeferIds[deferId]; clearTimeout(deferId); completeOutstandingRequest(noop); return true ; } return false ; } ; } function $BrowserProvider(){ this.$get = ['$window', '$log', '$sniffer', '$document', function ($window, $log, $sniffer, $document){ return new Browser($window, $document, $log, $sniffer); } ] ; } function $CacheFactoryProvider(){ this.$get = function (){ var caches = { } ; function cacheFactory(cacheId, options){ if (cacheId in caches) { throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId) } var size = 0, stats = extend({ } , options, { id: cacheId} ), data = { } , capacity = (options && options.capacity) || Number.MAX_VALUE, lruHash = { } , freshEnd = null , staleEnd = null ; return caches[cacheId] = { put: function (key, value){ var lruEntry = lruHash[key] || (lruHash[key] = { key: key} ); refresh(lruEntry); if (isUndefined(value)) return ; if (!(key in data)) size++ ; data[key] = value; if (size > capacity) { this.remove(staleEnd.key); } return value; } , get: function (key){ var lruEntry = lruHash[key]; if (!lruEntry) return ; refresh(lruEntry); return data[key]; } , remove: function (key){ var lruEntry = lruHash[key]; if (!lruEntry) return ; if (lruEntry == freshEnd) freshEnd = lruEntry.p; if (lruEntry == staleEnd) staleEnd = lruEntry.n; link(lruEntry.n, lruEntry.p); delete lruHash[key]; delete data[key]; size-- ; } , removeAll: function (){ data = { } ; size = 0; lruHash = { } ; freshEnd = staleEnd = null ; } , destroy: function (){ data = null ; stats = null ; lruHash = null ; delete caches[cacheId]; } , info: function (){ return extend({ } , stats, { size: size} ); } } ; function refresh(entry){ if (entry != freshEnd) { if (!staleEnd) { staleEnd = entry; } else if (staleEnd == entry) { staleEnd = entry.n; } link(entry.n, entry.p); link(entry, freshEnd); freshEnd = entry; freshEnd.n = null ; } } function link(nextEntry, prevEntry){ if (nextEntry != prevEntry) { if (nextEntry) nextEntry.p = prevEntry; if (prevEntry) prevEntry.n = nextEntry; } } } cacheFactory.info = function (){ var info = { } ; forEach(caches, function (cache, cacheId){ info[cacheId] = cache.info(); } ); return info; } ; cacheFactory.get = function (cacheId){ return caches[cacheId]; } ; return cacheFactory; } ; } function $TemplateCacheProvider(){ this.$get = ['$cacheFactory', function ($cacheFactory){ return $cacheFactory('templates'); } ] ; } var $compileMinErr = minErr('$compile'); $CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'] ; function $CompileProvider($provide, $$sanitizeUriProvider){ var hasDirectives = { } , Suffix = 'Directive', COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/; var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; this.directive = function registerDirective(name, directiveFactory){ assertNotHasOwnProperty(name, 'directive'); if (isString(name)) { assertArg(directiveFactory, 'directiveFactory'); if (!hasDirectives.hasOwnProperty(name)) { hasDirectives[name] = [] ; $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', function ($injector, $exceptionHandler){ var directives = [] ; forEach(hasDirectives[name], function (directiveFactory, index){ try { var directive = $injector.invoke(directiveFactory); if (isFunction(directive)) { directive = { compile: valueFn(directive)} ; } else if (!directive.compile && directive.link) { directive.compile = valueFn(directive.link); } directive.priority = directive.priority || 0; directive.index = index; directive.name = directive.name || name; directive.require = directive.require || (directive.controller && directive.name); directive.restrict = directive.restrict || 'A'; directives.push(directive); } catch (e) { $exceptionHandler(e); } } ); return directives; } ] ); } hasDirectives[name].push(directiveFactory); } else { forEach(name, reverseParams(registerDirective)); } return this; } ; this.aHrefSanitizationWhitelist = function (regexp){ if (isDefined(regexp)) { $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); return this; } else { return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); } } ; this.imgSrcSanitizationWhitelist = function (regexp){ if (isDefined(regexp)) { $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); return this; } else { return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); } } ; this.$get = ['$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse', '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', function ($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse, $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri){ var Attributes = function (element, attr){ this.$$element = element; this.$attr = attr || { } ; } ; Attributes.prototype = { $normalize: directiveNormalize, $addClass: function (classVal){ if (classVal && _AN_Read_length('length', classVal) > 0) { $animate.addClass(this.$$element, classVal); } } , $removeClass: function (classVal){ if (classVal && _AN_Read_length('length', classVal) > 0) { $animate.removeClass(this.$$element, classVal); } } , $updateClass: function (newClasses, oldClasses){ this.$removeClass(tokenDifference(oldClasses, newClasses)); this.$addClass(tokenDifference(newClasses, oldClasses)); } , $set: function (key, value, writeAttr, attrName){ var booleanKey = getBooleanAttrName(this.$$element[0], key), normalizedVal, nodeName; if (booleanKey) { this.$$element.prop(key, value); attrName = booleanKey; } this[key] = value; if (attrName) { this.$attr[key] = attrName; } else { attrName = this.$attr[key]; if (!attrName) { this.$attr[key] = attrName = snake_case(key, '-'); } } nodeName = nodeName_(this.$$element); if ((nodeName === 'A' && key === 'href') || (nodeName === 'IMG' && key === 'src')) { this[key] = value = $$sanitizeUri(value, key === 'src'); } if (writeAttr !== false ) { if (value === null || value === undefined) { this.$$element.removeAttr(attrName); } else { this.$$element.attr(attrName, value); } } var $$observers = this.$$observers; $$observers && forEach($$observers[key], function (fn){ try { fn(value); } catch (e) { $exceptionHandler(e); } } ); } , $observe: function (key, fn){ var attrs = this, $$observers = (attrs.$$observers || (attrs.$$observers = { } )), listeners = ($$observers[key] || ($$observers[key] = [] )); listeners.push(fn); $rootScope.$evalAsync(function (){ if (!listeners.$$inter) { fn(attrs[key]); } } ); return fn; } } ; var startSymbol = $interpolate.startSymbol(), endSymbol = $interpolate.endSymbol(), denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}')? identity: function denormalizeTemplate(template){ return _AN_Call_replace('replace', _AN_Call_replace('replace', template, /\{\{/g, startSymbol), /}}/g, endSymbol); } , NG_ATTR_BINDING = /^ngAttr[A-Z]/; return compile; function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext){ if (!($compileNodes instanceof jqLite)) { $compileNodes = jqLite($compileNodes); } forEach($compileNodes, function (node, index){ if (node.nodeType == 3 && _AN_Read_nodevalue('nodeValue', node).match(/\S+/)) { $compileNodes[index] = node = jqLite(node).wrap('').parent()[0]; } } ); var compositeLinkFn = compileNodes($compileNodes, transcludeFn, $compileNodes, maxPriority, ignoreDirective, previousCompileContext); safeAddClass($compileNodes, 'ng-scope'); return function publicLinkFn(scope, cloneConnectFn, transcludeControllers){ assertArg(scope, 'scope'); var $linkNode = cloneConnectFn? JQLitePrototype.clone.call($compileNodes): $compileNodes; forEach(transcludeControllers, function (instance, name){ $linkNode.data('$' + name + 'Controller', instance); } ); for (var i = 0, ii = _AN_Read_length('length', $linkNode); i < ii; i++ ){ var node = $linkNode[i], nodeType = node.nodeType; if (nodeType === 1 || nodeType === 9) { $linkNode.eq(i).data('$scope', scope); } } if (cloneConnectFn) cloneConnectFn($linkNode, scope); if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode); return $linkNode; } ; } function safeAddClass($element, className){ try { $element.addClass(className); } catch (e) { } } function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, previousCompileContext){ var linkFns = [] , attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound; for (var i = 0; i < _AN_Read_length('length', nodeList); i++ ){ attrs = new Attributes(); directives = collectDirectives(nodeList[i], [] , attrs, i === 0? maxPriority: undefined, ignoreDirective); nodeLinkFn = (_AN_Read_length('length', directives))? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, null , [] , [] , previousCompileContext): null ; if (nodeLinkFn && nodeLinkFn.scope) { safeAddClass(jqLite(nodeList[i]), 'ng-scope'); } childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || !(childNodes = nodeList[i].childNodes) || !_AN_Read_length('length', childNodes))? null : compileNodes(childNodes, nodeLinkFn? nodeLinkFn.transclude: transcludeFn); linkFns.push(nodeLinkFn, childLinkFn); linkFnFound = linkFnFound || nodeLinkFn || childLinkFn; previousCompileContext = null ; } return linkFnFound? compositeLinkFn: null ; function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn){ var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n; var nodeListLength = _AN_Read_length('length', nodeList), stableNodeList = new Array(nodeListLength); for (i = 0; i < nodeListLength; i++ ){ stableNodeList[i] = nodeList[i]; } for (i = 0, n = 0, ii = _AN_Read_length('length', linkFns); i < ii; n++ ){ node = stableNodeList[n]; nodeLinkFn = linkFns[i++ ]; childLinkFn = linkFns[i++ ]; $node = jqLite(node); if (nodeLinkFn) { if (nodeLinkFn.scope) { childScope = scope.$new(); $node.data('$scope', childScope); } else { childScope = scope; } childTranscludeFn = nodeLinkFn.transclude; if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) { nodeLinkFn(childLinkFn, childScope, node, $rootElement, createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn)); } else { nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn); } } else if (childLinkFn) { childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn); } } } } function createBoundTranscludeFn(scope, transcludeFn){ return function boundTranscludeFn(transcludedScope, cloneFn, controllers){ var scopeCreated = false ; if (!transcludedScope) { transcludedScope = scope.$new(); transcludedScope.$$transcluded = true ; scopeCreated = true ; } var clone = transcludeFn(transcludedScope, cloneFn, controllers); if (scopeCreated) { clone.on('$destroy', bind(transcludedScope, transcludedScope.$destroy)); } return clone; } ; } function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective){ var nodeType = node.nodeType, attrsMap = attrs.$attr, match, className; switch (nodeType){ case 1: addDirective(directives, directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective); for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes, j = 0, jj = nAttrs && _AN_Read_length('length', nAttrs); j < jj; j++ ){ var attrStartName = false ; var attrEndName = false ; attr = nAttrs[j]; if (!msie || msie >= 8 || attr.specified) { name = attr.name; ngAttrName = directiveNormalize(name); if (NG_ATTR_BINDING.test(ngAttrName)) { name = snake_case(ngAttrName.substr(6), '-'); } var directiveNName = _AN_Call_replace('replace', ngAttrName, /(Start|End)$/, ''); if (ngAttrName === directiveNName + 'Start') { attrStartName = name; attrEndName = name.substr(0, _AN_Read_length('length', name) - 5) + 'end'; name = name.substr(0, _AN_Read_length('length', name) - 6); } nName = directiveNormalize(name.toLowerCase()); attrsMap[nName] = name; attrs[nName] = value = trim(attr.value); if (getBooleanAttrName(node, nName)) { attrs[nName] = true ; } addAttrInterpolateDirective(node, directives, value, nName); addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, attrEndName); } } className = node.className; if (isString(className) && className !== '') { while (match = CLASS_DIRECTIVE_REGEXP.exec(className)){ nName = directiveNormalize(match[2]); if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { attrs[nName] = trim(match[3]); } className = className.substr(match.index + _AN_Read_length('length', match[0])); } } break ; case 3: addTextInterpolateDirective(directives, _AN_Read_nodevalue('nodeValue', node)); break ; case 8: try { match = COMMENT_DIRECTIVE_REGEXP.exec(_AN_Read_nodevalue('nodeValue', node)); if (match) { nName = directiveNormalize(match[1]); if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { attrs[nName] = trim(match[2]); } } } catch (e) { } break ; } directives.sort(byPriority); return directives; } function groupScan(node, attrStart, attrEnd){ var nodes = [] ; var depth = 0; if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { var startNode = node; do { if (!node) { throw $compileMinErr('uterdir', "Unterminated attribute, found '{0}' but no matching '{1}' found.", attrStart, attrEnd) } if (node.nodeType == 1) { if (node.hasAttribute(attrStart)) depth++ ; if (node.hasAttribute(attrEnd)) depth-- ; } nodes.push(node); node = node.nextSibling; } while(depth > 0)} else { nodes.push(node); } return jqLite(nodes); } function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd){ return function (scope, element, attrs, controllers, transcludeFn){ element = groupScan(element[0], attrStart, attrEnd); return linkFn(scope, element, attrs, controllers, transcludeFn); } ; } function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, previousCompileContext){ previousCompileContext = previousCompileContext || { } ; var terminalPriority = - Number.MAX_VALUE, newScopeDirective, controllerDirectives = previousCompileContext.controllerDirectives, newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, templateDirective = previousCompileContext.templateDirective, nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, hasTranscludeDirective = false , hasElementTranscludeDirective = false , $compileNode = templateAttrs.$$element = jqLite(compileNode), directive, directiveName, $template, replaceDirective = originalReplaceDirective, childTranscludeFn = transcludeFn, linkFn, directiveValue; for (var i = 0, ii = _AN_Read_length("length", directives); i < ii; i++ ){ directive = directives[i]; var attrStart = directive.$$start; var attrEnd = directive.$$end; if (attrStart) { $compileNode = groupScan(compileNode, attrStart, attrEnd); } $template = undefined; if (terminalPriority > directive.priority) { break ; } if (directiveValue = directive.scope) { newScopeDirective = newScopeDirective || directive; if (!directive.templateUrl) { assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, $compileNode); if (isObject(directiveValue)) { newIsolateScopeDirective = directive; } } } directiveName = directive.name; if (!directive.templateUrl && directive.controller) { directiveValue = directive.controller; controllerDirectives = controllerDirectives || { } ; assertNoDuplicate("'" + directiveName + "' controller", controllerDirectives[directiveName], directive, $compileNode); controllerDirectives[directiveName] = directive; } if (directiveValue = directive.transclude) { hasTranscludeDirective = true ; if (!directive.$$tlb) { assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); nonTlbTranscludeDirective = directive; } if (directiveValue == 'element') { hasElementTranscludeDirective = true ; terminalPriority = directive.priority; $template = groupScan(compileNode, attrStart, attrEnd); $compileNode = templateAttrs.$$element = jqLite(document.createComment(' ' + directiveName + ': ' + templateAttrs[directiveName] + ' ')); compileNode = $compileNode[0]; replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode); childTranscludeFn = compile($template, transcludeFn, terminalPriority, replaceDirective && replaceDirective.name, { nonTlbTranscludeDirective: nonTlbTranscludeDirective} ); } else { $template = jqLite(jqLiteClone(compileNode)).contents(); $compileNode.empty(); childTranscludeFn = compile($template, transcludeFn); } } if (directive.template) { assertNoDuplicate('template', templateDirective, directive, $compileNode); templateDirective = directive; directiveValue = (isFunction(directive.template))? directive.template($compileNode, templateAttrs): directive.template; directiveValue = denormalizeTemplate(directiveValue); if (directive.replace) { replaceDirective = directive; $template = jqLite('
' + trim(directiveValue) + '
').contents(); compileNode = $template[0]; if (_AN_Read_length('length', $template) != 1 || compileNode.nodeType !== 1) { throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", directiveName, '') } replaceWith(jqCollection, $compileNode, compileNode); var newTemplateAttrs = { $attr: { } } ; var templateDirectives = collectDirectives(compileNode, [] , newTemplateAttrs); var unprocessedDirectives = directives.splice(i + 1, _AN_Read_length('length', directives) - (i + 1)); if (newIsolateScopeDirective) { markDirectivesAsIsolate(templateDirectives); } directives = directives.concat(templateDirectives).concat(unprocessedDirectives); mergeTemplateAttributes(templateAttrs, newTemplateAttrs); ii = _AN_Read_length('length', directives); } else { $compileNode.html(directiveValue); } } if (directive.templateUrl) { assertNoDuplicate('template', templateDirective, directive, $compileNode); templateDirective = directive; if (directive.replace) { replaceDirective = directive; } nodeLinkFn = compileTemplateUrl(directives.splice(i, _AN_Read_length('length', directives) - i), $compileNode, templateAttrs, jqCollection, childTranscludeFn, preLinkFns, postLinkFns, { controllerDirectives: controllerDirectives, newIsolateScopeDirective: newIsolateScopeDirective, templateDirective: templateDirective, nonTlbTranscludeDirective: nonTlbTranscludeDirective} ); ii = _AN_Read_length('length', directives); } else if (directive.compile) { try { linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); if (isFunction(linkFn)) { addLinkFns(null , linkFn, attrStart, attrEnd); } else if (linkFn) { addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); } } catch (e) { $exceptionHandler(e, startingTag($compileNode)); } } if (directive.terminal) { nodeLinkFn.terminal = true ; terminalPriority = Math.max(terminalPriority, directive.priority); } } nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true ; nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn; return nodeLinkFn; function addLinkFns(pre, post, attrStart, attrEnd){ if (pre) { if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); pre.require = directive.require; if (newIsolateScopeDirective === directive || directive.$$isolateScope) { pre = cloneAndAnnotateFn(pre, { isolateScope: true } ); } preLinkFns.push(pre); } if (post) { if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); post.require = directive.require; if (newIsolateScopeDirective === directive || directive.$$isolateScope) { post = cloneAndAnnotateFn(post, { isolateScope: true } ); } postLinkFns.push(post); } } function getControllers(require, $element, elementControllers){ var value, retrievalMethod = 'data', optional = false ; if (isString(require)) { while ((value = require.charAt(0)) == '^' || value == '?'){ require = require.substr(1); if (value == '^') { retrievalMethod = 'inheritedData'; } optional = optional || value == '?'; } value = null ; if (elementControllers && retrievalMethod === 'data') { value = elementControllers[require]; } value = value || $element[retrievalMethod]('$' + require + 'Controller'); if (!value && !optional) { throw $compileMinErr('ctreq', "Controller '{0}', required by directive '{1}', can't be found!", require, directiveName) } return value; } else if (isArray(require)) { value = [] ; forEach(require, function (require){ value.push(getControllers(require, $element, elementControllers)); } ); } return value; } function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn){ var attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = { } , transcludeFn; if (compileNode === linkNode) { attrs = templateAttrs; } else { attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr)); } $element = attrs.$$element; if (newIsolateScopeDirective) { var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/; var $linkNode = jqLite(linkNode); isolateScope = scope.$new(true ); if (templateDirective && (templateDirective === newIsolateScopeDirective.$$originalDirective)) { $linkNode.data('$isolateScope', isolateScope); } else { $linkNode.data('$isolateScopeNoTemplate', isolateScope); } safeAddClass($linkNode, 'ng-isolate-scope'); forEach(newIsolateScopeDirective.scope, function (definition, scopeName){ var match = definition.match(LOCAL_REGEXP) || [] , attrName = match[3] || scopeName, optional = (match[2] == '?'), mode = match[1], lastValue, parentGet, parentSet, compare; isolateScope.$$isolateBindings[scopeName] = mode + attrName; switch (mode){ case '@': attrs.$observe(attrName, function (value){ isolateScope[scopeName] = value; } ); attrs.$$observers[attrName].$$scope = scope; if (attrs[attrName]) { isolateScope[scopeName] = $interpolate(attrs[attrName])(scope); } break ; case '=': if (optional && !attrs[attrName]) { return ; } parentGet = $parse(attrs[attrName]); if (parentGet.literal) { compare = equals; } else { compare = function (a, b){ return a === b; } ; } parentSet = parentGet.assign || function (){ lastValue = isolateScope[scopeName] = parentGet(scope); throw $compileMinErr('nonassign', "Expression '{0}' used with directive '{1}' is non-assignable!", attrs[attrName], newIsolateScopeDirective.name) } ; lastValue = isolateScope[scopeName] = parentGet(scope); isolateScope.$watch(function parentValueWatch(){ var parentValue = parentGet(scope); if (!compare(parentValue, isolateScope[scopeName])) { if (!compare(parentValue, lastValue)) { isolateScope[scopeName] = parentValue; } else { parentSet(scope, parentValue = isolateScope[scopeName]); } } return lastValue = parentValue; } , null , parentGet.literal); break ; case '&': parentGet = $parse(attrs[attrName]); isolateScope[scopeName] = function (locals){ return parentGet(scope, locals); } ; break ; default : { throw $compileMinErr('iscp', "Invalid isolate scope definition for directive '{0}'." + " Definition: {... {1}: '{2}' ...}", newIsolateScopeDirective.name, scopeName, definition) } } } ); } transcludeFn = boundTranscludeFn && controllersBoundTransclude; if (controllerDirectives) { forEach(controllerDirectives, function (directive){ var locals = { $scope: directive === newIsolateScopeDirective || directive.$$isolateScope? isolateScope: scope, $element: $element, $attrs: attrs, $transclude: transcludeFn} , controllerInstance; controller = directive.controller; if (controller == '@') { controller = attrs[directive.name]; } controllerInstance = $controller(controller, locals); elementControllers[directive.name] = controllerInstance; if (!hasElementTranscludeDirective) { $element.data('$' + directive.name + 'Controller', controllerInstance); } if (directive.controllerAs) { locals.$scope[directive.controllerAs] = controllerInstance; } } ); } for (i = 0, ii = _AN_Read_length('length', preLinkFns); i < ii; i++ ){ try { linkFn = preLinkFns[i]; linkFn(linkFn.isolateScope? isolateScope: scope, $element, attrs, linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn); } catch (e) { $exceptionHandler(e, startingTag($element)); } } var scopeToChild = scope; if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null )) { scopeToChild = isolateScope; } childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); for (i = _AN_Read_length('length', postLinkFns) - 1; i >= 0; i-- ){ try { linkFn = postLinkFns[i]; linkFn(linkFn.isolateScope? isolateScope: scope, $element, attrs, linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn); } catch (e) { $exceptionHandler(e, startingTag($element)); } } function controllersBoundTransclude(scope, cloneAttachFn){ var transcludeControllers; if (_AN_Read_length('length', arguments) < 2) { cloneAttachFn = scope; scope = undefined; } if (hasElementTranscludeDirective) { transcludeControllers = elementControllers; } return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers); } } } function markDirectivesAsIsolate(directives){ for (var j = 0, jj = _AN_Read_length('length', directives); j < jj; j++ ){ directives[j] = inherit(directives[j], { $$isolateScope: true } ); } } function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, endAttrName){ if (name === ignoreDirective) return null ; var match = null ; if (hasDirectives.hasOwnProperty(name)) { for (var directive, directives = $injector.get(name + Suffix), i = 0, ii = _AN_Read_length('length', directives); i < ii; i++ ){ try { directive = directives[i]; if ((maxPriority === undefined || maxPriority > directive.priority) && directive.restrict.indexOf(_AN_Read_location('location', window)) != -1) { if (startAttrName) { directive = inherit(directive, { $$start: startAttrName, $$end: endAttrName} ); } tDirectives.push(directive); match = directive; } } catch (e) { $exceptionHandler(e); } } } return match; } function mergeTemplateAttributes(dst, src){ var srcAttr = src.$attr, dstAttr = dst.$attr, $element = dst.$$element; forEach(dst, function (value, key){ if (key.charAt(0) != '$') { if (src[key]) { value += (key === 'style'? ';': ' ') + src[key]; } dst.$set(key, value, true , srcAttr[key]); } } ); forEach(src, function (value, key){ if (key == 'class') { safeAddClass($element, value); dst["class"] = (dst["class"] ? dst["class"] + ' ': '') + value; } else if (key == 'style') { $element.attr('style', $element.attr('style') + ';' + value); dst.style = (dst.style? dst.style + ';': '') + value; } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { dst[key] = value; dstAttr[key] = srcAttr[key]; } } ); } function compileTemplateUrl(directives, $compileNode, tAttrs, $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext){ var linkQueue = [] , afterTemplateNodeLinkFn, afterTemplateChildLinkFn, beforeTemplateCompileNode = $compileNode[0], origAsyncDirective = directives.shift(), derivedSyncDirective = extend({ } , origAsyncDirective, { templateUrl: null , transclude: null , replace: null , $$originalDirective: origAsyncDirective} ), templateUrl = (isFunction(origAsyncDirective.templateUrl))? origAsyncDirective.templateUrl($compileNode, tAttrs): origAsyncDirective.templateUrl; $compileNode.empty(); $http.get($sce.getTrustedResourceUrl(templateUrl), { cache: $templateCache} ).success(function (content){ var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; content = denormalizeTemplate(content); if (origAsyncDirective.replace) { $template = jqLite('
' + trim(content) + '
').contents(); compileNode = $template[0]; if (_AN_Read_length('length', $template) != 1 || compileNode.nodeType !== 1) { throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", origAsyncDirective.name, templateUrl) } tempTemplateAttrs = { $attr: { } } ; replaceWith($rootElement, $compileNode, compileNode); var templateDirectives = collectDirectives(compileNode, [] , tempTemplateAttrs); if (isObject(origAsyncDirective.scope)) { markDirectivesAsIsolate(templateDirectives); } directives = templateDirectives.concat(directives); mergeTemplateAttributes(tAttrs, tempTemplateAttrs); } else { compileNode = beforeTemplateCompileNode; $compileNode.html(content); } directives.unshift(derivedSyncDirective); afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, previousCompileContext); forEach($rootElement, function (node, i){ if (node == compileNode) { $rootElement[i] = $compileNode[0]; } } ); afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); while (linkQueue.length){ var scope = linkQueue.shift(), beforeTemplateLinkNode = linkQueue.shift(), linkRootElement = linkQueue.shift(), boundTranscludeFn = linkQueue.shift(), linkNode = $compileNode[0]; if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { linkNode = jqLiteClone(compileNode); replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); } if (afterTemplateNodeLinkFn.transclude) { childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude); } else { childBoundTranscludeFn = boundTranscludeFn; } afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, childBoundTranscludeFn); } linkQueue = null ; } ).error(function (response, code, headers, config){ throw $compileMinErr('tpload', 'Failed to load template: {0}', _AN_Read_url('url', config)) } ); return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn){ if (linkQueue) { linkQueue.push(scope); linkQueue.push(node); linkQueue.push(rootElement); linkQueue.push(boundTranscludeFn); } else { afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, boundTranscludeFn); } } ; } function byPriority(a, b){ var diff = b.priority - a.priority; if (diff !== 0) return diff; if (a.name !== b.name) return (a.name < b.name)? -1: 1; return a.index - b.index; } function assertNoDuplicate(what, previousDirective, directive, element){ if (previousDirective) { throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}', previousDirective.name, directive.name, what, startingTag(element)) } } function addTextInterpolateDirective(directives, text){ var interpolateFn = $interpolate(text, true ); if (interpolateFn) { directives.push({ priority: 0, compile: valueFn(function textInterpolateLinkFn(scope, node){ var parent = node.parent(), bindings = parent.data('$binding') || [] ; bindings.push(interpolateFn); safeAddClass(parent.data('$binding', bindings), 'ng-binding'); scope.$watch(interpolateFn, function interpolateFnWatchAction(value){ _AN_Write_nodevalue('nodeValue', node[0], false , value); } ); } )} ); } } function getTrustedContext(node, attrNormalizedName){ if (attrNormalizedName == "srcdoc") { return $sce.HTML; } var tag = nodeName_(node); if (attrNormalizedName == "xlinkHref" || (tag == "FORM" && attrNormalizedName == "action") || (tag != "IMG" && (attrNormalizedName == "src" || attrNormalizedName == "ngSrc"))) { return $sce.RESOURCE_URL; } } function addAttrInterpolateDirective(node, directives, value, name){ var interpolateFn = $interpolate(value, true ); if (!interpolateFn) return ; if (name === "multiple" && nodeName_(node) === "SELECT") { throw $compileMinErr("selmulti", "Binding to the 'multiple' attribute is not supported. Element: {0}", startingTag(node)) } directives.push({ priority: 100, compile: function (){ return { pre: function attrInterpolatePreLinkFn(scope, element, attr){ var $$observers = (attr.$$observers || (attr.$$observers = { } )); if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { throw $compileMinErr('nodomevents', "Interpolations for HTML DOM event attributes are disallowed. Please use the " + "ng- versions (such as ng-click instead of onclick) instead.") } interpolateFn = $interpolate(attr[name], true , getTrustedContext(node, name)); if (!interpolateFn) return ; attr[name] = interpolateFn(scope); ($$observers[name] || ($$observers[name] = [] )).$$inter = true ; (attr.$$observers && attr.$$observers[name].$$scope || scope).$watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue){ if (name === 'class' && newValue != oldValue) { attr.$updateClass(newValue, oldValue); } else { attr.$set(name, newValue); } } ); } } ; } } ); } function replaceWith($rootElement, elementsToRemove, newNode){ var firstElementToRemove = elementsToRemove[0], removeCount = _AN_Read_length('length', elementsToRemove), parent = firstElementToRemove.parentNode, i, ii; if ($rootElement) { for (i = 0, ii = _AN_Read_length('length', $rootElement); i < ii; i++ ){ if ($rootElement[i] == firstElementToRemove) { $rootElement[i++ ] = newNode; for (var j = i, j2 = j + removeCount - 1, jj = _AN_Read_length('length', $rootElement); j < jj; j++ , j2++ ){ if (j2 < jj) { $rootElement[j] = $rootElement[j2]; } else { delete $rootElement[j]; } } $rootElement.length -= removeCount - 1; break ; } } } if (parent) { parent.replaceChild(newNode, firstElementToRemove); } var fragment = document.createDocumentFragment(); _AN_Call_appendchild('appendChild', fragment, firstElementToRemove); newNode[jqLite.expando] = firstElementToRemove[jqLite.expando]; for (var k = 1, kk = _AN_Read_length('length', elementsToRemove); k < kk; k++ ){ var element = elementsToRemove[k]; jqLite(element).remove(); _AN_Call_appendchild('appendChild', fragment, element); delete elementsToRemove[k]; } elementsToRemove[0] = newNode; elementsToRemove.length = 1; } function cloneAndAnnotateFn(fn, annotation){ return extend(function (){ return fn.apply(null , arguments); } , fn, annotation); } } ] ; } var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i; function directiveNormalize(name){ return camelCase(_AN_Call_replace('replace', name, PREFIX_REGEXP, '')); } function nodesetLinkingFn(scope, nodeList, rootElement, boundTranscludeFn){ } function directiveLinkingFn(nodesetLinkingFn, scope, node, rootElement, boundTranscludeFn){ } function tokenDifference(str1, str2){ var values = '', tokens1 = str1.split(/\s+/), tokens2 = str2.split(/\s+/); outer: for (var i = 0; i < _AN_Read_length('length', tokens1); i++ ){ var token = tokens1[i]; for (var j = 0; j < _AN_Read_length('length', tokens2); j++ ){ if (token == tokens2[j]) continue outer; } values += (_AN_Read_length('length', values) > 0? ' ': '') + token; } return values; } function $ControllerProvider(){ var controllers = { } , CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; this.register = function (name, constructor){ assertNotHasOwnProperty(name, 'controller'); if (isObject(name)) { extend(controllers, name); } else { controllers[name] = constructor; } } ; this.$get = ['$injector', '$window', function ($injector, $window){ return function (expression, locals){ var instance, match, constructor, identifier; if (isString(expression)) { match = expression.match(CNTRL_REG), constructor = match[1], identifier = match[3]; expression = controllers.hasOwnProperty(constructor)? controllers[constructor]: getter(locals.$scope, constructor, true ) || getter($window, constructor, true ); assertArgFn(expression, constructor, true ); } instance = $injector.instantiate(expression, locals); if (identifier) { if (!(locals && typeof locals.$scope == 'object')) { throw minErr('$controller')('noscp', "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", constructor || expression.name, identifier) } locals.$scope[identifier] = instance; } return instance; } ; } ] ; } function $DocumentProvider(){ this.$get = ['$window', function (window){ return jqLite(window.document); } ] ; } function $ExceptionHandlerProvider(){ this.$get = ['$log', function ($log){ return function (exception, cause){ $log.error.apply($log, arguments); } ; } ] ; } function parseHeaders(headers){ var parsed = { } , key, val, i; if (!headers) return parsed; forEach(headers.split('\n'), function (line){ i = line.indexOf(':'); key = lowercase(trim(line.substr(0, i))); val = trim(line.substr(i + 1)); if (key) { if (parsed[key]) { parsed[key] += ', ' + val; } else { parsed[key] = val; } } } ); return parsed; } function headersGetter(headers){ var headersObj = isObject(headers)? headers: undefined; return function (name){ if (!headersObj) headersObj = parseHeaders(headers); if (name) { return headersObj[lowercase(name)] || null ; } return headersObj; } ; } function transformData(data, headers, fns){ if (isFunction(fns)) return fns(data, headers); forEach(fns, function (fn){ data = fn(data, headers); } ); return data; } function isSuccess(status){ return 200 <= status && status < 300; } function $HttpProvider(){ var JSON_START = /^\s*(\[|\{[^\{])/, JSON_END = /[\}\]]\s*$/, PROTECTION_PREFIX = /^\)\]\}',?\n/, CONTENT_TYPE_APPLICATION_JSON = { 'Content-Type': 'application/json;charset=utf-8'} ; var defaults = this.defaults = { transformResponse: [function (data){ if (isString(data)) { data = _AN_Call_replace('replace', data, PROTECTION_PREFIX, ''); if (JSON_START.test(data) && JSON_END.test(data)) data = fromJson(data); } return data; } ] , transformRequest: [function (d){ return isObject(d) && !isFile(d)? toJson(d): d; } ] , headers: { common: { 'Accept': 'application/json, text/plain, */*'} , post: copy(CONTENT_TYPE_APPLICATION_JSON), put: copy(CONTENT_TYPE_APPLICATION_JSON), patch: copy(CONTENT_TYPE_APPLICATION_JSON)} , xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN'} ; var interceptorFactories = this.interceptors = [] ; var responseInterceptorFactories = this.responseInterceptors = [] ; this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector', function ($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector){ var defaultCache = $cacheFactory('$http'); var reversedInterceptors = [] ; forEach(interceptorFactories, function (interceptorFactory){ reversedInterceptors.unshift(isString(interceptorFactory)? $injector.get(interceptorFactory): $injector.invoke(interceptorFactory)); } ); forEach(responseInterceptorFactories, function (interceptorFactory, index){ var responseFn = isString(interceptorFactory)? $injector.get(interceptorFactory): $injector.invoke(interceptorFactory); reversedInterceptors.splice(index, 0, { response: function (response){ return responseFn($q.when(response)); } , responseError: function (response){ return responseFn($q.reject(response)); } } ); } ); function $http(requestConfig){ var config = { transformRequest: defaults.transformRequest, transformResponse: defaults.transformResponse} ; var headers = mergeHeaders(requestConfig); extend(config, requestConfig); config.headers = headers; config.method = uppercase(config.method); var xsrfValue = urlIsSameOrigin(_AN_Read_url('url', config))? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]: undefined; if (xsrfValue) { headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; } var serverRequest = function (config){ headers = config.headers; var reqData = transformData(config.data, headersGetter(headers), config.transformRequest); if (isUndefined(config.data)) { forEach(headers, function (value, header){ if (lowercase(header) === 'content-type') { delete headers[header]; } } ); } if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { config.withCredentials = defaults.withCredentials; } return sendReq(config, reqData, headers).then(transformResponse, transformResponse); } ; var chain = [serverRequest, undefined] ; var promise = $q.when(config); forEach(reversedInterceptors, function (interceptor){ if (interceptor.request || interceptor.requestError) { chain.unshift(interceptor.request, interceptor.requestError); } if (interceptor.response || interceptor.responseError) { chain.push(interceptor.response, interceptor.responseError); } } ); while (chain.length){ var thenFn = chain.shift(); var rejectFn = chain.shift(); promise = promise.then(thenFn, rejectFn); } promise.success = function (fn){ promise.then(function (response){ fn(response.data, response.status, response.headers, config); } ); return promise; } ; promise.error = function (fn){ promise.then(null , function (response){ fn(response.data, response.status, response.headers, config); } ); return promise; } ; return promise; function transformResponse(response){ var resp = extend({ } , response, { data: transformData(response.data, response.headers, config.transformResponse)} ); return (isSuccess(response.status))? resp: $q.reject(resp); } function mergeHeaders(config){ var defHeaders = defaults.headers, reqHeaders = extend({ } , config.headers), defHeaderName, lowercaseDefHeaderName, reqHeaderName; defHeaders = extend({ } , defHeaders.common, defHeaders[lowercase(config.method)]); execHeaders(defHeaders); execHeaders(reqHeaders); defaultHeadersIteration: for (defHeaderName in defHeaders){ lowercaseDefHeaderName = lowercase(defHeaderName); for (reqHeaderName in reqHeaders){ if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { continue defaultHeadersIteration; } } reqHeaders[defHeaderName] = defHeaders[defHeaderName]; } return reqHeaders; function execHeaders(headers){ var headerContent; forEach(headers, function (headerFn, header){ if (isFunction(headerFn)) { headerContent = headerFn(); if (headerContent != null ) { headers[header] = headerContent; } else { delete headers[header]; } } } ); } } } $http.pendingRequests = [] ; createShortMethods('get', 'delete', 'head', 'jsonp'); createShortMethodsWithData('post', 'put'); $http.defaults = defaults; return $http; function createShortMethods(names){ forEach(arguments, function (name){ $http[name] = function (url, config){ return $http(extend(config || { } , { method: name, url: url} )); } ; } ); } function createShortMethodsWithData(name){ forEach(arguments, function (name){ $http[name] = function (url, data, config){ return $http(extend(config || { } , { method: name, url: url, data: data} )); } ; } ); } function sendReq(config, reqData, reqHeaders){ var deferred = $q.defer(), promise = deferred.promise, cache, cachedResp, url = buildUrl(_AN_Read_url('url', config), config.params); $http.pendingRequests.push(config); promise.then(removePendingReq, removePendingReq); if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') { cache = isObject(config.cache)? config.cache: isObject(defaults.cache)? defaults.cache: defaultCache; } if (cache) { cachedResp = cache.get(url); if (isDefined(cachedResp)) { if (cachedResp.then) { cachedResp.then(removePendingReq, removePendingReq); return cachedResp; } else { if (isArray(cachedResp)) { resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2])); } else { resolvePromise(cachedResp, 200, { } ); } } } else { cache.put(url, promise); } } if (isUndefined(cachedResp)) { $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, config.withCredentials, config.responseType); } return promise; function done(status, response, headersString){ if (cache) { if (isSuccess(status)) { cache.put(url, [status, response, parseHeaders(headersString)] ); } else { cache.remove(url); } } resolvePromise(response, status, headersString); if (!$rootScope.$$phase) $rootScope.$apply(); } function resolvePromise(response, status, headers){ status = Math.max(status, 0); (isSuccess(status)? deferred.resolve: deferred.reject)({ data: response, status: status, headers: headersGetter(headers), config: config} ); } function removePendingReq(){ var idx = indexOf($http.pendingRequests, config); if (idx !== -1) $http.pendingRequests.splice(idx, 1); } } function buildUrl(url, params){ if (!params) return url; var parts = [] ; forEachSorted(params, function (value, key){ if (value === null || isUndefined(value)) return ; if (!isArray(value)) value = [value] ; forEach(value, function (v){ if (isObject(v)) { v = toJson(v); } parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(v)); } ); } ); return url + ((url.indexOf('?') == -1)? '?': '&') + parts.join('&'); } } ] ; } function createXhr(method){ return (msie <= 8 && lowercase(method) === 'patch')? new ActiveXObject('Microsoft.XMLHTTP'): new window.XMLHttpRequest(); } function $HttpBackendProvider(){ this.$get = ['$browser', '$window', '$document', function ($browser, $window, $document){ return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]); } ] ; } function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument){ var ABORTED = -1; return function (method, url, post, callback, headers, timeout, withCredentials, responseType){ var status; $browser.$$incOutstandingRequestCount(); url = url || $browser.url(); if (lowercase(method) == 'jsonp') { var callbackId = '_' + (callbacks.counter++ ).toString(36); callbacks[callbackId] = function (data){ callbacks[callbackId].data = data; } ; var jsonpDone = jsonpReq(_AN_Call_replace('replace', url, 'JSON_CALLBACK', 'angular.callbacks.' + callbackId), function (){ if (callbacks[callbackId].data) { completeRequest(callback, 200, callbacks[callbackId].data); } else { completeRequest(callback, status || -2); } callbacks[callbackId] = angular.noop; } ); } else { var xhr = createXhr(method); _AN_Call_open('open', xhr, method, url, true ); forEach(headers, function (value, key){ if (isDefined(value)) { xhr.setRequestHeader(key, value); } } ); xhr.onreadystatechange = function (){ if (xhr && xhr.readyState == 4) { var responseHeaders = null , response = null ; if (status !== ABORTED) { responseHeaders = xhr.getAllResponseHeaders(); response = ('response' in xhr)? xhr.response: xhr.responseText; } completeRequest(callback, status || xhr.status, response, responseHeaders); } } ; if (withCredentials) { xhr.withCredentials = true ; } if (responseType) { xhr.responseType = responseType; } _AN_Call_send('send', xhr, post || null ); } if (timeout > 0) { var timeoutId = $browserDefer(timeoutRequest, timeout); } else if (timeout && timeout.then) { timeout.then(timeoutRequest); } function timeoutRequest(){ status = ABORTED; jsonpDone && jsonpDone(); xhr && xhr.abort(); } function completeRequest(callback, status, response, headersString){ timeoutId && $browserDefer.cancel(timeoutId); jsonpDone = xhr = null ; status = (status === 0)? (response? 200: 404): status; status = status == 1223? 204: status; callback(status, response, headersString); $browser.$$completeOutstandingRequest(noop); } } ; function jsonpReq(url, done){ var script = _AN_Call_createelement('createElement', rawDocument, 'script'), doneWrapper = function (){ script.onreadystatechange = script.onload = script.onerror = null ; rawDocument.body.removeChild(script); if (done) done(); } ; script.type = 'text/javascript'; _AN_Write_src('src', script, false , url); if (msie && msie <= 8) { script.onreadystatechange = function (){ if (/loaded|complete/.test(script.readyState)) { doneWrapper(); } } ; } else { script.onload = script.onerror = function (){ doneWrapper(); } ; } _AN_Call_appendchild('appendChild', rawDocument.body, script); return doneWrapper; } } var $interpolateMinErr = minErr('$interpolate'); function $InterpolateProvider(){ var startSymbol = '{{'; var endSymbol = '}}'; this.startSymbol = function (value){ if (value) { startSymbol = value; return this; } else { return startSymbol; } } ; this.endSymbol = function (value){ if (value) { endSymbol = value; return this; } else { return endSymbol; } } ; this.$get = ['$parse', '$exceptionHandler', '$sce', function ($parse, $exceptionHandler, $sce){ var startSymbolLength = _AN_Read_length('length', startSymbol), endSymbolLength = _AN_Read_length('length', endSymbol); function $interpolate(text, mustHaveExpression, trustedContext){ var startIndex, endIndex, index = 0, parts = [] , length = _AN_Read_length('length', text), hasInterpolation = false , fn, exp, concat = [] ; while (index < length){ if (((startIndex = text.indexOf(startSymbol, index)) != -1) && ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { (index != startIndex) && parts.push(text.substring(index, startIndex)); parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex))); fn.exp = exp; index = endIndex + endSymbolLength; hasInterpolation = true ; } else { (index != length) && parts.push(text.substring(index)); index = length; } } if (!(length = _AN_Read_length('length', parts))) { parts.push(''); length = 1; } if (trustedContext && _AN_Read_length('length', parts) > 1) { throw $interpolateMinErr('noconcat', "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + "interpolations that concatenate multiple expressions when a trusted value is " + "required. See http://docs.angularjs.org/api/ng.$sce", text) } if (!mustHaveExpression || hasInterpolation) { concat.length = length; fn = function (context){ try { for (var i = 0, ii = length, part; i < ii; i++ ){ if (typeof (part = parts[i]) == 'function') { part = part(context); if (trustedContext) { part = $sce.getTrusted(trustedContext, part); } else { part = $sce.valueOf(part); } if (part === null || isUndefined(part)) { part = ''; } else if (typeof part != 'string') { part = toJson(part); } } concat[i] = part; } return concat.join(''); } catch (err) { var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); $exceptionHandler(newErr); } } ; fn.exp = text; fn.parts = parts; return fn; } } $interpolate.startSymbol = function (){ return startSymbol; } ; $interpolate.endSymbol = function (){ return endSymbol; } ; return $interpolate; } ] ; } function $IntervalProvider(){ this.$get = ['$rootScope', '$window', '$q', function ($rootScope, $window, $q){ var intervals = { } ; function interval(fn, delay, count, invokeApply){ var setInterval = $window.setInterval, clearInterval = $window.clearInterval, deferred = $q.defer(), promise = deferred.promise, iteration = 0, skipApply = (isDefined(invokeApply) && !invokeApply); count = isDefined(count)? count: 0, promise.then(null , null , fn); promise.$$intervalId = _AN_Call_setinterval('setInterval', window, function tick(){ deferred.notify(iteration++ ); if (count > 0 && iteration >= count) { deferred.resolve(iteration); clearInterval(promise.$$intervalId); delete intervals[promise.$$intervalId]; } if (!skipApply) $rootScope.$apply(); } , delay); intervals[promise.$$intervalId] = deferred; return promise; } interval.cancel = function (promise){ if (promise && promise.$$intervalId in intervals) { intervals[promise.$$intervalId].reject('canceled'); clearInterval(promise.$$intervalId); delete intervals[promise.$$intervalId]; return true ; } return false ; } ; return interval; } ] ; } function $LocaleProvider(){ this.$get = function (){ return { id: 'en-us', NUMBER_FORMATS: { DECIMAL_SEP: '.', GROUP_SEP: ',', PATTERNS: [{ minInt: 1, minFrac: 0, maxFrac: 3, posPre: '', posSuf: '', negPre: '-', negSuf: '', gSize: 3, lgSize: 3} , { minInt: 1, minFrac: 2, maxFrac: 2, posPre: '\u00A4', posSuf: '', negPre: '(\u00A4', negSuf: ')', gSize: 3, lgSize: 3} ] , CURRENCY_SYM: '$'} , DATETIME_FORMATS: { MONTH: 'January,February,March,April,May,June,July,August,September,October,November,December'.split(','), SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), AMPMS: ['AM', 'PM'] , medium: 'MMM d, y h:mm:ss a', short: 'M/d/yy h:mm a', fullDate: 'EEEE, MMMM d, y', longDate: 'MMMM d, y', mediumDate: 'MMM d, y', shortDate: 'M/d/yy', mediumTime: 'h:mm:ss a', shortTime: 'h:mm a'} , pluralCat: function (num){ if (num === 1) { return 'one'; } return 'other'; } } ; } ; } var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, DEFAULT_PORTS = { 'http': 80, 'https': 443, 'ftp': 21} ; var $locationMinErr = minErr('$location'); function encodePath(path){ var segments = path.split('/'), i = _AN_Read_length('length', segments); while (i-- ){ segments[i] = encodeUriSegment(segments[i]); } return segments.join('/'); } function parseAbsoluteUrl(absoluteUrl, locationObj, appBase){ var parsedUrl = urlResolve(absoluteUrl, appBase); locationObj.$$protocol = _AN_Read_protocol('protocol', parsedUrl); locationObj.$$host = _AN_Read_hostname('hostname', parsedUrl); locationObj.$$port = int(_AN_Read_port('port', parsedUrl)) || DEFAULT_PORTS[_AN_Read_protocol('protocol', parsedUrl)] || null ; } function parseAppUrl(relativeUrl, locationObj, appBase){ var prefixed = (relativeUrl.charAt(0) !== '/'); if (prefixed) { relativeUrl = '/' + relativeUrl; } var match = urlResolve(relativeUrl, appBase); locationObj.$$path = decodeURIComponent(prefixed && _AN_Read_pathname('pathname', match).charAt(0) === '/'? _AN_Read_pathname('pathname', match).substring(1): _AN_Read_pathname('pathname', match)); locationObj.$$search = parseKeyValue(_AN_Read_search('search', match)); locationObj.$$hash = decodeURIComponent(_AN_Read_hash('hash', match)); if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { locationObj.$$path = '/' + locationObj.$$path; } } function beginsWith(begin, whole){ if (whole.indexOf(begin) === 0) { return whole.substr(_AN_Read_length('length', begin)); } } function stripHash(url){ var index = url.indexOf('#'); return index == -1? url: url.substr(0, index); } function stripFile(url){ return url.substr(0, stripHash(url).lastIndexOf('/') + 1); } function serverBase(url){ return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); } function LocationHtml5Url(appBase, basePrefix){ this.$$html5 = true ; basePrefix = basePrefix || ''; var appBaseNoFile = stripFile(appBase); parseAbsoluteUrl(appBase, this, appBase); this.$$parse = function (url){ var pathUrl = beginsWith(appBaseNoFile, url); if (!isString(pathUrl)) { throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, appBaseNoFile) } parseAppUrl(pathUrl, this, appBase); if (!this.$$path) { this.$$path = '/'; } this.$$compose(); } ; this.$$compose = function (){ var search = toKeyValue(this.$$search), hash = this.$$hash? '#' + encodeUriSegment(this.$$hash): ''; this.$$url = encodePath(this.$$path) + (search? '?' + search: '') + hash; this.$$absUrl = appBaseNoFile + this.$$url.substr(1); } ; this.$$rewrite = function (url){ var appUrl, prevAppUrl; if ((appUrl = beginsWith(appBase, url)) !== undefined) { prevAppUrl = appUrl; if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) { return appBaseNoFile + (beginsWith('/', appUrl) || appUrl); } else { return appBase + prevAppUrl; } } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) { return appBaseNoFile + appUrl; } else if (appBaseNoFile == url + '/') { return appBaseNoFile; } } ; } function LocationHashbangUrl(appBase, hashPrefix){ var appBaseNoFile = stripFile(appBase); parseAbsoluteUrl(appBase, this, appBase); this.$$parse = function (url){ var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); var withoutHashUrl = withoutBaseUrl.charAt(0) == '#'? beginsWith(hashPrefix, withoutBaseUrl): (this.$$html5)? withoutBaseUrl: ''; if (!isString(withoutHashUrl)) { throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url, hashPrefix) } parseAppUrl(withoutHashUrl, this, appBase); this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); this.$$compose(); function removeWindowsDriveName(path, url, base){ var windowsFilePathExp = /^\/?.*?:(\/.*)/; var firstPathSegmentMatch; if (url.indexOf(base) === 0) { url = _AN_Call_replace('replace', url, base, ''); } if (windowsFilePathExp.exec(url)) { return path; } firstPathSegmentMatch = windowsFilePathExp.exec(path); return firstPathSegmentMatch? firstPathSegmentMatch[1]: path; } } ; this.$$compose = function (){ var search = toKeyValue(this.$$search), hash = this.$$hash? '#' + encodeUriSegment(this.$$hash): ''; this.$$url = encodePath(this.$$path) + (search? '?' + search: '') + hash; this.$$absUrl = appBase + (this.$$url? hashPrefix + this.$$url: ''); } ; this.$$rewrite = function (url){ if (stripHash(appBase) == stripHash(url)) { return url; } } ; } function LocationHashbangInHtml5Url(appBase, hashPrefix){ this.$$html5 = true ; LocationHashbangUrl.apply(this, arguments); var appBaseNoFile = stripFile(appBase); this.$$rewrite = function (url){ var appUrl; if (appBase == stripHash(url)) { return url; } else if ((appUrl = beginsWith(appBaseNoFile, url))) { return appBase + hashPrefix + appUrl; } else if (appBaseNoFile === url + '/') { return appBaseNoFile; } } ; } LocationHashbangInHtml5Url.prototype = LocationHashbangUrl.prototype = LocationHtml5Url.prototype = { $$html5: false , $$replace: false , absUrl: locationGetter('$$absUrl'), url: function (url, replace){ if (isUndefined(url)) return this.$$url; var match = PATH_MATCH.exec(url); if (match[1]) this.path(decodeURIComponent(match[1])); if (match[2] || match[1]) this.search(match[3] || ''); this.hash(match[5] || '', replace); return this; } , protocol: locationGetter('$$protocol'), host: locationGetter('$$host'), port: locationGetter('$$port'), path: locationGetterSetter('$$path', function (path){ return path.charAt(0) == '/'? path: '/' + path; } ), search: function (search, paramValue){ switch (arguments.length){ case 0: return this.$$search; case 1: if (isString(search)) { this.$$search = parseKeyValue(search); } else if (isObject(search)) { this.$$search = search; } else { throw $locationMinErr('isrcharg', 'The first argument of the `$location#search()` call must be a string or an object.') } break ; default : { if (isUndefined(paramValue) || paramValue === null ) { delete this.$$search[search]; } else { this.$$search[search] = paramValue; } } } this.$$compose(); return this; } , hash: locationGetterSetter('$$hash', identity), replace: function (){ this.$$replace = true ; return this; } } ; function locationGetter(property){ return function (){ return this[property]; } ; } function locationGetterSetter(property, preprocess){ return function (value){ if (isUndefined(value)) return this[property]; this[property] = preprocess(value); this.$$compose(); return this; } ; } function $LocationProvider(){ var hashPrefix = '', html5Mode = false ; this.hashPrefix = function (prefix){ if (isDefined(prefix)) { hashPrefix = prefix; return this; } else { return hashPrefix; } } ; this.html5Mode = function (mode){ if (isDefined(mode)) { html5Mode = mode; return this; } else { return html5Mode; } } ; this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', function ($rootScope, $browser, $sniffer, $rootElement){ var $location, LocationMode, baseHref = $browser.baseHref(), initialUrl = $browser.url(), appBase; if (html5Mode) { appBase = serverBase(initialUrl) + (baseHref || '/'); LocationMode = $sniffer.history? LocationHtml5Url: LocationHashbangInHtml5Url; } else { appBase = stripHash(initialUrl); LocationMode = LocationHashbangUrl; } $location = new LocationMode(appBase, '#' + hashPrefix); $location.$$parse($location.$$rewrite(initialUrl)); $rootElement.on('click', function (event){ if (event.ctrlKey || event.metaKey || event.which == 2) return ; var elm = jqLite(_AN_Read_target('target', event)); while (lowercase(elm[0].nodeName) !== 'a'){ if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return ; } var absHref = elm.prop('href'); if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { absHref = _AN_Read_href('href', urlResolve(absHref.animVal)); } var rewrittenUrl = $location.$$rewrite(absHref); if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) { event.preventDefault(); if (rewrittenUrl != $browser.url()) { $location.$$parse(rewrittenUrl); $rootScope.$apply(); window.angular["ff-684208-preventDefault"] = true ; } } } ); if ($location.absUrl() != initialUrl) { $browser.url($location.absUrl(), true ); } $browser.onUrlChange(function (newUrl){ if ($location.absUrl() != newUrl) { $rootScope.$evalAsync(function (){ var oldUrl = $location.absUrl(); $location.$$parse(newUrl); if ($rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl).defaultPrevented) { $location.$$parse(oldUrl); $browser.url(oldUrl); } else { afterLocationChange(oldUrl); } } ); if (!$rootScope.$$phase) $rootScope.$digest(); } } ); var changeCounter = 0; $rootScope.$watch(function $locationWatch(){ var oldUrl = $browser.url(); var currentReplace = $location.$$replace; if (!changeCounter || oldUrl != $location.absUrl()) { changeCounter++ ; $rootScope.$evalAsync(function (){ if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).defaultPrevented) { $location.$$parse(oldUrl); } else { $browser.url($location.absUrl(), currentReplace); afterLocationChange(oldUrl); } } ); } $location.$$replace = false ; return changeCounter; } ); return $location; function afterLocationChange(oldUrl){ $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl); } } ] ; } function $LogProvider(){ var debug = true , self = this; this.debugEnabled = function (flag){ if (isDefined(flag)) { debug = flag; return this; } else { return debug; } } ; this.$get = ['$window', function ($window){ return { log: consoleLog('log'), info: consoleLog('info'), warn: consoleLog('warn'), error: consoleLog('error'), debug: (function (){ var fn = consoleLog('debug'); return function (){ if (debug) { fn.apply(self, arguments); } } ; } ())} ; function formatError(arg){ if (arg instanceof Error) { if (arg.stack) { arg = (arg.message && arg.stack.indexOf(arg.message) === -1)? 'Error: ' + arg.message + '\n' + arg.stack: arg.stack; } else if (arg.sourceURL) { arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; } } return arg; } function consoleLog(type){ var console = $window.console || { } , logFn = console[type] || console.log || noop, hasApply = false ; try { hasApply = !!logFn.apply; } catch (e) { } if (hasApply) { return function (){ var args = [] ; forEach(arguments, function (arg){ args.push(formatError(arg)); } ); return logFn.apply(console, args); } ; } return function (arg1, arg2){ logFn(arg1, arg2 == null ? '': arg2); } ; } } ] ; } var $parseMinErr = minErr('$parse'); var promiseWarningCache = { } ; var promiseWarning; function ensureSafeMemberName(name, fullExpression){ if (name === "constructor") { throw $parseMinErr('isecfld', 'Referencing "constructor" field in Angular expressions is disallowed! Expression: {0}', fullExpression) } return name; } function ensureSafeObject(obj, fullExpression){ if (obj) { if (obj.constructor === obj) { throw $parseMinErr('isecfn', 'Referencing Function in Angular expressions is disallowed! Expression: {0}', fullExpression) } else if (obj.document && _AN_Read_location('location', obj) && obj.alert && obj.setInterval) { throw $parseMinErr('isecwindow', 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', fullExpression) } else if (obj.children && (obj.nodeName || (obj.on && obj.find))) { throw $parseMinErr('isecdom', 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', fullExpression) } } return obj; } var OPERATORS = { 'null': function (){ return null ; } , 'true': function (){ return true ; } , 'false': function (){ return false ; } , undefined: noop, '+': function (self, locals, a, b){ a = a(self, locals); b = b(self, locals); if (isDefined(a)) { if (isDefined(b)) { return a + b; } return a; } return isDefined(b)? b: undefined; } , '-': function (self, locals, a, b){ a = a(self, locals); b = b(self, locals); return (isDefined(a)? a: 0) - (isDefined(b)? b: 0); } , '*': function (self, locals, a, b){ return a(self, locals) * b(self, locals); } , '/': function (self, locals, a, b){ return a(self, locals) / b(self, locals); } , '%': function (self, locals, a, b){ return a(self, locals) % b(self, locals); } , '^': function (self, locals, a, b){ return a(self, locals) ^ b(self, locals); } , '=': noop, '===': function (self, locals, a, b){ return a(self, locals) === b(self, locals); } , '!==': function (self, locals, a, b){ return a(self, locals) !== b(self, locals); } , '==': function (self, locals, a, b){ return a(self, locals) == b(self, locals); } , '!=': function (self, locals, a, b){ return a(self, locals) != b(self, locals); } , '<': function (self, locals, a, b){ return a(self, locals) < b(self, locals); } , '>': function (self, locals, a, b){ return a(self, locals) > b(self, locals); } , '<=': function (self, locals, a, b){ return a(self, locals) <= b(self, locals); } , '>=': function (self, locals, a, b){ return a(self, locals) >= b(self, locals); } , '&&': function (self, locals, a, b){ return a(self, locals) && b(self, locals); } , '||': function (self, locals, a, b){ return a(self, locals) || b(self, locals); } , '&': function (self, locals, a, b){ return a(self, locals) & b(self, locals); } , '|': function (self, locals, a, b){ return b(self, locals)(self, locals, a(self, locals)); } , '!': function (self, locals, a){ return !a(self, locals); } } ; var ESCAPE = { "n": "\n", "f": "\f", "r": "\r", "t": "\t", "v": "\v", "'": "'", '"': '"'} ; var Lexer = function (options){ this.options = options; } ; Lexer.prototype = { constructor: Lexer, lex: function (text){ _AN_Write_text('text', this, false , text); this.index = 0; this.ch = undefined; this.lastCh = ':'; this.tokens = [] ; var token; var json = [] ; while (this.index < _AN_Read_length('length', this.text)){ this.ch = this.text.charAt(this.index); if (this.is('"\'')) { this.readString(this.ch); } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) { this.readNumber(); } else if (this.isIdent(this.ch)) { this.readIdent(); if (this.was('{,') && json[0] === '{' && (token = this.tokens[_AN_Read_length('length', this.tokens) - 1])) { token.json = token.text.indexOf('.') === -1; } } else if (this.is('(){}[].,;:?')) { this.tokens.push({ index: this.index, text: this.ch, json: (this.was(':[,') && this.is('{[')) || this.is('}]:,')} ); if (this.is('{[')) json.unshift(this.ch); if (this.is('}]')) json.shift(); this.index++ ; } else if (this.isWhitespace(this.ch)) { this.index++ ; continue ; } else { var ch2 = this.ch + this.peek(); var ch3 = ch2 + this.peek(2); var fn = OPERATORS[this.ch]; var fn2 = OPERATORS[ch2]; var fn3 = OPERATORS[ch3]; if (fn3) { this.tokens.push({ index: this.index, text: ch3, fn: fn3} ); this.index += 3; } else if (fn2) { this.tokens.push({ index: this.index, text: ch2, fn: fn2} ); this.index += 2; } else if (fn) { this.tokens.push({ index: this.index, text: this.ch, fn: fn, json: (this.was('[,:') && this.is('+-'))} ); this.index += 1; } else { this.throwError('Unexpected next character ', this.index, this.index + 1); } } this.lastCh = this.ch; } return this.tokens; } , is: function (chars){ return chars.indexOf(this.ch) !== -1; } , was: function (chars){ return chars.indexOf(this.lastCh) !== -1; } , peek: function (i){ var num = i || 1; return (this.index + num < _AN_Read_length('length', this.text))? this.text.charAt(this.index + num): false ; } , isNumber: function (ch){ return ('0' <= ch && ch <= '9'); } , isWhitespace: function (ch){ return (ch === ' ' || ch === '\r' || ch === '\t' || ch === '\n' || ch === '\v' || ch === '\u00A0'); } , isIdent: function (ch){ return ('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || '_' === ch || ch === '$'); } , isExpOperator: function (ch){ return (ch === '-' || ch === '+' || this.isNumber(ch)); } , throwError: function (error, start, end){ end = end || this.index; var colStr = (isDefined(start)? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']': ' ' + end); throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', error, colStr, this.text) } , readNumber: function (){ var number = ''; var start = this.index; while (this.index < _AN_Read_length('length', this.text)){ var ch = lowercase(this.text.charAt(this.index)); if (ch == '.' || this.isNumber(ch)) { number += ch; } else { var peekCh = this.peek(); if (ch == 'e' && this.isExpOperator(peekCh)) { number += ch; } else if (this.isExpOperator(ch) && peekCh && this.isNumber(peekCh) && number.charAt(_AN_Read_length('length', number) - 1) == 'e') { number += ch; } else if (this.isExpOperator(ch) && (!peekCh || !this.isNumber(peekCh)) && number.charAt(_AN_Read_length('length', number) - 1) == 'e') { this.throwError('Invalid exponent'); } else { break ; } } this.index++ ; } number = 1 * number; this.tokens.push({ index: start, text: number, json: true , fn: function (){ return number; } } ); } , readIdent: function (){ var parser = this; var ident = ''; var start = this.index; var lastDot, peekIndex, methodName, ch; while (this.index < _AN_Read_length('length', this.text)){ ch = this.text.charAt(this.index); if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) { if (ch === '.') lastDot = this.index; ident += ch; } else { break ; } this.index++ ; } if (lastDot) { peekIndex = this.index; while (peekIndex < _AN_Read_length('length', this.text)){ ch = this.text.charAt(peekIndex); if (ch === '(') { methodName = ident.substr(lastDot - start + 1); ident = ident.substr(0, lastDot - start); this.index = peekIndex; break ; } if (this.isWhitespace(ch)) { peekIndex++ ; } else { break ; } } } var token = { index: start, text: ident} ; if (OPERATORS.hasOwnProperty(ident)) { token.fn = OPERATORS[ident]; token.json = OPERATORS[ident]; } else { var getter = getterFn(ident, this.options, this.text); token.fn = extend(function (self, locals){ return (getter(self, locals)); } , { assign: function (self, value){ return setter(self, ident, value, parser.text, parser.options); } } ); } this.tokens.push(token); if (methodName) { this.tokens.push({ index: lastDot, text: '.', json: false } ); this.tokens.push({ index: lastDot + 1, text: methodName, json: false } ); } } , readString: function (quote){ var start = this.index; this.index++ ; var string = ''; var rawString = quote; var escape = false ; while (this.index < _AN_Read_length('length', this.text)){ var ch = this.text.charAt(this.index); rawString += ch; if (escape) { if (ch === 'u') { var hex = this.text.substring(this.index + 1, this.index + 5); if (!hex.match(/[\da-f]{4}/i)) this.throwError('Invalid unicode escape [\\u' + hex + ']'); this.index += 4; string += String.fromCharCode(parseInt(hex, 16)); } else { var rep = ESCAPE[ch]; if (rep) { string += rep; } else { string += ch; } } escape = false ; } else if (ch === '\\') { escape = true ; } else if (ch === quote) { this.index++ ; this.tokens.push({ index: start, text: rawString, string: string, json: true , fn: function (){ return string; } } ); return ; } else { string += ch; } this.index++ ; } this.throwError('Unterminated quote', start); } } ; var Parser = function (lexer, $filter, options){ this.lexer = lexer; this.$filter = $filter; this.options = options; } ; Parser.ZERO = function (){ return 0; } ; Parser.prototype = { constructor: Parser, parse: function (text, json){ _AN_Write_text('text', this, false , text); this.json = json; this.tokens = this.lexer.lex(text); if (json) { this.assignment = this.logicalOR; this.functionCall = this.fieldAccess = this.objectIndex = this.filterChain = function (){ this.throwError('is not valid json', { text: text, index: 0} ); } ; } var value = json? this.primary(): this.statements(); if (_AN_Read_length('length', this.tokens) !== 0) { this.throwError('is an unexpected token', this.tokens[0]); } value.literal = !!value.literal; value.constant = !!value.constant; return value; } , primary: function (){ var primary; if (this.expect('(')) { primary = this.filterChain(); this.consume(')'); } else if (this.expect('[')) { primary = this.arrayDeclaration(); } else if (this.expect('{')) { primary = this.object(); } else { var token = this.expect(); primary = token.fn; if (!primary) { this.throwError('not a primary expression', token); } if (token.json) { primary.constant = true ; primary.literal = true ; } } var next, context; while ((next = this.expect('(', '[', '.'))){ if (next.text === '(') { primary = this.functionCall(primary, context); context = null ; } else if (next.text === '[') { context = primary; primary = this.objectIndex(primary); } else if (next.text === '.') { context = primary; primary = this.fieldAccess(primary); } else { this.throwError('IMPOSSIBLE'); } } return primary; } , throwError: function (msg, token){ throw $parseMinErr('syntax', 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)) } , peekToken: function (){ if (_AN_Read_length('length', this.tokens) === 0) throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text) return this.tokens[0]; } , peek: function (e1, e2, e3, e4){ if (_AN_Read_length('length', this.tokens) > 0) { var token = this.tokens[0]; var t = token.text; if (t === e1 || t === e2 || t === e3 || t === e4 || (!e1 && !e2 && !e3 && !e4)) { return token; } } return false ; } , expect: function (e1, e2, e3, e4){ var token = this.peek(e1, e2, e3, e4); if (token) { if (this.json && !token.json) { this.throwError('is not valid json', token); } this.tokens.shift(); return token; } return false ; } , consume: function (e1){ if (!this.expect(e1)) { this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); } } , unaryFn: function (fn, right){ return extend(function (self, locals){ return fn(self, locals, right); } , { constant: right.constant} ); } , ternaryFn: function (left, middle, right){ return extend(function (self, locals){ return left(self, locals)? middle(self, locals): right(self, locals); } , { constant: left.constant && middle.constant && right.constant} ); } , binaryFn: function (left, fn, right){ return extend(function (self, locals){ return fn(self, locals, left, right); } , { constant: left.constant && right.constant} ); } , statements: function (){ var statements = [] ; while (true ){ if (_AN_Read_length('length', this.tokens) > 0 && !this.peek('}', ')', ';', ']')) statements.push(this.filterChain()); if (!this.expect(';')) { return (_AN_Read_length('length', statements) === 1)? statements[0]: function (self, locals){ var value; for (var i = 0; i < _AN_Read_length('length', statements); i++ ){ var statement = statements[i]; if (statement) { value = statement(self, locals); } } return value; } ; } } } , filterChain: function (){ var left = this.expression(); var token; while (true ){ if ((token = this.expect('|'))) { left = this.binaryFn(left, token.fn, this.filter()); } else { return left; } } } , filter: function (){ var token = this.expect(); var fn = this.$filter(token.text); var argsFn = [] ; while (true ){ if ((token = this.expect(':'))) { argsFn.push(this.expression()); } else { var fnInvoke = function (self, locals, input){ var args = [input] ; for (var i = 0; i < _AN_Read_length('length', argsFn); i++ ){ args.push(argsFn[i](self, locals)); } return fn.apply(self, args); } ; return function (){ return fnInvoke; } ; } } } , expression: function (){ return this.assignment(); } , assignment: function (){ var left = this.ternary(); var right; var token; if ((token = this.expect('='))) { if (!left.assign) { this.throwError('implies assignment but [' + this.text.substring(0, token.index) + '] can not be assigned to', token); } right = this.ternary(); return function (scope, locals){ return _AN_Call_assign('assign', left, scope, right(scope, locals), locals); } ; } return left; } , ternary: function (){ var left = this.logicalOR(); var middle; var token; if ((token = this.expect('?'))) { middle = this.ternary(); if ((token = this.expect(':'))) { return this.ternaryFn(left, middle, this.ternary()); } else { this.throwError('expected :', token); } } else { return left; } } , logicalOR: function (){ var left = this.logicalAND(); var token; while (true ){ if ((token = this.expect('||'))) { left = this.binaryFn(left, token.fn, this.logicalAND()); } else { return left; } } } , logicalAND: function (){ var left = this.equality(); var token; if ((token = this.expect('&&'))) { left = this.binaryFn(left, token.fn, this.logicalAND()); } return left; } , equality: function (){ var left = this.relational(); var token; if ((token = this.expect('==', '!=', '===', '!=='))) { left = this.binaryFn(left, token.fn, this.equality()); } return left; } , relational: function (){ var left = this.additive(); var token; if ((token = this.expect('<', '>', '<=', '>='))) { left = this.binaryFn(left, token.fn, this.relational()); } return left; } , additive: function (){ var left = this.multiplicative(); var token; while ((token = this.expect('+', '-'))){ left = this.binaryFn(left, token.fn, this.multiplicative()); } return left; } , multiplicative: function (){ var left = this.unary(); var token; while ((token = this.expect('*', '/', '%'))){ left = this.binaryFn(left, token.fn, this.unary()); } return left; } , unary: function (){ var token; if (this.expect('+')) { return this.primary(); } else if ((token = this.expect('-'))) { return this.binaryFn(Parser.ZERO, token.fn, this.unary()); } else if ((token = this.expect('!'))) { return this.unaryFn(token.fn, this.unary()); } else { return this.primary(); } } , fieldAccess: function (object){ var parser = this; var field = this.expect().text; var getter = getterFn(field, this.options, this.text); return extend(function (scope, locals, self){ return getter(self || object(scope, locals), locals); } , { assign: function (scope, value, locals){ return setter(object(scope, locals), field, value, parser.text, parser.options); } } ); } , objectIndex: function (obj){ var parser = this; var indexFn = this.expression(); this.consume(']'); return extend(function (self, locals){ var o = obj(self, locals), i = indexFn(self, locals), v, p; if (!o) return undefined; v = ensureSafeObject(o[i], parser.text); if (v && v.then && parser.options.unwrapPromises) { p = v; if (!('$$v' in v)) { p.$$v = undefined; p.then(function (val){ p.$$v = val; } ); } v = v.$$v; } return v; } , { assign: function (self, value, locals){ var key = indexFn(self, locals); var safe = ensureSafeObject(obj(self, locals), parser.text); return safe[key] = value; } } ); } , functionCall: function (fn, contextGetter){ var argsFn = [] ; if (this.peekToken().text !== ')') { do { argsFn.push(this.expression()); } while(this.expect(','))} this.consume(')'); var parser = this; return function (scope, locals){ var args = [] ; var context = contextGetter? contextGetter(scope, locals): scope; for (var i = 0; i < _AN_Read_length('length', argsFn); i++ ){ args.push(argsFn[i](scope, locals)); } var fnPtr = fn(scope, locals, context) || noop; ensureSafeObject(context, parser.text); ensureSafeObject(fnPtr, parser.text); var v = fnPtr.apply? fnPtr.apply(context, args): fnPtr(args[0], args[1], args[2], args[3], args[4]); return ensureSafeObject(v, parser.text); } ; } , arrayDeclaration: function (){ var elementFns = [] ; var allConstant = true ; if (this.peekToken().text !== ']') { do { var elementFn = this.expression(); elementFns.push(elementFn); if (!elementFn.constant) { allConstant = false ; } } while(this.expect(','))} this.consume(']'); return extend(function (self, locals){ var array = [] ; for (var i = 0; i < _AN_Read_length('length', elementFns); i++ ){ array.push(elementFns[i](self, locals)); } return array; } , { literal: true , constant: allConstant} ); } , object: function (){ var keyValues = [] ; var allConstant = true ; if (this.peekToken().text !== '}') { do { var token = this.expect(), key = token.string || token.text; this.consume(':'); var value = this.expression(); keyValues.push({ key: key, value: value} ); if (!value.constant) { allConstant = false ; } } while(this.expect(','))} this.consume('}'); return extend(function (self, locals){ var object = { } ; for (var i = 0; i < _AN_Read_length('length', keyValues); i++ ){ var keyValue = keyValues[i]; object[keyValue.key] = keyValue.value(self, locals); } return object; } , { literal: true , constant: allConstant} ); } } ; function setter(obj, path, setValue, fullExp, options){ options = options || { } ; var element = path.split('.'), key; for (var i = 0; _AN_Read_length('length', element) > 1; i++ ){ key = ensureSafeMemberName(element.shift(), fullExp); var propertyObj = obj[key]; if (!propertyObj) { propertyObj = { } ; obj[key] = propertyObj; } obj = propertyObj; if (obj.then && options.unwrapPromises) { promiseWarning(fullExp); if (!("$$v" in obj)) { (function (promise){ promise.then(function (val){ promise.$$v = val; } ); } )(obj); } if (obj.$$v === undefined) { obj.$$v = { } ; } obj = obj.$$v; } } key = ensureSafeMemberName(element.shift(), fullExp); obj[key] = setValue; return setValue; } var getterFnCache = { } ; function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options){ ensureSafeMemberName(key0, fullExp); ensureSafeMemberName(key1, fullExp); ensureSafeMemberName(key2, fullExp); ensureSafeMemberName(key3, fullExp); ensureSafeMemberName(key4, fullExp); return !options.unwrapPromises? function cspSafeGetter(scope, locals){ var pathVal = (locals && locals.hasOwnProperty(key0))? locals: scope; if (pathVal == null ) return pathVal; pathVal = pathVal[key0]; if (!key1) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key1]; if (!key2) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key2]; if (!key3) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key3]; if (!key4) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key4]; return pathVal; } : function cspSafePromiseEnabledGetter(scope, locals){ var pathVal = (locals && locals.hasOwnProperty(key0))? locals: scope, promise; if (pathVal == null ) return pathVal; pathVal = pathVal[key0]; if (pathVal && pathVal.then) { promiseWarning(fullExp); if (!("$$v" in pathVal)) { promise = pathVal; promise.$$v = undefined; promise.then(function (val){ promise.$$v = val; } ); } pathVal = pathVal.$$v; } if (!key1) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key1]; if (pathVal && pathVal.then) { promiseWarning(fullExp); if (!("$$v" in pathVal)) { promise = pathVal; promise.$$v = undefined; promise.then(function (val){ promise.$$v = val; } ); } pathVal = pathVal.$$v; } if (!key2) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key2]; if (pathVal && pathVal.then) { promiseWarning(fullExp); if (!("$$v" in pathVal)) { promise = pathVal; promise.$$v = undefined; promise.then(function (val){ promise.$$v = val; } ); } pathVal = pathVal.$$v; } if (!key3) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key3]; if (pathVal && pathVal.then) { promiseWarning(fullExp); if (!("$$v" in pathVal)) { promise = pathVal; promise.$$v = undefined; promise.then(function (val){ promise.$$v = val; } ); } pathVal = pathVal.$$v; } if (!key4) return pathVal; if (pathVal == null ) return undefined; pathVal = pathVal[key4]; if (pathVal && pathVal.then) { promiseWarning(fullExp); if (!("$$v" in pathVal)) { promise = pathVal; promise.$$v = undefined; promise.then(function (val){ promise.$$v = val; } ); } pathVal = pathVal.$$v; } return pathVal; } ; } function simpleGetterFn1(key0, fullExp){ ensureSafeMemberName(key0, fullExp); return function simpleGetterFn1(scope, locals){ if (scope == null ) return undefined; return ((locals && locals.hasOwnProperty(key0))? locals: scope)[key0]; } ; } function simpleGetterFn2(key0, key1, fullExp){ ensureSafeMemberName(key0, fullExp); ensureSafeMemberName(key1, fullExp); return function simpleGetterFn2(scope, locals){ if (scope == null ) return undefined; scope = ((locals && locals.hasOwnProperty(key0))? locals: scope)[key0]; return scope == null ? undefined: scope[key1]; } ; } function getterFn(path, options, fullExp){ if (getterFnCache.hasOwnProperty(path)) { return getterFnCache[path]; } var pathKeys = path.split('.'), pathKeysLength = _AN_Read_length('length', pathKeys), fn; if (!options.unwrapPromises && pathKeysLength === 1) { fn = simpleGetterFn1(pathKeys[0], fullExp); } else if (!options.unwrapPromises && pathKeysLength === 2) { fn = simpleGetterFn2(pathKeys[0], pathKeys[1], fullExp); } else if (options.csp) { if (pathKeysLength < 6) { fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp, options); } else { fn = function (scope, locals){ var i = 0, val; do { val = cspSafeGetterFn(pathKeys[i++ ], pathKeys[i++ ], pathKeys[i++ ], pathKeys[i++ ], pathKeys[i++ ], fullExp, options)(scope, locals); locals = undefined; scope = val; } while(i < pathKeysLength)return val; } ; } } else { var code = 'var p;\n'; forEach(pathKeys, function (key, index){ ensureSafeMemberName(key, fullExp); code += 'if(s == null) return undefined;\n' + 's=' + (index? 's': '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '["' + key + '"]' + ';\n' + (options.unwrapPromises? 'if (s && s.then) {\n' + ' pw("' + _AN_Call_replace('replace', fullExp, /(["\r\n])/g, '\\$1') + '");\n' + ' if (!("$$v" in s)) {\n' + ' p=s;\n' + ' p.$$v = undefined;\n' + ' p.then(function(v) {p.$$v=v;});\n' + '}\n' + ' s=s.$$v\n' + '}\n': ''); } ); code += 'return s;'; var evaledFnGetter = new Function('s', 'k', 'pw', code); evaledFnGetter.toString = valueFn(code); fn = options.unwrapPromises? function (scope, locals){ return evaledFnGetter(scope, locals, promiseWarning); } : evaledFnGetter; } if (path !== 'hasOwnProperty') { getterFnCache[path] = fn; } return fn; } function $ParseProvider(){ var cache = { } ; var $parseOptions = { csp: false , unwrapPromises: false , logPromiseWarnings: true } ; this.unwrapPromises = function (value){ if (isDefined(value)) { $parseOptions.unwrapPromises = !!value; return this; } else { return $parseOptions.unwrapPromises; } } ; this.logPromiseWarnings = function (value){ if (isDefined(value)) { $parseOptions.logPromiseWarnings = value; return this; } else { return $parseOptions.logPromiseWarnings; } } ; this.$get = ['$filter', '$sniffer', '$log', function ($filter, $sniffer, $log){ $parseOptions.csp = $sniffer.csp; promiseWarning = function promiseWarningFn(fullExp){ if (!$parseOptions.logPromiseWarnings || promiseWarningCache.hasOwnProperty(fullExp)) return ; promiseWarningCache[fullExp] = true ; $log.warn('[$parse] Promise found in the expression `' + fullExp + '`. ' + 'Automatic unwrapping of promises in Angular expressions is deprecated.'); } ; return function (exp){ var parsedExpression; switch (typeof exp){ case 'string': if (cache.hasOwnProperty(exp)) { return cache[exp]; } var lexer = new Lexer($parseOptions); var parser = new Parser(lexer, $filter, $parseOptions); parsedExpression = parser.parse(exp, false ); if (exp !== 'hasOwnProperty') { cache[exp] = parsedExpression; } return parsedExpression; case 'function': return exp; default : { return noop; } } } ; } ] ; } function $QProvider(){ this.$get = ['$rootScope', '$exceptionHandler', function ($rootScope, $exceptionHandler){ return qFactory(function (callback){ $rootScope.$evalAsync(callback); } , $exceptionHandler); } ] ; } function qFactory(nextTick, exceptionHandler){ var defer = function (){ var pending = [] , value, deferred; deferred = { resolve: function (val){ if (pending) { var callbacks = pending; pending = undefined; value = ref(val); if (callbacks.length) { nextTick(function (){ var callback; for (var i = 0, ii = _AN_Read_length('length', callbacks); i < ii; i++ ){ callback = callbacks[i]; value.then(callback[0], callback[1], callback[2]); } } ); } } } , reject: function (reason){ deferred.resolve(reject(reason)); } , notify: function (progress){ if (pending) { var callbacks = pending; if (pending.length) { nextTick(function (){ var callback; for (var i = 0, ii = _AN_Read_length('length', callbacks); i < ii; i++ ){ callback = callbacks[i]; callback[2](progress); } } ); } } } , promise: { then: function (callback, errback, progressback){ var result = defer(); var wrappedCallback = function (value){ try { result.resolve((isFunction(callback)? callback: defaultCallback)(value)); } catch (e) { result.reject(e); exceptionHandler(e); } } ; var wrappedErrback = function (reason){ try { result.resolve((isFunction(errback)? errback: defaultErrback)(reason)); } catch (e) { result.reject(e); exceptionHandler(e); } } ; var wrappedProgressback = function (progress){ try { result.notify((isFunction(progressback)? progressback: defaultCallback)(progress)); } catch (e) { exceptionHandler(e); } } ; if (pending) { pending.push([wrappedCallback, wrappedErrback, wrappedProgressback] ); } else { value.then(wrappedCallback, wrappedErrback, wrappedProgressback); } return result.promise; } , "catch": function (callback){ return this.then(null , callback); } , "finally": function (callback){ function makePromise(value, resolved){ var result = defer(); if (resolved) { result.resolve(value); } else { result.reject(value); } return result.promise; } function handleCallback(value, isResolved){ var callbackOutput = null ; try { callbackOutput = (callback || defaultCallback)(); } catch (e) { return makePromise(e, false ); } if (callbackOutput && isFunction(callbackOutput.then)) { return callbackOutput.then(function (){ return makePromise(value, isResolved); } , function (error){ return makePromise(error, false ); } ); } else { return makePromise(value, isResolved); } } return this.then(function (value){ return handleCallback(value, true ); } , function (error){ return handleCallback(error, false ); } ); } } } ; return deferred; } ; var ref = function (value){ if (value && isFunction(value.then)) return value; return { then: function (callback){ var result = defer(); nextTick(function (){ result.resolve(callback(value)); } ); return result.promise; } } ; } ; var reject = function (reason){ return { then: function (callback, errback){ var result = defer(); nextTick(function (){ try { result.resolve((isFunction(errback)? errback: defaultErrback)(reason)); } catch (e) { result.reject(e); exceptionHandler(e); } } ); return result.promise; } } ; } ; var when = function (value, callback, errback, progressback){ var result = defer(), done; var wrappedCallback = function (value){ try { return (isFunction(callback)? callback: defaultCallback)(value); } catch (e) { exceptionHandler(e); return reject(e); } } ; var wrappedErrback = function (reason){ try { return (isFunction(errback)? errback: defaultErrback)(reason); } catch (e) { exceptionHandler(e); return reject(e); } } ; var wrappedProgressback = function (progress){ try { return (isFunction(progressback)? progressback: defaultCallback)(progress); } catch (e) { exceptionHandler(e); } } ; nextTick(function (){ ref(value).then(function (value){ if (done) return ; done = true ; result.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback)); } , function (reason){ if (done) return ; done = true ; result.resolve(wrappedErrback(reason)); } , function (progress){ if (done) return ; result.notify(wrappedProgressback(progress)); } ); } ); return result.promise; } ; function defaultCallback(value){ return value; } function defaultErrback(reason){ return reject(reason); } function all(promises){ var deferred = defer(), counter = 0, results = isArray(promises)? [] : { } ; forEach(promises, function (promise, key){ counter++ ; ref(promise).then(function (value){ if (results.hasOwnProperty(key)) return ; results[key] = value; if (!(--counter)) deferred.resolve(results); } , function (reason){ if (results.hasOwnProperty(key)) return ; deferred.reject(reason); } ); } ); if (counter === 0) { deferred.resolve(results); } return deferred.promise; } return { defer: defer, reject: reject, when: when, all: all} ; } function $RootScopeProvider(){ var TTL = 10; var $rootScopeMinErr = minErr('$rootScope'); var lastDirtyWatch = null ; this.digestTtl = function (value){ if (arguments.length) { TTL = value; } return TTL; } ; this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', function ($injector, $exceptionHandler, $parse, $browser){ function Scope(){ this.$id = nextUid(); this.$$phase = this.$parent = this.$$watchers = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null ; this["this"] = this.$root = this; this.$$destroyed = false ; this.$$asyncQueue = [] ; this.$$postDigestQueue = [] ; this.$$listeners = { } ; this.$$listenerCount = { } ; this.$$isolateBindings = { } ; } Scope.prototype = { constructor: Scope, $new: function (isolate){ var ChildScope, child; if (isolate) { child = new Scope(); child.$root = this.$root; child.$$asyncQueue = this.$$asyncQueue; child.$$postDigestQueue = this.$$postDigestQueue; } else { ChildScope = function (){ } ; ChildScope.prototype = this; child = new ChildScope(); child.$id = nextUid(); } child["this"] = child; child.$$listeners = { } ; child.$$listenerCount = { } ; child.$parent = this; child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null ; child.$$prevSibling = this.$$childTail; if (this.$$childHead) { this.$$childTail.$$nextSibling = child; this.$$childTail = child; } else { this.$$childHead = this.$$childTail = child; } return child; } , $watch: function (watchExp, listener, objectEquality){ var scope = this, get = compileToFn(watchExp, 'watch'), array = scope.$$watchers, watcher = { fn: listener, last: initWatchVal, get: get, exp: watchExp, eq: !!objectEquality} ; lastDirtyWatch = null ; if (!isFunction(listener)) { var listenFn = compileToFn(listener || noop, 'listener'); watcher.fn = function (newVal, oldVal, scope){ listenFn(scope); } ; } if (typeof watchExp == 'string' && get.constant) { var originalFn = watcher.fn; watcher.fn = function (newVal, oldVal, scope){ originalFn.call(this, newVal, oldVal, scope); arrayRemove(array, watcher); } ; } if (!array) { array = scope.$$watchers = [] ; } array.unshift(watcher); return function (){ arrayRemove(array, watcher); lastDirtyWatch = null ; } ; } , $watchCollection: function (obj, listener){ var self = this; var oldValue; var newValue; var changeDetected = 0; var objGetter = $parse(obj); var internalArray = [] ; var internalObject = { } ; var oldLength = 0; function $watchCollectionWatch(){ newValue = objGetter(self); var newLength, key; if (!isObject(newValue)) { if (oldValue !== newValue) { oldValue = newValue; changeDetected++ ; } } else if (isArrayLike(newValue)) { if (oldValue !== internalArray) { oldValue = internalArray; oldLength = oldValue.length = 0; changeDetected++ ; } newLength = _AN_Read_length('length', newValue); if (oldLength !== newLength) { changeDetected++ ; oldValue.length = oldLength = newLength; } for (var i = 0; i < newLength; i++ ){ if (oldValue[i] !== newValue[i]) { changeDetected++ ; oldValue[i] = newValue[i]; } } } else { if (oldValue !== internalObject) { oldValue = internalObject = { } ; oldLength = 0; changeDetected++ ; } newLength = 0; for (key in newValue){ if (newValue.hasOwnProperty(key)) { newLength++ ; if (oldValue.hasOwnProperty(key)) { if (oldValue[key] !== newValue[key]) { changeDetected++ ; oldValue[key] = newValue[key]; } } else { oldLength++ ; oldValue[key] = newValue[key]; changeDetected++ ; } } } if (oldLength > newLength) { changeDetected++ ; for (key in oldValue){ if (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) { oldLength-- ; delete oldValue[key]; } } } } return changeDetected; } function $watchCollectionAction(){ listener(newValue, oldValue, self); } return this.$watch($watchCollectionWatch, $watchCollectionAction); } , $digest: function (){ var watch, value, last, watchers, asyncQueue = this.$$asyncQueue, postDigestQueue = this.$$postDigestQueue, length, dirty, ttl = TTL, next, current, target = this, watchLog = [] , logIdx, logMsg, asyncTask; beginPhase('$digest'); lastDirtyWatch = null ; do { dirty = false ; current = target; while (asyncQueue.length){ try { asyncTask = asyncQueue.shift(); asyncTask.scope.$eval(asyncTask.expression); } catch (e) { clearPhase(); $exceptionHandler(e); } lastDirtyWatch = null ; } traverseScopesLoop: do { if ((watchers = current.$$watchers)) { length = _AN_Read_length('length', watchers); while (length-- ){ try { watch = watchers[length]; if (watch) { if ((value = watch.get(current)) !== (last = watch.last) && !(watch.eq? equals(value, last): (typeof value == 'number' && typeof last == 'number' && isNaN(value) && isNaN(last)))) { dirty = true ; lastDirtyWatch = watch; watch.last = watch.eq? copy(value): value; watch.fn(value, ((last === initWatchVal)? value: last), current); if (ttl < 5) { logIdx = 4 - ttl; if (!watchLog[logIdx]) watchLog[logIdx] = [] ; logMsg = (isFunction(watch.exp))? 'fn: ' + (watch.exp.name || watch.exp.toString()): watch.exp; logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last); watchLog[logIdx].push(logMsg); } } else if (watch === lastDirtyWatch) { dirty = false ; break traverseScopesLoop; } } } catch (e) { clearPhase(); $exceptionHandler(e); } } } if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) { while (current !== target && !(next = current.$$nextSibling)){ current = current.$parent; } } } while((current = next))if ((dirty || _AN_Read_length('length', asyncQueue)) && !(ttl-- )) { clearPhase(); throw $rootScopeMinErr('infdig', '{0} $digest() iterations reached. Aborting!\n' + 'Watchers fired in the last 5 iterations: {1}', TTL, toJson(watchLog)) } } while(dirty || _AN_Read_length('length', asyncQueue))clearPhase(); while (postDigestQueue.length){ try { postDigestQueue.shift()(); } catch (e) { $exceptionHandler(e); } } } , $destroy: function (){ if (this.$$destroyed) return ; var parent = this.$parent; this.$broadcast('$destroy'); this.$$destroyed = true ; if (this === $rootScope) return ; forEach(this.$$listenerCount, bind(null , decrementListenerCount, this)); if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null ; } , $eval: function (expr, locals){ return $parse(expr)(this, locals); } , $evalAsync: function (expr){ if (!$rootScope.$$phase && !_AN_Read_length('length', $rootScope.$$asyncQueue)) { $browser.defer(function (){ if ($rootScope.$$asyncQueue.length) { $rootScope.$digest(); } } ); } this.$$asyncQueue.push({ scope: this, expression: expr} ); } , $$postDigest: function (fn){ this.$$postDigestQueue.push(fn); } , $apply: function (expr){ try { beginPhase('$apply'); return this.$eval(expr); } catch (e) { $exceptionHandler(e); } finally{ clearPhase(); try { $rootScope.$digest(); } catch (e) { $exceptionHandler(e); throw e } } } , $on: function (name, listener){ var namedListeners = this.$$listeners[name]; if (!namedListeners) { this.$$listeners[name] = namedListeners = [] ; } namedListeners.push(listener); var current = this; do { if (!current.$$listenerCount[name]) { current.$$listenerCount[name] = 0; } current.$$listenerCount[name]++ ; } while((current = current.$parent))var self = this; return function (){ namedListeners[indexOf(namedListeners, listener)] = null ; decrementListenerCount(self, 1, name); } ; } , $emit: function (name, args){ var empty = [] , namedListeners, scope = this, stopPropagation = false , event = { name: name, targetScope: scope, stopPropagation: function (){ stopPropagation = true ; } , preventDefault: function (){ event.defaultPrevented = true ; } , defaultPrevented: false } , listenerArgs = concat([event] , arguments, 1), i, length; do { namedListeners = scope.$$listeners[name] || empty; event.currentScope = scope; for (i = 0, length = _AN_Read_length('length', namedListeners); i < length; i++ ){ if (!namedListeners[i]) { namedListeners.splice(i, 1); i-- ; length-- ; continue ; } try { namedListeners[i].apply(null , listenerArgs); } catch (e) { $exceptionHandler(e); } } if (stopPropagation) return event; scope = scope.$parent; } while(scope)return event; } , $broadcast: function (name, args){ var target = this, current = target, next = target, event = { name: name, targetScope: target, preventDefault: function (){ event.defaultPrevented = true ; } , defaultPrevented: false } , listenerArgs = concat([event] , arguments, 1), listeners, i, length; while ((current = next)){ event.currentScope = current; listeners = current.$$listeners[name] || [] ; for (i = 0, length = _AN_Read_length('length', listeners); i < length; i++ ){ if (!listeners[i]) { listeners.splice(i, 1); i-- ; length-- ; continue ; } try { listeners[i].apply(null , listenerArgs); } catch (e) { $exceptionHandler(e); } } if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || (current !== target && current.$$nextSibling)))) { while (current !== target && !(next = current.$$nextSibling)){ current = current.$parent; } } } return event; } } ; var $rootScope = new Scope(); return $rootScope; function beginPhase(phase){ if ($rootScope.$$phase) { throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase) } $rootScope.$$phase = phase; } function clearPhase(){ $rootScope.$$phase = null ; } function compileToFn(exp, name){ var fn = $parse(exp); assertArgFn(fn, name); return fn; } function decrementListenerCount(current, count, name){ do { current.$$listenerCount[name] -= count; if (current.$$listenerCount[name] === 0) { delete current.$$listenerCount[name]; } } while((current = current.$parent))} function initWatchVal(){ } } ] ; } function $$SanitizeUriProvider(){ var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, imgSrcSanitizationWhitelist = /^\s*(https?|ftp|file):|data:image\//; this.aHrefSanitizationWhitelist = function (regexp){ if (isDefined(regexp)) { aHrefSanitizationWhitelist = regexp; return this; } return aHrefSanitizationWhitelist; } ; this.imgSrcSanitizationWhitelist = function (regexp){ if (isDefined(regexp)) { imgSrcSanitizationWhitelist = regexp; return this; } return imgSrcSanitizationWhitelist; } ; this.$get = function (){ return function sanitizeUri(uri, isImage){ var regex = isImage? imgSrcSanitizationWhitelist: aHrefSanitizationWhitelist; var normalizedVal; if (!msie || msie >= 8) { normalizedVal = _AN_Read_href('href', urlResolve(uri)); if (normalizedVal !== '' && !normalizedVal.match(regex)) { return 'unsafe:' + normalizedVal; } } return uri; } ; } ; } var $sceMinErr = minErr('$sce'); var SCE_CONTEXTS = { HTML: 'html', CSS: 'css', URL: 'url', RESOURCE_URL: 'resourceUrl', JS: 'js'} ; function escapeForRegexp(s){ return _AN_Call_replace('replace', _AN_Call_replace('replace', s, /([-()\[\]{}+?*.$\^|,:# -1) { throw $sceMinErr('iwcard', 'Illegal sequence *** in string matcher. String: {0}', matcher) } matcher = _AN_Call_replace('replace', _AN_Call_replace('replace', escapeForRegexp(matcher), '\\*\\*', '.*'), '\\*', '[^:/.?&;]*'); return new RegExp('^' + matcher + '$'); } else if (isRegExp(matcher)) { return new RegExp('^' + matcher.source + '$'); } else { throw $sceMinErr('imatcher', 'Matchers may only be "self", string patterns or RegExp objects') } } function adjustMatchers(matchers){ var adjustedMatchers = [] ; if (isDefined(matchers)) { forEach(matchers, function (matcher){ adjustedMatchers.push(adjustMatcher(matcher)); } ); } return adjustedMatchers; } function $SceDelegateProvider(){ this.SCE_CONTEXTS = SCE_CONTEXTS; var resourceUrlWhitelist = ['self'] , resourceUrlBlacklist = [] ; this.resourceUrlWhitelist = function (value){ if (arguments.length) { resourceUrlWhitelist = adjustMatchers(value); } return resourceUrlWhitelist; } ; this.resourceUrlBlacklist = function (value){ if (arguments.length) { resourceUrlBlacklist = adjustMatchers(value); } return resourceUrlBlacklist; } ; this.$get = ['$injector', function ($injector){ var htmlSanitizer = function htmlSanitizer(html){ throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.') } ; if ($injector.has('$sanitize')) { htmlSanitizer = $injector.get('$sanitize'); } function matchUrl(matcher, parsedUrl){ if (matcher === 'self') { return urlIsSameOrigin(parsedUrl); } else { return !!matcher.exec(_AN_Read_href('href', parsedUrl)); } } function isResourceUrlAllowedByPolicy(url){ var parsedUrl = urlResolve(url.toString()); var i, n, allowed = false ; for (i = 0, n = _AN_Read_length('length', resourceUrlWhitelist); i < n; i++ ){ if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { allowed = true ; break ; } } if (allowed) { for (i = 0, n = _AN_Read_length('length', resourceUrlBlacklist); i < n; i++ ){ if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { allowed = false ; break ; } } } return allowed; } function generateHolderType(Base){ var holderType = function TrustedValueHolderType(trustedValue){ this.$$unwrapTrustedValue = function (){ return trustedValue; } ; } ; if (Base) { holderType.prototype = new Base(); } holderType.prototype.valueOf = function sceValueOf(){ return this.$$unwrapTrustedValue(); } ; holderType.prototype.toString = function sceToString(){ return this.$$unwrapTrustedValue().toString(); } ; return holderType; } var trustedValueHolderBase = generateHolderType(), byType = { } ; byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); byType[_AN_Read_url('URL', SCE_CONTEXTS)] = generateHolderType(trustedValueHolderBase); byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[_AN_Read_url('URL', SCE_CONTEXTS)]); function trustAs(type, trustedValue){ var Constructor = (byType.hasOwnProperty(type)? byType[type]: null ); if (!Constructor) { throw $sceMinErr('icontext', 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', type, trustedValue) } if (trustedValue === null || trustedValue === undefined || trustedValue === '') { return trustedValue; } if (typeof trustedValue !== 'string') { throw $sceMinErr('itype', 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', type) } return new Constructor(trustedValue); } function valueOf(maybeTrusted){ if (maybeTrusted instanceof trustedValueHolderBase) { return maybeTrusted.$$unwrapTrustedValue(); } else { return maybeTrusted; } } function getTrusted(type, maybeTrusted){ if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') { return maybeTrusted; } var constructor = (byType.hasOwnProperty(type)? byType[type]: null ); if (constructor && maybeTrusted instanceof constructor) { return maybeTrusted.$$unwrapTrustedValue(); } if (type === SCE_CONTEXTS.RESOURCE_URL) { if (isResourceUrlAllowedByPolicy(maybeTrusted)) { return maybeTrusted; } else { throw $sceMinErr('insecurl', 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', maybeTrusted.toString()) } } else if (type === SCE_CONTEXTS.HTML) { return htmlSanitizer(maybeTrusted); } throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.') } return { trustAs: trustAs, getTrusted: getTrusted, valueOf: valueOf} ; } ] ; } function $SceProvider(){ var enabled = true ; this.enabled = function (value){ if (arguments.length) { enabled = !!value; } return enabled; } ; this.$get = ['$parse', '$sniffer', '$sceDelegate', function ($parse, $sniffer, $sceDelegate){ if (enabled && $sniffer.msie && $sniffer.msieDocumentMode < 8) { throw $sceMinErr('iequirks', 'Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks ' + 'mode. You can fix this by adding the text to the top of your HTML ' + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.') } var sce = copy(SCE_CONTEXTS); sce.isEnabled = function (){ return enabled; } ; sce.trustAs = $sceDelegate.trustAs; sce.getTrusted = $sceDelegate.getTrusted; sce.valueOf = $sceDelegate.valueOf; if (!enabled) { sce.trustAs = sce.getTrusted = function (type, value){ return value; } ; sce.valueOf = identity; } sce.parseAs = function sceParseAs(type, expr){ var parsed = $parse(expr); if (parsed.literal && parsed.constant) { return parsed; } else { return function sceParseAsTrusted(self, locals){ return sce.getTrusted(type, parsed(self, locals)); } ; } } ; var parse = sce.parseAs, getTrusted = sce.getTrusted, trustAs = sce.trustAs; forEach(SCE_CONTEXTS, function (enumValue, name){ var lName = lowercase(name); sce[camelCase("parse_as_" + lName)] = function (expr){ return parse(enumValue, expr); } ; sce[camelCase("get_trusted_" + lName)] = function (value){ return getTrusted(enumValue, value); } ; sce[camelCase("trust_as_" + lName)] = function (value){ return trustAs(enumValue, value); } ; } ); return sce; } ] ; } function $SnifferProvider(){ this.$get = ['$window', '$document', function ($window, $document){ var eventSupport = { } , android = int((/android (\d+)/.exec(lowercase(($window.navigator || { } ).userAgent)) || [] )[1]), boxee = /Boxee/i.test(($window.navigator || { } ).userAgent), document = $document[0] || { } , documentMode = document.documentMode, vendorPrefix, vendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/, bodyStyle = document.body && document.body.style, transitions = false , animations = false , match; if (bodyStyle) { for (var prop in bodyStyle){ if (match = vendorRegex.exec(prop)) { vendorPrefix = match[0]; vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); break ; } } if (!vendorPrefix) { vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; } transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); if (android && (!transitions || !animations)) { transitions = isString(document.body.style.webkitTransition); animations = isString(document.body.style.webkitAnimation); } } return { history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), hashchange: 'onhashchange' in $window && (!documentMode || documentMode > 7), hasEvent: function (event){ if (event == 'input' && msie == 9) return false ; if (isUndefined(eventSupport[event])) { var divElm = _AN_Call_createelement('createElement', document, 'div'); eventSupport[event] = 'on' + event in divElm; } return eventSupport[event]; } , csp: csp(), vendorPrefix: vendorPrefix, transitions: transitions, animations: animations, android: android, msie: msie, msieDocumentMode: documentMode} ; } ] ; } function $TimeoutProvider(){ this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler', function ($rootScope, $browser, $q, $exceptionHandler){ var deferreds = { } ; function timeout(fn, delay, invokeApply){ var deferred = $q.defer(), promise = deferred.promise, skipApply = (isDefined(invokeApply) && !invokeApply), timeoutId; timeoutId = $browser.defer(function (){ try { deferred.resolve(fn()); } catch (e) { deferred.reject(e); $exceptionHandler(e); } finally{ delete deferreds[promise.$$timeoutId]; } if (!skipApply) $rootScope.$apply(); } , delay); promise.$$timeoutId = timeoutId; deferreds[timeoutId] = deferred; return promise; } timeout.cancel = function (promise){ if (promise && promise.$$timeoutId in deferreds) { deferreds[promise.$$timeoutId].reject('canceled'); delete deferreds[promise.$$timeoutId]; return $browser.defer.cancel(promise.$$timeoutId); } return false ; } ; return timeout; } ] ; } var urlParsingNode = _AN_Call_createelement('createElement', document, "a"); var originUrl = urlResolve(_AN_Read_href("href", _AN_Read_location("location", window)), true ); function urlResolve(url, base){ var href = url; if (msie) { _AN_Call_setattribute("setAttribute", urlParsingNode, "href", href); href = _AN_Read_href("href", urlParsingNode); } _AN_Call_setattribute("setAttribute", urlParsingNode, 'href', href); return { href: _AN_Read_href('href', urlParsingNode), protocol: _AN_Read_protocol('protocol', urlParsingNode)? _AN_Call_replace('replace', _AN_Read_protocol('protocol', urlParsingNode), /:$/, ''): '', host: _AN_Read_host('host', urlParsingNode), search: _AN_Read_search('search', urlParsingNode)? _AN_Call_replace('replace', _AN_Read_search('search', urlParsingNode), /^\?/, ''): '', hash: _AN_Read_hash('hash', urlParsingNode)? _AN_Call_replace('replace', _AN_Read_hash('hash', urlParsingNode), /^#/, ''): '', hostname: _AN_Read_hostname('hostname', urlParsingNode), port: _AN_Read_port('port', urlParsingNode), pathname: (_AN_Read_pathname('pathname', urlParsingNode).charAt(0) === '/')? _AN_Read_pathname('pathname', urlParsingNode): '/' + _AN_Read_pathname('pathname', urlParsingNode)} ; } function urlIsSameOrigin(requestUrl){ var parsed = (isString(requestUrl))? urlResolve(requestUrl): requestUrl; return (_AN_Read_protocol('protocol', parsed) === _AN_Read_protocol('protocol', originUrl) && _AN_Read_host('host', parsed) === _AN_Read_host('host', originUrl)); } function $WindowProvider(){ this.$get = valueFn(window); } $FilterProvider.$inject = ['$provide'] ; function $FilterProvider($provide){ var suffix = 'Filter'; function register(name, factory){ if (isObject(name)) { var filters = { } ; forEach(name, function (filter, key){ filters[key] = register(key, filter); } ); return filters; } else { return $provide.factory(name + suffix, factory); } } this.register = register; this.$get = ['$injector', function ($injector){ return function (name){ return $injector.get(name + suffix); } ; } ] ; register('currency', currencyFilter); register('date', dateFilter); register('filter', filterFilter); register('json', jsonFilter); register('limitTo', limitToFilter); register('lowercase', lowercaseFilter); register('number', numberFilter); register('orderBy', orderByFilter); register('uppercase', uppercaseFilter); } function filterFilter(){ return function (array, expression, comparator){ if (!isArray(array)) return array; var comparatorType = typeof (comparator), predicates = [] ; predicates.check = function (value){ for (var j = 0; j < _AN_Read_length('length', predicates); j++ ){ if (!predicates[j](value)) { return false ; } } return true ; } ; if (comparatorType !== 'function') { if (comparatorType === 'boolean' && comparator) { comparator = function (obj, text){ return angular.equals(obj, text); } ; } else { comparator = function (obj, text){ text = ('' + text).toLowerCase(); return ('' + obj).toLowerCase().indexOf(text) > -1; } ; } } var search = function (obj, text){ if (typeof text == 'string' && text.charAt(0) === '!') { return !search(obj, text.substr(1)); } switch (typeof obj){ case "boolean": case "number": case "string": return comparator(obj, text); case "object": switch (typeof text){ case "object": return comparator(obj, text); default : { for (var objKey in obj){ if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) { return true ; } } break ; } } return false ; case "array": for (var i = 0; i < _AN_Read_length("length", obj); i++ ){ if (search(obj[i], text)) { return true ; } } return false ; default : { return false ; } } } ; switch (typeof expression){ case "boolean": case "number": case "string": expression = { $: expression} ; case "object": for (var key in expression){ (function (path){ if (typeof expression[path] == 'undefined') return ; predicates.push(function (value){ return search(path == '$'? value: getter(value, path), expression[path]); } ); } )(key); } break ; case 'function': predicates.push(expression); break ; default : { return array; } } var filtered = [] ; for (var j = 0; j < _AN_Read_length('length', array); j++ ){ var value = array[j]; if (predicates.check(value)) { filtered.push(value); } } return filtered; } ; } currencyFilter.$inject = ['$locale'] ; function currencyFilter($locale){ var formats = $locale.NUMBER_FORMATS; return function (amount, currencySymbol){ if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM; return _AN_Call_replace('replace', formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2), /\u00A4/g, currencySymbol); } ; } numberFilter.$inject = ['$locale'] ; function numberFilter($locale){ var formats = $locale.NUMBER_FORMATS; return function (number, fractionSize){ return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize); } ; } var DECIMAL_SEP = '.'; function formatNumber(number, pattern, groupSep, decimalSep, fractionSize){ if (isNaN(number) || !isFinite(number)) return ''; var isNegative = number < 0; number = Math.abs(number); var numStr = number + '', formatedText = '', parts = [] ; var hasExponent = false ; if (numStr.indexOf('e') !== -1) { var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); if (match && match[2] == '-' && match[3] > fractionSize + 1) { numStr = '0'; } else { formatedText = numStr; hasExponent = true ; } } if (!hasExponent) { var fractionLen = _AN_Read_length('length', (numStr.split(DECIMAL_SEP)[1] || '')); if (isUndefined(fractionSize)) { fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); } var pow = Math.pow(10, fractionSize); number = Math.round(number * pow) / pow; var fraction = ('' + number).split(DECIMAL_SEP); var whole = fraction[0]; fraction = fraction[1] || ''; var i, pos = 0, lgroup = pattern.lgSize, group = pattern.gSize; if (_AN_Read_length('length', whole) >= (lgroup + group)) { pos = _AN_Read_length('length', whole) - lgroup; for (i = 0; i < pos; i++ ){ if ((pos - i) % group === 0 && i !== 0) { formatedText += groupSep; } formatedText += whole.charAt(i); } } for (i = pos; i < _AN_Read_length('length', whole); i++ ){ if ((_AN_Read_length('length', whole) - i) % lgroup === 0 && i !== 0) { formatedText += groupSep; } formatedText += whole.charAt(i); } while (_AN_Read_length('length', fraction) < fractionSize){ fraction += '0'; } if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); } else { if (fractionSize > 0 && number > -1 && number < 1) { formatedText = number.toFixed(fractionSize); } } parts.push(isNegative? pattern.negPre: pattern.posPre); parts.push(formatedText); parts.push(isNegative? pattern.negSuf: pattern.posSuf); return parts.join(''); } function padNumber(num, digits, trim){ var neg = ''; if (num < 0) { neg = '-'; num = - num; } num = '' + num; while (_AN_Read_length('length', num) < digits)num = '0' + num; if (trim) num = num.substr(_AN_Read_length('length', num) - digits); return neg + num; } function dateGetter(name, size, offset, trim){ offset = offset || 0; return function (date){ var value = date['get' + name](); if (offset > 0 || value > - offset) value += offset; if (value === 0 && offset == -12) value = 12; return padNumber(value, size, trim); } ; } function dateStrGetter(name, shortForm){ return function (date, formats){ var value = date['get' + name](); var get = uppercase(shortForm? ('SHORT' + name): name); return formats[get][value]; } ; } function timeZoneGetter(date){ var zone = -1 * date.getTimezoneOffset(); var paddedZone = (zone >= 0)? "+": ""; paddedZone += padNumber(Math[zone > 0? 'floor': 'ceil'](zone / 60), 2) + padNumber(Math.abs(zone % 60), 2); return paddedZone; } function ampmGetter(date, formats){ return date.getHours() < 12? formats.AMPMS[0]: formats.AMPMS[1]; } var DATE_FORMATS = { yyyy: dateGetter('FullYear', 4), yy: dateGetter('FullYear', 2, 0, true ), y: dateGetter('FullYear', 1), MMMM: dateStrGetter('Month'), MMM: dateStrGetter('Month', true ), MM: dateGetter('Month', 2, 1), M: dateGetter('Month', 1, 1), dd: dateGetter('Date', 2), d: dateGetter('Date', 1), HH: dateGetter('Hours', 2), H: dateGetter('Hours', 1), hh: dateGetter('Hours', 2, -12), h: dateGetter('Hours', 1, -12), mm: dateGetter('Minutes', 2), m: dateGetter('Minutes', 1), ss: dateGetter('Seconds', 2), s: dateGetter('Seconds', 1), sss: dateGetter('Milliseconds', 3), EEEE: dateStrGetter('Day'), EEE: dateStrGetter('Day', true ), a: ampmGetter, Z: timeZoneGetter} ; var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/, NUMBER_STRING = /^\-?\d+$/; dateFilter.$inject = ['$locale'] ; function dateFilter($locale){ var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; function jsonStringToDate(string){ var match; if (match = string.match(R_ISO8601_STR)) { var date = new Date(0), tzHour = 0, tzMin = 0, dateSetter = match[8]? date.setUTCFullYear: date.setFullYear, timeSetter = match[8]? date.setUTCHours: date.setHours; if (match[9]) { tzHour = int(match[9] + match[10]); tzMin = int(match[9] + match[11]); } dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3])); var h = int(match[4] || 0) - tzHour; var m = int(match[5] || 0) - tzMin; var s = int(match[6] || 0); var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); timeSetter.call(date, h, m, s, ms); return date; } return string; } return function (date, format){ var text = '', parts = [] , fn, match; format = format || 'mediumDate'; format = $locale.DATETIME_FORMATS[format] || format; if (isString(date)) { if (NUMBER_STRING.test(date)) { date = int(date); } else { date = jsonStringToDate(date); } } if (isNumber(date)) { date = new Date(date); } if (!isDate(date)) { return date; } while (format){ match = DATE_FORMATS_SPLIT.exec(format); if (match) { parts = concat(parts, match, 1); format = parts.pop(); } else { parts.push(format); format = null ; } } forEach(parts, function (value){ fn = DATE_FORMATS[value]; text += fn? fn(date, $locale.DATETIME_FORMATS): _AN_Call_replace('replace', _AN_Call_replace('replace', value, /(^'|'$)/g, ''), /''/g, "'"); } ); return text; } ; } function jsonFilter(){ return function (object){ return toJson(object, true ); } ; } var lowercaseFilter = valueFn(lowercase); var uppercaseFilter = valueFn(uppercase); function limitToFilter(){ return function (input, limit){ if (!isArray(input) && !isString(input)) return input; limit = int(limit); if (isString(input)) { if (limit) { return limit >= 0? input.slice(0, limit): input.slice(limit, _AN_Read_length("length", input)); } else { return ""; } } var out = [] , i, n; if (limit > _AN_Read_length("length", input)) limit = _AN_Read_length("length", input); else if (limit < - _AN_Read_length("length", input)) limit = - _AN_Read_length("length", input); if (limit > 0) { i = 0; n = limit; } else { i = _AN_Read_length("length", input) + limit; n = _AN_Read_length("length", input); } for (; i < n; i++ ){ out.push(input[i]); } return out; } ; } orderByFilter.$inject = ['$parse'] ; function orderByFilter($parse){ return function (array, sortPredicate, reverseOrder){ if (!isArray(array)) return array; if (!sortPredicate) return array; sortPredicate = isArray(sortPredicate)? sortPredicate: [sortPredicate] ; sortPredicate = map(sortPredicate, function (predicate){ var descending = false , get = predicate || identity; if (isString(predicate)) { if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { descending = predicate.charAt(0) == '-'; predicate = predicate.substring(1); } get = $parse(predicate); } return reverseComparator(function (a, b){ return compare(get(a), get(b)); } , descending); } ); var arrayCopy = [] ; for (var i = 0; i < _AN_Read_length('length', array); i++ ){ arrayCopy.push(array[i]); } return arrayCopy.sort(reverseComparator(comparator, reverseOrder)); function comparator(o1, o2){ for (var i = 0; i < _AN_Read_length('length', sortPredicate); i++ ){ var comp = sortPredicate[i](o1, o2); if (comp !== 0) return comp; } return 0; } function reverseComparator(comp, descending){ return toBoolean(descending)? function (a, b){ return comp(b, a); } : comp; } function compare(v1, v2){ var t1 = typeof v1; var t2 = typeof v2; if (t1 == t2) { if (t1 == "string") { v1 = v1.toLowerCase(); v2 = v2.toLowerCase(); } if (v1 === v2) return 0; return v1 < v2? -1: 1; } else { return t1 < t2? -1: 1; } } } ; } function ngDirective(directive){ if (isFunction(directive)) { directive = { link: directive} ; } directive.restrict = directive.restrict || 'AC'; return valueFn(directive); } var htmlAnchorDirective = valueFn({ restrict: 'E', compile: function (element, attr){ if (msie <= 8) { if (!_AN_Read_href('href', attr) && !attr.name) { attr.$set('href', ''); } element.append(document.createComment('IE fix')); } if (!_AN_Read_href('href', attr) && !attr.name) { return function (scope, element){ element.on('click', function (event){ if (!element.attr('href')) { event.preventDefault(); } } ); } ; } } } ); var ngAttributeAliasDirectives = { } ; forEach(BOOLEAN_ATTR, function (propName, attrName){ if (propName == "multiple") return ; var normalized = directiveNormalize('ng-' + attrName); ngAttributeAliasDirectives[normalized] = function (){ return { priority: 100, link: function (scope, element, attr){ scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value){ attr.$set(attrName, !!value); } ); } } ; } ; } ); forEach(['src', 'srcset', 'href'] , function (attrName){ var normalized = directiveNormalize('ng-' + attrName); ngAttributeAliasDirectives[normalized] = function (){ return { priority: 99, link: function (scope, element, attr){ attr.$observe(normalized, function (value){ if (!value) return ; attr.$set(attrName, value); if (msie) element.prop(attrName, attr[attrName]); } ); } } ; } ; } ); var nullFormCtrl = { $addControl: noop, $removeControl: noop, $setValidity: noop, $setDirty: noop, $setPristine: noop} ; FormController.$inject = ['$element', '$attrs', '$scope'] ; function FormController(element, attrs){ var form = this, parentForm = element.parent().controller('form') || nullFormCtrl, invalidCount = 0, errors = form.$error = { } , controls = [] ; form.$name = attrs.name || attrs.ngForm; form.$dirty = false ; form.$pristine = true ; form.$valid = true ; form.$invalid = false ; parentForm.$addControl(form); element.addClass(PRISTINE_CLASS); toggleValidCss(true ); function toggleValidCss(isValid, validationErrorKey){ validationErrorKey = validationErrorKey? '-' + snake_case(validationErrorKey, '-'): ''; element.removeClass((isValid? INVALID_CLASS: VALID_CLASS) + validationErrorKey).addClass((isValid? VALID_CLASS: INVALID_CLASS) + validationErrorKey); } form.$addControl = function (control){ assertNotHasOwnProperty(control.$name, 'input'); controls.push(control); if (control.$name) { form[control.$name] = control; } } ; form.$removeControl = function (control){ if (control.$name && form[control.$name] === control) { delete form[control.$name]; } forEach(errors, function (queue, validationToken){ form.$setValidity(validationToken, true , control); } ); arrayRemove(controls, control); } ; form.$setValidity = function (validationToken, isValid, control){ var queue = errors[validationToken]; if (isValid) { if (queue) { arrayRemove(queue, control); if (!_AN_Read_length('length', queue)) { invalidCount-- ; if (!invalidCount) { toggleValidCss(isValid); form.$valid = true ; form.$invalid = false ; } errors[validationToken] = false ; toggleValidCss(true , validationToken); parentForm.$setValidity(validationToken, true , form); } } } else { if (!invalidCount) { toggleValidCss(isValid); } if (queue) { if (includes(queue, control)) return ; } else { errors[validationToken] = queue = [] ; invalidCount++ ; toggleValidCss(false , validationToken); parentForm.$setValidity(validationToken, false , form); } queue.push(control); form.$valid = false ; form.$invalid = true ; } } ; form.$setDirty = function (){ element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); form.$dirty = true ; form.$pristine = false ; parentForm.$setDirty(); } ; form.$setPristine = function (){ element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); form.$dirty = false ; form.$pristine = true ; forEach(controls, function (control){ control.$setPristine(); } ); } ; } var formDirectiveFactory = function (isNgForm){ return ['$timeout', function ($timeout){ var formDirective = { name: 'form', restrict: isNgForm? 'EAC': 'E', controller: FormController, compile: function (){ return { pre: function (scope, formElement, attr, controller){ if (!_AN_Read_action('action', attr)) { var preventDefaultListener = function (event){ event.preventDefault? event.preventDefault(): event.returnValue = false ; } ; addEventListenerFn(formElement[0], 'submit', preventDefaultListener); formElement.on('$destroy', function (){ $timeout(function (){ removeEventListenerFn(formElement[0], 'submit', preventDefaultListener); } , 0, false ); } ); } var parentFormCtrl = formElement.parent().controller('form'), alias = attr.name || attr.ngForm; if (alias) { setter(scope, alias, controller, alias); } if (parentFormCtrl) { formElement.on('$destroy', function (){ parentFormCtrl.$removeControl(controller); if (alias) { setter(scope, alias, undefined, alias); } extend(controller, nullFormCtrl); } ); } } } ; } } ; return formDirective; } ] ; } ; var formDirective = formDirectiveFactory(); var ngFormDirective = formDirectiveFactory(true ); var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/; var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/; var inputType = { 'text': textInputType, 'number': numberInputType, 'url': urlInputType, 'email': emailInputType, 'radio': radioInputType, 'checkbox': checkboxInputType, 'hidden': noop, 'button': noop, 'submit': noop, 'reset': noop} ; function validate(ctrl, validatorName, validity, value){ ctrl.$setValidity(validatorName, validity); return validity? value: undefined; } function textInputType(scope, element, attr, ctrl, $sniffer, $browser){ if (!$sniffer.android) { var composing = false ; element.on('compositionstart', function (data){ composing = true ; } ); element.on('compositionend', function (){ composing = false ; } ); } var listener = function (){ if (composing) return ; var value = element.val(); if (toBoolean(attr.ngTrim || 'T')) { value = trim(value); } if (ctrl.$viewValue !== value) { if (scope.$$phase) { ctrl.$setViewValue(value); } else { scope.$apply(function (){ ctrl.$setViewValue(value); } ); } } } ; if ($sniffer.hasEvent('input')) { element.on('input', listener); } else { var timeout; var deferListener = function (){ if (!timeout) { timeout = $browser.defer(function (){ listener(); timeout = null ; } ); } } ; element.on('keydown', function (event){ var key = event.keyCode; if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return ; deferListener(); } ); if ($sniffer.hasEvent('paste')) { element.on('paste cut', deferListener); } } element.on('change', listener); ctrl.$render = function (){ element.val(ctrl.$isEmpty(ctrl.$viewValue)? '': ctrl.$viewValue); } ; var pattern = attr.ngPattern, patternValidator, match; if (pattern) { var validateRegex = function (regexp, value){ return validate(ctrl, 'pattern', ctrl.$isEmpty(value) || regexp.test(value), value); } ; match = pattern.match(/^\/(.*)\/([gim]*)$/); if (match) { pattern = new RegExp(match[1], match[2]); patternValidator = function (value){ return validateRegex(pattern, value); } ; } else { patternValidator = function (value){ var patternObj = scope.$eval(pattern); if (!patternObj || !patternObj.test) { throw minErr('ngPattern')('noregexp', 'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern, patternObj, startingTag(element)) } return validateRegex(patternObj, value); } ; } ctrl.$formatters.push(patternValidator); ctrl.$parsers.push(patternValidator); } if (attr.ngMinlength) { var minlength = int(attr.ngMinlength); var minLengthValidator = function (value){ return validate(ctrl, 'minlength', ctrl.$isEmpty(value) || _AN_Read_length('length', value) >= minlength, value); } ; ctrl.$parsers.push(minLengthValidator); ctrl.$formatters.push(minLengthValidator); } if (attr.ngMaxlength) { var maxlength = int(attr.ngMaxlength); var maxLengthValidator = function (value){ return validate(ctrl, 'maxlength', ctrl.$isEmpty(value) || _AN_Read_length('length', value) <= maxlength, value); } ; ctrl.$parsers.push(maxLengthValidator); ctrl.$formatters.push(maxLengthValidator); } } function numberInputType(scope, element, attr, ctrl, $sniffer, $browser){ textInputType(scope, element, attr, ctrl, $sniffer, $browser); ctrl.$parsers.push(function (value){ var empty = ctrl.$isEmpty(value); if (empty || NUMBER_REGEXP.test(value)) { ctrl.$setValidity('number', true ); return value === ''? null : (empty? value: parseFloat(value)); } else { ctrl.$setValidity('number', false ); return undefined; } } ); ctrl.$formatters.push(function (value){ return ctrl.$isEmpty(value)? '': '' + value; } ); if (attr.min) { var minValidator = function (value){ var min = parseFloat(attr.min); return validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value); } ; ctrl.$parsers.push(minValidator); ctrl.$formatters.push(minValidator); } if (attr.max) { var maxValidator = function (value){ var max = parseFloat(attr.max); return validate(ctrl, 'max', ctrl.$isEmpty(value) || value <= max, value); } ; ctrl.$parsers.push(maxValidator); ctrl.$formatters.push(maxValidator); } ctrl.$formatters.push(function (value){ return validate(ctrl, 'number', ctrl.$isEmpty(value) || isNumber(value), value); } ); } function urlInputType(scope, element, attr, ctrl, $sniffer, $browser){ textInputType(scope, element, attr, ctrl, $sniffer, $browser); var urlValidator = function (value){ return validate(ctrl, 'url', ctrl.$isEmpty(value) || URL_REGEXP.test(value), value); } ; ctrl.$formatters.push(urlValidator); ctrl.$parsers.push(urlValidator); } function emailInputType(scope, element, attr, ctrl, $sniffer, $browser){ textInputType(scope, element, attr, ctrl, $sniffer, $browser); var emailValidator = function (value){ return validate(ctrl, 'email', ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value), value); } ; ctrl.$formatters.push(emailValidator); ctrl.$parsers.push(emailValidator); } function radioInputType(scope, element, attr, ctrl){ if (isUndefined(attr.name)) { element.attr('name', nextUid()); } element.on('click', function (){ if (element[0].checked) { scope.$apply(function (){ ctrl.$setViewValue(attr.value); } ); } } ); ctrl.$render = function (){ var value = attr.value; element[0].checked = (value == ctrl.$viewValue); } ; attr.$observe('value', ctrl.$render); } function checkboxInputType(scope, element, attr, ctrl){ var trueValue = attr.ngTrueValue, falseValue = attr.ngFalseValue; if (!isString(trueValue)) trueValue = true ; if (!isString(falseValue)) falseValue = false ; element.on('click', function (){ scope.$apply(function (){ ctrl.$setViewValue(element[0].checked); } ); } ); ctrl.$render = function (){ element[0].checked = ctrl.$viewValue; } ; ctrl.$isEmpty = function (value){ return value !== trueValue; } ; ctrl.$formatters.push(function (value){ return value === trueValue; } ); ctrl.$parsers.push(function (value){ return value? trueValue: falseValue; } ); } var inputDirective = ['$browser', '$sniffer', function ($browser, $sniffer){ return { restrict: 'E', require: '?ngModel', link: function (scope, element, attr, ctrl){ if (ctrl) { (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer, $browser); } } } ; } ] ; var VALID_CLASS = 'ng-valid', INVALID_CLASS = 'ng-invalid', PRISTINE_CLASS = 'ng-pristine', DIRTY_CLASS = 'ng-dirty'; var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', function ($scope, $exceptionHandler, $attr, $element, $parse){ this.$viewValue = Number.NaN; this.$modelValue = Number.NaN; this.$parsers = [] ; this.$formatters = [] ; this.$viewChangeListeners = [] ; this.$pristine = true ; this.$dirty = false ; this.$valid = true ; this.$invalid = false ; this.$name = $attr.name; var ngModelGet = $parse($attr.ngModel), ngModelSet = ngModelGet.assign; if (!ngModelSet) { throw minErr('ngModel')('nonassign', "Expression '{0}' is non-assignable. Element: {1}", $attr.ngModel, startingTag($element)) } this.$render = noop; this.$isEmpty = function (value){ return isUndefined(value) || value === '' || value === null || value !== value; } ; var parentForm = $element.inheritedData('$formController') || nullFormCtrl, invalidCount = 0, $error = this.$error = { } ; $element.addClass(PRISTINE_CLASS); toggleValidCss(true ); function toggleValidCss(isValid, validationErrorKey){ validationErrorKey = validationErrorKey? '-' + snake_case(validationErrorKey, '-'): ''; $element.removeClass((isValid? INVALID_CLASS: VALID_CLASS) + validationErrorKey).addClass((isValid? VALID_CLASS: INVALID_CLASS) + validationErrorKey); } this.$setValidity = function (validationErrorKey, isValid){ if ($error[validationErrorKey] === !isValid) return ; if (isValid) { if ($error[validationErrorKey]) invalidCount-- ; if (!invalidCount) { toggleValidCss(true ); this.$valid = true ; this.$invalid = false ; } } else { toggleValidCss(false ); this.$invalid = true ; this.$valid = false ; invalidCount++ ; } $error[validationErrorKey] = !isValid; toggleValidCss(isValid, validationErrorKey); parentForm.$setValidity(validationErrorKey, isValid, this); } ; this.$setPristine = function (){ this.$dirty = false ; this.$pristine = true ; $element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); } ; this.$setViewValue = function (value){ this.$viewValue = value; if (this.$pristine) { this.$dirty = true ; this.$pristine = false ; $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); parentForm.$setDirty(); } forEach(this.$parsers, function (fn){ value = fn(value); } ); if (this.$modelValue !== value) { this.$modelValue = value; ngModelSet($scope, value); forEach(this.$viewChangeListeners, function (listener){ try { listener(); } catch (e) { $exceptionHandler(e); } } ); } } ; var ctrl = this; $scope.$watch(function ngModelWatch(){ var value = ngModelGet($scope); if (ctrl.$modelValue !== value) { var formatters = ctrl.$formatters, idx = _AN_Read_length('length', formatters); ctrl.$modelValue = value; while (idx-- ){ value = formatters[idx](value); } if (ctrl.$viewValue !== value) { ctrl.$viewValue = value; ctrl.$render(); } } return value; } ); } ] ; var ngModelDirective = function (){ return { require: ['ngModel', '^?form'] , controller: NgModelController, link: function (scope, element, attr, ctrls){ var modelCtrl = ctrls[0], formCtrl = ctrls[1] || nullFormCtrl; formCtrl.$addControl(modelCtrl); scope.$on('$destroy', function (){ formCtrl.$removeControl(modelCtrl); } ); } } ; } ; var ngChangeDirective = valueFn({ require: 'ngModel', link: function (scope, element, attr, ctrl){ ctrl.$viewChangeListeners.push(function (){ scope.$eval(attr.ngChange); } ); } } ); var requiredDirective = function (){ return { require: '?ngModel', link: function (scope, elm, attr, ctrl){ if (!ctrl) return ; attr.required = true ; var validator = function (value){ if (attr.required && ctrl.$isEmpty(value)) { ctrl.$setValidity('required', false ); return ; } else { ctrl.$setValidity('required', true ); return value; } } ; ctrl.$formatters.push(validator); ctrl.$parsers.unshift(validator); attr.$observe('required', function (){ validator(ctrl.$viewValue); } ); } } ; } ; var ngListDirective = function (){ return { require: 'ngModel', link: function (scope, element, attr, ctrl){ var match = /\/(.*)\//.exec(attr.ngList), separator = match && new RegExp(match[1]) || attr.ngList || ','; var parse = function (viewValue){ if (isUndefined(viewValue)) return ; var list = [] ; if (viewValue) { forEach(viewValue.split(separator), function (value){ if (value) list.push(trim(value)); } ); } return list; } ; ctrl.$parsers.push(parse); ctrl.$formatters.push(function (value){ if (isArray(value)) { return value.join(', '); } return undefined; } ); ctrl.$isEmpty = function (value){ return !value || !_AN_Read_length('length', value); } ; } } ; } ; var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; var ngValueDirective = function (){ return { priority: 100, compile: function (tpl, tplAttr){ if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) { return function ngValueConstantLink(scope, elm, attr){ attr.$set('value', scope.$eval(attr.ngValue)); } ; } else { return function ngValueLink(scope, elm, attr){ scope.$watch(attr.ngValue, function valueWatchAction(value){ attr.$set('value', value); } ); } ; } } } ; } ; var ngBindDirective = ngDirective(function (scope, element, attr){ element.addClass('ng-binding').data('$binding', attr.ngBind); scope.$watch(attr.ngBind, function ngBindWatchAction(value){ element.text(value == undefined? '': value); } ); } ); var ngBindTemplateDirective = ['$interpolate', function ($interpolate){ return function (scope, element, attr){ var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate)); element.addClass('ng-binding').data('$binding', interpolateFn); attr.$observe('ngBindTemplate', function (value){ element.text(value); } ); } ; } ] ; var ngBindHtmlDirective = ['$sce', '$parse', function ($sce, $parse){ return function (scope, element, attr){ element.addClass('ng-binding').data('$binding', attr.ngBindHtml); var parsed = $parse(attr.ngBindHtml); function getStringValue(){ return (parsed(scope) || '').toString(); } scope.$watch(getStringValue, function ngBindHtmlWatchAction(value){ element.html($sce.getTrustedHtml(parsed(scope)) || ''); } ); } ; } ] ; function classDirective(name, selector){ name = 'ngClass' + name; return function (){ return { restrict: 'AC', link: function (scope, element, attr){ var oldVal; scope.$watch(attr[name], ngClassWatchAction, true ); attr.$observe('class', function (value){ ngClassWatchAction(scope.$eval(attr[name])); } ); if (name !== 'ngClass') { scope.$watch('$index', function ($index, old$index){ var mod = $index & 1; if (mod !== old$index & 1) { var classes = flattenClasses(scope.$eval(attr[name])); mod === selector? attr.$addClass(classes): attr.$removeClass(classes); } } ); } function ngClassWatchAction(newVal){ if (selector === true || scope.$index % 2 === selector) { var newClasses = flattenClasses(newVal || ''); if (!oldVal) { attr.$addClass(newClasses); } else if (!equals(newVal, oldVal)) { attr.$updateClass(newClasses, flattenClasses(oldVal)); } } oldVal = copy(newVal); } function flattenClasses(classVal){ if (isArray(classVal)) { return classVal.join(' '); } else if (isObject(classVal)) { var classes = [] , i = 0; forEach(classVal, function (v, k){ if (v) { classes.push(k); } } ); return classes.join(' '); } return classVal; } } } ; } ; } var ngClassDirective = classDirective('', true ); var ngClassOddDirective = classDirective('Odd', 0); var ngClassEvenDirective = classDirective('Even', 1); var ngCloakDirective = ngDirective({ compile: function (element, attr){ attr.$set('ngCloak', undefined); element.removeClass('ng-cloak'); } } ); var ngControllerDirective = [function (){ return { scope: true , controller: '@', priority: 500} ; } ] ; var ngEventDirectives = { } ; forEach('click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '), function (name){ var directiveName = directiveNormalize('ng-' + name); ngEventDirectives[directiveName] = ['$parse', function ($parse){ return { compile: function ($element, attr){ var fn = $parse(attr[directiveName]); return function (scope, element, attr){ element.on(lowercase(name), function (event){ scope.$apply(function (){ fn(scope, { $event: event} ); } ); } ); } ; } } ; } ] ; } ); var ngIfDirective = ['$animate', function ($animate){ return { transclude: 'element', priority: 600, terminal: true , restrict: 'A', $$tlb: true , link: function ($scope, $element, $attr, ctrl, $transclude){ var block, childScope; $scope.$watch($attr.ngIf, function ngIfWatchAction(value){ if (toBoolean(value)) { if (!childScope) { childScope = $scope.$new(); $transclude(childScope, function (clone){ clone[clone.length++ ] = document.createComment(' end ngIf: ' + $attr.ngIf + ' '); block = { clone: clone} ; $animate.enter(clone, $element.parent(), $element); } ); } } else { if (childScope) { childScope.$destroy(); childScope = null ; } if (block) { $animate.leave(getBlockElements(block.clone)); block = null ; } } } ); } } ; } ] ; var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce', function ($http, $templateCache, $anchorScroll, $animate, $sce){ return { restrict: 'ECA', priority: 400, terminal: true , transclude: 'element', controller: angular.noop, compile: function (element, attr){ var srcExp = attr.ngInclude || _AN_Read_src('src', attr), onloadExp = attr.onload || '', autoScrollExp = attr.autoscroll; return function (scope, $element, $attr, ctrl, $transclude){ var changeCounter = 0, currentScope, currentElement; var cleanupLastIncludeContent = function (){ if (currentScope) { currentScope.$destroy(); currentScope = null ; } if (currentElement) { $animate.leave(currentElement); currentElement = null ; } } ; scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src){ var afterAnimation = function (){ if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) { $anchorScroll(); } } ; var thisChangeId = ++changeCounter; if (src) { $http.get(src, { cache: $templateCache} ).success(function (response){ if (thisChangeId !== changeCounter) return ; var newScope = scope.$new(); ctrl.template = response; var clone = $transclude(newScope, function (clone){ cleanupLastIncludeContent(); $animate.enter(clone, null , $element, afterAnimation); } ); currentScope = newScope; currentElement = clone; currentScope.$emit('$includeContentLoaded'); scope.$eval(onloadExp); } ).error(function (){ if (thisChangeId === changeCounter) cleanupLastIncludeContent(); } ); scope.$emit('$includeContentRequested'); } else { cleanupLastIncludeContent(); ctrl.template = null ; } } ); } ; } } ; } ] ; var ngIncludeFillContentDirective = ['$compile', function ($compile){ return { restrict: 'ECA', priority: -400, require: 'ngInclude', link: function (scope, $element, $attr, ctrl){ $element.html(ctrl.template); $compile($element.contents())(scope); } } ; } ] ; var ngInitDirective = ngDirective({ priority: 450, compile: function (){ return { pre: function (scope, element, attrs){ scope.$eval(attrs.ngInit); } } ; } } ); var ngNonBindableDirective = ngDirective({ terminal: true , priority: 1000} ); var ngPluralizeDirective = ['$locale', '$interpolate', function ($locale, $interpolate){ var BRACE = /{}/g; return { restrict: 'EA', link: function (scope, element, attr){ var numberExp = attr.count, whenExp = attr.$attr.when && element.attr(attr.$attr.when), offset = attr.offset || 0, whens = scope.$eval(whenExp) || { } , whensExpFns = { } , startSymbol = $interpolate.startSymbol(), endSymbol = $interpolate.endSymbol(), isWhen = /^when(Minus)?(.+)$/; forEach(attr, function (expression, attributeName){ if (isWhen.test(attributeName)) { whens[lowercase(_AN_Call_replace('replace', _AN_Call_replace('replace', attributeName, 'when', ''), 'Minus', '-'))] = element.attr(attr.$attr[attributeName]); } } ); forEach(whens, function (expression, key){ whensExpFns[key] = $interpolate(_AN_Call_replace('replace', expression, BRACE, startSymbol + numberExp + '-' + offset + endSymbol)); } ); scope.$watch(function ngPluralizeWatch(){ var value = parseFloat(scope.$eval(numberExp)); if (!isNaN(value)) { if (!(value in whens)) value = $locale.pluralCat(value - offset); return whensExpFns[value](scope, element, true ); } else { return ''; } } , function ngPluralizeWatchAction(newVal){ element.text(newVal); } ); } } ; } ] ; var ngRepeatDirective = ['$parse', '$animate', function ($parse, $animate){ var NG_REMOVED = '$$NG_REMOVED'; var ngRepeatMinErr = minErr('ngRepeat'); return { transclude: 'element', priority: 1000, terminal: true , $$tlb: true , link: function ($scope, $element, $attr, ctrl, $transclude){ var expression = $attr.ngRepeat; var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/), trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn, lhs, rhs, valueIdentifier, keyIdentifier, hashFnLocals = { $id: hashKey} ; if (!match) { throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", expression) } lhs = match[1]; rhs = match[2]; trackByExp = match[3]; if (trackByExp) { trackByExpGetter = $parse(trackByExp); trackByIdExpFn = function (key, value, index){ if (keyIdentifier) hashFnLocals[keyIdentifier] = key; hashFnLocals[valueIdentifier] = value; hashFnLocals.$index = index; return trackByExpGetter($scope, hashFnLocals); } ; } else { trackByIdArrayFn = function (key, value){ return hashKey(value); } ; trackByIdObjFn = function (key){ return key; } ; } match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/); if (!match) { throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.", lhs) } valueIdentifier = match[3] || match[1]; keyIdentifier = match[2]; var lastBlockMap = { } ; $scope.$watchCollection(rhs, function ngRepeatAction(collection){ var index, length, previousNode = $element[0], nextNode, nextBlockMap = { } , arrayLength, childScope, key, value, trackById, trackByIdFn, collectionKeys, block, nextBlockOrder = [] , elementsToRemove; if (isArrayLike(collection)) { collectionKeys = collection; trackByIdFn = trackByIdExpFn || trackByIdArrayFn; } else { trackByIdFn = trackByIdExpFn || trackByIdObjFn; collectionKeys = [] ; for (key in collection){ if (collection.hasOwnProperty(key) && key.charAt(0) != '$') { collectionKeys.push(key); } } collectionKeys.sort(); } arrayLength = _AN_Read_length('length', collectionKeys); length = nextBlockOrder.length = _AN_Read_length('length', collectionKeys); for (index = 0; index < length; index++ ){ key = (collection === collectionKeys)? index: collectionKeys[index]; value = collection[key]; trackById = trackByIdFn(key, value, index); assertNotHasOwnProperty(trackById, '`track by` id'); if (lastBlockMap.hasOwnProperty(trackById)) { block = lastBlockMap[trackById]; delete lastBlockMap[trackById]; nextBlockMap[trackById] = block; nextBlockOrder[index] = block; } else if (nextBlockMap.hasOwnProperty(trackById)) { forEach(nextBlockOrder, function (block){ if (block && block.scope) lastBlockMap[block.id] = block; } ); throw ngRepeatMinErr('dupes', "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}", expression, trackById) } else { nextBlockOrder[index] = { id: trackById} ; nextBlockMap[trackById] = false ; } } for (key in lastBlockMap){ if (lastBlockMap.hasOwnProperty(key)) { block = lastBlockMap[key]; elementsToRemove = getBlockElements(block.clone); $animate.leave(elementsToRemove); forEach(elementsToRemove, function (element){ element[NG_REMOVED] = true ; } ); block.scope.$destroy(); } } for (index = 0, length = _AN_Read_length("length", collectionKeys); index < length; index++ ){ key = (collection === collectionKeys)? index: collectionKeys[index]; value = collection[key]; block = nextBlockOrder[index]; if (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]); if (block.scope) { childScope = block.scope; nextNode = previousNode; do { nextNode = nextNode.nextSibling; } while(nextNode && nextNode[NG_REMOVED])if (getBlockStart(block) != nextNode) { $animate.move(getBlockElements(block.clone), null , jqLite(previousNode)); } previousNode = getBlockEnd(block); } else { childScope = $scope.$new(); } childScope[valueIdentifier] = value; if (keyIdentifier) childScope[keyIdentifier] = key; childScope.$index = index; childScope.$first = (index === 0); childScope.$last = (index === (arrayLength - 1)); childScope.$middle = !(childScope.$first || childScope.$last); childScope.$odd = !(childScope.$even = (index & 1) === 0); if (!block.scope) { $transclude(childScope, function (clone){ clone[clone.length++ ] = document.createComment(' end ngRepeat: ' + expression + ' '); $animate.enter(clone, null , jqLite(previousNode)); previousNode = clone; block.scope = childScope; block.clone = clone; nextBlockMap[block.id] = block; } ); } } lastBlockMap = nextBlockMap; } ); } } ; function getBlockStart(block){ return block.clone[0]; } function getBlockEnd(block){ return block.clone[_AN_Read_length('length', block.clone) - 1]; } } ] ; var ngShowDirective = ['$animate', function ($animate){ return function (scope, element, attr){ scope.$watch(attr.ngShow, function ngShowWatchAction(value){ $animate[toBoolean(value)? 'removeClass': 'addClass'](element, 'ng-hide'); } ); } ; } ] ; var ngHideDirective = ['$animate', function ($animate){ return function (scope, element, attr){ scope.$watch(attr.ngHide, function ngHideWatchAction(value){ $animate[toBoolean(value)? 'addClass': 'removeClass'](element, 'ng-hide'); } ); } ; } ] ; var ngStyleDirective = ngDirective(function (scope, element, attr){ scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles){ if (oldStyles && (newStyles !== oldStyles)) { forEach(oldStyles, function (val, style){ element.css(style, ''); } ); } if (newStyles) element.css(newStyles); } , true ); } ); var ngSwitchDirective = ['$animate', function ($animate){ return { restrict: 'EA', require: 'ngSwitch', controller: ['$scope', function ngSwitchController(){ this.cases = { } ; } ] , link: function (scope, element, attr, ngSwitchController){ var watchExpr = attr.ngSwitch || attr.on, selectedTranscludes, selectedElements, selectedScopes = [] ; scope.$watch(watchExpr, function ngSwitchWatchAction(value){ for (var i = 0, ii = _AN_Read_length('length', selectedScopes); i < ii; i++ ){ selectedScopes[i].$destroy(); $animate.leave(selectedElements[i]); } selectedElements = [] ; selectedScopes = [] ; if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases["?"] )) { scope.$eval(attr.change); forEach(selectedTranscludes, function (selectedTransclude){ var selectedScope = scope.$new(); selectedScopes.push(selectedScope); selectedTransclude.transclude(selectedScope, function (caseElement){ var anchor = selectedTransclude.element; selectedElements.push(caseElement); $animate.enter(caseElement, anchor.parent(), anchor); } ); } ); } } ); } } ; } ] ; var ngSwitchWhenDirective = ngDirective({ transclude: 'element', priority: 800, require: '^ngSwitch', link: function (scope, element, attrs, ctrl, $transclude){ ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || [] ); ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element} ); } } ); var ngSwitchDefaultDirective = ngDirective({ transclude: 'element', priority: 800, require: '^ngSwitch', link: function (scope, element, attr, ctrl, $transclude){ ctrl.cases["?"] = (ctrl.cases["?"] || [] ); ctrl.cases["?"] .push({ transclude: $transclude, element: element} ); } } ); var ngTranscludeDirective = ngDirective({ controller: ['$element', '$transclude', function ($element, $transclude){ if (!$transclude) { throw minErr('ngTransclude')('orphan', 'Illegal use of ngTransclude directive in the template! ' + 'No parent directive that requires a transclusion found. ' + 'Element: {0}', startingTag($element)) } this.$transclude = $transclude; } ] , link: function ($scope, $element, $attrs, controller){ controller.$transclude(function (clone){ $element.empty(); $element.append(clone); } ); } } ); var scriptDirective = ['$templateCache', function ($templateCache){ return { restrict: 'E', terminal: true , compile: function (element, attr){ if (attr.type == 'text/ng-template') { var templateUrl = attr.id, text = element[0].text; $templateCache.put(templateUrl, text); } } } ; } ] ; var ngOptionsMinErr = minErr('ngOptions'); var ngOptionsDirective = valueFn({ terminal: true } ); var selectDirective = ['$compile', '$parse', function ($compile, $parse){ var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\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]+?))?$/, nullModelCtrl = { $setViewValue: noop} ; return { restrict: 'E', require: ['select', '?ngModel'] , controller: ['$element', '$scope', '$attrs', function ($element, $scope, $attrs){ var self = this, optionsMap = { } , ngModelCtrl = nullModelCtrl, nullOption, unknownOption; self.databound = $attrs.ngModel; self.init = function (ngModelCtrl_, nullOption_, unknownOption_){ ngModelCtrl = ngModelCtrl_; nullOption = nullOption_; unknownOption = unknownOption_; } ; self.addOption = function (value){ assertNotHasOwnProperty(value, '"option value"'); optionsMap[value] = true ; if (ngModelCtrl.$viewValue == value) { $element.val(value); if (unknownOption.parent()) unknownOption.remove(); } } ; self.removeOption = function (value){ if (this.hasOption(value)) { delete optionsMap[value]; if (ngModelCtrl.$viewValue == value) { this.renderUnknownOption(value); } } } ; self.renderUnknownOption = function (val){ var unknownVal = '? ' + hashKey(val) + ' ?'; unknownOption.val(unknownVal); $element.prepend(unknownOption); $element.val(unknownVal); unknownOption.prop('selected', true ); } ; self.hasOption = function (value){ return optionsMap.hasOwnProperty(value); } ; $scope.$on('$destroy', function (){ self.renderUnknownOption = noop; } ); } ] , link: function (scope, element, attr, ctrls){ if (!ctrls[1]) return ; var selectCtrl = ctrls[0], ngModelCtrl = ctrls[1], multiple = attr.multiple, optionsExp = attr.ngOptions, nullOption = false , emptyOption, optionTemplate = jqLite(_AN_Call_createelement('createElement', document, 'option')), optGroupTemplate = jqLite(_AN_Call_createelement('createElement', document, 'optgroup')), unknownOption = optionTemplate.clone(); for (var i = 0, children = element.children(), ii = _AN_Read_length('length', children); i < ii; i++ ){ if (children[i].value === '') { emptyOption = nullOption = children.eq(i); break ; } } _AN_Call_init('init', selectCtrl, ngModelCtrl, nullOption, unknownOption); if (multiple) { ngModelCtrl.$isEmpty = function (value){ return !value || _AN_Read_length('length', value) === 0; } ; } if (optionsExp) setupAsOptions(scope, element, ngModelCtrl); else if (multiple) setupAsMultiple(scope, element, ngModelCtrl); else setupAsSingle(scope, element, ngModelCtrl, selectCtrl); function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl){ ngModelCtrl.$render = function (){ var viewValue = ngModelCtrl.$viewValue; if (selectCtrl.hasOption(viewValue)) { if (unknownOption.parent()) unknownOption.remove(); selectElement.val(viewValue); if (viewValue === '') emptyOption.prop('selected', true ); } else { if (isUndefined(viewValue) && emptyOption) { selectElement.val(''); } else { selectCtrl.renderUnknownOption(viewValue); } } } ; selectElement.on('change', function (){ scope.$apply(function (){ if (unknownOption.parent()) unknownOption.remove(); ngModelCtrl.$setViewValue(selectElement.val()); } ); } ); } function setupAsMultiple(scope, selectElement, ctrl){ var lastView; ctrl.$render = function (){ var items = new HashMap(ctrl.$viewValue); forEach(selectElement.find('option'), function (option){ option.selected = isDefined(items.get(option.value)); } ); } ; scope.$watch(function selectMultipleWatch(){ if (!equals(lastView, ctrl.$viewValue)) { lastView = copy(ctrl.$viewValue); ctrl.$render(); } } ); selectElement.on('change', function (){ scope.$apply(function (){ var array = [] ; forEach(selectElement.find('option'), function (option){ if (option.selected) { array.push(option.value); } } ); ctrl.$setViewValue(array); } ); } ); } function setupAsOptions(scope, selectElement, ctrl){ var match; if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) { throw ngOptionsMinErr('iexp', "Expected expression in form of " + "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" + " but got '{0}'. Element: {1}", optionsExp, startingTag(selectElement)) } var displayFn = $parse(match[2] || match[1]), valueName = match[4] || match[6], keyName = match[5], groupByFn = $parse(match[3] || ''), valueFn = $parse(match[2]? match[1]: valueName), valuesFn = $parse(match[7]), track = match[8], trackFn = track? $parse(match[8]): null , optionGroupsCache = [[{ element: selectElement, label: ''} ] ] ; if (nullOption) { $compile(nullOption)(scope); nullOption.removeClass('ng-scope'); nullOption.remove(); } selectElement.empty(); selectElement.on('change', function (){ scope.$apply(function (){ var optionGroup, collection = valuesFn(scope) || [] , locals = { } , key, value, optionElement, index, groupIndex, length, groupLength, trackIndex; if (multiple) { value = [] ; for (groupIndex = 0, groupLength = _AN_Read_length('length', optionGroupsCache); groupIndex < groupLength; groupIndex++ ){ optionGroup = optionGroupsCache[groupIndex]; for (index = 1, length = _AN_Read_length('length', optionGroup); index < length; index++ ){ if ((optionElement = optionGroup[index].element)[0].selected) { key = optionElement.val(); if (keyName) locals[keyName] = key; if (trackFn) { for (trackIndex = 0; trackIndex < _AN_Read_length('length', collection); trackIndex++ ){ locals[valueName] = collection[trackIndex]; if (trackFn(scope, locals) == key) break ; } } else { locals[valueName] = collection[key]; } value.push(valueFn(scope, locals)); } } } } else { key = selectElement.val(); if (key == '?') { value = undefined; } else if (key === '') { value = null ; } else { if (trackFn) { for (trackIndex = 0; trackIndex < _AN_Read_length('length', collection); trackIndex++ ){ locals[valueName] = collection[trackIndex]; if (trackFn(scope, locals) == key) { value = valueFn(scope, locals); break ; } } } else { locals[valueName] = collection[key]; if (keyName) locals[keyName] = key; value = valueFn(scope, locals); } } } ctrl.$setViewValue(value); } ); } ); ctrl.$render = render; scope.$watch(render); function render(){ var optionGroups = { '': [] } , optionGroupNames = [''] , optionGroupName, optionGroup, option, existingParent, existingOptions, existingOption, modelValue = ctrl.$modelValue, values = valuesFn(scope) || [] , keys = keyName? sortedKeys(values): values, key, groupLength, length, groupIndex, index, locals = { } , selected, selectedSet = false , lastElement, element, label; if (multiple) { if (trackFn && isArray(modelValue)) { selectedSet = new HashMap([] ); for (var trackIndex = 0; trackIndex < _AN_Read_length('length', modelValue); trackIndex++ ){ locals[valueName] = modelValue[trackIndex]; selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]); } } else { selectedSet = new HashMap(modelValue); } } for (index = 0; length = _AN_Read_length('length', keys), index < length; index++ ){ key = index; if (keyName) { key = keys[index]; if (key.charAt(0) === '$') continue ; locals[keyName] = key; } locals[valueName] = values[key]; optionGroupName = groupByFn(scope, locals) || ''; if (!(optionGroup = optionGroups[optionGroupName])) { optionGroup = optionGroups[optionGroupName] = [] ; optionGroupNames.push(optionGroupName); } if (multiple) { selected = isDefined(selectedSet.remove(trackFn? trackFn(scope, locals): valueFn(scope, locals))); } else { if (trackFn) { var modelCast = { } ; modelCast[valueName] = modelValue; selected = trackFn(scope, modelCast) === trackFn(scope, locals); } else { selected = modelValue === valueFn(scope, locals); } selectedSet = selectedSet || selected; } label = displayFn(scope, locals); label = isDefined(label)? label: ''; optionGroup.push({ id: trackFn? trackFn(scope, locals): (keyName? keys[index]: index), label: label, selected: selected} ); } if (!multiple) { if (nullOption || modelValue === null ) { optionGroups[""] .unshift({ id: '', label: '', selected: !selectedSet} ); } else if (!selectedSet) { optionGroups[""] .unshift({ id: '?', label: '', selected: true } ); } } for (groupIndex = 0, groupLength = _AN_Read_length('length', optionGroupNames); groupIndex < groupLength; groupIndex++ ){ optionGroupName = optionGroupNames[groupIndex]; optionGroup = optionGroups[optionGroupName]; if (_AN_Read_length('length', optionGroupsCache) <= groupIndex) { existingParent = { element: optGroupTemplate.clone().attr('label', optionGroupName), label: optionGroup.label} ; existingOptions = [existingParent] ; optionGroupsCache.push(existingOptions); selectElement.append(existingParent.element); } else { existingOptions = optionGroupsCache[groupIndex]; existingParent = existingOptions[0]; if (existingParent.label != optionGroupName) { existingParent.element.attr('label', existingParent.label = optionGroupName); } } lastElement = null ; for (index = 0, length = _AN_Read_length('length', optionGroup); index < length; index++ ){ option = optionGroup[index]; if ((existingOption = existingOptions[index + 1])) { lastElement = existingOption.element; if (existingOption.label !== option.label) { lastElement.text(existingOption.label = option.label); } if (existingOption.id !== option.id) { lastElement.val(existingOption.id = option.id); } if (lastElement[0].selected !== option.selected) { lastElement.prop('selected', (existingOption.selected = option.selected)); } } else { if (option.id === '' && nullOption) { element = nullOption; } else { (element = optionTemplate.clone()).val(option.id).attr('selected', option.selected).text(option.label); } existingOptions.push(existingOption = { element: element, label: option.label, id: option.id, selected: option.selected} ); if (lastElement) { lastElement.after(element); } else { existingParent.element.append(element); } lastElement = element; } } index++ ; while (_AN_Read_length('length', existingOptions) > index){ existingOptions.pop().element.remove(); } } while (_AN_Read_length('length', optionGroupsCache) > groupIndex){ optionGroupsCache.pop()[0].element.remove(); } } } } } ; } ] ; var optionDirective = ['$interpolate', function ($interpolate){ var nullSelectCtrl = { addOption: noop, removeOption: noop} ; return { restrict: 'E', priority: 100, compile: function (element, attr){ if (isUndefined(attr.value)) { var interpolateFn = $interpolate(element.text(), true ); if (!interpolateFn) { attr.$set('value', element.text()); } } return function (scope, element, attr){ var selectCtrlName = '$selectController', parent = element.parent(), selectCtrl = parent.data(selectCtrlName) || parent.parent().data(selectCtrlName); if (selectCtrl && selectCtrl.databound) { element.prop('selected', false ); } else { selectCtrl = nullSelectCtrl; } if (interpolateFn) { scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal){ attr.$set('value', newVal); if (newVal !== oldVal) selectCtrl.removeOption(oldVal); selectCtrl.addOption(newVal); } ); } else { selectCtrl.addOption(attr.value); } element.on('$destroy', function (){ selectCtrl.removeOption(attr.value); } ); } ; } } ; } ] ; var styleDirective = valueFn({ restrict: 'E', terminal: true } ); bindJQuery(); publishExternalAPI(angular); jqLite(document).ready(function (){ angularInit(document, bootstrap); } ); } )(window, document); !angular.$$csp() && angular.element(document).find('head').prepend('');