rsanchez
2014-11-14 8076f3e62e24f23cc8eb866fe18cc6f00ceb02b8
#2021 feature - Added stadard WAR structure to run the application on a
Servlet engine
64 files added
5 files modified
changed files
securis/etc/context/securis.xml patch | view | blame | history
securis/pom.xml patch | view | blame | history
securis/src/main/java/net/curisit/securis/BootstrapListener.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/RestServicesApplication.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/SeCurisServer.java patch | view | blame | history
securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java patch | view | blame | history
securis/src/main/resources/META-INF/persistence.xml patch | view | blame | history
securis/src/main/webapp/WEB-INF/classes/logging.properties patch | view | blame | history
securis/src/main/webapp/WEB-INF/web.xml patch | view | blame | history
securis/src/main/webapp/admin.html patch | view | blame | history
securis/src/main/webapp/css/bootstrap-dialog.css patch | view | blame | history
securis/src/main/webapp/css/bootstrap-theme.css patch | view | blame | history
securis/src/main/webapp/css/bootstrap-theme.css.map patch | view | blame | history
securis/src/main/webapp/css/bootstrap-theme.min.css patch | view | blame | history
securis/src/main/webapp/css/bootstrap.css patch | view | blame | history
securis/src/main/webapp/css/bootstrap.css.map patch | view | blame | history
securis/src/main/webapp/css/bootstrap.min.css patch | view | blame | history
securis/src/main/webapp/css/chosen-spinner.css patch | view | blame | history
securis/src/main/webapp/css/chosen-sprite.png patch | view | blame | history
securis/src/main/webapp/css/chosen-sprite@2x.png patch | view | blame | history
securis/src/main/webapp/css/chosen.css patch | view | blame | history
securis/src/main/webapp/css/font-awesome.min.css patch | view | blame | history
securis/src/main/webapp/css/securis.css patch | view | blame | history
securis/src/main/webapp/css/spinner.gif patch | view | blame | history
securis/src/main/webapp/css/toaster.css patch | view | blame | history
securis/src/main/webapp/favicon.ico patch | view | blame | history
securis/src/main/webapp/fonts/glyphicons-halflings-regular.eot patch | view | blame | history
securis/src/main/webapp/fonts/glyphicons-halflings-regular.svg patch | view | blame | history
securis/src/main/webapp/fonts/glyphicons-halflings-regular.ttf patch | view | blame | history
securis/src/main/webapp/fonts/glyphicons-halflings-regular.woff patch | view | blame | history
securis/src/main/webapp/header.html patch | view | blame | history
securis/src/main/webapp/humans.txt patch | view | blame | history
securis/src/main/webapp/images/securis_100.png patch | view | blame | history
securis/src/main/webapp/images/securis_40.png patch | view | blame | history
securis/src/main/webapp/index.html patch | view | blame | history
securis/src/main/webapp/js/admin.js patch | view | blame | history
securis/src/main/webapp/js/angular/angular-animate.min.js patch | view | blame | history
securis/src/main/webapp/js/angular/angular-animate.min.js.map patch | view | blame | history
securis/src/main/webapp/js/angular/angular-resource.min.js patch | view | blame | history
securis/src/main/webapp/js/angular/angular-resource.min.js.map patch | view | blame | history
securis/src/main/webapp/js/angular/angular-route.min.js patch | view | blame | history
securis/src/main/webapp/js/angular/angular-route.min.js.map patch | view | blame | history
securis/src/main/webapp/js/angular/angular.js patch | view | blame | history
securis/src/main/webapp/js/angular/angular.min.js patch | view | blame | history
securis/src/main/webapp/js/angular/angular.min.js.map patch | view | blame | history
securis/src/main/webapp/js/angular/chosen.js patch | view | blame | history
securis/src/main/webapp/js/angular/toaster.js patch | view | blame | history
securis/src/main/webapp/js/catalogs.js patch | view | blame | history
securis/src/main/webapp/js/catalogs.json patch | view | blame | history
securis/src/main/webapp/js/commons.js patch | view | blame | history
securis/src/main/webapp/js/i18n.js patch | view | blame | history
securis/src/main/webapp/js/lang/messages_es.json patch | view | blame | history
securis/src/main/webapp/js/lang/messages_fr.json patch | view | blame | history
securis/src/main/webapp/js/licenses.js patch | view | blame | history
securis/src/main/webapp/js/login.js patch | view | blame | history
securis/src/main/webapp/js/main.js patch | view | blame | history
securis/src/main/webapp/js/vendor/bootstrap-dialog.js patch | view | blame | history
securis/src/main/webapp/js/vendor/bootstrap.js patch | view | blame | history
securis/src/main/webapp/js/vendor/bootstrap.min.js patch | view | blame | history
securis/src/main/webapp/js/vendor/chosen.jquery.js patch | view | blame | history
securis/src/main/webapp/js/vendor/jquery.min.js patch | view | blame | history
securis/src/main/webapp/js/vendor/jquery.min.map patch | view | blame | history
securis/src/main/webapp/js/vendor/modernizr-2.6.2.min.js patch | view | blame | history
securis/src/main/webapp/js/vendor/store.js patch | view | blame | history
securis/src/main/webapp/js/vendor/store.min.js patch | view | blame | history
securis/src/main/webapp/licenses.html patch | view | blame | history
securis/src/main/webapp/login.html patch | view | blame | history
securis/src/main/webapp/main.html patch | view | blame | history
securis/src/main/webapp/server.js patch | view | blame | history
securis/etc/context/securis.xml
....@@ -0,0 +1,48 @@
1
+<Context >
2
+
3
+ <!-- maxActive: Maximum number of database connections in pool. Make sure you
4
+ configure your mysqld max_connections large enough to handle
5
+ all of your db connections. Set to -1 for no limit.
6
+ -->
7
+
8
+ <!-- maxIdle: Maximum number of idle database connections to retain in pool.
9
+ Set to -1 for no limit. See also the DBCP documentation on this
10
+ and the minEvictableIdleTimeMillis configuration parameter.
11
+ -->
12
+
13
+ <!-- maxWait: Maximum time to wait for a database connection to become available
14
+ in ms, in this example 10 seconds. An Exception is thrown if
15
+ this timeout is exceeded. Set to -1 to wait indefinitely.
16
+ -->
17
+
18
+ <!-- username and password: MySQL username and password for database connections -->
19
+
20
+ <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
21
+ org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
22
+ Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
23
+ -->
24
+
25
+ <!-- url: The JDBC connection url for connecting to your MySQL database.
26
+ -->
27
+<!--
28
+ <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
29
+ <property name="javax.persistence.jdbc.user" value="curis" />
30
+ <property name="javax.persistence.jdbc.password" value="53curi5" />
31
+ <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
32
+
33
+ <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />
34
+ <property name="hibernate.c3p0.acquire_increment" value="1" />
35
+ <property name="hibernate.c3p0.idle_test_period" value="60" />
36
+ <property name="hibernate.c3p0.min_size" value="1" />
37
+ <property name="hibernate.c3p0.max_size" value="10" />
38
+ <property name="hibernate.c3p0.max_statements" value="50" />
39
+ <property name="hibernate.c3p0.timeout" value="0" />
40
+ <property name="hibernate.c3p0.acquireRetryAttempts" value="1" />
41
+ <property name="hibernate.c3p0.acquireRetryDelay" value="250" />
42
+ -->
43
+ <Resource name="jdbc/SeCurisDS" auth="Container" type="javax.sql.DataSource"
44
+ maxActive="100" maxIdle="3" maxWait="5000"
45
+ username="curis" password="cur151T 53curi5" driverClassName="org.h2.Driver"
46
+ url="jdbc:h2:~/.SeCuris/db/securis"/>
47
+
48
+</Context>
securis/pom.xml
....@@ -15,11 +15,7 @@
1515 <groupId>javax.servlet</groupId>
1616 <artifactId>javax.servlet-api</artifactId>
1717 <version>3.1.0</version>
18
- </dependency>
19
- <dependency>
20
- <groupId>org.eclipse.jetty</groupId>
21
- <artifactId>jetty-webapp</artifactId>
22
- <version>9.0.7.v20131107</version>
18
+ <scope>provided</scope>
2319 </dependency>
2420 <dependency>
2521 <groupId>org.jboss.resteasy</groupId>
securis/src/main/java/net/curisit/securis/BootstrapListener.java
....@@ -0,0 +1,39 @@
1
+package net.curisit.securis;
2
+
3
+import java.util.List;
4
+
5
+import javax.servlet.ServletContext;
6
+import javax.servlet.ServletContextEvent;
7
+
8
+import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
9
+
10
+import com.google.inject.Injector;
11
+import com.google.inject.Module;
12
+import com.google.inject.persist.PersistService;
13
+import com.google.inject.persist.jpa.JpaPersistModule;
14
+
15
+public class BootstrapListener extends GuiceResteasyBootstrapServletContextListener {
16
+
17
+ @Override
18
+ public void contextInitialized(ServletContextEvent event) {
19
+ try {
20
+ super.contextInitialized(event);
21
+ } catch (Exception ex) {
22
+ ex.printStackTrace();
23
+ }
24
+ }
25
+
26
+ @SuppressWarnings("unchecked")
27
+ @Override
28
+ protected List<Module> getModules(ServletContext context) {
29
+ List<Module> modules = (List<Module>) super.getModules(context);
30
+ modules.add(new JpaPersistModule("localdb"));
31
+ return modules;
32
+ }
33
+
34
+ @Override
35
+ public void withInjector(Injector injector) {
36
+ injector.getInstance(PersistService.class).start();
37
+ }
38
+
39
+}
securis/src/main/java/net/curisit/securis/RestServicesApplication.java
....@@ -5,9 +5,6 @@
55
66 import javax.ws.rs.core.Application;
77
8
-import net.curisit.securis.services.BasicServices;
9
-import net.curisit.securis.services.LicenseServices;
10
-
118 import org.apache.logging.log4j.LogManager;
129 import org.apache.logging.log4j.Logger;
1310
....@@ -18,8 +15,8 @@
1815 @Override
1916 public Set<Class<?>> getClasses() {
2017 Set<Class<?>> classes = new HashSet<>();
21
- classes.add(LicenseServices.class);
22
- classes.add(BasicServices.class);
18
+ // classes.add(LicenseServices.class);
19
+ // classes.add(BasicServices.class);
2320
2421 LOG.info("Returnes classes for services: {}", classes);
2522 return classes;
securis/src/main/java/net/curisit/securis/SeCurisServer.java
....@@ -1,243 +1,219 @@
11 package net.curisit.securis;
22
3
-import java.io.File;
4
-import java.io.IOException;
5
-import java.lang.management.ManagementFactory;
6
-import java.net.URI;
7
-import java.net.URISyntaxException;
8
-import java.util.Properties;
9
-
10
-import javax.inject.Inject;
11
-import javax.inject.Named;
12
-
13
-import net.curisit.securis.ioc.RequestsModule;
14
-import net.curisit.securis.ioc.SecurisModule;
15
-import net.curisit.securis.utils.Config;
16
-
17
-import org.apache.commons.io.FileUtils;
183 import org.apache.logging.log4j.LogManager;
194 import org.apache.logging.log4j.Logger;
20
-import org.eclipse.jetty.http.HttpVersion;
21
-import org.eclipse.jetty.server.Handler;
22
-import org.eclipse.jetty.server.HttpConfiguration;
23
-import org.eclipse.jetty.server.HttpConnectionFactory;
24
-import org.eclipse.jetty.server.SecureRequestCustomizer;
25
-import org.eclipse.jetty.server.Server;
26
-import org.eclipse.jetty.server.ServerConnector;
27
-import org.eclipse.jetty.server.SslConnectionFactory;
28
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
29
-import org.eclipse.jetty.server.handler.ResourceHandler;
30
-import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
31
-import org.eclipse.jetty.servlet.FilterHolder;
32
-import org.eclipse.jetty.servlet.ServletContextHandler;
33
-import org.eclipse.jetty.servlet.ServletHolder;
34
-import org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener;
35
-import org.eclipse.jetty.util.component.LifeCycle;
36
-import org.eclipse.jetty.util.resource.Resource;
37
-import org.eclipse.jetty.util.ssl.SslContextFactory;
38
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
39
-import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
40
-import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
41
-
42
-import com.google.inject.Guice;
43
-import com.google.inject.Injector;
44
-import com.google.inject.Key;
45
-import com.google.inject.name.Names;
46
-import com.google.inject.persist.PersistFilter;
47
-import com.google.inject.persist.jpa.JpaPersistModule;
485
496 public class SeCurisServer {
507
518 private static final Logger LOG = LogManager.getLogger(SeCurisServer.class);
529 private static final Logger CONSOLE = LogManager.getLogger("console");
53
-
54
- private static final String PID_FILE = System.getProperty("user.home") + "/.SeCuris/securis-server.pid";
55
-
56
- private static Server server;
57
- private static Injector injector = null;
58
-
59
- @Inject
60
- @Named("base-uri")
61
- private URI uri;
62
-
63
- private static void showHelp() {
64
- CONSOLE.info("Execute SeCuris server using:");
65
- CONSOLE.info(" $ ./securis-server.sh {start|stop}");
66
- }
67
-
68
- public static void main(String[] args) throws Exception {
69
- String command;
70
- if (args.length > 0) {
71
- command = args[0].toLowerCase();
72
- } else {
73
- command = "start";
74
- }
75
-
76
- switch (command) {
77
- case "start":
78
- startServer();
79
- break;
80
- case "stop":
81
- stopServer();
82
- break;
83
-
84
- default:
85
- showHelp();
86
- System.exit(-1);
87
- }
88
- }
89
-
90
- private static void stopServer() {
91
- if (!new File(PID_FILE).exists()) {
92
- CONSOLE.error("SeCuris server is NOT running or PID file is missing");
93
- System.exit(-3);
94
- }
95
- try {
96
- int pid = Integer.parseInt(FileUtils.readFileToString(new File(PID_FILE)));
97
- Runtime.getRuntime().exec("kill -SIGINT " + pid);
98
- new File(PID_FILE).delete();
99
- CONSOLE.info("SeCuris server process stopped sucessfully (PID: {})", pid);
100
- } catch (NumberFormatException | IOException e) {
101
- LOG.error("Error getting SeCuris server process PID from file: {}", PID_FILE);
102
- }
103
- }
104
-
105
- private static void startServer() {
106
-
107
- if (new File(PID_FILE).exists()) {
108
- try {
109
- CONSOLE.error("SeCuris server is already running with PID: {}", FileUtils.readFileToString(new File(PID_FILE)));
110
- } catch (IOException e) {
111
- LOG.error("Unexpected error", e);
112
- }
113
- System.exit(-2);
114
- }
115
-
116
- SecurisModule securisModule = new SecurisModule();
117
- JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");
118
- Properties props = new Properties();
119
- props.put("javax.persistence.jdbc.password", securisModule.getPassword());
120
- props.put("javax.persistence.jdbc.url", securisModule.getUrl(securisModule.getAppDir()));
121
- // LOG.info("BD Url: {} {}",
122
- // securisModule.getUrl(securisModule.getAppDir()),
123
- // securisModule.getPassword());
124
- jpaPersistModule.properties(props);
125
-
126
- injector = Guice.createInjector(securisModule, new RequestsModule(), jpaPersistModule);
127
-
128
- try {
129
- startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
130
-
131
- } catch (SeCurisException e) {
132
- CONSOLE.error("Error launching the SeCuris server, {}", e);
133
- }
134
- }
135
-
136
- private static void savePID() throws SeCurisException {
137
- String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
138
- // runtimeName contains something like: "12345@localhost"
139
- String pid = runtimeName.substring(0, runtimeName.indexOf('@'));
140
- try {
141
- FileUtils.writeStringToFile(new File(PID_FILE), pid);
142
- CONSOLE.info("SeCuris server process started sucessfully (PID: {})", pid);
143
- } catch (IOException e) {
144
- LOG.error("Error saving pid file", e);
145
- throw new SeCurisException("Error saving pid file");
146
- }
147
- }
148
-
149
- private static void startServer(URI uri) throws SeCurisException {
150
- System.out.println("Starting jetty...");
151
-
152
- QueuedThreadPool threadPool = new QueuedThreadPool();
153
- threadPool.setMaxThreads(50);
154
-
155
- server = new Server();
156
-
157
- ServerConnector httpConnector = new ServerConnector(server);
158
- httpConnector.setPort(Config.getInt(Config.KEYS.SERVER_PORT, 9080));
159
- httpConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME, "0.0.0.0"));
160
- server.addConnector(httpConnector);
161
-
162
- ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
163
- context.setContextPath("/");
164
- context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
165
-
166
- context.setInitParameter("resteasy.role.based.security", "true");
167
- context.setInitParameter("resteasy.providers", DefaultExceptionHandler.class.getName());
168
- context.addFilter(new FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);
169
- ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
170
- sh.setName("resteasy");
171
- context.addServlet(sh, "/*");
172
-
173
- ResourceHandler staticResources = new ResourceHandler();
174
- try {
175
- staticResources.setBaseResource(Resource.newResource(SeCurisServer.class.getResource("/static").toURI()));
176
- } catch (IOException | URISyntaxException e) {
177
- LOG.error("Error configuring static resources", e);
178
- throw new SeCurisException("Error configuring static resources");
179
- }
180
- staticResources.setWelcomeFiles(new String[] {
181
- "/main.html"
182
- });
183
- context.setHandler(staticResources);
184
-
185
- ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
186
- context.setErrorHandler(errorHandler);
187
- ContextHandlerCollection contexts = new ContextHandlerCollection();
188
-
189
- contexts.setHandlers(new Handler[] {
190
- staticResources, context
191
- });
192
-
193
- HttpConfiguration http_config = new HttpConfiguration();
194
- http_config.setSecureScheme("https");
195
- http_config.setSecurePort(Config.getInt(Config.KEYS.SERVER_SSL_PORT, 9443));
196
- http_config.setOutputBufferSize(32768);
197
- http_config.setSendServerVersion(true);
198
- http_config.setSendDateHeader(false);
199
-
200
- HttpConfiguration https_config = new HttpConfiguration(http_config);
201
- https_config.addCustomizer(new SecureRequestCustomizer());
202
-
203
- SslContextFactory sslContextFactory = new SslContextFactory();
204
- sslContextFactory.setKeyStorePath(Config.get(Config.KEYS.KEYSTORE_PATH));
205
- sslContextFactory.setKeyStoreType(Config.get(Config.KEYS.KEYSTORE_TYPE, "JKS"));
206
- sslContextFactory.setKeyStorePassword(Config.get(Config.KEYS.KEYSTORE_PASSWORD, ""));
207
- // sslContextFactory.setCertAlias("1");
208
- // sslContextFactory.setKeyManagerPassword("curist3c");
209
- // sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");
210
- // sslContextFactory.setTrustStorePassword("curist3c");
211
- sslContextFactory.checkKeyStore();
212
- sslContextFactory.setNeedClientAuth(false);
213
-
214
- ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
215
- new HttpConnectionFactory(https_config));
216
- sslConnector.setPort(Config.getInt(Config.KEYS.SERVER_SSL_PORT, 9443));
217
- sslConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME, "0.0.0.0"));
218
- server.addConnector(sslConnector);
219
-
220
- server.setHandler(context);
221
- server.setStopAtShutdown(true);
222
- server.addLifeCycleListener(new ServerStoppedListener());
223
- try {
224
- server.start();
225
- savePID();
226
- CONSOLE.info("Server running in: {}", String.format("http://%s:%d", httpConnector.getHost(), httpConnector.getPort()));
227
- server.join();
228
- } catch (Exception e) {
229
- LOG.error("Error starting SeCurisServer", e);
230
- throw new SeCurisException("Error starting SeCurisServer");
231
- }
232
-
233
- }
234
-
235
- static class ServerStoppedListener extends AbstractLifeCycleListener {
236
- @Override
237
- public void lifeCycleStopped(LifeCycle event) {
238
- if (new File(PID_FILE).exists())
239
- new File(PID_FILE).delete();
240
- }
241
- }
10
+ //
11
+ // private static final String PID_FILE = System.getProperty("user.home") +
12
+ // "/.SeCuris/securis-server.pid";
13
+ //
14
+ // private static Server server;
15
+ // private static Injector injector = null;
16
+ //
17
+ // @Inject
18
+ // @Named("base-uri")
19
+ // private URI uri;
20
+ //
21
+ // private static void showHelp() {
22
+ // CONSOLE.info("Execute SeCuris server using:");
23
+ // CONSOLE.info(" $ ./securis-server.sh {start|stop}");
24
+ // }
25
+ //
26
+ // public static void main(String[] args) throws Exception {
27
+ // String command;
28
+ // if (args.length > 0) {
29
+ // command = args[0].toLowerCase();
30
+ // } else {
31
+ // command = "start";
32
+ // }
33
+ //
34
+ // switch (command) {
35
+ // case "start":
36
+ // startServer();
37
+ // break;
38
+ // case "stop":
39
+ // stopServer();
40
+ // break;
41
+ //
42
+ // default:
43
+ // showHelp();
44
+ // System.exit(-1);
45
+ // }
46
+ // }
47
+ //
48
+ // private static void stopServer() {
49
+ // if (!new File(PID_FILE).exists()) {
50
+ // CONSOLE.error("SeCuris server is NOT running or PID file is missing");
51
+ // System.exit(-3);
52
+ // }
53
+ // try {
54
+ // int pid = Integer.parseInt(FileUtils.readFileToString(new
55
+ // File(PID_FILE)));
56
+ // Runtime.getRuntime().exec("kill -SIGINT " + pid);
57
+ // new File(PID_FILE).delete();
58
+ // CONSOLE.info("SeCuris server process stopped sucessfully (PID: {})",
59
+ // pid);
60
+ // } catch (NumberFormatException | IOException e) {
61
+ // LOG.error("Error getting SeCuris server process PID from file: {}",
62
+ // PID_FILE);
63
+ // }
64
+ // }
65
+ //
66
+ // private static void startServer() {
67
+ //
68
+ // if (new File(PID_FILE).exists()) {
69
+ // try {
70
+ // CONSOLE.error("SeCuris server is already running with PID: {}",
71
+ // FileUtils.readFileToString(new File(PID_FILE)));
72
+ // } catch (IOException e) {
73
+ // LOG.error("Unexpected error", e);
74
+ // }
75
+ // System.exit(-2);
76
+ // }
77
+ //
78
+ // SecurisModule securisModule = new SecurisModule();
79
+ // JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");
80
+ // Properties props = new Properties();
81
+ // props.put("javax.persistence.jdbc.password",
82
+ // securisModule.getPassword());
83
+ // props.put("javax.persistence.jdbc.url",
84
+ // securisModule.getUrl(securisModule.getAppDir()));
85
+ // // LOG.info("BD Url: {} {}",
86
+ // // securisModule.getUrl(securisModule.getAppDir()),
87
+ // // securisModule.getPassword());
88
+ // jpaPersistModule.properties(props);
89
+ //
90
+ // injector = Guice.createInjector(securisModule, new RequestsModule(),
91
+ // jpaPersistModule);
92
+ //
93
+ // try {
94
+ // startServer(injector.getInstance(Key.get(URI.class,
95
+ // Names.named("base-uri"))));
96
+ //
97
+ // } catch (SeCurisException e) {
98
+ // CONSOLE.error("Error launching the SeCuris server, {}", e);
99
+ // }
100
+ // }
101
+ //
102
+ // private static void savePID() throws SeCurisException {
103
+ // String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
104
+ // // runtimeName contains something like: "12345@localhost"
105
+ // String pid = runtimeName.substring(0, runtimeName.indexOf('@'));
106
+ // try {
107
+ // FileUtils.writeStringToFile(new File(PID_FILE), pid);
108
+ // CONSOLE.info("SeCuris server process started sucessfully (PID: {})",
109
+ // pid);
110
+ // } catch (IOException e) {
111
+ // LOG.error("Error saving pid file", e);
112
+ // throw new SeCurisException("Error saving pid file");
113
+ // }
114
+ // }
115
+ //
116
+ // private static void startServer(URI uri) throws SeCurisException {
117
+ // System.out.println("Starting jetty...");
118
+ //
119
+ // QueuedThreadPool threadPool = new QueuedThreadPool();
120
+ // threadPool.setMaxThreads(50);
121
+ //
122
+ // server = new Server();
123
+ //
124
+ // ServerConnector httpConnector = new ServerConnector(server);
125
+ // httpConnector.setPort(Config.getInt(Config.KEYS.SERVER_PORT, 9080));
126
+ // httpConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME,
127
+ // "0.0.0.0"));
128
+ // server.addConnector(httpConnector);
129
+ //
130
+ // ServletContextHandler context = new
131
+ // ServletContextHandler(ServletContextHandler.SESSIONS);
132
+ // context.setContextPath("/");
133
+ // context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
134
+ //
135
+ // context.setInitParameter("resteasy.role.based.security", "true");
136
+ // context.setInitParameter("resteasy.providers",
137
+ // DefaultExceptionHandler.class.getName());
138
+ // context.addFilter(new
139
+ // FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);
140
+ // ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
141
+ // sh.setName("resteasy");
142
+ // context.addServlet(sh, "/*");
143
+ //
144
+ // ResourceHandler staticResources = new ResourceHandler();
145
+ // try {
146
+ // staticResources.setBaseResource(Resource.newResource(SeCurisServer.class.getResource("/static").toURI()));
147
+ // } catch (IOException | URISyntaxException e) {
148
+ // LOG.error("Error configuring static resources", e);
149
+ // throw new SeCurisException("Error configuring static resources");
150
+ // }
151
+ // staticResources.setWelcomeFiles(new String[] {
152
+ // "/main.html"
153
+ // });
154
+ // context.setHandler(staticResources);
155
+ //
156
+ // ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
157
+ // context.setErrorHandler(errorHandler);
158
+ // ContextHandlerCollection contexts = new ContextHandlerCollection();
159
+ //
160
+ // contexts.setHandlers(new Handler[] {
161
+ // staticResources, context
162
+ // });
163
+ //
164
+ // HttpConfiguration http_config = new HttpConfiguration();
165
+ // http_config.setSecureScheme("https");
166
+ // http_config.setSecurePort(Config.getInt(Config.KEYS.SERVER_SSL_PORT,
167
+ // 9443));
168
+ // http_config.setOutputBufferSize(32768);
169
+ // http_config.setSendServerVersion(true);
170
+ // http_config.setSendDateHeader(false);
171
+ //
172
+ // HttpConfiguration https_config = new HttpConfiguration(http_config);
173
+ // https_config.addCustomizer(new SecureRequestCustomizer());
174
+ //
175
+ // SslContextFactory sslContextFactory = new SslContextFactory();
176
+ // sslContextFactory.setKeyStorePath(Config.get(Config.KEYS.KEYSTORE_PATH));
177
+ // sslContextFactory.setKeyStoreType(Config.get(Config.KEYS.KEYSTORE_TYPE,
178
+ // "JKS"));
179
+ // sslContextFactory.setKeyStorePassword(Config.get(Config.KEYS.KEYSTORE_PASSWORD,
180
+ // ""));
181
+ // // sslContextFactory.setCertAlias("1");
182
+ // // sslContextFactory.setKeyManagerPassword("curist3c");
183
+ // // sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");
184
+ // // sslContextFactory.setTrustStorePassword("curist3c");
185
+ // sslContextFactory.checkKeyStore();
186
+ // sslContextFactory.setNeedClientAuth(false);
187
+ //
188
+ // ServerConnector sslConnector = new ServerConnector(server, new
189
+ // SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
190
+ // new HttpConnectionFactory(https_config));
191
+ // sslConnector.setPort(Config.getInt(Config.KEYS.SERVER_SSL_PORT, 9443));
192
+ // sslConnector.setHost(Config.get(Config.KEYS.SERVER_HOSTNAME, "0.0.0.0"));
193
+ // server.addConnector(sslConnector);
194
+ //
195
+ // server.setHandler(context);
196
+ // server.setStopAtShutdown(true);
197
+ // server.addLifeCycleListener(new ServerStoppedListener());
198
+ // try {
199
+ // server.start();
200
+ // savePID();
201
+ // CONSOLE.info("Server running in: {}", String.format("http://%s:%d",
202
+ // httpConnector.getHost(), httpConnector.getPort()));
203
+ // server.join();
204
+ // } catch (Exception e) {
205
+ // LOG.error("Error starting SeCurisServer", e);
206
+ // throw new SeCurisException("Error starting SeCurisServer");
207
+ // }
208
+ //
209
+ // }
210
+ //
211
+ // static class ServerStoppedListener extends AbstractLifeCycleListener {
212
+ // @Override
213
+ // public void lifeCycleStopped(LifeCycle event) {
214
+ // if (new File(PID_FILE).exists())
215
+ // new File(PID_FILE).delete();
216
+ // }
217
+ // }
242218
243219 }
securis/src/main/java/net/curisit/securis/ioc/RequestsModule.java
....@@ -11,12 +11,7 @@
1111 import net.curisit.securis.services.PackResource;
1212 import net.curisit.securis.services.UserResource;
1313
14
-import org.eclipse.jetty.server.Authentication.User;
15
-import org.jboss.resteasy.plugins.guice.RequestScoped;
1614 import org.jboss.resteasy.plugins.guice.ext.RequestScopeModule;
17
-import org.jboss.resteasy.spi.ResteasyProviderFactory;
18
-
19
-import com.google.inject.Provides;
2015
2116 public class RequestsModule extends RequestScopeModule {
2217
....@@ -37,11 +32,10 @@
3732 bind(LicenseResource.class);
3833 bind(PackResource.class);
3934 }
40
-
41
- @Provides
42
- @RequestScoped
43
- public User provideUser() {
44
- return ResteasyProviderFactory.getContextData(User.class);
45
- }
35
+ // @Provides
36
+ // @RequestScoped
37
+ // public User provideUser() {
38
+ // return ResteasyProviderFactory.getContextData(User.class);
39
+ // }
4640
4741 }
securis/src/main/resources/META-INF/persistence.xml
....@@ -5,28 +5,16 @@
55 <persistence-unit name="localdb" transaction-type="RESOURCE_LOCAL">
66 <description>SeCuris LocalDB</description>
77 <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
8
- <!-- <jta-data-source>java:/DefaultDS</jta-data-source> -->
8
+
9
+ <jta-data-source>java:comp/env/jdbc/SeCurisDS</jta-data-source>
910
1011 <!-- <class>net.curisit.securis.db.UserSettingsUnits</class> -->
1112
1213 <properties>
13
- <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
14
-<!-- <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/.SeCuris/db/securis" /> -->
15
- <property name="javax.persistence.jdbc.user" value="curis" />
16
- <property name="javax.persistence.jdbc.password" value="53curi5" />
1714 <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
15
+ <property name="hibernate.connection.datasource" value="java:comp/env/jdbc/SeCurisDS"/>
1816
19
- <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />
20
- <property name="hibernate.c3p0.acquire_increment" value="1" />
21
- <property name="hibernate.c3p0.idle_test_period" value="60" />
22
- <property name="hibernate.c3p0.min_size" value="1" />
23
- <property name="hibernate.c3p0.max_size" value="10" />
24
- <property name="hibernate.c3p0.max_statements" value="50" />
25
- <property name="hibernate.c3p0.timeout" value="0" />
26
- <property name="hibernate.c3p0.acquireRetryAttempts" value="1" />
27
- <property name="hibernate.c3p0.acquireRetryDelay" value="250" />
28
-
29
- <property name="hibernate.show_sql" value="false" />
17
+ <property name="hibernate.show_sql" value="true" />
3018 </properties>
3119
3220 </persistence-unit>
securis/src/main/webapp/WEB-INF/classes/logging.properties
....@@ -0,0 +1 @@
1
+org.apache.catalina.level=INFO
securis/src/main/webapp/WEB-INF/web.xml
....@@ -0,0 +1,94 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!--
3
+ Licensed to the Apache Software Foundation (ASF) under one or more
4
+ contributor license agreements. See the NOTICE file distributed with
5
+ this work for additional information regarding copyright ownership.
6
+ The ASF licenses this file to You under the Apache License, Version 2.0
7
+ (the "License"); you may not use this file except in compliance with
8
+ the License. You may obtain a copy of the License at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ Unless required by applicable law or agreed to in writing, software
13
+ distributed under the License is distributed on an "AS IS" BASIS,
14
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ See the License for the specific language governing permissions and
16
+ limitations under the License.
17
+-->
18
+
19
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
20
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
21
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
22
+ http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
23
+ version="3.0"
24
+ metadata-complete="true">
25
+
26
+ <display-name>SeCuris Server</display-name>
27
+ <description>
28
+ SeCuris Server application with client API and administration GUI
29
+ </description>
30
+
31
+
32
+ <context-param>
33
+ <param-name>resteasy.guice.modules</param-name>
34
+ <param-value>net.curisit.securis.ioc.SecurisModule,net.curisit.securis.ioc.RequestsModule</param-value>
35
+ </context-param>
36
+ <context-param>
37
+ <param-name>resteasy.role.based.security</param-name>
38
+ <param-value>true</param-value>
39
+ </context-param>
40
+ <context-param>
41
+ <param-name>resteasy.providers</param-name>
42
+ <param-value>net.curisit.securis.DefaultExceptionHandler</param-value>
43
+ </context-param>
44
+
45
+
46
+ <filter>
47
+ <filter-name>Resteasy</filter-name>
48
+ <filter-class>
49
+ org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
50
+ </filter-class>
51
+ <init-param>
52
+ <param-name>javax.ws.rs.Application</param-name>
53
+ <param-value>net.curisit.securis.RestServicesApplication</param-value>
54
+ </init-param>
55
+ </filter>
56
+
57
+ <filter-mapping>
58
+ <filter-name>Resteasy</filter-name>
59
+ <url-pattern>/*</url-pattern>
60
+ </filter-mapping>
61
+
62
+
63
+ <listener>
64
+ <listener-class>
65
+ net.curisit.securis.BootstrapListener
66
+ </listener-class>
67
+ </listener>
68
+
69
+ <welcome-file-list>
70
+ <welcome-file>/main.html</welcome-file>
71
+ </welcome-file-list>
72
+
73
+
74
+ <!-- Security roles referenced by this web application -->
75
+ <security-role>
76
+ <description>
77
+ Advance users, customers
78
+ </description>
79
+ <role-name>advance</role-name>
80
+ </security-role>
81
+ <security-role>
82
+ <description>
83
+ Administrator role
84
+ </description>
85
+ <role-name>admin</role-name>
86
+ </security-role>
87
+
88
+<resource-env-ref>
89
+ <resource-env-ref-name>jdbc/SeCurisDS</resource-env-ref-name>
90
+ <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
91
+ <res-auth>Container</res-auth>
92
+</resource-env-ref>
93
+
94
+</web-app>
securis/src/main/webapp/admin.html
....@@ -0,0 +1,143 @@
1
+
2
+ <div ng-include="'header.html'" ></div>
3
+
4
+ <div class="container">
5
+ <div class="col-md-12">&nbsp;</div>
6
+ <div class="col-md-2">
7
+
8
+ <ul class="nav nav-pills nav-stacked">
9
+ <li ng-repeat="catalog in catalogsList" ng-class="{active: $index === catalogIndex}"><a ng-click="selectCatalog($index)" ng-bind="catalog.name"></a></li>
10
+ </ul>
11
+
12
+ </div>
13
+ <div class="col-md-10">
14
+ <div id="toolbarAndForm" ng-controller="CatalogFormCtrl">
15
+ <nav class="navbar navbar-default navbar-static-top">
16
+ <!-- Brand and toggle get grouped for better mobile display -->
17
+ <div class="navbar-header">
18
+ <a class="navbar-brand" ng-bind="catalogMetadata.name"></a>
19
+ </div>
20
+
21
+ <!-- Collect the nav links, forms, and other content for toggling -->
22
+ <div class="collapse navbar-collapse"
23
+ id="bs-example-navbar-collapse-1">
24
+ <ul class="nav navbar-nav">
25
+ <li><a i18n ng-click="editNew()"><span class="glyphicon glyphicon-plus"></span>
26
+ New</a></li>
27
+ <li><a i18n ng-click="cancel()"> <span
28
+ class="glyphicon glyphicon-ban-circle"></span> Cancel
29
+ </a></li>
30
+ </ul>
31
+ <div class="navbar-form navbar-right">
32
+ <div class="input-group input-group-sm">
33
+ <span class="input-group-addon glyphicon glyphicon-search" style="top: 0px;"></span>
34
+ <input type="text" class="form-control" placeholder="Search" ng-model="$parent.searchText" >
35
+ <span class="btn input-group-addon glyphicon glyphicon-remove" ng-click="$parent.searchText = ''" style="top: 0px;"></span>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </nav>
40
+
41
+ <div class="panel panel-default animate-show ng-hide" ng-show="showForm">
42
+ <form role="form" class="form-horizontal " name="catalogForm" id="catalogForm" ng-submit="saveCatalog()" >
43
+<!-- <pre>formu: {{formu | json}}</pre>-->
44
+ <div class="form-group" ng-repeat="field in catalogMetadata.fields" ng-if="(!isNew || !field.autogenerate) && !field.listingOnly">
45
+ <label class="col-md-3 control-label" for="{{field.name}}">{{field.display}}</label>
46
+ <div class="col-md-5">
47
+ <div ng-switch on="inputType(field)">
48
+ <input catalog-field ng-switch-when="normal" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder=""
49
+ class="form-control" ng-model="formu[field.name]" ng-required="field.mandatory" ng-maxlength="{{field.maxlength}}" />
50
+ <input catalog-field ng-switch-when="password" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder=""
51
+ class="form-control" ng-model="formu[field.name]" ng-required="field.mandatory" ng-maxlength="{{field.maxlength}}" />
52
+ <textarea catalog-field ng-switch-when="textarea" type="{{field.type}}" id="{{field.name}}" name="{{field.name}}" placeholder=""
53
+ class="form-control" ng-model="formu[field.name]" rows="{{field.multiline}}" ng-required="field.mandatory" ng-maxlength="{{field.maxlength}}"></textarea>
54
+ <p ng-switch-when="readonly" class="form-control-static">{{formu[field.name]}}</p>
55
+ <p ng-switch-when="readonly_date" class="form-control-static">{{formu[field.name] | date:'medium'}}</p>
56
+ <select ng-switch-when="select" class="form-control" ng-required="field.mandatory" ng-model="formu[field.name]"
57
+ ng-options="o.id as o.label for o in refs[field.name]" ng-change="selectFieldChanged(field.onchange)">
58
+ <option value="" ></option>
59
+ </select>
60
+ <select chosen multiple ng-switch-when="multiselect" class="form-control" ng-required="field.mandatory" ng-model="formu[field.name]"
61
+ ng-options="o.id as o.label for o in refs[field.name]" data-placeholder="...">
62
+ </select>
63
+ <div ng-switch-when="metadata" >
64
+ <table class="table table-hover table-condensed">
65
+ <thead>
66
+ <tr>
67
+ <th i18n >Key</th>
68
+ <th i18n >Value</th>
69
+ <th i18n >Mandatory</th>
70
+ <th ng-if="field.allow_creation"><span ng-click="createMetadataRow()" id="md_add" class="btn btn-success btn-xs glyphicon glyphicon-plus"></span></th>
71
+ </tr>
72
+ </thead>
73
+ <tbody>
74
+ <tr ng-repeat="row_md in formu['metadata']" >
75
+ <td><input type="text" id="md_key" name="md_key" placeholder="" ng-readonly="!field.allow_creation"
76
+ class="form-control" ng-model="row_md['key']" ng-required="true" ng-maxlength="150" />
77
+ </td>
78
+ <td>
79
+ <input type="text" id="md_value" name="md_value" placeholder=""
80
+ class="form-control" ng-model="row_md['value']" ng-required="false" ng-maxlength="150" />
81
+ </td>
82
+ <td>
83
+ <input type="checkbox" id="md_mandatory" name="md_mandatory" ng-disabled="!field.allow_creation"
84
+ class="form-control" ng-model="row_md['mandatory']" />
85
+ </td>
86
+ <td ng-if="field.allow_creation">
87
+ <span ng-click="removeMetadataKey(row_md)" id="md_delete" class="btn btn-danger btn-xs glyphicon glyphicon-trash"></span>
88
+ </td>
89
+ </tr>
90
+ </tbody>
91
+ </table>
92
+ </div>
93
+
94
+ </div>
95
+ <div class="alert inline-alert alert-warning" ng-show="catalogForm[field.name].$invalid">
96
+ <span class="glyphicon glyphicon-warning-sign"></span>
97
+ <span ng-show="catalogForm[field.name].$error.maxlength">{{field.display}} length is too long (max: {{field.maxlength}}).<br/></span>
98
+ <span ng-show="catalogForm[field.name].$error.required">{{field.display}} is required.</span>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ <div class="form-group">
103
+ <div class="col-md-offset-3 col-md-10" id="saveContainer">
104
+ <button id="save" type="submit" class="btn btn-primary" >
105
+ <span i18n class="glyphicon glyphicon-floppy-disk"></span> Save
106
+ </button>
107
+ </div>
108
+ </div>
109
+ </form>
110
+ </div>
111
+
112
+ </div>
113
+
114
+ <div class="panel panel-default" ng-controller="CatalogListCtrl">
115
+ <div class="panel-heading">
116
+ {{catalog.name}} <span class="badge pull-right" ng-bind="list.length || 0"></span>
117
+ </div>
118
+
119
+ <table class="table table-hover table-condensed">
120
+ <thead>
121
+ <tr>
122
+ <th ng-repeat="field in catalogMetadata.list_fields" ng-bind="display(field)"></th>
123
+ <th></th>
124
+ </tr>
125
+ </thead>
126
+ <tbody>
127
+ <tr ng-repeat="row in list | filter:searchText" ng-dblclick="edit(row)">
128
+ <td ng-repeat="field in catalogMetadata.list_fields" ng-bind="print(field, row)"></td>
129
+
130
+ <td><span ng-click="edit(row)"
131
+ class="glyphicon glyphicon-pencil"></span>
132
+ <span ng-click="delete(row)"
133
+ class="glyphicon glyphicon-remove"></span>
134
+ </td>
135
+ </tr>
136
+ </tbody>
137
+ <tfoot>
138
+ </tfoot>
139
+ </table>
140
+ </div>
141
+ </div>
142
+
143
+ </div>
securis/src/main/webapp/css/bootstrap-dialog.css
....@@ -0,0 +1,120 @@
1
+.bootstrap-dialog {
2
+
3
+}
4
+.bootstrap-dialog .modal-header {
5
+ border-top-left-radius: 4px;
6
+ border-top-right-radius: 4px;
7
+}
8
+.bootstrap-dialog .bootstrap-dialog-title {
9
+ color: #fff;
10
+ display: inline-block;
11
+}
12
+.bootstrap-dialog.type-default .bootstrap-dialog-title {
13
+ color: #333;
14
+}
15
+.bootstrap-dialog.size-normal .bootstrap-dialog-title {
16
+ font-size: 16px;
17
+}
18
+.bootstrap-dialog.size-large .bootstrap-dialog-title {
19
+ font-size: 24px;
20
+}
21
+.bootstrap-dialog .bootstrap-dialog-close-button {
22
+ float: right;
23
+ filter:alpha(opacity=90);
24
+ -moz-opacity:0.9;
25
+ -khtml-opacity: 0.9;
26
+ opacity: 0.9;
27
+}
28
+.bootstrap-dialog.size-normal .bootstrap-dialog-close-button {
29
+ font-size: 20px;
30
+}
31
+.bootstrap-dialog.size-large .bootstrap-dialog-close-button {
32
+ font-size: 30px;
33
+}
34
+.bootstrap-dialog .bootstrap-dialog-close-button:hover {
35
+ cursor: pointer;
36
+ filter: alpha(opacity=100);
37
+ -moz-opacity: 1;
38
+ -khtml-opacity: 1;
39
+ opacity: 1;
40
+}
41
+.bootstrap-dialog.size-normal .bootstrap-dialog-message {
42
+ font-size: 14px;
43
+}
44
+.bootstrap-dialog.size-large .bootstrap-dialog-message {
45
+ font-size: 18px;
46
+}
47
+.bootstrap-dialog.type-default .modal-header {
48
+ background-color: #fff;
49
+}
50
+.bootstrap-dialog.type-info .modal-header {
51
+ background-color: #5bc0de;
52
+}
53
+.bootstrap-dialog.type-primary .modal-header {
54
+ background-color: #428bca;
55
+}
56
+.bootstrap-dialog.type-success .modal-header {
57
+ background-color: #5cb85c;
58
+}
59
+.bootstrap-dialog.type-warning .modal-header {
60
+ background-color: #f0ad4e;
61
+}
62
+.bootstrap-dialog.type-danger .modal-header {
63
+ background-color: #d9534f;
64
+}
65
+.bootstrap-dialog .bootstrap-dialog-button-icon {
66
+ margin-right: 3px;
67
+}
68
+
69
+/**
70
+ * Icon animation
71
+ * Copied from font-awesome: http://fontawesome.io/
72
+ **/
73
+.icon-spin {
74
+ display: inline-block;
75
+ -moz-animation: spin 2s infinite linear;
76
+ -o-animation: spin 2s infinite linear;
77
+ -webkit-animation: spin 2s infinite linear;
78
+ animation: spin 2s infinite linear;
79
+}
80
+@-moz-keyframes spin {
81
+ 0% {
82
+ -moz-transform: rotate(0deg);
83
+}
84
+100% {
85
+ -moz-transform: rotate(359deg);
86
+}
87
+}
88
+@-webkit-keyframes spin {
89
+ 0% {
90
+ -webkit-transform: rotate(0deg);
91
+}
92
+100% {
93
+ -webkit-transform: rotate(359deg);
94
+}
95
+}
96
+@-o-keyframes spin {
97
+ 0% {
98
+ -o-transform: rotate(0deg);
99
+}
100
+100% {
101
+ -o-transform: rotate(359deg);
102
+}
103
+}
104
+@-ms-keyframes spin {
105
+ 0% {
106
+ -ms-transform: rotate(0deg);
107
+}
108
+100% {
109
+ -ms-transform: rotate(359deg);
110
+}
111
+}
112
+@keyframes spin {
113
+ 0% {
114
+ transform: rotate(0deg);
115
+}
116
+100% {
117
+ transform: rotate(359deg);
118
+}
119
+}
120
+/** End of icon animation **/
securis/src/main/webapp/css/bootstrap-theme.css
....@@ -0,0 +1,442 @@
1
+/*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+.btn-default,
8
+.btn-primary,
9
+.btn-success,
10
+.btn-info,
11
+.btn-warning,
12
+.btn-danger {
13
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
14
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
15
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
16
+}
17
+.btn-default:active,
18
+.btn-primary:active,
19
+.btn-success:active,
20
+.btn-info:active,
21
+.btn-warning:active,
22
+.btn-danger:active,
23
+.btn-default.active,
24
+.btn-primary.active,
25
+.btn-success.active,
26
+.btn-info.active,
27
+.btn-warning.active,
28
+.btn-danger.active {
29
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
30
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
31
+}
32
+.btn:active,
33
+.btn.active {
34
+ background-image: none;
35
+}
36
+.btn-default {
37
+ text-shadow: 0 1px 0 #fff;
38
+ background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
39
+ background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
40
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
41
+ background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
42
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
43
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
44
+ background-repeat: repeat-x;
45
+ border-color: #dbdbdb;
46
+ border-color: #ccc;
47
+}
48
+.btn-default:hover,
49
+.btn-default:focus {
50
+ background-color: #e0e0e0;
51
+ background-position: 0 -15px;
52
+}
53
+.btn-default:active,
54
+.btn-default.active {
55
+ background-color: #e0e0e0;
56
+ border-color: #dbdbdb;
57
+}
58
+.btn-default:disabled,
59
+.btn-default[disabled] {
60
+ background-color: #e0e0e0;
61
+ background-image: none;
62
+}
63
+.btn-primary {
64
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
65
+ background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
66
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
67
+ background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
68
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
69
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
70
+ background-repeat: repeat-x;
71
+ border-color: #2b669a;
72
+}
73
+.btn-primary:hover,
74
+.btn-primary:focus {
75
+ background-color: #2d6ca2;
76
+ background-position: 0 -15px;
77
+}
78
+.btn-primary:active,
79
+.btn-primary.active {
80
+ background-color: #2d6ca2;
81
+ border-color: #2b669a;
82
+}
83
+.btn-primary:disabled,
84
+.btn-primary[disabled] {
85
+ background-color: #2d6ca2;
86
+ background-image: none;
87
+}
88
+.btn-success {
89
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
90
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
91
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
92
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
93
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
94
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
95
+ background-repeat: repeat-x;
96
+ border-color: #3e8f3e;
97
+}
98
+.btn-success:hover,
99
+.btn-success:focus {
100
+ background-color: #419641;
101
+ background-position: 0 -15px;
102
+}
103
+.btn-success:active,
104
+.btn-success.active {
105
+ background-color: #419641;
106
+ border-color: #3e8f3e;
107
+}
108
+.btn-success:disabled,
109
+.btn-success[disabled] {
110
+ background-color: #419641;
111
+ background-image: none;
112
+}
113
+.btn-info {
114
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
115
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
116
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
117
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
118
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
119
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
120
+ background-repeat: repeat-x;
121
+ border-color: #28a4c9;
122
+}
123
+.btn-info:hover,
124
+.btn-info:focus {
125
+ background-color: #2aabd2;
126
+ background-position: 0 -15px;
127
+}
128
+.btn-info:active,
129
+.btn-info.active {
130
+ background-color: #2aabd2;
131
+ border-color: #28a4c9;
132
+}
133
+.btn-info:disabled,
134
+.btn-info[disabled] {
135
+ background-color: #2aabd2;
136
+ background-image: none;
137
+}
138
+.btn-warning {
139
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
140
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
141
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
142
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
143
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
144
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
145
+ background-repeat: repeat-x;
146
+ border-color: #e38d13;
147
+}
148
+.btn-warning:hover,
149
+.btn-warning:focus {
150
+ background-color: #eb9316;
151
+ background-position: 0 -15px;
152
+}
153
+.btn-warning:active,
154
+.btn-warning.active {
155
+ background-color: #eb9316;
156
+ border-color: #e38d13;
157
+}
158
+.btn-warning:disabled,
159
+.btn-warning[disabled] {
160
+ background-color: #eb9316;
161
+ background-image: none;
162
+}
163
+.btn-danger {
164
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
165
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
166
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
167
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
168
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
169
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
170
+ background-repeat: repeat-x;
171
+ border-color: #b92c28;
172
+}
173
+.btn-danger:hover,
174
+.btn-danger:focus {
175
+ background-color: #c12e2a;
176
+ background-position: 0 -15px;
177
+}
178
+.btn-danger:active,
179
+.btn-danger.active {
180
+ background-color: #c12e2a;
181
+ border-color: #b92c28;
182
+}
183
+.btn-danger:disabled,
184
+.btn-danger[disabled] {
185
+ background-color: #c12e2a;
186
+ background-image: none;
187
+}
188
+.thumbnail,
189
+.img-thumbnail {
190
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
191
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
192
+}
193
+.dropdown-menu > li > a:hover,
194
+.dropdown-menu > li > a:focus {
195
+ background-color: #e8e8e8;
196
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
197
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
198
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
199
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
200
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
201
+ background-repeat: repeat-x;
202
+}
203
+.dropdown-menu > .active > a,
204
+.dropdown-menu > .active > a:hover,
205
+.dropdown-menu > .active > a:focus {
206
+ background-color: #357ebd;
207
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
208
+ background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
209
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
210
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
211
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
212
+ background-repeat: repeat-x;
213
+}
214
+.navbar-default {
215
+ background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
216
+ background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
217
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
218
+ background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
219
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
220
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
221
+ background-repeat: repeat-x;
222
+ border-radius: 4px;
223
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
224
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
225
+}
226
+.navbar-default .navbar-nav > .active > a {
227
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
228
+ background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
229
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3));
230
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
231
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
232
+ background-repeat: repeat-x;
233
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
234
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
235
+}
236
+.navbar-brand,
237
+.navbar-nav > li > a {
238
+ text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
239
+}
240
+.navbar-inverse {
241
+ background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
242
+ background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
243
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
244
+ background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
245
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
246
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
247
+ background-repeat: repeat-x;
248
+}
249
+.navbar-inverse .navbar-nav > .active > a {
250
+ background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
251
+ background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
252
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828));
253
+ background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
254
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
255
+ background-repeat: repeat-x;
256
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
257
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
258
+}
259
+.navbar-inverse .navbar-brand,
260
+.navbar-inverse .navbar-nav > li > a {
261
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
262
+}
263
+.navbar-static-top,
264
+.navbar-fixed-top,
265
+.navbar-fixed-bottom {
266
+ border-radius: 0;
267
+}
268
+.alert {
269
+ text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
270
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
271
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
272
+}
273
+.alert-success {
274
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
275
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
276
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
277
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
278
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
279
+ background-repeat: repeat-x;
280
+ border-color: #b2dba1;
281
+}
282
+.alert-info {
283
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
284
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
285
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
286
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
287
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
288
+ background-repeat: repeat-x;
289
+ border-color: #9acfea;
290
+}
291
+.alert-warning {
292
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
293
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
294
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
295
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
296
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
297
+ background-repeat: repeat-x;
298
+ border-color: #f5e79e;
299
+}
300
+.alert-danger {
301
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
302
+ background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
303
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
304
+ background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
305
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
306
+ background-repeat: repeat-x;
307
+ border-color: #dca7a7;
308
+}
309
+.progress {
310
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
311
+ background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
312
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
313
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
314
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
315
+ background-repeat: repeat-x;
316
+}
317
+.progress-bar {
318
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
319
+ background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
320
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
321
+ background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
322
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
323
+ background-repeat: repeat-x;
324
+}
325
+.progress-bar-success {
326
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
327
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
328
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
329
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
330
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
331
+ background-repeat: repeat-x;
332
+}
333
+.progress-bar-info {
334
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
335
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
336
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
337
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
338
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
339
+ background-repeat: repeat-x;
340
+}
341
+.progress-bar-warning {
342
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
343
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
344
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
345
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
346
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
347
+ background-repeat: repeat-x;
348
+}
349
+.progress-bar-danger {
350
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
351
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
352
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
353
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
354
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
355
+ background-repeat: repeat-x;
356
+}
357
+.progress-bar-striped {
358
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
359
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
360
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
361
+}
362
+.list-group {
363
+ border-radius: 4px;
364
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
365
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
366
+}
367
+.list-group-item.active,
368
+.list-group-item.active:hover,
369
+.list-group-item.active:focus {
370
+ text-shadow: 0 -1px 0 #3071a9;
371
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
372
+ background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
373
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
374
+ background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
375
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
376
+ background-repeat: repeat-x;
377
+ border-color: #3278b3;
378
+}
379
+.panel {
380
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
381
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
382
+}
383
+.panel-default > .panel-heading {
384
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
385
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
386
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
387
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
388
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
389
+ background-repeat: repeat-x;
390
+}
391
+.panel-primary > .panel-heading {
392
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
393
+ background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
394
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
395
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
396
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
397
+ background-repeat: repeat-x;
398
+}
399
+.panel-success > .panel-heading {
400
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
401
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
402
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
403
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
404
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
405
+ background-repeat: repeat-x;
406
+}
407
+.panel-info > .panel-heading {
408
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
409
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
410
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
411
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
412
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
413
+ background-repeat: repeat-x;
414
+}
415
+.panel-warning > .panel-heading {
416
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
417
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
418
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
419
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
420
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
421
+ background-repeat: repeat-x;
422
+}
423
+.panel-danger > .panel-heading {
424
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
425
+ background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
426
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
427
+ background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
428
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
429
+ background-repeat: repeat-x;
430
+}
431
+.well {
432
+ background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
433
+ background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
434
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
435
+ background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
436
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
437
+ background-repeat: repeat-x;
438
+ border-color: #dcdcdc;
439
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
440
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
441
+}
442
+/*# sourceMappingURL=bootstrap-theme.css.map */
securis/src/main/webapp/css/bootstrap-theme.css.map
....@@ -0,0 +1 @@
1
+{"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
securis/src/main/webapp/css/bootstrap-theme.min.css
....@@ -0,0 +1,5 @@
1
+/*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
securis/src/main/webapp/css/bootstrap.css
....@@ -0,0 +1,6203 @@
1
+/*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
8
+html {
9
+ font-family: sans-serif;
10
+ -webkit-text-size-adjust: 100%;
11
+ -ms-text-size-adjust: 100%;
12
+}
13
+body {
14
+ margin: 0;
15
+}
16
+article,
17
+aside,
18
+details,
19
+figcaption,
20
+figure,
21
+footer,
22
+header,
23
+hgroup,
24
+main,
25
+nav,
26
+section,
27
+summary {
28
+ display: block;
29
+}
30
+audio,
31
+canvas,
32
+progress,
33
+video {
34
+ display: inline-block;
35
+ vertical-align: baseline;
36
+}
37
+audio:not([controls]) {
38
+ display: none;
39
+ height: 0;
40
+}
41
+[hidden],
42
+template {
43
+ display: none;
44
+}
45
+a {
46
+ background: transparent;
47
+}
48
+a:active,
49
+a:hover {
50
+ outline: 0;
51
+}
52
+abbr[title] {
53
+ border-bottom: 1px dotted;
54
+}
55
+b,
56
+strong {
57
+ font-weight: bold;
58
+}
59
+dfn {
60
+ font-style: italic;
61
+}
62
+h1 {
63
+ margin: .67em 0;
64
+ font-size: 2em;
65
+}
66
+mark {
67
+ color: #000;
68
+ background: #ff0;
69
+}
70
+small {
71
+ font-size: 80%;
72
+}
73
+sub,
74
+sup {
75
+ position: relative;
76
+ font-size: 75%;
77
+ line-height: 0;
78
+ vertical-align: baseline;
79
+}
80
+sup {
81
+ top: -.5em;
82
+}
83
+sub {
84
+ bottom: -.25em;
85
+}
86
+img {
87
+ border: 0;
88
+}
89
+svg:not(:root) {
90
+ overflow: hidden;
91
+}
92
+figure {
93
+ margin: 1em 40px;
94
+}
95
+hr {
96
+ height: 0;
97
+ -webkit-box-sizing: content-box;
98
+ -moz-box-sizing: content-box;
99
+ box-sizing: content-box;
100
+}
101
+pre {
102
+ overflow: auto;
103
+}
104
+code,
105
+kbd,
106
+pre,
107
+samp {
108
+ font-family: monospace, monospace;
109
+ font-size: 1em;
110
+}
111
+button,
112
+input,
113
+optgroup,
114
+select,
115
+textarea {
116
+ margin: 0;
117
+ font: inherit;
118
+ color: inherit;
119
+}
120
+button {
121
+ overflow: visible;
122
+}
123
+button,
124
+select {
125
+ text-transform: none;
126
+}
127
+button,
128
+html input[type="button"],
129
+input[type="reset"],
130
+input[type="submit"] {
131
+ -webkit-appearance: button;
132
+ cursor: pointer;
133
+}
134
+button[disabled],
135
+html input[disabled] {
136
+ cursor: default;
137
+}
138
+button::-moz-focus-inner,
139
+input::-moz-focus-inner {
140
+ padding: 0;
141
+ border: 0;
142
+}
143
+input {
144
+ line-height: normal;
145
+}
146
+input[type="checkbox"],
147
+input[type="radio"] {
148
+ -webkit-box-sizing: border-box;
149
+ -moz-box-sizing: border-box;
150
+ box-sizing: border-box;
151
+ padding: 0;
152
+}
153
+input[type="number"]::-webkit-inner-spin-button,
154
+input[type="number"]::-webkit-outer-spin-button {
155
+ height: auto;
156
+}
157
+input[type="search"] {
158
+ -webkit-box-sizing: content-box;
159
+ -moz-box-sizing: content-box;
160
+ box-sizing: content-box;
161
+ -webkit-appearance: textfield;
162
+}
163
+input[type="search"]::-webkit-search-cancel-button,
164
+input[type="search"]::-webkit-search-decoration {
165
+ -webkit-appearance: none;
166
+}
167
+fieldset {
168
+ padding: .35em .625em .75em;
169
+ margin: 0 2px;
170
+ border: 1px solid #c0c0c0;
171
+}
172
+legend {
173
+ padding: 0;
174
+ border: 0;
175
+}
176
+textarea {
177
+ overflow: auto;
178
+}
179
+optgroup {
180
+ font-weight: bold;
181
+}
182
+table {
183
+ border-spacing: 0;
184
+ border-collapse: collapse;
185
+}
186
+td,
187
+th {
188
+ padding: 0;
189
+}
190
+@media print {
191
+ * {
192
+ color: #000 !important;
193
+ text-shadow: none !important;
194
+ background: transparent !important;
195
+ -webkit-box-shadow: none !important;
196
+ box-shadow: none !important;
197
+ }
198
+ a,
199
+ a:visited {
200
+ text-decoration: underline;
201
+ }
202
+ a[href]:after {
203
+ content: " (" attr(href) ")";
204
+ }
205
+ abbr[title]:after {
206
+ content: " (" attr(title) ")";
207
+ }
208
+ a[href^="javascript:"]:after,
209
+ a[href^="#"]:after {
210
+ content: "";
211
+ }
212
+ pre,
213
+ blockquote {
214
+ border: 1px solid #999;
215
+
216
+ page-break-inside: avoid;
217
+ }
218
+ thead {
219
+ display: table-header-group;
220
+ }
221
+ tr,
222
+ img {
223
+ page-break-inside: avoid;
224
+ }
225
+ img {
226
+ max-width: 100% !important;
227
+ }
228
+ p,
229
+ h2,
230
+ h3 {
231
+ orphans: 3;
232
+ widows: 3;
233
+ }
234
+ h2,
235
+ h3 {
236
+ page-break-after: avoid;
237
+ }
238
+ select {
239
+ background: #fff !important;
240
+ }
241
+ .navbar {
242
+ display: none;
243
+ }
244
+ .table td,
245
+ .table th {
246
+ background-color: #fff !important;
247
+ }
248
+ .btn > .caret,
249
+ .dropup > .btn > .caret {
250
+ border-top-color: #000 !important;
251
+ }
252
+ .label {
253
+ border: 1px solid #000;
254
+ }
255
+ .table {
256
+ border-collapse: collapse !important;
257
+ }
258
+ .table-bordered th,
259
+ .table-bordered td {
260
+ border: 1px solid #ddd !important;
261
+ }
262
+}
263
+@font-face {
264
+ font-family: 'Glyphicons Halflings';
265
+
266
+ src: url('../fonts/glyphicons-halflings-regular.eot');
267
+ src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
268
+}
269
+.glyphicon {
270
+ position: relative;
271
+ top: 1px;
272
+ display: inline-block;
273
+ font-family: 'Glyphicons Halflings';
274
+ font-style: normal;
275
+ font-weight: normal;
276
+ line-height: 1;
277
+
278
+ -webkit-font-smoothing: antialiased;
279
+ -moz-osx-font-smoothing: grayscale;
280
+}
281
+.glyphicon-asterisk:before {
282
+ content: "\2a";
283
+}
284
+.glyphicon-plus:before {
285
+ content: "\2b";
286
+}
287
+.glyphicon-euro:before {
288
+ content: "\20ac";
289
+}
290
+.glyphicon-minus:before {
291
+ content: "\2212";
292
+}
293
+.glyphicon-cloud:before {
294
+ content: "\2601";
295
+}
296
+.glyphicon-envelope:before {
297
+ content: "\2709";
298
+}
299
+.glyphicon-pencil:before {
300
+ content: "\270f";
301
+}
302
+.glyphicon-glass:before {
303
+ content: "\e001";
304
+}
305
+.glyphicon-music:before {
306
+ content: "\e002";
307
+}
308
+.glyphicon-search:before {
309
+ content: "\e003";
310
+}
311
+.glyphicon-heart:before {
312
+ content: "\e005";
313
+}
314
+.glyphicon-star:before {
315
+ content: "\e006";
316
+}
317
+.glyphicon-star-empty:before {
318
+ content: "\e007";
319
+}
320
+.glyphicon-user:before {
321
+ content: "\e008";
322
+}
323
+.glyphicon-film:before {
324
+ content: "\e009";
325
+}
326
+.glyphicon-th-large:before {
327
+ content: "\e010";
328
+}
329
+.glyphicon-th:before {
330
+ content: "\e011";
331
+}
332
+.glyphicon-th-list:before {
333
+ content: "\e012";
334
+}
335
+.glyphicon-ok:before {
336
+ content: "\e013";
337
+}
338
+.glyphicon-remove:before {
339
+ content: "\e014";
340
+}
341
+.glyphicon-zoom-in:before {
342
+ content: "\e015";
343
+}
344
+.glyphicon-zoom-out:before {
345
+ content: "\e016";
346
+}
347
+.glyphicon-off:before {
348
+ content: "\e017";
349
+}
350
+.glyphicon-signal:before {
351
+ content: "\e018";
352
+}
353
+.glyphicon-cog:before {
354
+ content: "\e019";
355
+}
356
+.glyphicon-trash:before {
357
+ content: "\e020";
358
+}
359
+.glyphicon-home:before {
360
+ content: "\e021";
361
+}
362
+.glyphicon-file:before {
363
+ content: "\e022";
364
+}
365
+.glyphicon-time:before {
366
+ content: "\e023";
367
+}
368
+.glyphicon-road:before {
369
+ content: "\e024";
370
+}
371
+.glyphicon-download-alt:before {
372
+ content: "\e025";
373
+}
374
+.glyphicon-download:before {
375
+ content: "\e026";
376
+}
377
+.glyphicon-upload:before {
378
+ content: "\e027";
379
+}
380
+.glyphicon-inbox:before {
381
+ content: "\e028";
382
+}
383
+.glyphicon-play-circle:before {
384
+ content: "\e029";
385
+}
386
+.glyphicon-repeat:before {
387
+ content: "\e030";
388
+}
389
+.glyphicon-refresh:before {
390
+ content: "\e031";
391
+}
392
+.glyphicon-list-alt:before {
393
+ content: "\e032";
394
+}
395
+.glyphicon-lock:before {
396
+ content: "\e033";
397
+}
398
+.glyphicon-flag:before {
399
+ content: "\e034";
400
+}
401
+.glyphicon-headphones:before {
402
+ content: "\e035";
403
+}
404
+.glyphicon-volume-off:before {
405
+ content: "\e036";
406
+}
407
+.glyphicon-volume-down:before {
408
+ content: "\e037";
409
+}
410
+.glyphicon-volume-up:before {
411
+ content: "\e038";
412
+}
413
+.glyphicon-qrcode:before {
414
+ content: "\e039";
415
+}
416
+.glyphicon-barcode:before {
417
+ content: "\e040";
418
+}
419
+.glyphicon-tag:before {
420
+ content: "\e041";
421
+}
422
+.glyphicon-tags:before {
423
+ content: "\e042";
424
+}
425
+.glyphicon-book:before {
426
+ content: "\e043";
427
+}
428
+.glyphicon-bookmark:before {
429
+ content: "\e044";
430
+}
431
+.glyphicon-print:before {
432
+ content: "\e045";
433
+}
434
+.glyphicon-camera:before {
435
+ content: "\e046";
436
+}
437
+.glyphicon-font:before {
438
+ content: "\e047";
439
+}
440
+.glyphicon-bold:before {
441
+ content: "\e048";
442
+}
443
+.glyphicon-italic:before {
444
+ content: "\e049";
445
+}
446
+.glyphicon-text-height:before {
447
+ content: "\e050";
448
+}
449
+.glyphicon-text-width:before {
450
+ content: "\e051";
451
+}
452
+.glyphicon-align-left:before {
453
+ content: "\e052";
454
+}
455
+.glyphicon-align-center:before {
456
+ content: "\e053";
457
+}
458
+.glyphicon-align-right:before {
459
+ content: "\e054";
460
+}
461
+.glyphicon-align-justify:before {
462
+ content: "\e055";
463
+}
464
+.glyphicon-list:before {
465
+ content: "\e056";
466
+}
467
+.glyphicon-indent-left:before {
468
+ content: "\e057";
469
+}
470
+.glyphicon-indent-right:before {
471
+ content: "\e058";
472
+}
473
+.glyphicon-facetime-video:before {
474
+ content: "\e059";
475
+}
476
+.glyphicon-picture:before {
477
+ content: "\e060";
478
+}
479
+.glyphicon-map-marker:before {
480
+ content: "\e062";
481
+}
482
+.glyphicon-adjust:before {
483
+ content: "\e063";
484
+}
485
+.glyphicon-tint:before {
486
+ content: "\e064";
487
+}
488
+.glyphicon-edit:before {
489
+ content: "\e065";
490
+}
491
+.glyphicon-share:before {
492
+ content: "\e066";
493
+}
494
+.glyphicon-check:before {
495
+ content: "\e067";
496
+}
497
+.glyphicon-move:before {
498
+ content: "\e068";
499
+}
500
+.glyphicon-step-backward:before {
501
+ content: "\e069";
502
+}
503
+.glyphicon-fast-backward:before {
504
+ content: "\e070";
505
+}
506
+.glyphicon-backward:before {
507
+ content: "\e071";
508
+}
509
+.glyphicon-play:before {
510
+ content: "\e072";
511
+}
512
+.glyphicon-pause:before {
513
+ content: "\e073";
514
+}
515
+.glyphicon-stop:before {
516
+ content: "\e074";
517
+}
518
+.glyphicon-forward:before {
519
+ content: "\e075";
520
+}
521
+.glyphicon-fast-forward:before {
522
+ content: "\e076";
523
+}
524
+.glyphicon-step-forward:before {
525
+ content: "\e077";
526
+}
527
+.glyphicon-eject:before {
528
+ content: "\e078";
529
+}
530
+.glyphicon-chevron-left:before {
531
+ content: "\e079";
532
+}
533
+.glyphicon-chevron-right:before {
534
+ content: "\e080";
535
+}
536
+.glyphicon-plus-sign:before {
537
+ content: "\e081";
538
+}
539
+.glyphicon-minus-sign:before {
540
+ content: "\e082";
541
+}
542
+.glyphicon-remove-sign:before {
543
+ content: "\e083";
544
+}
545
+.glyphicon-ok-sign:before {
546
+ content: "\e084";
547
+}
548
+.glyphicon-question-sign:before {
549
+ content: "\e085";
550
+}
551
+.glyphicon-info-sign:before {
552
+ content: "\e086";
553
+}
554
+.glyphicon-screenshot:before {
555
+ content: "\e087";
556
+}
557
+.glyphicon-remove-circle:before {
558
+ content: "\e088";
559
+}
560
+.glyphicon-ok-circle:before {
561
+ content: "\e089";
562
+}
563
+.glyphicon-ban-circle:before {
564
+ content: "\e090";
565
+}
566
+.glyphicon-arrow-left:before {
567
+ content: "\e091";
568
+}
569
+.glyphicon-arrow-right:before {
570
+ content: "\e092";
571
+}
572
+.glyphicon-arrow-up:before {
573
+ content: "\e093";
574
+}
575
+.glyphicon-arrow-down:before {
576
+ content: "\e094";
577
+}
578
+.glyphicon-share-alt:before {
579
+ content: "\e095";
580
+}
581
+.glyphicon-resize-full:before {
582
+ content: "\e096";
583
+}
584
+.glyphicon-resize-small:before {
585
+ content: "\e097";
586
+}
587
+.glyphicon-exclamation-sign:before {
588
+ content: "\e101";
589
+}
590
+.glyphicon-gift:before {
591
+ content: "\e102";
592
+}
593
+.glyphicon-leaf:before {
594
+ content: "\e103";
595
+}
596
+.glyphicon-fire:before {
597
+ content: "\e104";
598
+}
599
+.glyphicon-eye-open:before {
600
+ content: "\e105";
601
+}
602
+.glyphicon-eye-close:before {
603
+ content: "\e106";
604
+}
605
+.glyphicon-warning-sign:before {
606
+ content: "\e107";
607
+}
608
+.glyphicon-plane:before {
609
+ content: "\e108";
610
+}
611
+.glyphicon-calendar:before {
612
+ content: "\e109";
613
+}
614
+.glyphicon-random:before {
615
+ content: "\e110";
616
+}
617
+.glyphicon-comment:before {
618
+ content: "\e111";
619
+}
620
+.glyphicon-magnet:before {
621
+ content: "\e112";
622
+}
623
+.glyphicon-chevron-up:before {
624
+ content: "\e113";
625
+}
626
+.glyphicon-chevron-down:before {
627
+ content: "\e114";
628
+}
629
+.glyphicon-retweet:before {
630
+ content: "\e115";
631
+}
632
+.glyphicon-shopping-cart:before {
633
+ content: "\e116";
634
+}
635
+.glyphicon-folder-close:before {
636
+ content: "\e117";
637
+}
638
+.glyphicon-folder-open:before {
639
+ content: "\e118";
640
+}
641
+.glyphicon-resize-vertical:before {
642
+ content: "\e119";
643
+}
644
+.glyphicon-resize-horizontal:before {
645
+ content: "\e120";
646
+}
647
+.glyphicon-hdd:before {
648
+ content: "\e121";
649
+}
650
+.glyphicon-bullhorn:before {
651
+ content: "\e122";
652
+}
653
+.glyphicon-bell:before {
654
+ content: "\e123";
655
+}
656
+.glyphicon-certificate:before {
657
+ content: "\e124";
658
+}
659
+.glyphicon-thumbs-up:before {
660
+ content: "\e125";
661
+}
662
+.glyphicon-thumbs-down:before {
663
+ content: "\e126";
664
+}
665
+.glyphicon-hand-right:before {
666
+ content: "\e127";
667
+}
668
+.glyphicon-hand-left:before {
669
+ content: "\e128";
670
+}
671
+.glyphicon-hand-up:before {
672
+ content: "\e129";
673
+}
674
+.glyphicon-hand-down:before {
675
+ content: "\e130";
676
+}
677
+.glyphicon-circle-arrow-right:before {
678
+ content: "\e131";
679
+}
680
+.glyphicon-circle-arrow-left:before {
681
+ content: "\e132";
682
+}
683
+.glyphicon-circle-arrow-up:before {
684
+ content: "\e133";
685
+}
686
+.glyphicon-circle-arrow-down:before {
687
+ content: "\e134";
688
+}
689
+.glyphicon-globe:before {
690
+ content: "\e135";
691
+}
692
+.glyphicon-wrench:before {
693
+ content: "\e136";
694
+}
695
+.glyphicon-tasks:before {
696
+ content: "\e137";
697
+}
698
+.glyphicon-filter:before {
699
+ content: "\e138";
700
+}
701
+.glyphicon-briefcase:before {
702
+ content: "\e139";
703
+}
704
+.glyphicon-fullscreen:before {
705
+ content: "\e140";
706
+}
707
+.glyphicon-dashboard:before {
708
+ content: "\e141";
709
+}
710
+.glyphicon-paperclip:before {
711
+ content: "\e142";
712
+}
713
+.glyphicon-heart-empty:before {
714
+ content: "\e143";
715
+}
716
+.glyphicon-link:before {
717
+ content: "\e144";
718
+}
719
+.glyphicon-phone:before {
720
+ content: "\e145";
721
+}
722
+.glyphicon-pushpin:before {
723
+ content: "\e146";
724
+}
725
+.glyphicon-usd:before {
726
+ content: "\e148";
727
+}
728
+.glyphicon-gbp:before {
729
+ content: "\e149";
730
+}
731
+.glyphicon-sort:before {
732
+ content: "\e150";
733
+}
734
+.glyphicon-sort-by-alphabet:before {
735
+ content: "\e151";
736
+}
737
+.glyphicon-sort-by-alphabet-alt:before {
738
+ content: "\e152";
739
+}
740
+.glyphicon-sort-by-order:before {
741
+ content: "\e153";
742
+}
743
+.glyphicon-sort-by-order-alt:before {
744
+ content: "\e154";
745
+}
746
+.glyphicon-sort-by-attributes:before {
747
+ content: "\e155";
748
+}
749
+.glyphicon-sort-by-attributes-alt:before {
750
+ content: "\e156";
751
+}
752
+.glyphicon-unchecked:before {
753
+ content: "\e157";
754
+}
755
+.glyphicon-expand:before {
756
+ content: "\e158";
757
+}
758
+.glyphicon-collapse-down:before {
759
+ content: "\e159";
760
+}
761
+.glyphicon-collapse-up:before {
762
+ content: "\e160";
763
+}
764
+.glyphicon-log-in:before {
765
+ content: "\e161";
766
+}
767
+.glyphicon-flash:before {
768
+ content: "\e162";
769
+}
770
+.glyphicon-log-out:before {
771
+ content: "\e163";
772
+}
773
+.glyphicon-new-window:before {
774
+ content: "\e164";
775
+}
776
+.glyphicon-record:before {
777
+ content: "\e165";
778
+}
779
+.glyphicon-save:before {
780
+ content: "\e166";
781
+}
782
+.glyphicon-open:before {
783
+ content: "\e167";
784
+}
785
+.glyphicon-saved:before {
786
+ content: "\e168";
787
+}
788
+.glyphicon-import:before {
789
+ content: "\e169";
790
+}
791
+.glyphicon-export:before {
792
+ content: "\e170";
793
+}
794
+.glyphicon-send:before {
795
+ content: "\e171";
796
+}
797
+.glyphicon-floppy-disk:before {
798
+ content: "\e172";
799
+}
800
+.glyphicon-floppy-saved:before {
801
+ content: "\e173";
802
+}
803
+.glyphicon-floppy-remove:before {
804
+ content: "\e174";
805
+}
806
+.glyphicon-floppy-save:before {
807
+ content: "\e175";
808
+}
809
+.glyphicon-floppy-open:before {
810
+ content: "\e176";
811
+}
812
+.glyphicon-credit-card:before {
813
+ content: "\e177";
814
+}
815
+.glyphicon-transfer:before {
816
+ content: "\e178";
817
+}
818
+.glyphicon-cutlery:before {
819
+ content: "\e179";
820
+}
821
+.glyphicon-header:before {
822
+ content: "\e180";
823
+}
824
+.glyphicon-compressed:before {
825
+ content: "\e181";
826
+}
827
+.glyphicon-earphone:before {
828
+ content: "\e182";
829
+}
830
+.glyphicon-phone-alt:before {
831
+ content: "\e183";
832
+}
833
+.glyphicon-tower:before {
834
+ content: "\e184";
835
+}
836
+.glyphicon-stats:before {
837
+ content: "\e185";
838
+}
839
+.glyphicon-sd-video:before {
840
+ content: "\e186";
841
+}
842
+.glyphicon-hd-video:before {
843
+ content: "\e187";
844
+}
845
+.glyphicon-subtitles:before {
846
+ content: "\e188";
847
+}
848
+.glyphicon-sound-stereo:before {
849
+ content: "\e189";
850
+}
851
+.glyphicon-sound-dolby:before {
852
+ content: "\e190";
853
+}
854
+.glyphicon-sound-5-1:before {
855
+ content: "\e191";
856
+}
857
+.glyphicon-sound-6-1:before {
858
+ content: "\e192";
859
+}
860
+.glyphicon-sound-7-1:before {
861
+ content: "\e193";
862
+}
863
+.glyphicon-copyright-mark:before {
864
+ content: "\e194";
865
+}
866
+.glyphicon-registration-mark:before {
867
+ content: "\e195";
868
+}
869
+.glyphicon-cloud-download:before {
870
+ content: "\e197";
871
+}
872
+.glyphicon-cloud-upload:before {
873
+ content: "\e198";
874
+}
875
+.glyphicon-tree-conifer:before {
876
+ content: "\e199";
877
+}
878
+.glyphicon-tree-deciduous:before {
879
+ content: "\e200";
880
+}
881
+* {
882
+ -webkit-box-sizing: border-box;
883
+ -moz-box-sizing: border-box;
884
+ box-sizing: border-box;
885
+}
886
+*:before,
887
+*:after {
888
+ -webkit-box-sizing: border-box;
889
+ -moz-box-sizing: border-box;
890
+ box-sizing: border-box;
891
+}
892
+html {
893
+ font-size: 10px;
894
+
895
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
896
+}
897
+body {
898
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
899
+ font-size: 14px;
900
+ line-height: 1.42857143;
901
+ color: #333;
902
+ background-color: #fff;
903
+}
904
+input,
905
+button,
906
+select,
907
+textarea {
908
+ font-family: inherit;
909
+ font-size: inherit;
910
+ line-height: inherit;
911
+}
912
+a {
913
+ color: #428bca;
914
+ text-decoration: none;
915
+}
916
+a:hover,
917
+a:focus {
918
+ color: #2a6496;
919
+ text-decoration: underline;
920
+}
921
+a:focus {
922
+ outline: thin dotted;
923
+ outline: 5px auto -webkit-focus-ring-color;
924
+ outline-offset: -2px;
925
+}
926
+figure {
927
+ margin: 0;
928
+}
929
+img {
930
+ vertical-align: middle;
931
+}
932
+.img-responsive,
933
+.thumbnail > img,
934
+.thumbnail a > img,
935
+.carousel-inner > .item > img,
936
+.carousel-inner > .item > a > img {
937
+ display: block;
938
+ width: 100% \9;
939
+ max-width: 100%;
940
+ height: auto;
941
+}
942
+.img-rounded {
943
+ border-radius: 6px;
944
+}
945
+.img-thumbnail {
946
+ display: inline-block;
947
+ width: 100% \9;
948
+ max-width: 100%;
949
+ height: auto;
950
+ padding: 4px;
951
+ line-height: 1.42857143;
952
+ background-color: #fff;
953
+ border: 1px solid #ddd;
954
+ border-radius: 4px;
955
+ -webkit-transition: all .2s ease-in-out;
956
+ -o-transition: all .2s ease-in-out;
957
+ transition: all .2s ease-in-out;
958
+}
959
+.img-circle {
960
+ border-radius: 50%;
961
+}
962
+hr {
963
+ margin-top: 20px;
964
+ margin-bottom: 20px;
965
+ border: 0;
966
+ border-top: 1px solid #eee;
967
+}
968
+.sr-only {
969
+ position: absolute;
970
+ width: 1px;
971
+ height: 1px;
972
+ padding: 0;
973
+ margin: -1px;
974
+ overflow: hidden;
975
+ clip: rect(0, 0, 0, 0);
976
+ border: 0;
977
+}
978
+.sr-only-focusable:active,
979
+.sr-only-focusable:focus {
980
+ position: static;
981
+ width: auto;
982
+ height: auto;
983
+ margin: 0;
984
+ overflow: visible;
985
+ clip: auto;
986
+}
987
+h1,
988
+h2,
989
+h3,
990
+h4,
991
+h5,
992
+h6,
993
+.h1,
994
+.h2,
995
+.h3,
996
+.h4,
997
+.h5,
998
+.h6 {
999
+ font-family: inherit;
1000
+ font-weight: 500;
1001
+ line-height: 1.1;
1002
+ color: inherit;
1003
+}
1004
+h1 small,
1005
+h2 small,
1006
+h3 small,
1007
+h4 small,
1008
+h5 small,
1009
+h6 small,
1010
+.h1 small,
1011
+.h2 small,
1012
+.h3 small,
1013
+.h4 small,
1014
+.h5 small,
1015
+.h6 small,
1016
+h1 .small,
1017
+h2 .small,
1018
+h3 .small,
1019
+h4 .small,
1020
+h5 .small,
1021
+h6 .small,
1022
+.h1 .small,
1023
+.h2 .small,
1024
+.h3 .small,
1025
+.h4 .small,
1026
+.h5 .small,
1027
+.h6 .small {
1028
+ font-weight: normal;
1029
+ line-height: 1;
1030
+ color: #777;
1031
+}
1032
+h1,
1033
+.h1,
1034
+h2,
1035
+.h2,
1036
+h3,
1037
+.h3 {
1038
+ margin-top: 20px;
1039
+ margin-bottom: 10px;
1040
+}
1041
+h1 small,
1042
+.h1 small,
1043
+h2 small,
1044
+.h2 small,
1045
+h3 small,
1046
+.h3 small,
1047
+h1 .small,
1048
+.h1 .small,
1049
+h2 .small,
1050
+.h2 .small,
1051
+h3 .small,
1052
+.h3 .small {
1053
+ font-size: 65%;
1054
+}
1055
+h4,
1056
+.h4,
1057
+h5,
1058
+.h5,
1059
+h6,
1060
+.h6 {
1061
+ margin-top: 10px;
1062
+ margin-bottom: 10px;
1063
+}
1064
+h4 small,
1065
+.h4 small,
1066
+h5 small,
1067
+.h5 small,
1068
+h6 small,
1069
+.h6 small,
1070
+h4 .small,
1071
+.h4 .small,
1072
+h5 .small,
1073
+.h5 .small,
1074
+h6 .small,
1075
+.h6 .small {
1076
+ font-size: 75%;
1077
+}
1078
+h1,
1079
+.h1 {
1080
+ font-size: 36px;
1081
+}
1082
+h2,
1083
+.h2 {
1084
+ font-size: 30px;
1085
+}
1086
+h3,
1087
+.h3 {
1088
+ font-size: 24px;
1089
+}
1090
+h4,
1091
+.h4 {
1092
+ font-size: 18px;
1093
+}
1094
+h5,
1095
+.h5 {
1096
+ font-size: 14px;
1097
+}
1098
+h6,
1099
+.h6 {
1100
+ font-size: 12px;
1101
+}
1102
+p {
1103
+ margin: 0 0 10px;
1104
+}
1105
+.lead {
1106
+ margin-bottom: 20px;
1107
+ font-size: 16px;
1108
+ font-weight: 300;
1109
+ line-height: 1.4;
1110
+}
1111
+@media (min-width: 768px) {
1112
+ .lead {
1113
+ font-size: 21px;
1114
+ }
1115
+}
1116
+small,
1117
+.small {
1118
+ font-size: 85%;
1119
+}
1120
+cite {
1121
+ font-style: normal;
1122
+}
1123
+mark,
1124
+.mark {
1125
+ padding: .2em;
1126
+ background-color: #fcf8e3;
1127
+}
1128
+.text-left {
1129
+ text-align: left;
1130
+}
1131
+.text-right {
1132
+ text-align: right;
1133
+}
1134
+.text-center {
1135
+ text-align: center;
1136
+}
1137
+.text-justify {
1138
+ text-align: justify;
1139
+}
1140
+.text-nowrap {
1141
+ white-space: nowrap;
1142
+}
1143
+.text-lowercase {
1144
+ text-transform: lowercase;
1145
+}
1146
+.text-uppercase {
1147
+ text-transform: uppercase;
1148
+}
1149
+.text-capitalize {
1150
+ text-transform: capitalize;
1151
+}
1152
+.text-muted {
1153
+ color: #777;
1154
+}
1155
+.text-primary {
1156
+ color: #428bca;
1157
+}
1158
+a.text-primary:hover {
1159
+ color: #3071a9;
1160
+}
1161
+.text-success {
1162
+ color: #3c763d;
1163
+}
1164
+a.text-success:hover {
1165
+ color: #2b542c;
1166
+}
1167
+.text-info {
1168
+ color: #31708f;
1169
+}
1170
+a.text-info:hover {
1171
+ color: #245269;
1172
+}
1173
+.text-warning {
1174
+ color: #8a6d3b;
1175
+}
1176
+a.text-warning:hover {
1177
+ color: #66512c;
1178
+}
1179
+.text-danger {
1180
+ color: #a94442;
1181
+}
1182
+a.text-danger:hover {
1183
+ color: #843534;
1184
+}
1185
+.bg-primary {
1186
+ color: #fff;
1187
+ background-color: #428bca;
1188
+}
1189
+a.bg-primary:hover {
1190
+ background-color: #3071a9;
1191
+}
1192
+.bg-success {
1193
+ background-color: #dff0d8;
1194
+}
1195
+a.bg-success:hover {
1196
+ background-color: #c1e2b3;
1197
+}
1198
+.bg-info {
1199
+ background-color: #d9edf7;
1200
+}
1201
+a.bg-info:hover {
1202
+ background-color: #afd9ee;
1203
+}
1204
+.bg-warning {
1205
+ background-color: #fcf8e3;
1206
+}
1207
+a.bg-warning:hover {
1208
+ background-color: #f7ecb5;
1209
+}
1210
+.bg-danger {
1211
+ background-color: #f2dede;
1212
+}
1213
+a.bg-danger:hover {
1214
+ background-color: #e4b9b9;
1215
+}
1216
+.page-header {
1217
+ padding-bottom: 9px;
1218
+ margin: 40px 0 20px;
1219
+ border-bottom: 1px solid #eee;
1220
+}
1221
+ul,
1222
+ol {
1223
+ margin-top: 0;
1224
+ margin-bottom: 10px;
1225
+}
1226
+ul ul,
1227
+ol ul,
1228
+ul ol,
1229
+ol ol {
1230
+ margin-bottom: 0;
1231
+}
1232
+.list-unstyled {
1233
+ padding-left: 0;
1234
+ list-style: none;
1235
+}
1236
+.list-inline {
1237
+ padding-left: 0;
1238
+ margin-left: -5px;
1239
+ list-style: none;
1240
+}
1241
+.list-inline > li {
1242
+ display: inline-block;
1243
+ padding-right: 5px;
1244
+ padding-left: 5px;
1245
+}
1246
+dl {
1247
+ margin-top: 0;
1248
+ margin-bottom: 20px;
1249
+}
1250
+dt,
1251
+dd {
1252
+ line-height: 1.42857143;
1253
+}
1254
+dt {
1255
+ font-weight: bold;
1256
+}
1257
+dd {
1258
+ margin-left: 0;
1259
+}
1260
+@media (min-width: 768px) {
1261
+ .dl-horizontal dt {
1262
+ float: left;
1263
+ width: 160px;
1264
+ overflow: hidden;
1265
+ clear: left;
1266
+ text-align: right;
1267
+ text-overflow: ellipsis;
1268
+ white-space: nowrap;
1269
+ }
1270
+ .dl-horizontal dd {
1271
+ margin-left: 180px;
1272
+ }
1273
+}
1274
+abbr[title],
1275
+abbr[data-original-title] {
1276
+ cursor: help;
1277
+ border-bottom: 1px dotted #777;
1278
+}
1279
+.initialism {
1280
+ font-size: 90%;
1281
+ text-transform: uppercase;
1282
+}
1283
+blockquote {
1284
+ padding: 10px 20px;
1285
+ margin: 0 0 20px;
1286
+ font-size: 17.5px;
1287
+ border-left: 5px solid #eee;
1288
+}
1289
+blockquote p:last-child,
1290
+blockquote ul:last-child,
1291
+blockquote ol:last-child {
1292
+ margin-bottom: 0;
1293
+}
1294
+blockquote footer,
1295
+blockquote small,
1296
+blockquote .small {
1297
+ display: block;
1298
+ font-size: 80%;
1299
+ line-height: 1.42857143;
1300
+ color: #777;
1301
+}
1302
+blockquote footer:before,
1303
+blockquote small:before,
1304
+blockquote .small:before {
1305
+ content: '\2014 \00A0';
1306
+}
1307
+.blockquote-reverse,
1308
+blockquote.pull-right {
1309
+ padding-right: 15px;
1310
+ padding-left: 0;
1311
+ text-align: right;
1312
+ border-right: 5px solid #eee;
1313
+ border-left: 0;
1314
+}
1315
+.blockquote-reverse footer:before,
1316
+blockquote.pull-right footer:before,
1317
+.blockquote-reverse small:before,
1318
+blockquote.pull-right small:before,
1319
+.blockquote-reverse .small:before,
1320
+blockquote.pull-right .small:before {
1321
+ content: '';
1322
+}
1323
+.blockquote-reverse footer:after,
1324
+blockquote.pull-right footer:after,
1325
+.blockquote-reverse small:after,
1326
+blockquote.pull-right small:after,
1327
+.blockquote-reverse .small:after,
1328
+blockquote.pull-right .small:after {
1329
+ content: '\00A0 \2014';
1330
+}
1331
+blockquote:before,
1332
+blockquote:after {
1333
+ content: "";
1334
+}
1335
+address {
1336
+ margin-bottom: 20px;
1337
+ font-style: normal;
1338
+ line-height: 1.42857143;
1339
+}
1340
+code,
1341
+kbd,
1342
+pre,
1343
+samp {
1344
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
1345
+}
1346
+code {
1347
+ padding: 2px 4px;
1348
+ font-size: 90%;
1349
+ color: #c7254e;
1350
+ background-color: #f9f2f4;
1351
+ border-radius: 4px;
1352
+}
1353
+kbd {
1354
+ padding: 2px 4px;
1355
+ font-size: 90%;
1356
+ color: #fff;
1357
+ background-color: #333;
1358
+ border-radius: 3px;
1359
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
1360
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
1361
+}
1362
+kbd kbd {
1363
+ padding: 0;
1364
+ font-size: 100%;
1365
+ -webkit-box-shadow: none;
1366
+ box-shadow: none;
1367
+}
1368
+pre {
1369
+ display: block;
1370
+ padding: 9.5px;
1371
+ margin: 0 0 10px;
1372
+ font-size: 13px;
1373
+ line-height: 1.42857143;
1374
+ color: #333;
1375
+ word-break: break-all;
1376
+ word-wrap: break-word;
1377
+ background-color: #f5f5f5;
1378
+ border: 1px solid #ccc;
1379
+ border-radius: 4px;
1380
+}
1381
+pre code {
1382
+ padding: 0;
1383
+ font-size: inherit;
1384
+ color: inherit;
1385
+ white-space: pre-wrap;
1386
+ background-color: transparent;
1387
+ border-radius: 0;
1388
+}
1389
+.pre-scrollable {
1390
+ max-height: 340px;
1391
+ overflow-y: scroll;
1392
+}
1393
+.container {
1394
+ padding-right: 15px;
1395
+ padding-left: 15px;
1396
+ margin-right: auto;
1397
+ margin-left: auto;
1398
+}
1399
+@media (min-width: 768px) {
1400
+ .container {
1401
+ width: 750px;
1402
+ }
1403
+}
1404
+@media (min-width: 992px) {
1405
+ .container {
1406
+ width: 970px;
1407
+ }
1408
+}
1409
+@media (min-width: 1200px) {
1410
+ .container {
1411
+ width: 1170px;
1412
+ }
1413
+}
1414
+.container-fluid {
1415
+ padding-right: 15px;
1416
+ padding-left: 15px;
1417
+ margin-right: auto;
1418
+ margin-left: auto;
1419
+}
1420
+.row {
1421
+ margin-right: -15px;
1422
+ margin-left: -15px;
1423
+}
1424
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
1425
+ position: relative;
1426
+ min-height: 1px;
1427
+ padding-right: 15px;
1428
+ padding-left: 15px;
1429
+}
1430
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
1431
+ float: left;
1432
+}
1433
+.col-xs-12 {
1434
+ width: 100%;
1435
+}
1436
+.col-xs-11 {
1437
+ width: 91.66666667%;
1438
+}
1439
+.col-xs-10 {
1440
+ width: 83.33333333%;
1441
+}
1442
+.col-xs-9 {
1443
+ width: 75%;
1444
+}
1445
+.col-xs-8 {
1446
+ width: 66.66666667%;
1447
+}
1448
+.col-xs-7 {
1449
+ width: 58.33333333%;
1450
+}
1451
+.col-xs-6 {
1452
+ width: 50%;
1453
+}
1454
+.col-xs-5 {
1455
+ width: 41.66666667%;
1456
+}
1457
+.col-xs-4 {
1458
+ width: 33.33333333%;
1459
+}
1460
+.col-xs-3 {
1461
+ width: 25%;
1462
+}
1463
+.col-xs-2 {
1464
+ width: 16.66666667%;
1465
+}
1466
+.col-xs-1 {
1467
+ width: 8.33333333%;
1468
+}
1469
+.col-xs-pull-12 {
1470
+ right: 100%;
1471
+}
1472
+.col-xs-pull-11 {
1473
+ right: 91.66666667%;
1474
+}
1475
+.col-xs-pull-10 {
1476
+ right: 83.33333333%;
1477
+}
1478
+.col-xs-pull-9 {
1479
+ right: 75%;
1480
+}
1481
+.col-xs-pull-8 {
1482
+ right: 66.66666667%;
1483
+}
1484
+.col-xs-pull-7 {
1485
+ right: 58.33333333%;
1486
+}
1487
+.col-xs-pull-6 {
1488
+ right: 50%;
1489
+}
1490
+.col-xs-pull-5 {
1491
+ right: 41.66666667%;
1492
+}
1493
+.col-xs-pull-4 {
1494
+ right: 33.33333333%;
1495
+}
1496
+.col-xs-pull-3 {
1497
+ right: 25%;
1498
+}
1499
+.col-xs-pull-2 {
1500
+ right: 16.66666667%;
1501
+}
1502
+.col-xs-pull-1 {
1503
+ right: 8.33333333%;
1504
+}
1505
+.col-xs-pull-0 {
1506
+ right: auto;
1507
+}
1508
+.col-xs-push-12 {
1509
+ left: 100%;
1510
+}
1511
+.col-xs-push-11 {
1512
+ left: 91.66666667%;
1513
+}
1514
+.col-xs-push-10 {
1515
+ left: 83.33333333%;
1516
+}
1517
+.col-xs-push-9 {
1518
+ left: 75%;
1519
+}
1520
+.col-xs-push-8 {
1521
+ left: 66.66666667%;
1522
+}
1523
+.col-xs-push-7 {
1524
+ left: 58.33333333%;
1525
+}
1526
+.col-xs-push-6 {
1527
+ left: 50%;
1528
+}
1529
+.col-xs-push-5 {
1530
+ left: 41.66666667%;
1531
+}
1532
+.col-xs-push-4 {
1533
+ left: 33.33333333%;
1534
+}
1535
+.col-xs-push-3 {
1536
+ left: 25%;
1537
+}
1538
+.col-xs-push-2 {
1539
+ left: 16.66666667%;
1540
+}
1541
+.col-xs-push-1 {
1542
+ left: 8.33333333%;
1543
+}
1544
+.col-xs-push-0 {
1545
+ left: auto;
1546
+}
1547
+.col-xs-offset-12 {
1548
+ margin-left: 100%;
1549
+}
1550
+.col-xs-offset-11 {
1551
+ margin-left: 91.66666667%;
1552
+}
1553
+.col-xs-offset-10 {
1554
+ margin-left: 83.33333333%;
1555
+}
1556
+.col-xs-offset-9 {
1557
+ margin-left: 75%;
1558
+}
1559
+.col-xs-offset-8 {
1560
+ margin-left: 66.66666667%;
1561
+}
1562
+.col-xs-offset-7 {
1563
+ margin-left: 58.33333333%;
1564
+}
1565
+.col-xs-offset-6 {
1566
+ margin-left: 50%;
1567
+}
1568
+.col-xs-offset-5 {
1569
+ margin-left: 41.66666667%;
1570
+}
1571
+.col-xs-offset-4 {
1572
+ margin-left: 33.33333333%;
1573
+}
1574
+.col-xs-offset-3 {
1575
+ margin-left: 25%;
1576
+}
1577
+.col-xs-offset-2 {
1578
+ margin-left: 16.66666667%;
1579
+}
1580
+.col-xs-offset-1 {
1581
+ margin-left: 8.33333333%;
1582
+}
1583
+.col-xs-offset-0 {
1584
+ margin-left: 0;
1585
+}
1586
+@media (min-width: 768px) {
1587
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
1588
+ float: left;
1589
+ }
1590
+ .col-sm-12 {
1591
+ width: 100%;
1592
+ }
1593
+ .col-sm-11 {
1594
+ width: 91.66666667%;
1595
+ }
1596
+ .col-sm-10 {
1597
+ width: 83.33333333%;
1598
+ }
1599
+ .col-sm-9 {
1600
+ width: 75%;
1601
+ }
1602
+ .col-sm-8 {
1603
+ width: 66.66666667%;
1604
+ }
1605
+ .col-sm-7 {
1606
+ width: 58.33333333%;
1607
+ }
1608
+ .col-sm-6 {
1609
+ width: 50%;
1610
+ }
1611
+ .col-sm-5 {
1612
+ width: 41.66666667%;
1613
+ }
1614
+ .col-sm-4 {
1615
+ width: 33.33333333%;
1616
+ }
1617
+ .col-sm-3 {
1618
+ width: 25%;
1619
+ }
1620
+ .col-sm-2 {
1621
+ width: 16.66666667%;
1622
+ }
1623
+ .col-sm-1 {
1624
+ width: 8.33333333%;
1625
+ }
1626
+ .col-sm-pull-12 {
1627
+ right: 100%;
1628
+ }
1629
+ .col-sm-pull-11 {
1630
+ right: 91.66666667%;
1631
+ }
1632
+ .col-sm-pull-10 {
1633
+ right: 83.33333333%;
1634
+ }
1635
+ .col-sm-pull-9 {
1636
+ right: 75%;
1637
+ }
1638
+ .col-sm-pull-8 {
1639
+ right: 66.66666667%;
1640
+ }
1641
+ .col-sm-pull-7 {
1642
+ right: 58.33333333%;
1643
+ }
1644
+ .col-sm-pull-6 {
1645
+ right: 50%;
1646
+ }
1647
+ .col-sm-pull-5 {
1648
+ right: 41.66666667%;
1649
+ }
1650
+ .col-sm-pull-4 {
1651
+ right: 33.33333333%;
1652
+ }
1653
+ .col-sm-pull-3 {
1654
+ right: 25%;
1655
+ }
1656
+ .col-sm-pull-2 {
1657
+ right: 16.66666667%;
1658
+ }
1659
+ .col-sm-pull-1 {
1660
+ right: 8.33333333%;
1661
+ }
1662
+ .col-sm-pull-0 {
1663
+ right: auto;
1664
+ }
1665
+ .col-sm-push-12 {
1666
+ left: 100%;
1667
+ }
1668
+ .col-sm-push-11 {
1669
+ left: 91.66666667%;
1670
+ }
1671
+ .col-sm-push-10 {
1672
+ left: 83.33333333%;
1673
+ }
1674
+ .col-sm-push-9 {
1675
+ left: 75%;
1676
+ }
1677
+ .col-sm-push-8 {
1678
+ left: 66.66666667%;
1679
+ }
1680
+ .col-sm-push-7 {
1681
+ left: 58.33333333%;
1682
+ }
1683
+ .col-sm-push-6 {
1684
+ left: 50%;
1685
+ }
1686
+ .col-sm-push-5 {
1687
+ left: 41.66666667%;
1688
+ }
1689
+ .col-sm-push-4 {
1690
+ left: 33.33333333%;
1691
+ }
1692
+ .col-sm-push-3 {
1693
+ left: 25%;
1694
+ }
1695
+ .col-sm-push-2 {
1696
+ left: 16.66666667%;
1697
+ }
1698
+ .col-sm-push-1 {
1699
+ left: 8.33333333%;
1700
+ }
1701
+ .col-sm-push-0 {
1702
+ left: auto;
1703
+ }
1704
+ .col-sm-offset-12 {
1705
+ margin-left: 100%;
1706
+ }
1707
+ .col-sm-offset-11 {
1708
+ margin-left: 91.66666667%;
1709
+ }
1710
+ .col-sm-offset-10 {
1711
+ margin-left: 83.33333333%;
1712
+ }
1713
+ .col-sm-offset-9 {
1714
+ margin-left: 75%;
1715
+ }
1716
+ .col-sm-offset-8 {
1717
+ margin-left: 66.66666667%;
1718
+ }
1719
+ .col-sm-offset-7 {
1720
+ margin-left: 58.33333333%;
1721
+ }
1722
+ .col-sm-offset-6 {
1723
+ margin-left: 50%;
1724
+ }
1725
+ .col-sm-offset-5 {
1726
+ margin-left: 41.66666667%;
1727
+ }
1728
+ .col-sm-offset-4 {
1729
+ margin-left: 33.33333333%;
1730
+ }
1731
+ .col-sm-offset-3 {
1732
+ margin-left: 25%;
1733
+ }
1734
+ .col-sm-offset-2 {
1735
+ margin-left: 16.66666667%;
1736
+ }
1737
+ .col-sm-offset-1 {
1738
+ margin-left: 8.33333333%;
1739
+ }
1740
+ .col-sm-offset-0 {
1741
+ margin-left: 0;
1742
+ }
1743
+}
1744
+@media (min-width: 992px) {
1745
+ .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
1746
+ float: left;
1747
+ }
1748
+ .col-md-12 {
1749
+ width: 100%;
1750
+ }
1751
+ .col-md-11 {
1752
+ width: 91.66666667%;
1753
+ }
1754
+ .col-md-10 {
1755
+ width: 83.33333333%;
1756
+ }
1757
+ .col-md-9 {
1758
+ width: 75%;
1759
+ }
1760
+ .col-md-8 {
1761
+ width: 66.66666667%;
1762
+ }
1763
+ .col-md-7 {
1764
+ width: 58.33333333%;
1765
+ }
1766
+ .col-md-6 {
1767
+ width: 50%;
1768
+ }
1769
+ .col-md-5 {
1770
+ width: 41.66666667%;
1771
+ }
1772
+ .col-md-4 {
1773
+ width: 33.33333333%;
1774
+ }
1775
+ .col-md-3 {
1776
+ width: 25%;
1777
+ }
1778
+ .col-md-2 {
1779
+ width: 16.66666667%;
1780
+ }
1781
+ .col-md-1 {
1782
+ width: 8.33333333%;
1783
+ }
1784
+ .col-md-pull-12 {
1785
+ right: 100%;
1786
+ }
1787
+ .col-md-pull-11 {
1788
+ right: 91.66666667%;
1789
+ }
1790
+ .col-md-pull-10 {
1791
+ right: 83.33333333%;
1792
+ }
1793
+ .col-md-pull-9 {
1794
+ right: 75%;
1795
+ }
1796
+ .col-md-pull-8 {
1797
+ right: 66.66666667%;
1798
+ }
1799
+ .col-md-pull-7 {
1800
+ right: 58.33333333%;
1801
+ }
1802
+ .col-md-pull-6 {
1803
+ right: 50%;
1804
+ }
1805
+ .col-md-pull-5 {
1806
+ right: 41.66666667%;
1807
+ }
1808
+ .col-md-pull-4 {
1809
+ right: 33.33333333%;
1810
+ }
1811
+ .col-md-pull-3 {
1812
+ right: 25%;
1813
+ }
1814
+ .col-md-pull-2 {
1815
+ right: 16.66666667%;
1816
+ }
1817
+ .col-md-pull-1 {
1818
+ right: 8.33333333%;
1819
+ }
1820
+ .col-md-pull-0 {
1821
+ right: auto;
1822
+ }
1823
+ .col-md-push-12 {
1824
+ left: 100%;
1825
+ }
1826
+ .col-md-push-11 {
1827
+ left: 91.66666667%;
1828
+ }
1829
+ .col-md-push-10 {
1830
+ left: 83.33333333%;
1831
+ }
1832
+ .col-md-push-9 {
1833
+ left: 75%;
1834
+ }
1835
+ .col-md-push-8 {
1836
+ left: 66.66666667%;
1837
+ }
1838
+ .col-md-push-7 {
1839
+ left: 58.33333333%;
1840
+ }
1841
+ .col-md-push-6 {
1842
+ left: 50%;
1843
+ }
1844
+ .col-md-push-5 {
1845
+ left: 41.66666667%;
1846
+ }
1847
+ .col-md-push-4 {
1848
+ left: 33.33333333%;
1849
+ }
1850
+ .col-md-push-3 {
1851
+ left: 25%;
1852
+ }
1853
+ .col-md-push-2 {
1854
+ left: 16.66666667%;
1855
+ }
1856
+ .col-md-push-1 {
1857
+ left: 8.33333333%;
1858
+ }
1859
+ .col-md-push-0 {
1860
+ left: auto;
1861
+ }
1862
+ .col-md-offset-12 {
1863
+ margin-left: 100%;
1864
+ }
1865
+ .col-md-offset-11 {
1866
+ margin-left: 91.66666667%;
1867
+ }
1868
+ .col-md-offset-10 {
1869
+ margin-left: 83.33333333%;
1870
+ }
1871
+ .col-md-offset-9 {
1872
+ margin-left: 75%;
1873
+ }
1874
+ .col-md-offset-8 {
1875
+ margin-left: 66.66666667%;
1876
+ }
1877
+ .col-md-offset-7 {
1878
+ margin-left: 58.33333333%;
1879
+ }
1880
+ .col-md-offset-6 {
1881
+ margin-left: 50%;
1882
+ }
1883
+ .col-md-offset-5 {
1884
+ margin-left: 41.66666667%;
1885
+ }
1886
+ .col-md-offset-4 {
1887
+ margin-left: 33.33333333%;
1888
+ }
1889
+ .col-md-offset-3 {
1890
+ margin-left: 25%;
1891
+ }
1892
+ .col-md-offset-2 {
1893
+ margin-left: 16.66666667%;
1894
+ }
1895
+ .col-md-offset-1 {
1896
+ margin-left: 8.33333333%;
1897
+ }
1898
+ .col-md-offset-0 {
1899
+ margin-left: 0;
1900
+ }
1901
+}
1902
+@media (min-width: 1200px) {
1903
+ .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
1904
+ float: left;
1905
+ }
1906
+ .col-lg-12 {
1907
+ width: 100%;
1908
+ }
1909
+ .col-lg-11 {
1910
+ width: 91.66666667%;
1911
+ }
1912
+ .col-lg-10 {
1913
+ width: 83.33333333%;
1914
+ }
1915
+ .col-lg-9 {
1916
+ width: 75%;
1917
+ }
1918
+ .col-lg-8 {
1919
+ width: 66.66666667%;
1920
+ }
1921
+ .col-lg-7 {
1922
+ width: 58.33333333%;
1923
+ }
1924
+ .col-lg-6 {
1925
+ width: 50%;
1926
+ }
1927
+ .col-lg-5 {
1928
+ width: 41.66666667%;
1929
+ }
1930
+ .col-lg-4 {
1931
+ width: 33.33333333%;
1932
+ }
1933
+ .col-lg-3 {
1934
+ width: 25%;
1935
+ }
1936
+ .col-lg-2 {
1937
+ width: 16.66666667%;
1938
+ }
1939
+ .col-lg-1 {
1940
+ width: 8.33333333%;
1941
+ }
1942
+ .col-lg-pull-12 {
1943
+ right: 100%;
1944
+ }
1945
+ .col-lg-pull-11 {
1946
+ right: 91.66666667%;
1947
+ }
1948
+ .col-lg-pull-10 {
1949
+ right: 83.33333333%;
1950
+ }
1951
+ .col-lg-pull-9 {
1952
+ right: 75%;
1953
+ }
1954
+ .col-lg-pull-8 {
1955
+ right: 66.66666667%;
1956
+ }
1957
+ .col-lg-pull-7 {
1958
+ right: 58.33333333%;
1959
+ }
1960
+ .col-lg-pull-6 {
1961
+ right: 50%;
1962
+ }
1963
+ .col-lg-pull-5 {
1964
+ right: 41.66666667%;
1965
+ }
1966
+ .col-lg-pull-4 {
1967
+ right: 33.33333333%;
1968
+ }
1969
+ .col-lg-pull-3 {
1970
+ right: 25%;
1971
+ }
1972
+ .col-lg-pull-2 {
1973
+ right: 16.66666667%;
1974
+ }
1975
+ .col-lg-pull-1 {
1976
+ right: 8.33333333%;
1977
+ }
1978
+ .col-lg-pull-0 {
1979
+ right: auto;
1980
+ }
1981
+ .col-lg-push-12 {
1982
+ left: 100%;
1983
+ }
1984
+ .col-lg-push-11 {
1985
+ left: 91.66666667%;
1986
+ }
1987
+ .col-lg-push-10 {
1988
+ left: 83.33333333%;
1989
+ }
1990
+ .col-lg-push-9 {
1991
+ left: 75%;
1992
+ }
1993
+ .col-lg-push-8 {
1994
+ left: 66.66666667%;
1995
+ }
1996
+ .col-lg-push-7 {
1997
+ left: 58.33333333%;
1998
+ }
1999
+ .col-lg-push-6 {
2000
+ left: 50%;
2001
+ }
2002
+ .col-lg-push-5 {
2003
+ left: 41.66666667%;
2004
+ }
2005
+ .col-lg-push-4 {
2006
+ left: 33.33333333%;
2007
+ }
2008
+ .col-lg-push-3 {
2009
+ left: 25%;
2010
+ }
2011
+ .col-lg-push-2 {
2012
+ left: 16.66666667%;
2013
+ }
2014
+ .col-lg-push-1 {
2015
+ left: 8.33333333%;
2016
+ }
2017
+ .col-lg-push-0 {
2018
+ left: auto;
2019
+ }
2020
+ .col-lg-offset-12 {
2021
+ margin-left: 100%;
2022
+ }
2023
+ .col-lg-offset-11 {
2024
+ margin-left: 91.66666667%;
2025
+ }
2026
+ .col-lg-offset-10 {
2027
+ margin-left: 83.33333333%;
2028
+ }
2029
+ .col-lg-offset-9 {
2030
+ margin-left: 75%;
2031
+ }
2032
+ .col-lg-offset-8 {
2033
+ margin-left: 66.66666667%;
2034
+ }
2035
+ .col-lg-offset-7 {
2036
+ margin-left: 58.33333333%;
2037
+ }
2038
+ .col-lg-offset-6 {
2039
+ margin-left: 50%;
2040
+ }
2041
+ .col-lg-offset-5 {
2042
+ margin-left: 41.66666667%;
2043
+ }
2044
+ .col-lg-offset-4 {
2045
+ margin-left: 33.33333333%;
2046
+ }
2047
+ .col-lg-offset-3 {
2048
+ margin-left: 25%;
2049
+ }
2050
+ .col-lg-offset-2 {
2051
+ margin-left: 16.66666667%;
2052
+ }
2053
+ .col-lg-offset-1 {
2054
+ margin-left: 8.33333333%;
2055
+ }
2056
+ .col-lg-offset-0 {
2057
+ margin-left: 0;
2058
+ }
2059
+}
2060
+table {
2061
+ background-color: transparent;
2062
+}
2063
+th {
2064
+ text-align: left;
2065
+}
2066
+.table {
2067
+ width: 100%;
2068
+ max-width: 100%;
2069
+ margin-bottom: 20px;
2070
+}
2071
+.table > thead > tr > th,
2072
+.table > tbody > tr > th,
2073
+.table > tfoot > tr > th,
2074
+.table > thead > tr > td,
2075
+.table > tbody > tr > td,
2076
+.table > tfoot > tr > td {
2077
+ padding: 8px;
2078
+ line-height: 1.42857143;
2079
+ vertical-align: top;
2080
+ border-top: 1px solid #ddd;
2081
+}
2082
+.table > thead > tr > th {
2083
+ vertical-align: bottom;
2084
+ border-bottom: 2px solid #ddd;
2085
+}
2086
+.table > caption + thead > tr:first-child > th,
2087
+.table > colgroup + thead > tr:first-child > th,
2088
+.table > thead:first-child > tr:first-child > th,
2089
+.table > caption + thead > tr:first-child > td,
2090
+.table > colgroup + thead > tr:first-child > td,
2091
+.table > thead:first-child > tr:first-child > td {
2092
+ border-top: 0;
2093
+}
2094
+.table > tbody + tbody {
2095
+ border-top: 2px solid #ddd;
2096
+}
2097
+.table .table {
2098
+ background-color: #fff;
2099
+}
2100
+.table-condensed > thead > tr > th,
2101
+.table-condensed > tbody > tr > th,
2102
+.table-condensed > tfoot > tr > th,
2103
+.table-condensed > thead > tr > td,
2104
+.table-condensed > tbody > tr > td,
2105
+.table-condensed > tfoot > tr > td {
2106
+ padding: 5px;
2107
+}
2108
+.table-bordered {
2109
+ border: 1px solid #ddd;
2110
+}
2111
+.table-bordered > thead > tr > th,
2112
+.table-bordered > tbody > tr > th,
2113
+.table-bordered > tfoot > tr > th,
2114
+.table-bordered > thead > tr > td,
2115
+.table-bordered > tbody > tr > td,
2116
+.table-bordered > tfoot > tr > td {
2117
+ border: 1px solid #ddd;
2118
+}
2119
+.table-bordered > thead > tr > th,
2120
+.table-bordered > thead > tr > td {
2121
+ border-bottom-width: 2px;
2122
+}
2123
+.table-striped > tbody > tr:nth-child(odd) > td,
2124
+.table-striped > tbody > tr:nth-child(odd) > th {
2125
+ background-color: #f9f9f9;
2126
+}
2127
+.table-hover > tbody > tr:hover > td,
2128
+.table-hover > tbody > tr:hover > th {
2129
+ background-color: #f5f5f5;
2130
+}
2131
+table col[class*="col-"] {
2132
+ position: static;
2133
+ display: table-column;
2134
+ float: none;
2135
+}
2136
+table td[class*="col-"],
2137
+table th[class*="col-"] {
2138
+ position: static;
2139
+ display: table-cell;
2140
+ float: none;
2141
+}
2142
+.table > thead > tr > td.active,
2143
+.table > tbody > tr > td.active,
2144
+.table > tfoot > tr > td.active,
2145
+.table > thead > tr > th.active,
2146
+.table > tbody > tr > th.active,
2147
+.table > tfoot > tr > th.active,
2148
+.table > thead > tr.active > td,
2149
+.table > tbody > tr.active > td,
2150
+.table > tfoot > tr.active > td,
2151
+.table > thead > tr.active > th,
2152
+.table > tbody > tr.active > th,
2153
+.table > tfoot > tr.active > th {
2154
+ background-color: #f5f5f5;
2155
+}
2156
+.table-hover > tbody > tr > td.active:hover,
2157
+.table-hover > tbody > tr > th.active:hover,
2158
+.table-hover > tbody > tr.active:hover > td,
2159
+.table-hover > tbody > tr:hover > .active,
2160
+.table-hover > tbody > tr.active:hover > th {
2161
+ background-color: #e8e8e8;
2162
+}
2163
+.table > thead > tr > td.success,
2164
+.table > tbody > tr > td.success,
2165
+.table > tfoot > tr > td.success,
2166
+.table > thead > tr > th.success,
2167
+.table > tbody > tr > th.success,
2168
+.table > tfoot > tr > th.success,
2169
+.table > thead > tr.success > td,
2170
+.table > tbody > tr.success > td,
2171
+.table > tfoot > tr.success > td,
2172
+.table > thead > tr.success > th,
2173
+.table > tbody > tr.success > th,
2174
+.table > tfoot > tr.success > th {
2175
+ background-color: #dff0d8;
2176
+}
2177
+.table-hover > tbody > tr > td.success:hover,
2178
+.table-hover > tbody > tr > th.success:hover,
2179
+.table-hover > tbody > tr.success:hover > td,
2180
+.table-hover > tbody > tr:hover > .success,
2181
+.table-hover > tbody > tr.success:hover > th {
2182
+ background-color: #d0e9c6;
2183
+}
2184
+.table > thead > tr > td.info,
2185
+.table > tbody > tr > td.info,
2186
+.table > tfoot > tr > td.info,
2187
+.table > thead > tr > th.info,
2188
+.table > tbody > tr > th.info,
2189
+.table > tfoot > tr > th.info,
2190
+.table > thead > tr.info > td,
2191
+.table > tbody > tr.info > td,
2192
+.table > tfoot > tr.info > td,
2193
+.table > thead > tr.info > th,
2194
+.table > tbody > tr.info > th,
2195
+.table > tfoot > tr.info > th {
2196
+ background-color: #d9edf7;
2197
+}
2198
+.table-hover > tbody > tr > td.info:hover,
2199
+.table-hover > tbody > tr > th.info:hover,
2200
+.table-hover > tbody > tr.info:hover > td,
2201
+.table-hover > tbody > tr:hover > .info,
2202
+.table-hover > tbody > tr.info:hover > th {
2203
+ background-color: #c4e3f3;
2204
+}
2205
+.table > thead > tr > td.warning,
2206
+.table > tbody > tr > td.warning,
2207
+.table > tfoot > tr > td.warning,
2208
+.table > thead > tr > th.warning,
2209
+.table > tbody > tr > th.warning,
2210
+.table > tfoot > tr > th.warning,
2211
+.table > thead > tr.warning > td,
2212
+.table > tbody > tr.warning > td,
2213
+.table > tfoot > tr.warning > td,
2214
+.table > thead > tr.warning > th,
2215
+.table > tbody > tr.warning > th,
2216
+.table > tfoot > tr.warning > th {
2217
+ background-color: #fcf8e3;
2218
+}
2219
+.table-hover > tbody > tr > td.warning:hover,
2220
+.table-hover > tbody > tr > th.warning:hover,
2221
+.table-hover > tbody > tr.warning:hover > td,
2222
+.table-hover > tbody > tr:hover > .warning,
2223
+.table-hover > tbody > tr.warning:hover > th {
2224
+ background-color: #faf2cc;
2225
+}
2226
+.table > thead > tr > td.danger,
2227
+.table > tbody > tr > td.danger,
2228
+.table > tfoot > tr > td.danger,
2229
+.table > thead > tr > th.danger,
2230
+.table > tbody > tr > th.danger,
2231
+.table > tfoot > tr > th.danger,
2232
+.table > thead > tr.danger > td,
2233
+.table > tbody > tr.danger > td,
2234
+.table > tfoot > tr.danger > td,
2235
+.table > thead > tr.danger > th,
2236
+.table > tbody > tr.danger > th,
2237
+.table > tfoot > tr.danger > th {
2238
+ background-color: #f2dede;
2239
+}
2240
+.table-hover > tbody > tr > td.danger:hover,
2241
+.table-hover > tbody > tr > th.danger:hover,
2242
+.table-hover > tbody > tr.danger:hover > td,
2243
+.table-hover > tbody > tr:hover > .danger,
2244
+.table-hover > tbody > tr.danger:hover > th {
2245
+ background-color: #ebcccc;
2246
+}
2247
+@media screen and (max-width: 767px) {
2248
+ .table-responsive {
2249
+ width: 100%;
2250
+ margin-bottom: 15px;
2251
+ overflow-x: auto;
2252
+ overflow-y: hidden;
2253
+ -webkit-overflow-scrolling: touch;
2254
+ -ms-overflow-style: -ms-autohiding-scrollbar;
2255
+ border: 1px solid #ddd;
2256
+ }
2257
+ .table-responsive > .table {
2258
+ margin-bottom: 0;
2259
+ }
2260
+ .table-responsive > .table > thead > tr > th,
2261
+ .table-responsive > .table > tbody > tr > th,
2262
+ .table-responsive > .table > tfoot > tr > th,
2263
+ .table-responsive > .table > thead > tr > td,
2264
+ .table-responsive > .table > tbody > tr > td,
2265
+ .table-responsive > .table > tfoot > tr > td {
2266
+ white-space: nowrap;
2267
+ }
2268
+ .table-responsive > .table-bordered {
2269
+ border: 0;
2270
+ }
2271
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
2272
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
2273
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
2274
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
2275
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
2276
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
2277
+ border-left: 0;
2278
+ }
2279
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
2280
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
2281
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
2282
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
2283
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
2284
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
2285
+ border-right: 0;
2286
+ }
2287
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
2288
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
2289
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
2290
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
2291
+ border-bottom: 0;
2292
+ }
2293
+}
2294
+fieldset {
2295
+ min-width: 0;
2296
+ padding: 0;
2297
+ margin: 0;
2298
+ border: 0;
2299
+}
2300
+legend {
2301
+ display: block;
2302
+ width: 100%;
2303
+ padding: 0;
2304
+ margin-bottom: 20px;
2305
+ font-size: 21px;
2306
+ line-height: inherit;
2307
+ color: #333;
2308
+ border: 0;
2309
+ border-bottom: 1px solid #e5e5e5;
2310
+}
2311
+label {
2312
+ display: inline-block;
2313
+ max-width: 100%;
2314
+ margin-bottom: 5px;
2315
+ font-weight: bold;
2316
+}
2317
+input[type="search"] {
2318
+ -webkit-box-sizing: border-box;
2319
+ -moz-box-sizing: border-box;
2320
+ box-sizing: border-box;
2321
+}
2322
+input[type="radio"],
2323
+input[type="checkbox"] {
2324
+ margin: 4px 0 0;
2325
+ margin-top: 1px \9;
2326
+ line-height: normal;
2327
+}
2328
+input[type="file"] {
2329
+ display: block;
2330
+}
2331
+input[type="range"] {
2332
+ display: block;
2333
+ width: 100%;
2334
+}
2335
+select[multiple],
2336
+select[size] {
2337
+ height: auto;
2338
+}
2339
+input[type="file"]:focus,
2340
+input[type="radio"]:focus,
2341
+input[type="checkbox"]:focus {
2342
+ outline: thin dotted;
2343
+ outline: 5px auto -webkit-focus-ring-color;
2344
+ outline-offset: -2px;
2345
+}
2346
+output {
2347
+ display: block;
2348
+ padding-top: 7px;
2349
+ font-size: 14px;
2350
+ line-height: 1.42857143;
2351
+ color: #555;
2352
+}
2353
+.form-control {
2354
+ display: block;
2355
+ width: 100%;
2356
+ height: 34px;
2357
+ padding: 6px 12px;
2358
+ font-size: 14px;
2359
+ line-height: 1.42857143;
2360
+ color: #555;
2361
+ background-color: #fff;
2362
+ background-image: none;
2363
+ border: 1px solid #ccc;
2364
+ border-radius: 4px;
2365
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2366
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2367
+ -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
2368
+ -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2369
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2370
+}
2371
+.form-control:focus {
2372
+ border-color: #66afe9;
2373
+ outline: 0;
2374
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
2375
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
2376
+}
2377
+.form-control::-moz-placeholder {
2378
+ color: #777;
2379
+ opacity: 1;
2380
+}
2381
+.form-control:-ms-input-placeholder {
2382
+ color: #777;
2383
+}
2384
+.form-control::-webkit-input-placeholder {
2385
+ color: #777;
2386
+}
2387
+.form-control[disabled],
2388
+.form-control[readonly],
2389
+fieldset[disabled] .form-control {
2390
+ cursor: not-allowed;
2391
+ background-color: #eee;
2392
+ opacity: 1;
2393
+}
2394
+textarea.form-control {
2395
+ height: auto;
2396
+}
2397
+input[type="search"] {
2398
+ -webkit-appearance: none;
2399
+}
2400
+input[type="date"],
2401
+input[type="time"],
2402
+input[type="datetime-local"],
2403
+input[type="month"] {
2404
+ line-height: 34px;
2405
+ line-height: 1.42857143 \0;
2406
+}
2407
+input[type="date"].input-sm,
2408
+input[type="time"].input-sm,
2409
+input[type="datetime-local"].input-sm,
2410
+input[type="month"].input-sm {
2411
+ line-height: 30px;
2412
+}
2413
+input[type="date"].input-lg,
2414
+input[type="time"].input-lg,
2415
+input[type="datetime-local"].input-lg,
2416
+input[type="month"].input-lg {
2417
+ line-height: 46px;
2418
+}
2419
+.form-group {
2420
+ margin-bottom: 15px;
2421
+}
2422
+.radio,
2423
+.checkbox {
2424
+ position: relative;
2425
+ display: block;
2426
+ min-height: 20px;
2427
+ margin-top: 10px;
2428
+ margin-bottom: 10px;
2429
+}
2430
+.radio label,
2431
+.checkbox label {
2432
+ padding-left: 20px;
2433
+ margin-bottom: 0;
2434
+ font-weight: normal;
2435
+ cursor: pointer;
2436
+}
2437
+.radio input[type="radio"],
2438
+.radio-inline input[type="radio"],
2439
+.checkbox input[type="checkbox"],
2440
+.checkbox-inline input[type="checkbox"] {
2441
+ position: absolute;
2442
+ margin-top: 4px \9;
2443
+ margin-left: -20px;
2444
+}
2445
+.radio + .radio,
2446
+.checkbox + .checkbox {
2447
+ margin-top: -5px;
2448
+}
2449
+.radio-inline,
2450
+.checkbox-inline {
2451
+ display: inline-block;
2452
+ padding-left: 20px;
2453
+ margin-bottom: 0;
2454
+ font-weight: normal;
2455
+ vertical-align: middle;
2456
+ cursor: pointer;
2457
+}
2458
+.radio-inline + .radio-inline,
2459
+.checkbox-inline + .checkbox-inline {
2460
+ margin-top: 0;
2461
+ margin-left: 10px;
2462
+}
2463
+input[type="radio"][disabled],
2464
+input[type="checkbox"][disabled],
2465
+input[type="radio"].disabled,
2466
+input[type="checkbox"].disabled,
2467
+fieldset[disabled] input[type="radio"],
2468
+fieldset[disabled] input[type="checkbox"] {
2469
+ cursor: not-allowed;
2470
+}
2471
+.radio-inline.disabled,
2472
+.checkbox-inline.disabled,
2473
+fieldset[disabled] .radio-inline,
2474
+fieldset[disabled] .checkbox-inline {
2475
+ cursor: not-allowed;
2476
+}
2477
+.radio.disabled label,
2478
+.checkbox.disabled label,
2479
+fieldset[disabled] .radio label,
2480
+fieldset[disabled] .checkbox label {
2481
+ cursor: not-allowed;
2482
+}
2483
+.form-control-static {
2484
+ padding-top: 7px;
2485
+ padding-bottom: 7px;
2486
+ margin-bottom: 0;
2487
+}
2488
+.form-control-static.input-lg,
2489
+.form-control-static.input-sm {
2490
+ padding-right: 0;
2491
+ padding-left: 0;
2492
+}
2493
+.input-sm,
2494
+.form-horizontal .form-group-sm .form-control {
2495
+ height: 30px;
2496
+ padding: 5px 10px;
2497
+ font-size: 12px;
2498
+ line-height: 1.5;
2499
+ border-radius: 3px;
2500
+}
2501
+select.input-sm {
2502
+ height: 30px;
2503
+ line-height: 30px;
2504
+}
2505
+textarea.input-sm,
2506
+select[multiple].input-sm {
2507
+ height: auto;
2508
+}
2509
+.input-lg,
2510
+.form-horizontal .form-group-lg .form-control {
2511
+ height: 46px;
2512
+ padding: 10px 16px;
2513
+ font-size: 18px;
2514
+ line-height: 1.33;
2515
+ border-radius: 6px;
2516
+}
2517
+select.input-lg {
2518
+ height: 46px;
2519
+ line-height: 46px;
2520
+}
2521
+textarea.input-lg,
2522
+select[multiple].input-lg {
2523
+ height: auto;
2524
+}
2525
+.has-feedback {
2526
+ position: relative;
2527
+}
2528
+.has-feedback .form-control {
2529
+ padding-right: 42.5px;
2530
+}
2531
+.form-control-feedback {
2532
+ position: absolute;
2533
+ top: 25px;
2534
+ right: 0;
2535
+ z-index: 2;
2536
+ display: block;
2537
+ width: 34px;
2538
+ height: 34px;
2539
+ line-height: 34px;
2540
+ text-align: center;
2541
+}
2542
+.input-lg + .form-control-feedback {
2543
+ width: 46px;
2544
+ height: 46px;
2545
+ line-height: 46px;
2546
+}
2547
+.input-sm + .form-control-feedback {
2548
+ width: 30px;
2549
+ height: 30px;
2550
+ line-height: 30px;
2551
+}
2552
+.has-success .help-block,
2553
+.has-success .control-label,
2554
+.has-success .radio,
2555
+.has-success .checkbox,
2556
+.has-success .radio-inline,
2557
+.has-success .checkbox-inline {
2558
+ color: #3c763d;
2559
+}
2560
+.has-success .form-control {
2561
+ border-color: #3c763d;
2562
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2563
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2564
+}
2565
+.has-success .form-control:focus {
2566
+ border-color: #2b542c;
2567
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
2568
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
2569
+}
2570
+.has-success .input-group-addon {
2571
+ color: #3c763d;
2572
+ background-color: #dff0d8;
2573
+ border-color: #3c763d;
2574
+}
2575
+.has-success .form-control-feedback {
2576
+ color: #3c763d;
2577
+}
2578
+.has-warning .help-block,
2579
+.has-warning .control-label,
2580
+.has-warning .radio,
2581
+.has-warning .checkbox,
2582
+.has-warning .radio-inline,
2583
+.has-warning .checkbox-inline {
2584
+ color: #8a6d3b;
2585
+}
2586
+.has-warning .form-control {
2587
+ border-color: #8a6d3b;
2588
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2589
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2590
+}
2591
+.has-warning .form-control:focus {
2592
+ border-color: #66512c;
2593
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
2594
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
2595
+}
2596
+.has-warning .input-group-addon {
2597
+ color: #8a6d3b;
2598
+ background-color: #fcf8e3;
2599
+ border-color: #8a6d3b;
2600
+}
2601
+.has-warning .form-control-feedback {
2602
+ color: #8a6d3b;
2603
+}
2604
+.has-error .help-block,
2605
+.has-error .control-label,
2606
+.has-error .radio,
2607
+.has-error .checkbox,
2608
+.has-error .radio-inline,
2609
+.has-error .checkbox-inline {
2610
+ color: #a94442;
2611
+}
2612
+.has-error .form-control {
2613
+ border-color: #a94442;
2614
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2615
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2616
+}
2617
+.has-error .form-control:focus {
2618
+ border-color: #843534;
2619
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
2620
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
2621
+}
2622
+.has-error .input-group-addon {
2623
+ color: #a94442;
2624
+ background-color: #f2dede;
2625
+ border-color: #a94442;
2626
+}
2627
+.has-error .form-control-feedback {
2628
+ color: #a94442;
2629
+}
2630
+.has-feedback label.sr-only ~ .form-control-feedback {
2631
+ top: 0;
2632
+}
2633
+.help-block {
2634
+ display: block;
2635
+ margin-top: 5px;
2636
+ margin-bottom: 10px;
2637
+ color: #737373;
2638
+}
2639
+@media (min-width: 768px) {
2640
+ .form-inline .form-group {
2641
+ display: inline-block;
2642
+ margin-bottom: 0;
2643
+ vertical-align: middle;
2644
+ }
2645
+ .form-inline .form-control {
2646
+ display: inline-block;
2647
+ width: auto;
2648
+ vertical-align: middle;
2649
+ }
2650
+ .form-inline .input-group {
2651
+ display: inline-table;
2652
+ vertical-align: middle;
2653
+ }
2654
+ .form-inline .input-group .input-group-addon,
2655
+ .form-inline .input-group .input-group-btn,
2656
+ .form-inline .input-group .form-control {
2657
+ width: auto;
2658
+ }
2659
+ .form-inline .input-group > .form-control {
2660
+ width: 100%;
2661
+ }
2662
+ .form-inline .control-label {
2663
+ margin-bottom: 0;
2664
+ vertical-align: middle;
2665
+ }
2666
+ .form-inline .radio,
2667
+ .form-inline .checkbox {
2668
+ display: inline-block;
2669
+ margin-top: 0;
2670
+ margin-bottom: 0;
2671
+ vertical-align: middle;
2672
+ }
2673
+ .form-inline .radio label,
2674
+ .form-inline .checkbox label {
2675
+ padding-left: 0;
2676
+ }
2677
+ .form-inline .radio input[type="radio"],
2678
+ .form-inline .checkbox input[type="checkbox"] {
2679
+ position: relative;
2680
+ margin-left: 0;
2681
+ }
2682
+ .form-inline .has-feedback .form-control-feedback {
2683
+ top: 0;
2684
+ }
2685
+}
2686
+.form-horizontal .radio,
2687
+.form-horizontal .checkbox,
2688
+.form-horizontal .radio-inline,
2689
+.form-horizontal .checkbox-inline {
2690
+ padding-top: 7px;
2691
+ margin-top: 0;
2692
+ margin-bottom: 0;
2693
+}
2694
+.form-horizontal .radio,
2695
+.form-horizontal .checkbox {
2696
+ min-height: 27px;
2697
+}
2698
+.form-horizontal .form-group {
2699
+ margin-right: -15px;
2700
+ margin-left: -15px;
2701
+}
2702
+@media (min-width: 768px) {
2703
+ .form-horizontal .control-label {
2704
+ padding-top: 7px;
2705
+ margin-bottom: 0;
2706
+ text-align: right;
2707
+ }
2708
+}
2709
+.form-horizontal .has-feedback .form-control-feedback {
2710
+ top: 0;
2711
+ right: 15px;
2712
+}
2713
+@media (min-width: 768px) {
2714
+ .form-horizontal .form-group-lg .control-label {
2715
+ padding-top: 14.3px;
2716
+ }
2717
+}
2718
+@media (min-width: 768px) {
2719
+ .form-horizontal .form-group-sm .control-label {
2720
+ padding-top: 6px;
2721
+ }
2722
+}
2723
+.btn {
2724
+ display: inline-block;
2725
+ padding: 6px 12px;
2726
+ margin-bottom: 0;
2727
+ font-size: 14px;
2728
+ font-weight: normal;
2729
+ line-height: 1.42857143;
2730
+ text-align: center;
2731
+ white-space: nowrap;
2732
+ vertical-align: middle;
2733
+ cursor: pointer;
2734
+ -webkit-user-select: none;
2735
+ -moz-user-select: none;
2736
+ -ms-user-select: none;
2737
+ user-select: none;
2738
+ background-image: none;
2739
+ border: 1px solid transparent;
2740
+ border-radius: 4px;
2741
+}
2742
+.btn:focus,
2743
+.btn:active:focus,
2744
+.btn.active:focus {
2745
+ outline: thin dotted;
2746
+ outline: 5px auto -webkit-focus-ring-color;
2747
+ outline-offset: -2px;
2748
+}
2749
+.btn:hover,
2750
+.btn:focus {
2751
+ color: #333;
2752
+ text-decoration: none;
2753
+}
2754
+.btn:active,
2755
+.btn.active {
2756
+ background-image: none;
2757
+ outline: 0;
2758
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
2759
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
2760
+}
2761
+.btn.disabled,
2762
+.btn[disabled],
2763
+fieldset[disabled] .btn {
2764
+ pointer-events: none;
2765
+ cursor: not-allowed;
2766
+ filter: alpha(opacity=65);
2767
+ -webkit-box-shadow: none;
2768
+ box-shadow: none;
2769
+ opacity: .65;
2770
+}
2771
+.btn-default {
2772
+ color: #333;
2773
+ background-color: #fff;
2774
+ border-color: #ccc;
2775
+}
2776
+.btn-default:hover,
2777
+.btn-default:focus,
2778
+.btn-default:active,
2779
+.btn-default.active,
2780
+.open > .dropdown-toggle.btn-default {
2781
+ color: #333;
2782
+ background-color: #e6e6e6;
2783
+ border-color: #adadad;
2784
+}
2785
+.btn-default:active,
2786
+.btn-default.active,
2787
+.open > .dropdown-toggle.btn-default {
2788
+ background-image: none;
2789
+}
2790
+.btn-default.disabled,
2791
+.btn-default[disabled],
2792
+fieldset[disabled] .btn-default,
2793
+.btn-default.disabled:hover,
2794
+.btn-default[disabled]:hover,
2795
+fieldset[disabled] .btn-default:hover,
2796
+.btn-default.disabled:focus,
2797
+.btn-default[disabled]:focus,
2798
+fieldset[disabled] .btn-default:focus,
2799
+.btn-default.disabled:active,
2800
+.btn-default[disabled]:active,
2801
+fieldset[disabled] .btn-default:active,
2802
+.btn-default.disabled.active,
2803
+.btn-default[disabled].active,
2804
+fieldset[disabled] .btn-default.active {
2805
+ background-color: #fff;
2806
+ border-color: #ccc;
2807
+}
2808
+.btn-default .badge {
2809
+ color: #fff;
2810
+ background-color: #333;
2811
+}
2812
+.btn-primary {
2813
+ color: #fff;
2814
+ background-color: #428bca;
2815
+ border-color: #357ebd;
2816
+}
2817
+.btn-primary:hover,
2818
+.btn-primary:focus,
2819
+.btn-primary:active,
2820
+.btn-primary.active,
2821
+.open > .dropdown-toggle.btn-primary {
2822
+ color: #fff;
2823
+ background-color: #3071a9;
2824
+ border-color: #285e8e;
2825
+}
2826
+.btn-primary:active,
2827
+.btn-primary.active,
2828
+.open > .dropdown-toggle.btn-primary {
2829
+ background-image: none;
2830
+}
2831
+.btn-primary.disabled,
2832
+.btn-primary[disabled],
2833
+fieldset[disabled] .btn-primary,
2834
+.btn-primary.disabled:hover,
2835
+.btn-primary[disabled]:hover,
2836
+fieldset[disabled] .btn-primary:hover,
2837
+.btn-primary.disabled:focus,
2838
+.btn-primary[disabled]:focus,
2839
+fieldset[disabled] .btn-primary:focus,
2840
+.btn-primary.disabled:active,
2841
+.btn-primary[disabled]:active,
2842
+fieldset[disabled] .btn-primary:active,
2843
+.btn-primary.disabled.active,
2844
+.btn-primary[disabled].active,
2845
+fieldset[disabled] .btn-primary.active {
2846
+ background-color: #428bca;
2847
+ border-color: #357ebd;
2848
+}
2849
+.btn-primary .badge {
2850
+ color: #428bca;
2851
+ background-color: #fff;
2852
+}
2853
+.btn-success {
2854
+ color: #fff;
2855
+ background-color: #5cb85c;
2856
+ border-color: #4cae4c;
2857
+}
2858
+.btn-success:hover,
2859
+.btn-success:focus,
2860
+.btn-success:active,
2861
+.btn-success.active,
2862
+.open > .dropdown-toggle.btn-success {
2863
+ color: #fff;
2864
+ background-color: #449d44;
2865
+ border-color: #398439;
2866
+}
2867
+.btn-success:active,
2868
+.btn-success.active,
2869
+.open > .dropdown-toggle.btn-success {
2870
+ background-image: none;
2871
+}
2872
+.btn-success.disabled,
2873
+.btn-success[disabled],
2874
+fieldset[disabled] .btn-success,
2875
+.btn-success.disabled:hover,
2876
+.btn-success[disabled]:hover,
2877
+fieldset[disabled] .btn-success:hover,
2878
+.btn-success.disabled:focus,
2879
+.btn-success[disabled]:focus,
2880
+fieldset[disabled] .btn-success:focus,
2881
+.btn-success.disabled:active,
2882
+.btn-success[disabled]:active,
2883
+fieldset[disabled] .btn-success:active,
2884
+.btn-success.disabled.active,
2885
+.btn-success[disabled].active,
2886
+fieldset[disabled] .btn-success.active {
2887
+ background-color: #5cb85c;
2888
+ border-color: #4cae4c;
2889
+}
2890
+.btn-success .badge {
2891
+ color: #5cb85c;
2892
+ background-color: #fff;
2893
+}
2894
+.btn-info {
2895
+ color: #fff;
2896
+ background-color: #5bc0de;
2897
+ border-color: #46b8da;
2898
+}
2899
+.btn-info:hover,
2900
+.btn-info:focus,
2901
+.btn-info:active,
2902
+.btn-info.active,
2903
+.open > .dropdown-toggle.btn-info {
2904
+ color: #fff;
2905
+ background-color: #31b0d5;
2906
+ border-color: #269abc;
2907
+}
2908
+.btn-info:active,
2909
+.btn-info.active,
2910
+.open > .dropdown-toggle.btn-info {
2911
+ background-image: none;
2912
+}
2913
+.btn-info.disabled,
2914
+.btn-info[disabled],
2915
+fieldset[disabled] .btn-info,
2916
+.btn-info.disabled:hover,
2917
+.btn-info[disabled]:hover,
2918
+fieldset[disabled] .btn-info:hover,
2919
+.btn-info.disabled:focus,
2920
+.btn-info[disabled]:focus,
2921
+fieldset[disabled] .btn-info:focus,
2922
+.btn-info.disabled:active,
2923
+.btn-info[disabled]:active,
2924
+fieldset[disabled] .btn-info:active,
2925
+.btn-info.disabled.active,
2926
+.btn-info[disabled].active,
2927
+fieldset[disabled] .btn-info.active {
2928
+ background-color: #5bc0de;
2929
+ border-color: #46b8da;
2930
+}
2931
+.btn-info .badge {
2932
+ color: #5bc0de;
2933
+ background-color: #fff;
2934
+}
2935
+.btn-warning {
2936
+ color: #fff;
2937
+ background-color: #f0ad4e;
2938
+ border-color: #eea236;
2939
+}
2940
+.btn-warning:hover,
2941
+.btn-warning:focus,
2942
+.btn-warning:active,
2943
+.btn-warning.active,
2944
+.open > .dropdown-toggle.btn-warning {
2945
+ color: #fff;
2946
+ background-color: #ec971f;
2947
+ border-color: #d58512;
2948
+}
2949
+.btn-warning:active,
2950
+.btn-warning.active,
2951
+.open > .dropdown-toggle.btn-warning {
2952
+ background-image: none;
2953
+}
2954
+.btn-warning.disabled,
2955
+.btn-warning[disabled],
2956
+fieldset[disabled] .btn-warning,
2957
+.btn-warning.disabled:hover,
2958
+.btn-warning[disabled]:hover,
2959
+fieldset[disabled] .btn-warning:hover,
2960
+.btn-warning.disabled:focus,
2961
+.btn-warning[disabled]:focus,
2962
+fieldset[disabled] .btn-warning:focus,
2963
+.btn-warning.disabled:active,
2964
+.btn-warning[disabled]:active,
2965
+fieldset[disabled] .btn-warning:active,
2966
+.btn-warning.disabled.active,
2967
+.btn-warning[disabled].active,
2968
+fieldset[disabled] .btn-warning.active {
2969
+ background-color: #f0ad4e;
2970
+ border-color: #eea236;
2971
+}
2972
+.btn-warning .badge {
2973
+ color: #f0ad4e;
2974
+ background-color: #fff;
2975
+}
2976
+.btn-danger {
2977
+ color: #fff;
2978
+ background-color: #d9534f;
2979
+ border-color: #d43f3a;
2980
+}
2981
+.btn-danger:hover,
2982
+.btn-danger:focus,
2983
+.btn-danger:active,
2984
+.btn-danger.active,
2985
+.open > .dropdown-toggle.btn-danger {
2986
+ color: #fff;
2987
+ background-color: #c9302c;
2988
+ border-color: #ac2925;
2989
+}
2990
+.btn-danger:active,
2991
+.btn-danger.active,
2992
+.open > .dropdown-toggle.btn-danger {
2993
+ background-image: none;
2994
+}
2995
+.btn-danger.disabled,
2996
+.btn-danger[disabled],
2997
+fieldset[disabled] .btn-danger,
2998
+.btn-danger.disabled:hover,
2999
+.btn-danger[disabled]:hover,
3000
+fieldset[disabled] .btn-danger:hover,
3001
+.btn-danger.disabled:focus,
3002
+.btn-danger[disabled]:focus,
3003
+fieldset[disabled] .btn-danger:focus,
3004
+.btn-danger.disabled:active,
3005
+.btn-danger[disabled]:active,
3006
+fieldset[disabled] .btn-danger:active,
3007
+.btn-danger.disabled.active,
3008
+.btn-danger[disabled].active,
3009
+fieldset[disabled] .btn-danger.active {
3010
+ background-color: #d9534f;
3011
+ border-color: #d43f3a;
3012
+}
3013
+.btn-danger .badge {
3014
+ color: #d9534f;
3015
+ background-color: #fff;
3016
+}
3017
+.btn-link {
3018
+ font-weight: normal;
3019
+ color: #428bca;
3020
+ cursor: pointer;
3021
+ border-radius: 0;
3022
+}
3023
+.btn-link,
3024
+.btn-link:active,
3025
+.btn-link[disabled],
3026
+fieldset[disabled] .btn-link {
3027
+ background-color: transparent;
3028
+ -webkit-box-shadow: none;
3029
+ box-shadow: none;
3030
+}
3031
+.btn-link,
3032
+.btn-link:hover,
3033
+.btn-link:focus,
3034
+.btn-link:active {
3035
+ border-color: transparent;
3036
+}
3037
+.btn-link:hover,
3038
+.btn-link:focus {
3039
+ color: #2a6496;
3040
+ text-decoration: underline;
3041
+ background-color: transparent;
3042
+}
3043
+.btn-link[disabled]:hover,
3044
+fieldset[disabled] .btn-link:hover,
3045
+.btn-link[disabled]:focus,
3046
+fieldset[disabled] .btn-link:focus {
3047
+ color: #777;
3048
+ text-decoration: none;
3049
+}
3050
+.btn-lg,
3051
+.btn-group-lg > .btn {
3052
+ padding: 10px 16px;
3053
+ font-size: 18px;
3054
+ line-height: 1.33;
3055
+ border-radius: 6px;
3056
+}
3057
+.btn-sm,
3058
+.btn-group-sm > .btn {
3059
+ padding: 5px 10px;
3060
+ font-size: 12px;
3061
+ line-height: 1.5;
3062
+ border-radius: 3px;
3063
+}
3064
+.btn-xs,
3065
+.btn-group-xs > .btn {
3066
+ padding: 1px 5px;
3067
+ font-size: 12px;
3068
+ line-height: 1.5;
3069
+ border-radius: 3px;
3070
+}
3071
+.btn-block {
3072
+ display: block;
3073
+ width: 100%;
3074
+}
3075
+.btn-block + .btn-block {
3076
+ margin-top: 5px;
3077
+}
3078
+input[type="submit"].btn-block,
3079
+input[type="reset"].btn-block,
3080
+input[type="button"].btn-block {
3081
+ width: 100%;
3082
+}
3083
+.fade {
3084
+ opacity: 0;
3085
+ -webkit-transition: opacity .15s linear;
3086
+ -o-transition: opacity .15s linear;
3087
+ transition: opacity .15s linear;
3088
+}
3089
+.fade.in {
3090
+ opacity: 1;
3091
+}
3092
+.collapse {
3093
+ display: none;
3094
+}
3095
+.collapse.in {
3096
+ display: block;
3097
+}
3098
+tr.collapse.in {
3099
+ display: table-row;
3100
+}
3101
+tbody.collapse.in {
3102
+ display: table-row-group;
3103
+}
3104
+.collapsing {
3105
+ position: relative;
3106
+ height: 0;
3107
+ overflow: hidden;
3108
+ -webkit-transition: height .35s ease;
3109
+ -o-transition: height .35s ease;
3110
+ transition: height .35s ease;
3111
+}
3112
+.caret {
3113
+ display: inline-block;
3114
+ width: 0;
3115
+ height: 0;
3116
+ margin-left: 2px;
3117
+ vertical-align: middle;
3118
+ border-top: 4px solid;
3119
+ border-right: 4px solid transparent;
3120
+ border-left: 4px solid transparent;
3121
+}
3122
+.dropdown {
3123
+ position: relative;
3124
+}
3125
+.dropdown-toggle:focus {
3126
+ outline: 0;
3127
+}
3128
+.dropdown-menu {
3129
+ position: absolute;
3130
+ top: 100%;
3131
+ left: 0;
3132
+ z-index: 1000;
3133
+ display: none;
3134
+ float: left;
3135
+ min-width: 160px;
3136
+ padding: 5px 0;
3137
+ margin: 2px 0 0;
3138
+ font-size: 14px;
3139
+ text-align: left;
3140
+ list-style: none;
3141
+ background-color: #fff;
3142
+ -webkit-background-clip: padding-box;
3143
+ background-clip: padding-box;
3144
+ border: 1px solid #ccc;
3145
+ border: 1px solid rgba(0, 0, 0, .15);
3146
+ border-radius: 4px;
3147
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
3148
+ box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
3149
+}
3150
+.dropdown-menu.pull-right {
3151
+ right: 0;
3152
+ left: auto;
3153
+}
3154
+.dropdown-menu .divider {
3155
+ height: 1px;
3156
+ margin: 9px 0;
3157
+ overflow: hidden;
3158
+ background-color: #e5e5e5;
3159
+}
3160
+.dropdown-menu > li > a {
3161
+ display: block;
3162
+ padding: 3px 20px;
3163
+ clear: both;
3164
+ font-weight: normal;
3165
+ line-height: 1.42857143;
3166
+ color: #333;
3167
+ white-space: nowrap;
3168
+}
3169
+.dropdown-menu > li > a:hover,
3170
+.dropdown-menu > li > a:focus {
3171
+ color: #262626;
3172
+ text-decoration: none;
3173
+ background-color: #f5f5f5;
3174
+}
3175
+.dropdown-menu > .active > a,
3176
+.dropdown-menu > .active > a:hover,
3177
+.dropdown-menu > .active > a:focus {
3178
+ color: #fff;
3179
+ text-decoration: none;
3180
+ background-color: #428bca;
3181
+ outline: 0;
3182
+}
3183
+.dropdown-menu > .disabled > a,
3184
+.dropdown-menu > .disabled > a:hover,
3185
+.dropdown-menu > .disabled > a:focus {
3186
+ color: #777;
3187
+}
3188
+.dropdown-menu > .disabled > a:hover,
3189
+.dropdown-menu > .disabled > a:focus {
3190
+ text-decoration: none;
3191
+ cursor: not-allowed;
3192
+ background-color: transparent;
3193
+ background-image: none;
3194
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
3195
+}
3196
+.open > .dropdown-menu {
3197
+ display: block;
3198
+}
3199
+.open > a {
3200
+ outline: 0;
3201
+}
3202
+.dropdown-menu-right {
3203
+ right: 0;
3204
+ left: auto;
3205
+}
3206
+.dropdown-menu-left {
3207
+ right: auto;
3208
+ left: 0;
3209
+}
3210
+.dropdown-header {
3211
+ display: block;
3212
+ padding: 3px 20px;
3213
+ font-size: 12px;
3214
+ line-height: 1.42857143;
3215
+ color: #777;
3216
+ white-space: nowrap;
3217
+}
3218
+.dropdown-backdrop {
3219
+ position: fixed;
3220
+ top: 0;
3221
+ right: 0;
3222
+ bottom: 0;
3223
+ left: 0;
3224
+ z-index: 990;
3225
+}
3226
+.pull-right > .dropdown-menu {
3227
+ right: 0;
3228
+ left: auto;
3229
+}
3230
+.dropup .caret,
3231
+.navbar-fixed-bottom .dropdown .caret {
3232
+ content: "";
3233
+ border-top: 0;
3234
+ border-bottom: 4px solid;
3235
+}
3236
+.dropup .dropdown-menu,
3237
+.navbar-fixed-bottom .dropdown .dropdown-menu {
3238
+ top: auto;
3239
+ bottom: 100%;
3240
+ margin-bottom: 1px;
3241
+}
3242
+@media (min-width: 768px) {
3243
+ .navbar-right .dropdown-menu {
3244
+ right: 0;
3245
+ left: auto;
3246
+ }
3247
+ .navbar-right .dropdown-menu-left {
3248
+ right: auto;
3249
+ left: 0;
3250
+ }
3251
+}
3252
+.btn-group,
3253
+.btn-group-vertical {
3254
+ position: relative;
3255
+ display: inline-block;
3256
+ vertical-align: middle;
3257
+}
3258
+.btn-group > .btn,
3259
+.btn-group-vertical > .btn {
3260
+ position: relative;
3261
+ float: left;
3262
+}
3263
+.btn-group > .btn:hover,
3264
+.btn-group-vertical > .btn:hover,
3265
+.btn-group > .btn:focus,
3266
+.btn-group-vertical > .btn:focus,
3267
+.btn-group > .btn:active,
3268
+.btn-group-vertical > .btn:active,
3269
+.btn-group > .btn.active,
3270
+.btn-group-vertical > .btn.active {
3271
+ z-index: 2;
3272
+}
3273
+.btn-group > .btn:focus,
3274
+.btn-group-vertical > .btn:focus {
3275
+ outline: 0;
3276
+}
3277
+.btn-group .btn + .btn,
3278
+.btn-group .btn + .btn-group,
3279
+.btn-group .btn-group + .btn,
3280
+.btn-group .btn-group + .btn-group {
3281
+ margin-left: -1px;
3282
+}
3283
+.btn-toolbar {
3284
+ margin-left: -5px;
3285
+}
3286
+.btn-toolbar .btn-group,
3287
+.btn-toolbar .input-group {
3288
+ float: left;
3289
+}
3290
+.btn-toolbar > .btn,
3291
+.btn-toolbar > .btn-group,
3292
+.btn-toolbar > .input-group {
3293
+ margin-left: 5px;
3294
+}
3295
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
3296
+ border-radius: 0;
3297
+}
3298
+.btn-group > .btn:first-child {
3299
+ margin-left: 0;
3300
+}
3301
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
3302
+ border-top-right-radius: 0;
3303
+ border-bottom-right-radius: 0;
3304
+}
3305
+.btn-group > .btn:last-child:not(:first-child),
3306
+.btn-group > .dropdown-toggle:not(:first-child) {
3307
+ border-top-left-radius: 0;
3308
+ border-bottom-left-radius: 0;
3309
+}
3310
+.btn-group > .btn-group {
3311
+ float: left;
3312
+}
3313
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
3314
+ border-radius: 0;
3315
+}
3316
+.btn-group > .btn-group:first-child > .btn:last-child,
3317
+.btn-group > .btn-group:first-child > .dropdown-toggle {
3318
+ border-top-right-radius: 0;
3319
+ border-bottom-right-radius: 0;
3320
+}
3321
+.btn-group > .btn-group:last-child > .btn:first-child {
3322
+ border-top-left-radius: 0;
3323
+ border-bottom-left-radius: 0;
3324
+}
3325
+.btn-group .dropdown-toggle:active,
3326
+.btn-group.open .dropdown-toggle {
3327
+ outline: 0;
3328
+}
3329
+.btn-group > .btn + .dropdown-toggle {
3330
+ padding-right: 8px;
3331
+ padding-left: 8px;
3332
+}
3333
+.btn-group > .btn-lg + .dropdown-toggle {
3334
+ padding-right: 12px;
3335
+ padding-left: 12px;
3336
+}
3337
+.btn-group.open .dropdown-toggle {
3338
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
3339
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
3340
+}
3341
+.btn-group.open .dropdown-toggle.btn-link {
3342
+ -webkit-box-shadow: none;
3343
+ box-shadow: none;
3344
+}
3345
+.btn .caret {
3346
+ margin-left: 0;
3347
+}
3348
+.btn-lg .caret {
3349
+ border-width: 5px 5px 0;
3350
+ border-bottom-width: 0;
3351
+}
3352
+.dropup .btn-lg .caret {
3353
+ border-width: 0 5px 5px;
3354
+}
3355
+.btn-group-vertical > .btn,
3356
+.btn-group-vertical > .btn-group,
3357
+.btn-group-vertical > .btn-group > .btn {
3358
+ display: block;
3359
+ float: none;
3360
+ width: 100%;
3361
+ max-width: 100%;
3362
+}
3363
+.btn-group-vertical > .btn-group > .btn {
3364
+ float: none;
3365
+}
3366
+.btn-group-vertical > .btn + .btn,
3367
+.btn-group-vertical > .btn + .btn-group,
3368
+.btn-group-vertical > .btn-group + .btn,
3369
+.btn-group-vertical > .btn-group + .btn-group {
3370
+ margin-top: -1px;
3371
+ margin-left: 0;
3372
+}
3373
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
3374
+ border-radius: 0;
3375
+}
3376
+.btn-group-vertical > .btn:first-child:not(:last-child) {
3377
+ border-top-right-radius: 4px;
3378
+ border-bottom-right-radius: 0;
3379
+ border-bottom-left-radius: 0;
3380
+}
3381
+.btn-group-vertical > .btn:last-child:not(:first-child) {
3382
+ border-top-left-radius: 0;
3383
+ border-top-right-radius: 0;
3384
+ border-bottom-left-radius: 4px;
3385
+}
3386
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
3387
+ border-radius: 0;
3388
+}
3389
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
3390
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
3391
+ border-bottom-right-radius: 0;
3392
+ border-bottom-left-radius: 0;
3393
+}
3394
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
3395
+ border-top-left-radius: 0;
3396
+ border-top-right-radius: 0;
3397
+}
3398
+.btn-group-justified {
3399
+ display: table;
3400
+ width: 100%;
3401
+ table-layout: fixed;
3402
+ border-collapse: separate;
3403
+}
3404
+.btn-group-justified > .btn,
3405
+.btn-group-justified > .btn-group {
3406
+ display: table-cell;
3407
+ float: none;
3408
+ width: 1%;
3409
+}
3410
+.btn-group-justified > .btn-group .btn {
3411
+ width: 100%;
3412
+}
3413
+.btn-group-justified > .btn-group .dropdown-menu {
3414
+ left: auto;
3415
+}
3416
+[data-toggle="buttons"] > .btn > input[type="radio"],
3417
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
3418
+ position: absolute;
3419
+ z-index: -1;
3420
+ filter: alpha(opacity=0);
3421
+ opacity: 0;
3422
+}
3423
+.input-group {
3424
+ position: relative;
3425
+ display: table;
3426
+ border-collapse: separate;
3427
+}
3428
+.input-group[class*="col-"] {
3429
+ float: none;
3430
+ padding-right: 0;
3431
+ padding-left: 0;
3432
+}
3433
+.input-group .form-control {
3434
+ position: relative;
3435
+ z-index: 2;
3436
+ float: left;
3437
+ width: 100%;
3438
+ margin-bottom: 0;
3439
+}
3440
+.input-group-lg > .form-control,
3441
+.input-group-lg > .input-group-addon,
3442
+.input-group-lg > .input-group-btn > .btn {
3443
+ height: 46px;
3444
+ padding: 10px 16px;
3445
+ font-size: 18px;
3446
+ line-height: 1.33;
3447
+ border-radius: 6px;
3448
+}
3449
+select.input-group-lg > .form-control,
3450
+select.input-group-lg > .input-group-addon,
3451
+select.input-group-lg > .input-group-btn > .btn {
3452
+ height: 46px;
3453
+ line-height: 46px;
3454
+}
3455
+textarea.input-group-lg > .form-control,
3456
+textarea.input-group-lg > .input-group-addon,
3457
+textarea.input-group-lg > .input-group-btn > .btn,
3458
+select[multiple].input-group-lg > .form-control,
3459
+select[multiple].input-group-lg > .input-group-addon,
3460
+select[multiple].input-group-lg > .input-group-btn > .btn {
3461
+ height: auto;
3462
+}
3463
+.input-group-sm > .form-control,
3464
+.input-group-sm > .input-group-addon,
3465
+.input-group-sm > .input-group-btn > .btn {
3466
+ height: 30px;
3467
+ padding: 5px 10px;
3468
+ font-size: 12px;
3469
+ line-height: 1.5;
3470
+ border-radius: 3px;
3471
+}
3472
+select.input-group-sm > .form-control,
3473
+select.input-group-sm > .input-group-addon,
3474
+select.input-group-sm > .input-group-btn > .btn {
3475
+ height: 30px;
3476
+ line-height: 30px;
3477
+}
3478
+textarea.input-group-sm > .form-control,
3479
+textarea.input-group-sm > .input-group-addon,
3480
+textarea.input-group-sm > .input-group-btn > .btn,
3481
+select[multiple].input-group-sm > .form-control,
3482
+select[multiple].input-group-sm > .input-group-addon,
3483
+select[multiple].input-group-sm > .input-group-btn > .btn {
3484
+ height: auto;
3485
+}
3486
+.input-group-addon,
3487
+.input-group-btn,
3488
+.input-group .form-control {
3489
+ display: table-cell;
3490
+}
3491
+.input-group-addon:not(:first-child):not(:last-child),
3492
+.input-group-btn:not(:first-child):not(:last-child),
3493
+.input-group .form-control:not(:first-child):not(:last-child) {
3494
+ border-radius: 0;
3495
+}
3496
+.input-group-addon,
3497
+.input-group-btn {
3498
+ width: 1%;
3499
+ white-space: nowrap;
3500
+ vertical-align: middle;
3501
+}
3502
+.input-group-addon {
3503
+ padding: 6px 12px;
3504
+ font-size: 14px;
3505
+ font-weight: normal;
3506
+ line-height: 1;
3507
+ color: #555;
3508
+ text-align: center;
3509
+ background-color: #eee;
3510
+ border: 1px solid #ccc;
3511
+ border-radius: 4px;
3512
+}
3513
+.input-group-addon.input-sm {
3514
+ padding: 5px 10px;
3515
+ font-size: 12px;
3516
+ border-radius: 3px;
3517
+}
3518
+.input-group-addon.input-lg {
3519
+ padding: 10px 16px;
3520
+ font-size: 18px;
3521
+ border-radius: 6px;
3522
+}
3523
+.input-group-addon input[type="radio"],
3524
+.input-group-addon input[type="checkbox"] {
3525
+ margin-top: 0;
3526
+}
3527
+.input-group .form-control:first-child,
3528
+.input-group-addon:first-child,
3529
+.input-group-btn:first-child > .btn,
3530
+.input-group-btn:first-child > .btn-group > .btn,
3531
+.input-group-btn:first-child > .dropdown-toggle,
3532
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
3533
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
3534
+ border-top-right-radius: 0;
3535
+ border-bottom-right-radius: 0;
3536
+}
3537
+.input-group-addon:first-child {
3538
+ border-right: 0;
3539
+}
3540
+.input-group .form-control:last-child,
3541
+.input-group-addon:last-child,
3542
+.input-group-btn:last-child > .btn,
3543
+.input-group-btn:last-child > .btn-group > .btn,
3544
+.input-group-btn:last-child > .dropdown-toggle,
3545
+.input-group-btn:first-child > .btn:not(:first-child),
3546
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
3547
+ border-top-left-radius: 0;
3548
+ border-bottom-left-radius: 0;
3549
+}
3550
+.input-group-addon:last-child {
3551
+ border-left: 0;
3552
+}
3553
+.input-group-btn {
3554
+ position: relative;
3555
+ font-size: 0;
3556
+ white-space: nowrap;
3557
+}
3558
+.input-group-btn > .btn {
3559
+ position: relative;
3560
+}
3561
+.input-group-btn > .btn + .btn {
3562
+ margin-left: -1px;
3563
+}
3564
+.input-group-btn > .btn:hover,
3565
+.input-group-btn > .btn:focus,
3566
+.input-group-btn > .btn:active {
3567
+ z-index: 2;
3568
+}
3569
+.input-group-btn:first-child > .btn,
3570
+.input-group-btn:first-child > .btn-group {
3571
+ margin-right: -1px;
3572
+}
3573
+.input-group-btn:last-child > .btn,
3574
+.input-group-btn:last-child > .btn-group {
3575
+ margin-left: -1px;
3576
+}
3577
+.nav {
3578
+ padding-left: 0;
3579
+ margin-bottom: 0;
3580
+ list-style: none;
3581
+}
3582
+.nav > li {
3583
+ position: relative;
3584
+ display: block;
3585
+}
3586
+.nav > li > a {
3587
+ position: relative;
3588
+ display: block;
3589
+ padding: 10px 15px;
3590
+}
3591
+.nav > li > a:hover,
3592
+.nav > li > a:focus {
3593
+ text-decoration: none;
3594
+ background-color: #eee;
3595
+}
3596
+.nav > li.disabled > a {
3597
+ color: #777;
3598
+}
3599
+.nav > li.disabled > a:hover,
3600
+.nav > li.disabled > a:focus {
3601
+ color: #777;
3602
+ text-decoration: none;
3603
+ cursor: not-allowed;
3604
+ background-color: transparent;
3605
+}
3606
+.nav .open > a,
3607
+.nav .open > a:hover,
3608
+.nav .open > a:focus {
3609
+ background-color: #eee;
3610
+ border-color: #428bca;
3611
+}
3612
+.nav .nav-divider {
3613
+ height: 1px;
3614
+ margin: 9px 0;
3615
+ overflow: hidden;
3616
+ background-color: #e5e5e5;
3617
+}
3618
+.nav > li > a > img {
3619
+ max-width: none;
3620
+}
3621
+.nav-tabs {
3622
+ border-bottom: 1px solid #ddd;
3623
+}
3624
+.nav-tabs > li {
3625
+ float: left;
3626
+ margin-bottom: -1px;
3627
+}
3628
+.nav-tabs > li > a {
3629
+ margin-right: 2px;
3630
+ line-height: 1.42857143;
3631
+ border: 1px solid transparent;
3632
+ border-radius: 4px 4px 0 0;
3633
+}
3634
+.nav-tabs > li > a:hover {
3635
+ border-color: #eee #eee #ddd;
3636
+}
3637
+.nav-tabs > li.active > a,
3638
+.nav-tabs > li.active > a:hover,
3639
+.nav-tabs > li.active > a:focus {
3640
+ color: #555;
3641
+ cursor: default;
3642
+ background-color: #fff;
3643
+ border: 1px solid #ddd;
3644
+ border-bottom-color: transparent;
3645
+}
3646
+.nav-tabs.nav-justified {
3647
+ width: 100%;
3648
+ border-bottom: 0;
3649
+}
3650
+.nav-tabs.nav-justified > li {
3651
+ float: none;
3652
+}
3653
+.nav-tabs.nav-justified > li > a {
3654
+ margin-bottom: 5px;
3655
+ text-align: center;
3656
+}
3657
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
3658
+ top: auto;
3659
+ left: auto;
3660
+}
3661
+@media (min-width: 768px) {
3662
+ .nav-tabs.nav-justified > li {
3663
+ display: table-cell;
3664
+ width: 1%;
3665
+ }
3666
+ .nav-tabs.nav-justified > li > a {
3667
+ margin-bottom: 0;
3668
+ }
3669
+}
3670
+.nav-tabs.nav-justified > li > a {
3671
+ margin-right: 0;
3672
+ border-radius: 4px;
3673
+}
3674
+.nav-tabs.nav-justified > .active > a,
3675
+.nav-tabs.nav-justified > .active > a:hover,
3676
+.nav-tabs.nav-justified > .active > a:focus {
3677
+ border: 1px solid #ddd;
3678
+}
3679
+@media (min-width: 768px) {
3680
+ .nav-tabs.nav-justified > li > a {
3681
+ border-bottom: 1px solid #ddd;
3682
+ border-radius: 4px 4px 0 0;
3683
+ }
3684
+ .nav-tabs.nav-justified > .active > a,
3685
+ .nav-tabs.nav-justified > .active > a:hover,
3686
+ .nav-tabs.nav-justified > .active > a:focus {
3687
+ border-bottom-color: #fff;
3688
+ }
3689
+}
3690
+.nav-pills > li {
3691
+ float: left;
3692
+}
3693
+.nav-pills > li > a {
3694
+ border-radius: 4px;
3695
+}
3696
+.nav-pills > li + li {
3697
+ margin-left: 2px;
3698
+}
3699
+.nav-pills > li.active > a,
3700
+.nav-pills > li.active > a:hover,
3701
+.nav-pills > li.active > a:focus {
3702
+ color: #fff;
3703
+ background-color: #428bca;
3704
+}
3705
+.nav-stacked > li {
3706
+ float: none;
3707
+}
3708
+.nav-stacked > li + li {
3709
+ margin-top: 2px;
3710
+ margin-left: 0;
3711
+}
3712
+.nav-justified {
3713
+ width: 100%;
3714
+}
3715
+.nav-justified > li {
3716
+ float: none;
3717
+}
3718
+.nav-justified > li > a {
3719
+ margin-bottom: 5px;
3720
+ text-align: center;
3721
+}
3722
+.nav-justified > .dropdown .dropdown-menu {
3723
+ top: auto;
3724
+ left: auto;
3725
+}
3726
+@media (min-width: 768px) {
3727
+ .nav-justified > li {
3728
+ display: table-cell;
3729
+ width: 1%;
3730
+ }
3731
+ .nav-justified > li > a {
3732
+ margin-bottom: 0;
3733
+ }
3734
+}
3735
+.nav-tabs-justified {
3736
+ border-bottom: 0;
3737
+}
3738
+.nav-tabs-justified > li > a {
3739
+ margin-right: 0;
3740
+ border-radius: 4px;
3741
+}
3742
+.nav-tabs-justified > .active > a,
3743
+.nav-tabs-justified > .active > a:hover,
3744
+.nav-tabs-justified > .active > a:focus {
3745
+ border: 1px solid #ddd;
3746
+}
3747
+@media (min-width: 768px) {
3748
+ .nav-tabs-justified > li > a {
3749
+ border-bottom: 1px solid #ddd;
3750
+ border-radius: 4px 4px 0 0;
3751
+ }
3752
+ .nav-tabs-justified > .active > a,
3753
+ .nav-tabs-justified > .active > a:hover,
3754
+ .nav-tabs-justified > .active > a:focus {
3755
+ border-bottom-color: #fff;
3756
+ }
3757
+}
3758
+.tab-content > .tab-pane {
3759
+ display: none;
3760
+}
3761
+.tab-content > .active {
3762
+ display: block;
3763
+}
3764
+.nav-tabs .dropdown-menu {
3765
+ margin-top: -1px;
3766
+ border-top-left-radius: 0;
3767
+ border-top-right-radius: 0;
3768
+}
3769
+.navbar {
3770
+ position: relative;
3771
+ min-height: 50px;
3772
+ margin-bottom: 20px;
3773
+ border: 1px solid transparent;
3774
+}
3775
+@media (min-width: 768px) {
3776
+ .navbar {
3777
+ border-radius: 4px;
3778
+ }
3779
+}
3780
+@media (min-width: 768px) {
3781
+ .navbar-header {
3782
+ float: left;
3783
+ }
3784
+}
3785
+.navbar-collapse {
3786
+ padding-right: 15px;
3787
+ padding-left: 15px;
3788
+ overflow-x: visible;
3789
+ -webkit-overflow-scrolling: touch;
3790
+ border-top: 1px solid transparent;
3791
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
3792
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
3793
+}
3794
+.navbar-collapse.in {
3795
+ overflow-y: auto;
3796
+}
3797
+@media (min-width: 768px) {
3798
+ .navbar-collapse {
3799
+ width: auto;
3800
+ border-top: 0;
3801
+ -webkit-box-shadow: none;
3802
+ box-shadow: none;
3803
+ }
3804
+ .navbar-collapse.collapse {
3805
+ display: block !important;
3806
+ height: auto !important;
3807
+ padding-bottom: 0;
3808
+ overflow: visible !important;
3809
+ }
3810
+ .navbar-collapse.in {
3811
+ overflow-y: visible;
3812
+ }
3813
+ .navbar-fixed-top .navbar-collapse,
3814
+ .navbar-static-top .navbar-collapse,
3815
+ .navbar-fixed-bottom .navbar-collapse {
3816
+ padding-right: 0;
3817
+ padding-left: 0;
3818
+ }
3819
+}
3820
+.navbar-fixed-top .navbar-collapse,
3821
+.navbar-fixed-bottom .navbar-collapse {
3822
+ max-height: 340px;
3823
+}
3824
+@media (max-width: 480px) and (orientation: landscape) {
3825
+ .navbar-fixed-top .navbar-collapse,
3826
+ .navbar-fixed-bottom .navbar-collapse {
3827
+ max-height: 200px;
3828
+ }
3829
+}
3830
+.container > .navbar-header,
3831
+.container-fluid > .navbar-header,
3832
+.container > .navbar-collapse,
3833
+.container-fluid > .navbar-collapse {
3834
+ margin-right: -15px;
3835
+ margin-left: -15px;
3836
+}
3837
+@media (min-width: 768px) {
3838
+ .container > .navbar-header,
3839
+ .container-fluid > .navbar-header,
3840
+ .container > .navbar-collapse,
3841
+ .container-fluid > .navbar-collapse {
3842
+ margin-right: 0;
3843
+ margin-left: 0;
3844
+ }
3845
+}
3846
+.navbar-static-top {
3847
+ z-index: 1000;
3848
+ border-width: 0 0 1px;
3849
+}
3850
+@media (min-width: 768px) {
3851
+ .navbar-static-top {
3852
+ border-radius: 0;
3853
+ }
3854
+}
3855
+.navbar-fixed-top,
3856
+.navbar-fixed-bottom {
3857
+ position: fixed;
3858
+ right: 0;
3859
+ left: 0;
3860
+ z-index: 1030;
3861
+ -webkit-transform: translate3d(0, 0, 0);
3862
+ -o-transform: translate3d(0, 0, 0);
3863
+ transform: translate3d(0, 0, 0);
3864
+}
3865
+@media (min-width: 768px) {
3866
+ .navbar-fixed-top,
3867
+ .navbar-fixed-bottom {
3868
+ border-radius: 0;
3869
+ }
3870
+}
3871
+.navbar-fixed-top {
3872
+ top: 0;
3873
+ border-width: 0 0 1px;
3874
+}
3875
+.navbar-fixed-bottom {
3876
+ bottom: 0;
3877
+ margin-bottom: 0;
3878
+ border-width: 1px 0 0;
3879
+}
3880
+.navbar-brand {
3881
+ float: left;
3882
+ height: 50px;
3883
+ padding: 15px 15px;
3884
+ font-size: 18px;
3885
+ line-height: 20px;
3886
+}
3887
+.navbar-brand:hover,
3888
+.navbar-brand:focus {
3889
+ text-decoration: none;
3890
+}
3891
+@media (min-width: 768px) {
3892
+ .navbar > .container .navbar-brand,
3893
+ .navbar > .container-fluid .navbar-brand {
3894
+ margin-left: -15px;
3895
+ }
3896
+}
3897
+.navbar-toggle {
3898
+ position: relative;
3899
+ float: right;
3900
+ padding: 9px 10px;
3901
+ margin-top: 8px;
3902
+ margin-right: 15px;
3903
+ margin-bottom: 8px;
3904
+ background-color: transparent;
3905
+ background-image: none;
3906
+ border: 1px solid transparent;
3907
+ border-radius: 4px;
3908
+}
3909
+.navbar-toggle:focus {
3910
+ outline: 0;
3911
+}
3912
+.navbar-toggle .icon-bar {
3913
+ display: block;
3914
+ width: 22px;
3915
+ height: 2px;
3916
+ border-radius: 1px;
3917
+}
3918
+.navbar-toggle .icon-bar + .icon-bar {
3919
+ margin-top: 4px;
3920
+}
3921
+@media (min-width: 768px) {
3922
+ .navbar-toggle {
3923
+ display: none;
3924
+ }
3925
+}
3926
+.navbar-nav {
3927
+ margin: 7.5px -15px;
3928
+}
3929
+.navbar-nav > li > a {
3930
+ padding-top: 10px;
3931
+ padding-bottom: 10px;
3932
+ line-height: 20px;
3933
+}
3934
+@media (max-width: 767px) {
3935
+ .navbar-nav .open .dropdown-menu {
3936
+ position: static;
3937
+ float: none;
3938
+ width: auto;
3939
+ margin-top: 0;
3940
+ background-color: transparent;
3941
+ border: 0;
3942
+ -webkit-box-shadow: none;
3943
+ box-shadow: none;
3944
+ }
3945
+ .navbar-nav .open .dropdown-menu > li > a,
3946
+ .navbar-nav .open .dropdown-menu .dropdown-header {
3947
+ padding: 5px 15px 5px 25px;
3948
+ }
3949
+ .navbar-nav .open .dropdown-menu > li > a {
3950
+ line-height: 20px;
3951
+ }
3952
+ .navbar-nav .open .dropdown-menu > li > a:hover,
3953
+ .navbar-nav .open .dropdown-menu > li > a:focus {
3954
+ background-image: none;
3955
+ }
3956
+}
3957
+@media (min-width: 768px) {
3958
+ .navbar-nav {
3959
+ float: left;
3960
+ margin: 0;
3961
+ }
3962
+ .navbar-nav > li {
3963
+ float: left;
3964
+ }
3965
+ .navbar-nav > li > a {
3966
+ padding-top: 15px;
3967
+ padding-bottom: 15px;
3968
+ }
3969
+ .navbar-nav.navbar-right:last-child {
3970
+ margin-right: -15px;
3971
+ }
3972
+}
3973
+@media (min-width: 768px) {
3974
+ .navbar-left {
3975
+ float: left !important;
3976
+ }
3977
+ .navbar-right {
3978
+ float: right !important;
3979
+ }
3980
+}
3981
+.navbar-form {
3982
+ padding: 10px 15px;
3983
+ margin-top: 8px;
3984
+ margin-right: -15px;
3985
+ margin-bottom: 8px;
3986
+ margin-left: -15px;
3987
+ border-top: 1px solid transparent;
3988
+ border-bottom: 1px solid transparent;
3989
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
3990
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
3991
+}
3992
+@media (min-width: 768px) {
3993
+ .navbar-form .form-group {
3994
+ display: inline-block;
3995
+ margin-bottom: 0;
3996
+ vertical-align: middle;
3997
+ }
3998
+ .navbar-form .form-control {
3999
+ display: inline-block;
4000
+ width: auto;
4001
+ vertical-align: middle;
4002
+ }
4003
+ .navbar-form .input-group {
4004
+ display: inline-table;
4005
+ vertical-align: middle;
4006
+ }
4007
+ .navbar-form .input-group .input-group-addon,
4008
+ .navbar-form .input-group .input-group-btn,
4009
+ .navbar-form .input-group .form-control {
4010
+ width: auto;
4011
+ }
4012
+ .navbar-form .input-group > .form-control {
4013
+ width: 100%;
4014
+ }
4015
+ .navbar-form .control-label {
4016
+ margin-bottom: 0;
4017
+ vertical-align: middle;
4018
+ }
4019
+ .navbar-form .radio,
4020
+ .navbar-form .checkbox {
4021
+ display: inline-block;
4022
+ margin-top: 0;
4023
+ margin-bottom: 0;
4024
+ vertical-align: middle;
4025
+ }
4026
+ .navbar-form .radio label,
4027
+ .navbar-form .checkbox label {
4028
+ padding-left: 0;
4029
+ }
4030
+ .navbar-form .radio input[type="radio"],
4031
+ .navbar-form .checkbox input[type="checkbox"] {
4032
+ position: relative;
4033
+ margin-left: 0;
4034
+ }
4035
+ .navbar-form .has-feedback .form-control-feedback {
4036
+ top: 0;
4037
+ }
4038
+}
4039
+@media (max-width: 767px) {
4040
+ .navbar-form .form-group {
4041
+ margin-bottom: 5px;
4042
+ }
4043
+}
4044
+@media (min-width: 768px) {
4045
+ .navbar-form {
4046
+ width: auto;
4047
+ padding-top: 0;
4048
+ padding-bottom: 0;
4049
+ margin-right: 0;
4050
+ margin-left: 0;
4051
+ border: 0;
4052
+ -webkit-box-shadow: none;
4053
+ box-shadow: none;
4054
+ }
4055
+ .navbar-form.navbar-right:last-child {
4056
+ margin-right: -15px;
4057
+ }
4058
+}
4059
+.navbar-nav > li > .dropdown-menu {
4060
+ margin-top: 0;
4061
+ border-top-left-radius: 0;
4062
+ border-top-right-radius: 0;
4063
+}
4064
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
4065
+ border-bottom-right-radius: 0;
4066
+ border-bottom-left-radius: 0;
4067
+}
4068
+.navbar-btn {
4069
+ margin-top: 8px;
4070
+ margin-bottom: 8px;
4071
+}
4072
+.navbar-btn.btn-sm {
4073
+ margin-top: 10px;
4074
+ margin-bottom: 10px;
4075
+}
4076
+.navbar-btn.btn-xs {
4077
+ margin-top: 14px;
4078
+ margin-bottom: 14px;
4079
+}
4080
+.navbar-text {
4081
+ margin-top: 15px;
4082
+ margin-bottom: 15px;
4083
+}
4084
+@media (min-width: 768px) {
4085
+ .navbar-text {
4086
+ float: left;
4087
+ margin-right: 15px;
4088
+ margin-left: 15px;
4089
+ }
4090
+ .navbar-text.navbar-right:last-child {
4091
+ margin-right: 0;
4092
+ }
4093
+}
4094
+.navbar-default {
4095
+ background-color: #f8f8f8;
4096
+ border-color: #e7e7e7;
4097
+}
4098
+.navbar-default .navbar-brand {
4099
+ color: #777;
4100
+}
4101
+.navbar-default .navbar-brand:hover,
4102
+.navbar-default .navbar-brand:focus {
4103
+ color: #5e5e5e;
4104
+ background-color: transparent;
4105
+}
4106
+.navbar-default .navbar-text {
4107
+ color: #777;
4108
+}
4109
+.navbar-default .navbar-nav > li > a {
4110
+ color: #777;
4111
+}
4112
+.navbar-default .navbar-nav > li > a:hover,
4113
+.navbar-default .navbar-nav > li > a:focus {
4114
+ color: #333;
4115
+ background-color: transparent;
4116
+}
4117
+.navbar-default .navbar-nav > .active > a,
4118
+.navbar-default .navbar-nav > .active > a:hover,
4119
+.navbar-default .navbar-nav > .active > a:focus {
4120
+ color: #555;
4121
+ background-color: #e7e7e7;
4122
+}
4123
+.navbar-default .navbar-nav > .disabled > a,
4124
+.navbar-default .navbar-nav > .disabled > a:hover,
4125
+.navbar-default .navbar-nav > .disabled > a:focus {
4126
+ color: #ccc;
4127
+ background-color: transparent;
4128
+}
4129
+.navbar-default .navbar-toggle {
4130
+ border-color: #ddd;
4131
+}
4132
+.navbar-default .navbar-toggle:hover,
4133
+.navbar-default .navbar-toggle:focus {
4134
+ background-color: #ddd;
4135
+}
4136
+.navbar-default .navbar-toggle .icon-bar {
4137
+ background-color: #888;
4138
+}
4139
+.navbar-default .navbar-collapse,
4140
+.navbar-default .navbar-form {
4141
+ border-color: #e7e7e7;
4142
+}
4143
+.navbar-default .navbar-nav > .open > a,
4144
+.navbar-default .navbar-nav > .open > a:hover,
4145
+.navbar-default .navbar-nav > .open > a:focus {
4146
+ color: #555;
4147
+ background-color: #e7e7e7;
4148
+}
4149
+@media (max-width: 767px) {
4150
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
4151
+ color: #777;
4152
+ }
4153
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
4154
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
4155
+ color: #333;
4156
+ background-color: transparent;
4157
+ }
4158
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
4159
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
4160
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
4161
+ color: #555;
4162
+ background-color: #e7e7e7;
4163
+ }
4164
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
4165
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
4166
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
4167
+ color: #ccc;
4168
+ background-color: transparent;
4169
+ }
4170
+}
4171
+.navbar-default .navbar-link {
4172
+ color: #777;
4173
+}
4174
+.navbar-default .navbar-link:hover {
4175
+ color: #333;
4176
+}
4177
+.navbar-default .btn-link {
4178
+ color: #777;
4179
+}
4180
+.navbar-default .btn-link:hover,
4181
+.navbar-default .btn-link:focus {
4182
+ color: #333;
4183
+}
4184
+.navbar-default .btn-link[disabled]:hover,
4185
+fieldset[disabled] .navbar-default .btn-link:hover,
4186
+.navbar-default .btn-link[disabled]:focus,
4187
+fieldset[disabled] .navbar-default .btn-link:focus {
4188
+ color: #ccc;
4189
+}
4190
+.navbar-inverse {
4191
+ background-color: #222;
4192
+ border-color: #080808;
4193
+}
4194
+.navbar-inverse .navbar-brand {
4195
+ color: #777;
4196
+}
4197
+.navbar-inverse .navbar-brand:hover,
4198
+.navbar-inverse .navbar-brand:focus {
4199
+ color: #fff;
4200
+ background-color: transparent;
4201
+}
4202
+.navbar-inverse .navbar-text {
4203
+ color: #777;
4204
+}
4205
+.navbar-inverse .navbar-nav > li > a {
4206
+ color: #777;
4207
+}
4208
+.navbar-inverse .navbar-nav > li > a:hover,
4209
+.navbar-inverse .navbar-nav > li > a:focus {
4210
+ color: #fff;
4211
+ background-color: transparent;
4212
+}
4213
+.navbar-inverse .navbar-nav > .active > a,
4214
+.navbar-inverse .navbar-nav > .active > a:hover,
4215
+.navbar-inverse .navbar-nav > .active > a:focus {
4216
+ color: #fff;
4217
+ background-color: #080808;
4218
+}
4219
+.navbar-inverse .navbar-nav > .disabled > a,
4220
+.navbar-inverse .navbar-nav > .disabled > a:hover,
4221
+.navbar-inverse .navbar-nav > .disabled > a:focus {
4222
+ color: #444;
4223
+ background-color: transparent;
4224
+}
4225
+.navbar-inverse .navbar-toggle {
4226
+ border-color: #333;
4227
+}
4228
+.navbar-inverse .navbar-toggle:hover,
4229
+.navbar-inverse .navbar-toggle:focus {
4230
+ background-color: #333;
4231
+}
4232
+.navbar-inverse .navbar-toggle .icon-bar {
4233
+ background-color: #fff;
4234
+}
4235
+.navbar-inverse .navbar-collapse,
4236
+.navbar-inverse .navbar-form {
4237
+ border-color: #101010;
4238
+}
4239
+.navbar-inverse .navbar-nav > .open > a,
4240
+.navbar-inverse .navbar-nav > .open > a:hover,
4241
+.navbar-inverse .navbar-nav > .open > a:focus {
4242
+ color: #fff;
4243
+ background-color: #080808;
4244
+}
4245
+@media (max-width: 767px) {
4246
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
4247
+ border-color: #080808;
4248
+ }
4249
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
4250
+ background-color: #080808;
4251
+ }
4252
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
4253
+ color: #777;
4254
+ }
4255
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
4256
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
4257
+ color: #fff;
4258
+ background-color: transparent;
4259
+ }
4260
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
4261
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
4262
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
4263
+ color: #fff;
4264
+ background-color: #080808;
4265
+ }
4266
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
4267
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
4268
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
4269
+ color: #444;
4270
+ background-color: transparent;
4271
+ }
4272
+}
4273
+.navbar-inverse .navbar-link {
4274
+ color: #777;
4275
+}
4276
+.navbar-inverse .navbar-link:hover {
4277
+ color: #fff;
4278
+}
4279
+.navbar-inverse .btn-link {
4280
+ color: #777;
4281
+}
4282
+.navbar-inverse .btn-link:hover,
4283
+.navbar-inverse .btn-link:focus {
4284
+ color: #fff;
4285
+}
4286
+.navbar-inverse .btn-link[disabled]:hover,
4287
+fieldset[disabled] .navbar-inverse .btn-link:hover,
4288
+.navbar-inverse .btn-link[disabled]:focus,
4289
+fieldset[disabled] .navbar-inverse .btn-link:focus {
4290
+ color: #444;
4291
+}
4292
+.breadcrumb {
4293
+ padding: 8px 15px;
4294
+ margin-bottom: 20px;
4295
+ list-style: none;
4296
+ background-color: #f5f5f5;
4297
+ border-radius: 4px;
4298
+}
4299
+.breadcrumb > li {
4300
+ display: inline-block;
4301
+}
4302
+.breadcrumb > li + li:before {
4303
+ padding: 0 5px;
4304
+ color: #ccc;
4305
+ content: "/\00a0";
4306
+}
4307
+.breadcrumb > .active {
4308
+ color: #777;
4309
+}
4310
+.pagination {
4311
+ display: inline-block;
4312
+ padding-left: 0;
4313
+ margin: 20px 0;
4314
+ border-radius: 4px;
4315
+}
4316
+.pagination > li {
4317
+ display: inline;
4318
+}
4319
+.pagination > li > a,
4320
+.pagination > li > span {
4321
+ position: relative;
4322
+ float: left;
4323
+ padding: 6px 12px;
4324
+ margin-left: -1px;
4325
+ line-height: 1.42857143;
4326
+ color: #428bca;
4327
+ text-decoration: none;
4328
+ background-color: #fff;
4329
+ border: 1px solid #ddd;
4330
+}
4331
+.pagination > li:first-child > a,
4332
+.pagination > li:first-child > span {
4333
+ margin-left: 0;
4334
+ border-top-left-radius: 4px;
4335
+ border-bottom-left-radius: 4px;
4336
+}
4337
+.pagination > li:last-child > a,
4338
+.pagination > li:last-child > span {
4339
+ border-top-right-radius: 4px;
4340
+ border-bottom-right-radius: 4px;
4341
+}
4342
+.pagination > li > a:hover,
4343
+.pagination > li > span:hover,
4344
+.pagination > li > a:focus,
4345
+.pagination > li > span:focus {
4346
+ color: #2a6496;
4347
+ background-color: #eee;
4348
+ border-color: #ddd;
4349
+}
4350
+.pagination > .active > a,
4351
+.pagination > .active > span,
4352
+.pagination > .active > a:hover,
4353
+.pagination > .active > span:hover,
4354
+.pagination > .active > a:focus,
4355
+.pagination > .active > span:focus {
4356
+ z-index: 2;
4357
+ color: #fff;
4358
+ cursor: default;
4359
+ background-color: #428bca;
4360
+ border-color: #428bca;
4361
+}
4362
+.pagination > .disabled > span,
4363
+.pagination > .disabled > span:hover,
4364
+.pagination > .disabled > span:focus,
4365
+.pagination > .disabled > a,
4366
+.pagination > .disabled > a:hover,
4367
+.pagination > .disabled > a:focus {
4368
+ color: #777;
4369
+ cursor: not-allowed;
4370
+ background-color: #fff;
4371
+ border-color: #ddd;
4372
+}
4373
+.pagination-lg > li > a,
4374
+.pagination-lg > li > span {
4375
+ padding: 10px 16px;
4376
+ font-size: 18px;
4377
+}
4378
+.pagination-lg > li:first-child > a,
4379
+.pagination-lg > li:first-child > span {
4380
+ border-top-left-radius: 6px;
4381
+ border-bottom-left-radius: 6px;
4382
+}
4383
+.pagination-lg > li:last-child > a,
4384
+.pagination-lg > li:last-child > span {
4385
+ border-top-right-radius: 6px;
4386
+ border-bottom-right-radius: 6px;
4387
+}
4388
+.pagination-sm > li > a,
4389
+.pagination-sm > li > span {
4390
+ padding: 5px 10px;
4391
+ font-size: 12px;
4392
+}
4393
+.pagination-sm > li:first-child > a,
4394
+.pagination-sm > li:first-child > span {
4395
+ border-top-left-radius: 3px;
4396
+ border-bottom-left-radius: 3px;
4397
+}
4398
+.pagination-sm > li:last-child > a,
4399
+.pagination-sm > li:last-child > span {
4400
+ border-top-right-radius: 3px;
4401
+ border-bottom-right-radius: 3px;
4402
+}
4403
+.pager {
4404
+ padding-left: 0;
4405
+ margin: 20px 0;
4406
+ text-align: center;
4407
+ list-style: none;
4408
+}
4409
+.pager li {
4410
+ display: inline;
4411
+}
4412
+.pager li > a,
4413
+.pager li > span {
4414
+ display: inline-block;
4415
+ padding: 5px 14px;
4416
+ background-color: #fff;
4417
+ border: 1px solid #ddd;
4418
+ border-radius: 15px;
4419
+}
4420
+.pager li > a:hover,
4421
+.pager li > a:focus {
4422
+ text-decoration: none;
4423
+ background-color: #eee;
4424
+}
4425
+.pager .next > a,
4426
+.pager .next > span {
4427
+ float: right;
4428
+}
4429
+.pager .previous > a,
4430
+.pager .previous > span {
4431
+ float: left;
4432
+}
4433
+.pager .disabled > a,
4434
+.pager .disabled > a:hover,
4435
+.pager .disabled > a:focus,
4436
+.pager .disabled > span {
4437
+ color: #777;
4438
+ cursor: not-allowed;
4439
+ background-color: #fff;
4440
+}
4441
+.label {
4442
+ display: inline;
4443
+ padding: .2em .6em .3em;
4444
+ font-size: 75%;
4445
+ font-weight: bold;
4446
+ line-height: 1;
4447
+ color: #fff;
4448
+ text-align: center;
4449
+ white-space: nowrap;
4450
+ vertical-align: baseline;
4451
+ border-radius: .25em;
4452
+}
4453
+a.label:hover,
4454
+a.label:focus {
4455
+ color: #fff;
4456
+ text-decoration: none;
4457
+ cursor: pointer;
4458
+}
4459
+.label:empty {
4460
+ display: none;
4461
+}
4462
+.btn .label {
4463
+ position: relative;
4464
+ top: -1px;
4465
+}
4466
+.label-default {
4467
+ background-color: #777;
4468
+}
4469
+.label-default[href]:hover,
4470
+.label-default[href]:focus {
4471
+ background-color: #5e5e5e;
4472
+}
4473
+.label-primary {
4474
+ background-color: #428bca;
4475
+}
4476
+.label-primary[href]:hover,
4477
+.label-primary[href]:focus {
4478
+ background-color: #3071a9;
4479
+}
4480
+.label-success {
4481
+ background-color: #5cb85c;
4482
+}
4483
+.label-success[href]:hover,
4484
+.label-success[href]:focus {
4485
+ background-color: #449d44;
4486
+}
4487
+.label-info {
4488
+ background-color: #5bc0de;
4489
+}
4490
+.label-info[href]:hover,
4491
+.label-info[href]:focus {
4492
+ background-color: #31b0d5;
4493
+}
4494
+.label-warning {
4495
+ background-color: #f0ad4e;
4496
+}
4497
+.label-warning[href]:hover,
4498
+.label-warning[href]:focus {
4499
+ background-color: #ec971f;
4500
+}
4501
+.label-danger {
4502
+ background-color: #d9534f;
4503
+}
4504
+.label-danger[href]:hover,
4505
+.label-danger[href]:focus {
4506
+ background-color: #c9302c;
4507
+}
4508
+.badge {
4509
+ display: inline-block;
4510
+ min-width: 10px;
4511
+ padding: 3px 7px;
4512
+ font-size: 12px;
4513
+ font-weight: bold;
4514
+ line-height: 1;
4515
+ color: #fff;
4516
+ text-align: center;
4517
+ white-space: nowrap;
4518
+ vertical-align: baseline;
4519
+ background-color: #777;
4520
+ border-radius: 10px;
4521
+}
4522
+.badge:empty {
4523
+ display: none;
4524
+}
4525
+.btn .badge {
4526
+ position: relative;
4527
+ top: -1px;
4528
+}
4529
+.btn-xs .badge {
4530
+ top: 0;
4531
+ padding: 1px 5px;
4532
+}
4533
+a.badge:hover,
4534
+a.badge:focus {
4535
+ color: #fff;
4536
+ text-decoration: none;
4537
+ cursor: pointer;
4538
+}
4539
+a.list-group-item.active > .badge,
4540
+.nav-pills > .active > a > .badge {
4541
+ color: #428bca;
4542
+ background-color: #fff;
4543
+}
4544
+.nav-pills > li > a > .badge {
4545
+ margin-left: 3px;
4546
+}
4547
+.jumbotron {
4548
+ padding: 30px;
4549
+ margin-bottom: 30px;
4550
+ color: inherit;
4551
+ background-color: #eee;
4552
+}
4553
+.jumbotron h1,
4554
+.jumbotron .h1 {
4555
+ color: inherit;
4556
+}
4557
+.jumbotron p {
4558
+ margin-bottom: 15px;
4559
+ font-size: 21px;
4560
+ font-weight: 200;
4561
+}
4562
+.jumbotron > hr {
4563
+ border-top-color: #d5d5d5;
4564
+}
4565
+.container .jumbotron {
4566
+ border-radius: 6px;
4567
+}
4568
+.jumbotron .container {
4569
+ max-width: 100%;
4570
+}
4571
+@media screen and (min-width: 768px) {
4572
+ .jumbotron {
4573
+ padding-top: 48px;
4574
+ padding-bottom: 48px;
4575
+ }
4576
+ .container .jumbotron {
4577
+ padding-right: 60px;
4578
+ padding-left: 60px;
4579
+ }
4580
+ .jumbotron h1,
4581
+ .jumbotron .h1 {
4582
+ font-size: 63px;
4583
+ }
4584
+}
4585
+.thumbnail {
4586
+ display: block;
4587
+ padding: 4px;
4588
+ margin-bottom: 20px;
4589
+ line-height: 1.42857143;
4590
+ background-color: #fff;
4591
+ border: 1px solid #ddd;
4592
+ border-radius: 4px;
4593
+ -webkit-transition: all .2s ease-in-out;
4594
+ -o-transition: all .2s ease-in-out;
4595
+ transition: all .2s ease-in-out;
4596
+}
4597
+.thumbnail > img,
4598
+.thumbnail a > img {
4599
+ margin-right: auto;
4600
+ margin-left: auto;
4601
+}
4602
+a.thumbnail:hover,
4603
+a.thumbnail:focus,
4604
+a.thumbnail.active {
4605
+ border-color: #428bca;
4606
+}
4607
+.thumbnail .caption {
4608
+ padding: 9px;
4609
+ color: #333;
4610
+}
4611
+.alert {
4612
+ padding: 15px;
4613
+ margin-bottom: 20px;
4614
+ border: 1px solid transparent;
4615
+ border-radius: 4px;
4616
+}
4617
+.alert h4 {
4618
+ margin-top: 0;
4619
+ color: inherit;
4620
+}
4621
+.alert .alert-link {
4622
+ font-weight: bold;
4623
+}
4624
+.alert > p,
4625
+.alert > ul {
4626
+ margin-bottom: 0;
4627
+}
4628
+.alert > p + p {
4629
+ margin-top: 5px;
4630
+}
4631
+.alert-dismissable,
4632
+.alert-dismissible {
4633
+ padding-right: 35px;
4634
+}
4635
+.alert-dismissable .close,
4636
+.alert-dismissible .close {
4637
+ position: relative;
4638
+ top: -2px;
4639
+ right: -21px;
4640
+ color: inherit;
4641
+}
4642
+.alert-success {
4643
+ color: #3c763d;
4644
+ background-color: #dff0d8;
4645
+ border-color: #d6e9c6;
4646
+}
4647
+.alert-success hr {
4648
+ border-top-color: #c9e2b3;
4649
+}
4650
+.alert-success .alert-link {
4651
+ color: #2b542c;
4652
+}
4653
+.alert-info {
4654
+ color: #31708f;
4655
+ background-color: #d9edf7;
4656
+ border-color: #bce8f1;
4657
+}
4658
+.alert-info hr {
4659
+ border-top-color: #a6e1ec;
4660
+}
4661
+.alert-info .alert-link {
4662
+ color: #245269;
4663
+}
4664
+.alert-warning {
4665
+ color: #8a6d3b;
4666
+ background-color: #fcf8e3;
4667
+ border-color: #faebcc;
4668
+}
4669
+.alert-warning hr {
4670
+ border-top-color: #f7e1b5;
4671
+}
4672
+.alert-warning .alert-link {
4673
+ color: #66512c;
4674
+}
4675
+.alert-danger {
4676
+ color: #a94442;
4677
+ background-color: #f2dede;
4678
+ border-color: #ebccd1;
4679
+}
4680
+.alert-danger hr {
4681
+ border-top-color: #e4b9c0;
4682
+}
4683
+.alert-danger .alert-link {
4684
+ color: #843534;
4685
+}
4686
+@-webkit-keyframes progress-bar-stripes {
4687
+ from {
4688
+ background-position: 40px 0;
4689
+ }
4690
+ to {
4691
+ background-position: 0 0;
4692
+ }
4693
+}
4694
+@-o-keyframes progress-bar-stripes {
4695
+ from {
4696
+ background-position: 40px 0;
4697
+ }
4698
+ to {
4699
+ background-position: 0 0;
4700
+ }
4701
+}
4702
+@keyframes progress-bar-stripes {
4703
+ from {
4704
+ background-position: 40px 0;
4705
+ }
4706
+ to {
4707
+ background-position: 0 0;
4708
+ }
4709
+}
4710
+.progress {
4711
+ height: 20px;
4712
+ margin-bottom: 20px;
4713
+ overflow: hidden;
4714
+ background-color: #f5f5f5;
4715
+ border-radius: 4px;
4716
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
4717
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
4718
+}
4719
+.progress-bar {
4720
+ float: left;
4721
+ width: 0;
4722
+ height: 100%;
4723
+ font-size: 12px;
4724
+ line-height: 20px;
4725
+ color: #fff;
4726
+ text-align: center;
4727
+ background-color: #428bca;
4728
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
4729
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
4730
+ -webkit-transition: width .6s ease;
4731
+ -o-transition: width .6s ease;
4732
+ transition: width .6s ease;
4733
+}
4734
+.progress-striped .progress-bar,
4735
+.progress-bar-striped {
4736
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4737
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4738
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4739
+ -webkit-background-size: 40px 40px;
4740
+ background-size: 40px 40px;
4741
+}
4742
+.progress.active .progress-bar,
4743
+.progress-bar.active {
4744
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
4745
+ -o-animation: progress-bar-stripes 2s linear infinite;
4746
+ animation: progress-bar-stripes 2s linear infinite;
4747
+}
4748
+.progress-bar[aria-valuenow="1"],
4749
+.progress-bar[aria-valuenow="2"] {
4750
+ min-width: 30px;
4751
+}
4752
+.progress-bar[aria-valuenow="0"] {
4753
+ min-width: 30px;
4754
+ color: #777;
4755
+ background-color: transparent;
4756
+ background-image: none;
4757
+ -webkit-box-shadow: none;
4758
+ box-shadow: none;
4759
+}
4760
+.progress-bar-success {
4761
+ background-color: #5cb85c;
4762
+}
4763
+.progress-striped .progress-bar-success {
4764
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4765
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4766
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4767
+}
4768
+.progress-bar-info {
4769
+ background-color: #5bc0de;
4770
+}
4771
+.progress-striped .progress-bar-info {
4772
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4773
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4774
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4775
+}
4776
+.progress-bar-warning {
4777
+ background-color: #f0ad4e;
4778
+}
4779
+.progress-striped .progress-bar-warning {
4780
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4781
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4782
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4783
+}
4784
+.progress-bar-danger {
4785
+ background-color: #d9534f;
4786
+}
4787
+.progress-striped .progress-bar-danger {
4788
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4789
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4790
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4791
+}
4792
+.media,
4793
+.media-body {
4794
+ overflow: hidden;
4795
+ zoom: 1;
4796
+}
4797
+.media,
4798
+.media .media {
4799
+ margin-top: 15px;
4800
+}
4801
+.media:first-child {
4802
+ margin-top: 0;
4803
+}
4804
+.media-object {
4805
+ display: block;
4806
+}
4807
+.media-heading {
4808
+ margin: 0 0 5px;
4809
+}
4810
+.media > .pull-left {
4811
+ margin-right: 10px;
4812
+}
4813
+.media > .pull-right {
4814
+ margin-left: 10px;
4815
+}
4816
+.media-list {
4817
+ padding-left: 0;
4818
+ list-style: none;
4819
+}
4820
+.list-group {
4821
+ padding-left: 0;
4822
+ margin-bottom: 20px;
4823
+}
4824
+.list-group-item {
4825
+ position: relative;
4826
+ display: block;
4827
+ padding: 10px 15px;
4828
+ margin-bottom: -1px;
4829
+ background-color: #fff;
4830
+ border: 1px solid #ddd;
4831
+}
4832
+.list-group-item:first-child {
4833
+ border-top-left-radius: 4px;
4834
+ border-top-right-radius: 4px;
4835
+}
4836
+.list-group-item:last-child {
4837
+ margin-bottom: 0;
4838
+ border-bottom-right-radius: 4px;
4839
+ border-bottom-left-radius: 4px;
4840
+}
4841
+.list-group-item > .badge {
4842
+ float: right;
4843
+}
4844
+.list-group-item > .badge + .badge {
4845
+ margin-right: 5px;
4846
+}
4847
+a.list-group-item {
4848
+ color: #555;
4849
+}
4850
+a.list-group-item .list-group-item-heading {
4851
+ color: #333;
4852
+}
4853
+a.list-group-item:hover,
4854
+a.list-group-item:focus {
4855
+ color: #555;
4856
+ text-decoration: none;
4857
+ background-color: #f5f5f5;
4858
+}
4859
+.list-group-item.disabled,
4860
+.list-group-item.disabled:hover,
4861
+.list-group-item.disabled:focus {
4862
+ color: #777;
4863
+ background-color: #eee;
4864
+}
4865
+.list-group-item.disabled .list-group-item-heading,
4866
+.list-group-item.disabled:hover .list-group-item-heading,
4867
+.list-group-item.disabled:focus .list-group-item-heading {
4868
+ color: inherit;
4869
+}
4870
+.list-group-item.disabled .list-group-item-text,
4871
+.list-group-item.disabled:hover .list-group-item-text,
4872
+.list-group-item.disabled:focus .list-group-item-text {
4873
+ color: #777;
4874
+}
4875
+.list-group-item.active,
4876
+.list-group-item.active:hover,
4877
+.list-group-item.active:focus {
4878
+ z-index: 2;
4879
+ color: #fff;
4880
+ background-color: #428bca;
4881
+ border-color: #428bca;
4882
+}
4883
+.list-group-item.active .list-group-item-heading,
4884
+.list-group-item.active:hover .list-group-item-heading,
4885
+.list-group-item.active:focus .list-group-item-heading,
4886
+.list-group-item.active .list-group-item-heading > small,
4887
+.list-group-item.active:hover .list-group-item-heading > small,
4888
+.list-group-item.active:focus .list-group-item-heading > small,
4889
+.list-group-item.active .list-group-item-heading > .small,
4890
+.list-group-item.active:hover .list-group-item-heading > .small,
4891
+.list-group-item.active:focus .list-group-item-heading > .small {
4892
+ color: inherit;
4893
+}
4894
+.list-group-item.active .list-group-item-text,
4895
+.list-group-item.active:hover .list-group-item-text,
4896
+.list-group-item.active:focus .list-group-item-text {
4897
+ color: #e1edf7;
4898
+}
4899
+.list-group-item-success {
4900
+ color: #3c763d;
4901
+ background-color: #dff0d8;
4902
+}
4903
+a.list-group-item-success {
4904
+ color: #3c763d;
4905
+}
4906
+a.list-group-item-success .list-group-item-heading {
4907
+ color: inherit;
4908
+}
4909
+a.list-group-item-success:hover,
4910
+a.list-group-item-success:focus {
4911
+ color: #3c763d;
4912
+ background-color: #d0e9c6;
4913
+}
4914
+a.list-group-item-success.active,
4915
+a.list-group-item-success.active:hover,
4916
+a.list-group-item-success.active:focus {
4917
+ color: #fff;
4918
+ background-color: #3c763d;
4919
+ border-color: #3c763d;
4920
+}
4921
+.list-group-item-info {
4922
+ color: #31708f;
4923
+ background-color: #d9edf7;
4924
+}
4925
+a.list-group-item-info {
4926
+ color: #31708f;
4927
+}
4928
+a.list-group-item-info .list-group-item-heading {
4929
+ color: inherit;
4930
+}
4931
+a.list-group-item-info:hover,
4932
+a.list-group-item-info:focus {
4933
+ color: #31708f;
4934
+ background-color: #c4e3f3;
4935
+}
4936
+a.list-group-item-info.active,
4937
+a.list-group-item-info.active:hover,
4938
+a.list-group-item-info.active:focus {
4939
+ color: #fff;
4940
+ background-color: #31708f;
4941
+ border-color: #31708f;
4942
+}
4943
+.list-group-item-warning {
4944
+ color: #8a6d3b;
4945
+ background-color: #fcf8e3;
4946
+}
4947
+a.list-group-item-warning {
4948
+ color: #8a6d3b;
4949
+}
4950
+a.list-group-item-warning .list-group-item-heading {
4951
+ color: inherit;
4952
+}
4953
+a.list-group-item-warning:hover,
4954
+a.list-group-item-warning:focus {
4955
+ color: #8a6d3b;
4956
+ background-color: #faf2cc;
4957
+}
4958
+a.list-group-item-warning.active,
4959
+a.list-group-item-warning.active:hover,
4960
+a.list-group-item-warning.active:focus {
4961
+ color: #fff;
4962
+ background-color: #8a6d3b;
4963
+ border-color: #8a6d3b;
4964
+}
4965
+.list-group-item-danger {
4966
+ color: #a94442;
4967
+ background-color: #f2dede;
4968
+}
4969
+a.list-group-item-danger {
4970
+ color: #a94442;
4971
+}
4972
+a.list-group-item-danger .list-group-item-heading {
4973
+ color: inherit;
4974
+}
4975
+a.list-group-item-danger:hover,
4976
+a.list-group-item-danger:focus {
4977
+ color: #a94442;
4978
+ background-color: #ebcccc;
4979
+}
4980
+a.list-group-item-danger.active,
4981
+a.list-group-item-danger.active:hover,
4982
+a.list-group-item-danger.active:focus {
4983
+ color: #fff;
4984
+ background-color: #a94442;
4985
+ border-color: #a94442;
4986
+}
4987
+.list-group-item-heading {
4988
+ margin-top: 0;
4989
+ margin-bottom: 5px;
4990
+}
4991
+.list-group-item-text {
4992
+ margin-bottom: 0;
4993
+ line-height: 1.3;
4994
+}
4995
+.panel {
4996
+ margin-bottom: 20px;
4997
+ background-color: #fff;
4998
+ border: 1px solid transparent;
4999
+ border-radius: 4px;
5000
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
5001
+ box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
5002
+}
5003
+.panel-body {
5004
+ padding: 15px;
5005
+}
5006
+.panel-heading {
5007
+ padding: 10px 15px;
5008
+ border-bottom: 1px solid transparent;
5009
+ border-top-left-radius: 3px;
5010
+ border-top-right-radius: 3px;
5011
+}
5012
+.panel-heading > .dropdown .dropdown-toggle {
5013
+ color: inherit;
5014
+}
5015
+.panel-title {
5016
+ margin-top: 0;
5017
+ margin-bottom: 0;
5018
+ font-size: 16px;
5019
+ color: inherit;
5020
+}
5021
+.panel-title > a {
5022
+ color: inherit;
5023
+}
5024
+.panel-footer {
5025
+ padding: 10px 15px;
5026
+ background-color: #f5f5f5;
5027
+ border-top: 1px solid #ddd;
5028
+ border-bottom-right-radius: 3px;
5029
+ border-bottom-left-radius: 3px;
5030
+}
5031
+.panel > .list-group {
5032
+ margin-bottom: 0;
5033
+}
5034
+.panel > .list-group .list-group-item {
5035
+ border-width: 1px 0;
5036
+ border-radius: 0;
5037
+}
5038
+.panel > .list-group:first-child .list-group-item:first-child {
5039
+ border-top: 0;
5040
+ border-top-left-radius: 3px;
5041
+ border-top-right-radius: 3px;
5042
+}
5043
+.panel > .list-group:last-child .list-group-item:last-child {
5044
+ border-bottom: 0;
5045
+ border-bottom-right-radius: 3px;
5046
+ border-bottom-left-radius: 3px;
5047
+}
5048
+.panel-heading + .list-group .list-group-item:first-child {
5049
+ border-top-width: 0;
5050
+}
5051
+.list-group + .panel-footer {
5052
+ border-top-width: 0;
5053
+}
5054
+.panel > .table,
5055
+.panel > .table-responsive > .table,
5056
+.panel > .panel-collapse > .table {
5057
+ margin-bottom: 0;
5058
+}
5059
+.panel > .table:first-child,
5060
+.panel > .table-responsive:first-child > .table:first-child {
5061
+ border-top-left-radius: 3px;
5062
+ border-top-right-radius: 3px;
5063
+}
5064
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
5065
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
5066
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
5067
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
5068
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
5069
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
5070
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
5071
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
5072
+ border-top-left-radius: 3px;
5073
+}
5074
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
5075
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
5076
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
5077
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
5078
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
5079
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
5080
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
5081
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
5082
+ border-top-right-radius: 3px;
5083
+}
5084
+.panel > .table:last-child,
5085
+.panel > .table-responsive:last-child > .table:last-child {
5086
+ border-bottom-right-radius: 3px;
5087
+ border-bottom-left-radius: 3px;
5088
+}
5089
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
5090
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
5091
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
5092
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
5093
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
5094
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
5095
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
5096
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
5097
+ border-bottom-left-radius: 3px;
5098
+}
5099
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
5100
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
5101
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
5102
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
5103
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
5104
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
5105
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
5106
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
5107
+ border-bottom-right-radius: 3px;
5108
+}
5109
+.panel > .panel-body + .table,
5110
+.panel > .panel-body + .table-responsive {
5111
+ border-top: 1px solid #ddd;
5112
+}
5113
+.panel > .table > tbody:first-child > tr:first-child th,
5114
+.panel > .table > tbody:first-child > tr:first-child td {
5115
+ border-top: 0;
5116
+}
5117
+.panel > .table-bordered,
5118
+.panel > .table-responsive > .table-bordered {
5119
+ border: 0;
5120
+}
5121
+.panel > .table-bordered > thead > tr > th:first-child,
5122
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
5123
+.panel > .table-bordered > tbody > tr > th:first-child,
5124
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
5125
+.panel > .table-bordered > tfoot > tr > th:first-child,
5126
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
5127
+.panel > .table-bordered > thead > tr > td:first-child,
5128
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
5129
+.panel > .table-bordered > tbody > tr > td:first-child,
5130
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
5131
+.panel > .table-bordered > tfoot > tr > td:first-child,
5132
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
5133
+ border-left: 0;
5134
+}
5135
+.panel > .table-bordered > thead > tr > th:last-child,
5136
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
5137
+.panel > .table-bordered > tbody > tr > th:last-child,
5138
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
5139
+.panel > .table-bordered > tfoot > tr > th:last-child,
5140
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
5141
+.panel > .table-bordered > thead > tr > td:last-child,
5142
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
5143
+.panel > .table-bordered > tbody > tr > td:last-child,
5144
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
5145
+.panel > .table-bordered > tfoot > tr > td:last-child,
5146
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
5147
+ border-right: 0;
5148
+}
5149
+.panel > .table-bordered > thead > tr:first-child > td,
5150
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
5151
+.panel > .table-bordered > tbody > tr:first-child > td,
5152
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
5153
+.panel > .table-bordered > thead > tr:first-child > th,
5154
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
5155
+.panel > .table-bordered > tbody > tr:first-child > th,
5156
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
5157
+ border-bottom: 0;
5158
+}
5159
+.panel > .table-bordered > tbody > tr:last-child > td,
5160
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
5161
+.panel > .table-bordered > tfoot > tr:last-child > td,
5162
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
5163
+.panel > .table-bordered > tbody > tr:last-child > th,
5164
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
5165
+.panel > .table-bordered > tfoot > tr:last-child > th,
5166
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
5167
+ border-bottom: 0;
5168
+}
5169
+.panel > .table-responsive {
5170
+ margin-bottom: 0;
5171
+ border: 0;
5172
+}
5173
+.panel-group {
5174
+ margin-bottom: 20px;
5175
+}
5176
+.panel-group .panel {
5177
+ margin-bottom: 0;
5178
+ border-radius: 4px;
5179
+}
5180
+.panel-group .panel + .panel {
5181
+ margin-top: 5px;
5182
+}
5183
+.panel-group .panel-heading {
5184
+ border-bottom: 0;
5185
+}
5186
+.panel-group .panel-heading + .panel-collapse > .panel-body {
5187
+ border-top: 1px solid #ddd;
5188
+}
5189
+.panel-group .panel-footer {
5190
+ border-top: 0;
5191
+}
5192
+.panel-group .panel-footer + .panel-collapse .panel-body {
5193
+ border-bottom: 1px solid #ddd;
5194
+}
5195
+.panel-default {
5196
+ border-color: #ddd;
5197
+}
5198
+.panel-default > .panel-heading {
5199
+ color: #333;
5200
+ background-color: #f5f5f5;
5201
+ border-color: #ddd;
5202
+}
5203
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
5204
+ border-top-color: #ddd;
5205
+}
5206
+.panel-default > .panel-heading .badge {
5207
+ color: #f5f5f5;
5208
+ background-color: #333;
5209
+}
5210
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
5211
+ border-bottom-color: #ddd;
5212
+}
5213
+.panel-primary {
5214
+ border-color: #428bca;
5215
+}
5216
+.panel-primary > .panel-heading {
5217
+ color: #fff;
5218
+ background-color: #428bca;
5219
+ border-color: #428bca;
5220
+}
5221
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
5222
+ border-top-color: #428bca;
5223
+}
5224
+.panel-primary > .panel-heading .badge {
5225
+ color: #428bca;
5226
+ background-color: #fff;
5227
+}
5228
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
5229
+ border-bottom-color: #428bca;
5230
+}
5231
+.panel-success {
5232
+ border-color: #d6e9c6;
5233
+}
5234
+.panel-success > .panel-heading {
5235
+ color: #3c763d;
5236
+ background-color: #dff0d8;
5237
+ border-color: #d6e9c6;
5238
+}
5239
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
5240
+ border-top-color: #d6e9c6;
5241
+}
5242
+.panel-success > .panel-heading .badge {
5243
+ color: #dff0d8;
5244
+ background-color: #3c763d;
5245
+}
5246
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
5247
+ border-bottom-color: #d6e9c6;
5248
+}
5249
+.panel-info {
5250
+ border-color: #bce8f1;
5251
+}
5252
+.panel-info > .panel-heading {
5253
+ color: #31708f;
5254
+ background-color: #d9edf7;
5255
+ border-color: #bce8f1;
5256
+}
5257
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
5258
+ border-top-color: #bce8f1;
5259
+}
5260
+.panel-info > .panel-heading .badge {
5261
+ color: #d9edf7;
5262
+ background-color: #31708f;
5263
+}
5264
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
5265
+ border-bottom-color: #bce8f1;
5266
+}
5267
+.panel-warning {
5268
+ border-color: #faebcc;
5269
+}
5270
+.panel-warning > .panel-heading {
5271
+ color: #8a6d3b;
5272
+ background-color: #fcf8e3;
5273
+ border-color: #faebcc;
5274
+}
5275
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
5276
+ border-top-color: #faebcc;
5277
+}
5278
+.panel-warning > .panel-heading .badge {
5279
+ color: #fcf8e3;
5280
+ background-color: #8a6d3b;
5281
+}
5282
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
5283
+ border-bottom-color: #faebcc;
5284
+}
5285
+.panel-danger {
5286
+ border-color: #ebccd1;
5287
+}
5288
+.panel-danger > .panel-heading {
5289
+ color: #a94442;
5290
+ background-color: #f2dede;
5291
+ border-color: #ebccd1;
5292
+}
5293
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
5294
+ border-top-color: #ebccd1;
5295
+}
5296
+.panel-danger > .panel-heading .badge {
5297
+ color: #f2dede;
5298
+ background-color: #a94442;
5299
+}
5300
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
5301
+ border-bottom-color: #ebccd1;
5302
+}
5303
+.embed-responsive {
5304
+ position: relative;
5305
+ display: block;
5306
+ height: 0;
5307
+ padding: 0;
5308
+ overflow: hidden;
5309
+}
5310
+.embed-responsive .embed-responsive-item,
5311
+.embed-responsive iframe,
5312
+.embed-responsive embed,
5313
+.embed-responsive object {
5314
+ position: absolute;
5315
+ top: 0;
5316
+ bottom: 0;
5317
+ left: 0;
5318
+ width: 100%;
5319
+ height: 100%;
5320
+ border: 0;
5321
+}
5322
+.embed-responsive.embed-responsive-16by9 {
5323
+ padding-bottom: 56.25%;
5324
+}
5325
+.embed-responsive.embed-responsive-4by3 {
5326
+ padding-bottom: 75%;
5327
+}
5328
+.well {
5329
+ min-height: 20px;
5330
+ padding: 19px;
5331
+ margin-bottom: 20px;
5332
+ background-color: #f5f5f5;
5333
+ border: 1px solid #e3e3e3;
5334
+ border-radius: 4px;
5335
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
5336
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
5337
+}
5338
+.well blockquote {
5339
+ border-color: #ddd;
5340
+ border-color: rgba(0, 0, 0, .15);
5341
+}
5342
+.well-lg {
5343
+ padding: 24px;
5344
+ border-radius: 6px;
5345
+}
5346
+.well-sm {
5347
+ padding: 9px;
5348
+ border-radius: 3px;
5349
+}
5350
+.close {
5351
+ float: right;
5352
+ font-size: 21px;
5353
+ font-weight: bold;
5354
+ line-height: 1;
5355
+ color: #000;
5356
+ text-shadow: 0 1px 0 #fff;
5357
+ filter: alpha(opacity=20);
5358
+ opacity: .2;
5359
+}
5360
+.close:hover,
5361
+.close:focus {
5362
+ color: #000;
5363
+ text-decoration: none;
5364
+ cursor: pointer;
5365
+ filter: alpha(opacity=50);
5366
+ opacity: .5;
5367
+}
5368
+button.close {
5369
+ -webkit-appearance: none;
5370
+ padding: 0;
5371
+ cursor: pointer;
5372
+ background: transparent;
5373
+ border: 0;
5374
+}
5375
+.modal-open {
5376
+ overflow: hidden;
5377
+}
5378
+.modal {
5379
+ position: fixed;
5380
+ top: 0;
5381
+ right: 0;
5382
+ bottom: 0;
5383
+ left: 0;
5384
+ z-index: 1050;
5385
+ display: none;
5386
+ overflow: hidden;
5387
+ -webkit-overflow-scrolling: touch;
5388
+ outline: 0;
5389
+}
5390
+.modal.fade .modal-dialog {
5391
+ -webkit-transition: -webkit-transform .3s ease-out;
5392
+ -o-transition: -o-transform .3s ease-out;
5393
+ transition: transform .3s ease-out;
5394
+ -webkit-transform: translate3d(0, -25%, 0);
5395
+ -o-transform: translate3d(0, -25%, 0);
5396
+ transform: translate3d(0, -25%, 0);
5397
+}
5398
+.modal.in .modal-dialog {
5399
+ -webkit-transform: translate3d(0, 0, 0);
5400
+ -o-transform: translate3d(0, 0, 0);
5401
+ transform: translate3d(0, 0, 0);
5402
+}
5403
+.modal-open .modal {
5404
+ overflow-x: hidden;
5405
+ overflow-y: auto;
5406
+}
5407
+.modal-dialog {
5408
+ position: relative;
5409
+ width: auto;
5410
+ margin: 10px;
5411
+}
5412
+.modal-content {
5413
+ position: relative;
5414
+ background-color: #fff;
5415
+ -webkit-background-clip: padding-box;
5416
+ background-clip: padding-box;
5417
+ border: 1px solid #999;
5418
+ border: 1px solid rgba(0, 0, 0, .2);
5419
+ border-radius: 6px;
5420
+ outline: 0;
5421
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
5422
+ box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
5423
+}
5424
+.modal-backdrop {
5425
+ position: fixed;
5426
+ top: 0;
5427
+ right: 0;
5428
+ bottom: 0;
5429
+ left: 0;
5430
+ z-index: 1040;
5431
+ background-color: #000;
5432
+}
5433
+.modal-backdrop.fade {
5434
+ filter: alpha(opacity=0);
5435
+ opacity: 0;
5436
+}
5437
+.modal-backdrop.in {
5438
+ filter: alpha(opacity=50);
5439
+ opacity: .5;
5440
+}
5441
+.modal-header {
5442
+ min-height: 16.42857143px;
5443
+ padding: 15px;
5444
+ border-bottom: 1px solid #e5e5e5;
5445
+}
5446
+.modal-header .close {
5447
+ margin-top: -2px;
5448
+}
5449
+.modal-title {
5450
+ margin: 0;
5451
+ line-height: 1.42857143;
5452
+}
5453
+.modal-body {
5454
+ position: relative;
5455
+ padding: 15px;
5456
+}
5457
+.modal-footer {
5458
+ padding: 15px;
5459
+ text-align: right;
5460
+ border-top: 1px solid #e5e5e5;
5461
+}
5462
+.modal-footer .btn + .btn {
5463
+ margin-bottom: 0;
5464
+ margin-left: 5px;
5465
+}
5466
+.modal-footer .btn-group .btn + .btn {
5467
+ margin-left: -1px;
5468
+}
5469
+.modal-footer .btn-block + .btn-block {
5470
+ margin-left: 0;
5471
+}
5472
+.modal-scrollbar-measure {
5473
+ position: absolute;
5474
+ top: -9999px;
5475
+ width: 50px;
5476
+ height: 50px;
5477
+ overflow: scroll;
5478
+}
5479
+@media (min-width: 768px) {
5480
+ .modal-dialog {
5481
+ width: 600px;
5482
+ margin: 30px auto;
5483
+ }
5484
+ .modal-content {
5485
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
5486
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
5487
+ }
5488
+ .modal-sm {
5489
+ width: 300px;
5490
+ }
5491
+}
5492
+@media (min-width: 992px) {
5493
+ .modal-lg {
5494
+ width: 900px;
5495
+ }
5496
+}
5497
+.tooltip {
5498
+ position: absolute;
5499
+ z-index: 1070;
5500
+ display: block;
5501
+ font-size: 12px;
5502
+ line-height: 1.4;
5503
+ visibility: visible;
5504
+ filter: alpha(opacity=0);
5505
+ opacity: 0;
5506
+}
5507
+.tooltip.in {
5508
+ filter: alpha(opacity=90);
5509
+ opacity: .9;
5510
+}
5511
+.tooltip.top {
5512
+ padding: 5px 0;
5513
+ margin-top: -3px;
5514
+}
5515
+.tooltip.right {
5516
+ padding: 0 5px;
5517
+ margin-left: 3px;
5518
+}
5519
+.tooltip.bottom {
5520
+ padding: 5px 0;
5521
+ margin-top: 3px;
5522
+}
5523
+.tooltip.left {
5524
+ padding: 0 5px;
5525
+ margin-left: -3px;
5526
+}
5527
+.tooltip-inner {
5528
+ max-width: 200px;
5529
+ padding: 3px 8px;
5530
+ color: #fff;
5531
+ text-align: center;
5532
+ text-decoration: none;
5533
+ background-color: #000;
5534
+ border-radius: 4px;
5535
+}
5536
+.tooltip-arrow {
5537
+ position: absolute;
5538
+ width: 0;
5539
+ height: 0;
5540
+ border-color: transparent;
5541
+ border-style: solid;
5542
+}
5543
+.tooltip.top .tooltip-arrow {
5544
+ bottom: 0;
5545
+ left: 50%;
5546
+ margin-left: -5px;
5547
+ border-width: 5px 5px 0;
5548
+ border-top-color: #000;
5549
+}
5550
+.tooltip.top-left .tooltip-arrow {
5551
+ bottom: 0;
5552
+ left: 5px;
5553
+ border-width: 5px 5px 0;
5554
+ border-top-color: #000;
5555
+}
5556
+.tooltip.top-right .tooltip-arrow {
5557
+ right: 5px;
5558
+ bottom: 0;
5559
+ border-width: 5px 5px 0;
5560
+ border-top-color: #000;
5561
+}
5562
+.tooltip.right .tooltip-arrow {
5563
+ top: 50%;
5564
+ left: 0;
5565
+ margin-top: -5px;
5566
+ border-width: 5px 5px 5px 0;
5567
+ border-right-color: #000;
5568
+}
5569
+.tooltip.left .tooltip-arrow {
5570
+ top: 50%;
5571
+ right: 0;
5572
+ margin-top: -5px;
5573
+ border-width: 5px 0 5px 5px;
5574
+ border-left-color: #000;
5575
+}
5576
+.tooltip.bottom .tooltip-arrow {
5577
+ top: 0;
5578
+ left: 50%;
5579
+ margin-left: -5px;
5580
+ border-width: 0 5px 5px;
5581
+ border-bottom-color: #000;
5582
+}
5583
+.tooltip.bottom-left .tooltip-arrow {
5584
+ top: 0;
5585
+ left: 5px;
5586
+ border-width: 0 5px 5px;
5587
+ border-bottom-color: #000;
5588
+}
5589
+.tooltip.bottom-right .tooltip-arrow {
5590
+ top: 0;
5591
+ right: 5px;
5592
+ border-width: 0 5px 5px;
5593
+ border-bottom-color: #000;
5594
+}
5595
+.popover {
5596
+ position: absolute;
5597
+ top: 0;
5598
+ left: 0;
5599
+ z-index: 1060;
5600
+ display: none;
5601
+ max-width: 276px;
5602
+ padding: 1px;
5603
+ text-align: left;
5604
+ white-space: normal;
5605
+ background-color: #fff;
5606
+ -webkit-background-clip: padding-box;
5607
+ background-clip: padding-box;
5608
+ border: 1px solid #ccc;
5609
+ border: 1px solid rgba(0, 0, 0, .2);
5610
+ border-radius: 6px;
5611
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
5612
+ box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
5613
+}
5614
+.popover.top {
5615
+ margin-top: -10px;
5616
+}
5617
+.popover.right {
5618
+ margin-left: 10px;
5619
+}
5620
+.popover.bottom {
5621
+ margin-top: 10px;
5622
+}
5623
+.popover.left {
5624
+ margin-left: -10px;
5625
+}
5626
+.popover-title {
5627
+ padding: 8px 14px;
5628
+ margin: 0;
5629
+ font-size: 14px;
5630
+ font-weight: normal;
5631
+ line-height: 18px;
5632
+ background-color: #f7f7f7;
5633
+ border-bottom: 1px solid #ebebeb;
5634
+ border-radius: 5px 5px 0 0;
5635
+}
5636
+.popover-content {
5637
+ padding: 9px 14px;
5638
+}
5639
+.popover > .arrow,
5640
+.popover > .arrow:after {
5641
+ position: absolute;
5642
+ display: block;
5643
+ width: 0;
5644
+ height: 0;
5645
+ border-color: transparent;
5646
+ border-style: solid;
5647
+}
5648
+.popover > .arrow {
5649
+ border-width: 11px;
5650
+}
5651
+.popover > .arrow:after {
5652
+ content: "";
5653
+ border-width: 10px;
5654
+}
5655
+.popover.top > .arrow {
5656
+ bottom: -11px;
5657
+ left: 50%;
5658
+ margin-left: -11px;
5659
+ border-top-color: #999;
5660
+ border-top-color: rgba(0, 0, 0, .25);
5661
+ border-bottom-width: 0;
5662
+}
5663
+.popover.top > .arrow:after {
5664
+ bottom: 1px;
5665
+ margin-left: -10px;
5666
+ content: " ";
5667
+ border-top-color: #fff;
5668
+ border-bottom-width: 0;
5669
+}
5670
+.popover.right > .arrow {
5671
+ top: 50%;
5672
+ left: -11px;
5673
+ margin-top: -11px;
5674
+ border-right-color: #999;
5675
+ border-right-color: rgba(0, 0, 0, .25);
5676
+ border-left-width: 0;
5677
+}
5678
+.popover.right > .arrow:after {
5679
+ bottom: -10px;
5680
+ left: 1px;
5681
+ content: " ";
5682
+ border-right-color: #fff;
5683
+ border-left-width: 0;
5684
+}
5685
+.popover.bottom > .arrow {
5686
+ top: -11px;
5687
+ left: 50%;
5688
+ margin-left: -11px;
5689
+ border-top-width: 0;
5690
+ border-bottom-color: #999;
5691
+ border-bottom-color: rgba(0, 0, 0, .25);
5692
+}
5693
+.popover.bottom > .arrow:after {
5694
+ top: 1px;
5695
+ margin-left: -10px;
5696
+ content: " ";
5697
+ border-top-width: 0;
5698
+ border-bottom-color: #fff;
5699
+}
5700
+.popover.left > .arrow {
5701
+ top: 50%;
5702
+ right: -11px;
5703
+ margin-top: -11px;
5704
+ border-right-width: 0;
5705
+ border-left-color: #999;
5706
+ border-left-color: rgba(0, 0, 0, .25);
5707
+}
5708
+.popover.left > .arrow:after {
5709
+ right: 1px;
5710
+ bottom: -10px;
5711
+ content: " ";
5712
+ border-right-width: 0;
5713
+ border-left-color: #fff;
5714
+}
5715
+.carousel {
5716
+ position: relative;
5717
+}
5718
+.carousel-inner {
5719
+ position: relative;
5720
+ width: 100%;
5721
+ overflow: hidden;
5722
+}
5723
+.carousel-inner > .item {
5724
+ position: relative;
5725
+ display: none;
5726
+ -webkit-transition: .6s ease-in-out left;
5727
+ -o-transition: .6s ease-in-out left;
5728
+ transition: .6s ease-in-out left;
5729
+}
5730
+.carousel-inner > .item > img,
5731
+.carousel-inner > .item > a > img {
5732
+ line-height: 1;
5733
+}
5734
+.carousel-inner > .active,
5735
+.carousel-inner > .next,
5736
+.carousel-inner > .prev {
5737
+ display: block;
5738
+}
5739
+.carousel-inner > .active {
5740
+ left: 0;
5741
+}
5742
+.carousel-inner > .next,
5743
+.carousel-inner > .prev {
5744
+ position: absolute;
5745
+ top: 0;
5746
+ width: 100%;
5747
+}
5748
+.carousel-inner > .next {
5749
+ left: 100%;
5750
+}
5751
+.carousel-inner > .prev {
5752
+ left: -100%;
5753
+}
5754
+.carousel-inner > .next.left,
5755
+.carousel-inner > .prev.right {
5756
+ left: 0;
5757
+}
5758
+.carousel-inner > .active.left {
5759
+ left: -100%;
5760
+}
5761
+.carousel-inner > .active.right {
5762
+ left: 100%;
5763
+}
5764
+.carousel-control {
5765
+ position: absolute;
5766
+ top: 0;
5767
+ bottom: 0;
5768
+ left: 0;
5769
+ width: 15%;
5770
+ font-size: 20px;
5771
+ color: #fff;
5772
+ text-align: center;
5773
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
5774
+ filter: alpha(opacity=50);
5775
+ opacity: .5;
5776
+}
5777
+.carousel-control.left {
5778
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
5779
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
5780
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
5781
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
5782
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
5783
+ background-repeat: repeat-x;
5784
+}
5785
+.carousel-control.right {
5786
+ right: 0;
5787
+ left: auto;
5788
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
5789
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
5790
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
5791
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
5792
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
5793
+ background-repeat: repeat-x;
5794
+}
5795
+.carousel-control:hover,
5796
+.carousel-control:focus {
5797
+ color: #fff;
5798
+ text-decoration: none;
5799
+ filter: alpha(opacity=90);
5800
+ outline: 0;
5801
+ opacity: .9;
5802
+}
5803
+.carousel-control .icon-prev,
5804
+.carousel-control .icon-next,
5805
+.carousel-control .glyphicon-chevron-left,
5806
+.carousel-control .glyphicon-chevron-right {
5807
+ position: absolute;
5808
+ top: 50%;
5809
+ z-index: 5;
5810
+ display: inline-block;
5811
+}
5812
+.carousel-control .icon-prev,
5813
+.carousel-control .glyphicon-chevron-left {
5814
+ left: 50%;
5815
+ margin-left: -10px;
5816
+}
5817
+.carousel-control .icon-next,
5818
+.carousel-control .glyphicon-chevron-right {
5819
+ right: 50%;
5820
+ margin-right: -10px;
5821
+}
5822
+.carousel-control .icon-prev,
5823
+.carousel-control .icon-next {
5824
+ width: 20px;
5825
+ height: 20px;
5826
+ margin-top: -10px;
5827
+ font-family: serif;
5828
+}
5829
+.carousel-control .icon-prev:before {
5830
+ content: '\2039';
5831
+}
5832
+.carousel-control .icon-next:before {
5833
+ content: '\203a';
5834
+}
5835
+.carousel-indicators {
5836
+ position: absolute;
5837
+ bottom: 10px;
5838
+ left: 50%;
5839
+ z-index: 15;
5840
+ width: 60%;
5841
+ padding-left: 0;
5842
+ margin-left: -30%;
5843
+ text-align: center;
5844
+ list-style: none;
5845
+}
5846
+.carousel-indicators li {
5847
+ display: inline-block;
5848
+ width: 10px;
5849
+ height: 10px;
5850
+ margin: 1px;
5851
+ text-indent: -999px;
5852
+ cursor: pointer;
5853
+ background-color: #000 \9;
5854
+ background-color: rgba(0, 0, 0, 0);
5855
+ border: 1px solid #fff;
5856
+ border-radius: 10px;
5857
+}
5858
+.carousel-indicators .active {
5859
+ width: 12px;
5860
+ height: 12px;
5861
+ margin: 0;
5862
+ background-color: #fff;
5863
+}
5864
+.carousel-caption {
5865
+ position: absolute;
5866
+ right: 15%;
5867
+ bottom: 20px;
5868
+ left: 15%;
5869
+ z-index: 10;
5870
+ padding-top: 20px;
5871
+ padding-bottom: 20px;
5872
+ color: #fff;
5873
+ text-align: center;
5874
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
5875
+}
5876
+.carousel-caption .btn {
5877
+ text-shadow: none;
5878
+}
5879
+@media screen and (min-width: 768px) {
5880
+ .carousel-control .glyphicon-chevron-left,
5881
+ .carousel-control .glyphicon-chevron-right,
5882
+ .carousel-control .icon-prev,
5883
+ .carousel-control .icon-next {
5884
+ width: 30px;
5885
+ height: 30px;
5886
+ margin-top: -15px;
5887
+ font-size: 30px;
5888
+ }
5889
+ .carousel-control .glyphicon-chevron-left,
5890
+ .carousel-control .icon-prev {
5891
+ margin-left: -15px;
5892
+ }
5893
+ .carousel-control .glyphicon-chevron-right,
5894
+ .carousel-control .icon-next {
5895
+ margin-right: -15px;
5896
+ }
5897
+ .carousel-caption {
5898
+ right: 20%;
5899
+ left: 20%;
5900
+ padding-bottom: 30px;
5901
+ }
5902
+ .carousel-indicators {
5903
+ bottom: 20px;
5904
+ }
5905
+}
5906
+.clearfix:before,
5907
+.clearfix:after,
5908
+.dl-horizontal dd:before,
5909
+.dl-horizontal dd:after,
5910
+.container:before,
5911
+.container:after,
5912
+.container-fluid:before,
5913
+.container-fluid:after,
5914
+.row:before,
5915
+.row:after,
5916
+.form-horizontal .form-group:before,
5917
+.form-horizontal .form-group:after,
5918
+.btn-toolbar:before,
5919
+.btn-toolbar:after,
5920
+.btn-group-vertical > .btn-group:before,
5921
+.btn-group-vertical > .btn-group:after,
5922
+.nav:before,
5923
+.nav:after,
5924
+.navbar:before,
5925
+.navbar:after,
5926
+.navbar-header:before,
5927
+.navbar-header:after,
5928
+.navbar-collapse:before,
5929
+.navbar-collapse:after,
5930
+.pager:before,
5931
+.pager:after,
5932
+.panel-body:before,
5933
+.panel-body:after,
5934
+.modal-footer:before,
5935
+.modal-footer:after {
5936
+ display: table;
5937
+ content: " ";
5938
+}
5939
+.clearfix:after,
5940
+.dl-horizontal dd:after,
5941
+.container:after,
5942
+.container-fluid:after,
5943
+.row:after,
5944
+.form-horizontal .form-group:after,
5945
+.btn-toolbar:after,
5946
+.btn-group-vertical > .btn-group:after,
5947
+.nav:after,
5948
+.navbar:after,
5949
+.navbar-header:after,
5950
+.navbar-collapse:after,
5951
+.pager:after,
5952
+.panel-body:after,
5953
+.modal-footer:after {
5954
+ clear: both;
5955
+}
5956
+.center-block {
5957
+ display: block;
5958
+ margin-right: auto;
5959
+ margin-left: auto;
5960
+}
5961
+.pull-right {
5962
+ float: right !important;
5963
+}
5964
+.pull-left {
5965
+ float: left !important;
5966
+}
5967
+.hide {
5968
+ display: none !important;
5969
+}
5970
+.show {
5971
+ display: block !important;
5972
+}
5973
+.invisible {
5974
+ visibility: hidden;
5975
+}
5976
+.text-hide {
5977
+ font: 0/0 a;
5978
+ color: transparent;
5979
+ text-shadow: none;
5980
+ background-color: transparent;
5981
+ border: 0;
5982
+}
5983
+.hidden {
5984
+ display: none !important;
5985
+ visibility: hidden !important;
5986
+}
5987
+.affix {
5988
+ position: fixed;
5989
+ -webkit-transform: translate3d(0, 0, 0);
5990
+ -o-transform: translate3d(0, 0, 0);
5991
+ transform: translate3d(0, 0, 0);
5992
+}
5993
+@-ms-viewport {
5994
+ width: device-width;
5995
+}
5996
+.visible-xs,
5997
+.visible-sm,
5998
+.visible-md,
5999
+.visible-lg {
6000
+ display: none !important;
6001
+}
6002
+.visible-xs-block,
6003
+.visible-xs-inline,
6004
+.visible-xs-inline-block,
6005
+.visible-sm-block,
6006
+.visible-sm-inline,
6007
+.visible-sm-inline-block,
6008
+.visible-md-block,
6009
+.visible-md-inline,
6010
+.visible-md-inline-block,
6011
+.visible-lg-block,
6012
+.visible-lg-inline,
6013
+.visible-lg-inline-block {
6014
+ display: none !important;
6015
+}
6016
+@media (max-width: 767px) {
6017
+ .visible-xs {
6018
+ display: block !important;
6019
+ }
6020
+ table.visible-xs {
6021
+ display: table;
6022
+ }
6023
+ tr.visible-xs {
6024
+ display: table-row !important;
6025
+ }
6026
+ th.visible-xs,
6027
+ td.visible-xs {
6028
+ display: table-cell !important;
6029
+ }
6030
+}
6031
+@media (max-width: 767px) {
6032
+ .visible-xs-block {
6033
+ display: block !important;
6034
+ }
6035
+}
6036
+@media (max-width: 767px) {
6037
+ .visible-xs-inline {
6038
+ display: inline !important;
6039
+ }
6040
+}
6041
+@media (max-width: 767px) {
6042
+ .visible-xs-inline-block {
6043
+ display: inline-block !important;
6044
+ }
6045
+}
6046
+@media (min-width: 768px) and (max-width: 991px) {
6047
+ .visible-sm {
6048
+ display: block !important;
6049
+ }
6050
+ table.visible-sm {
6051
+ display: table;
6052
+ }
6053
+ tr.visible-sm {
6054
+ display: table-row !important;
6055
+ }
6056
+ th.visible-sm,
6057
+ td.visible-sm {
6058
+ display: table-cell !important;
6059
+ }
6060
+}
6061
+@media (min-width: 768px) and (max-width: 991px) {
6062
+ .visible-sm-block {
6063
+ display: block !important;
6064
+ }
6065
+}
6066
+@media (min-width: 768px) and (max-width: 991px) {
6067
+ .visible-sm-inline {
6068
+ display: inline !important;
6069
+ }
6070
+}
6071
+@media (min-width: 768px) and (max-width: 991px) {
6072
+ .visible-sm-inline-block {
6073
+ display: inline-block !important;
6074
+ }
6075
+}
6076
+@media (min-width: 992px) and (max-width: 1199px) {
6077
+ .visible-md {
6078
+ display: block !important;
6079
+ }
6080
+ table.visible-md {
6081
+ display: table;
6082
+ }
6083
+ tr.visible-md {
6084
+ display: table-row !important;
6085
+ }
6086
+ th.visible-md,
6087
+ td.visible-md {
6088
+ display: table-cell !important;
6089
+ }
6090
+}
6091
+@media (min-width: 992px) and (max-width: 1199px) {
6092
+ .visible-md-block {
6093
+ display: block !important;
6094
+ }
6095
+}
6096
+@media (min-width: 992px) and (max-width: 1199px) {
6097
+ .visible-md-inline {
6098
+ display: inline !important;
6099
+ }
6100
+}
6101
+@media (min-width: 992px) and (max-width: 1199px) {
6102
+ .visible-md-inline-block {
6103
+ display: inline-block !important;
6104
+ }
6105
+}
6106
+@media (min-width: 1200px) {
6107
+ .visible-lg {
6108
+ display: block !important;
6109
+ }
6110
+ table.visible-lg {
6111
+ display: table;
6112
+ }
6113
+ tr.visible-lg {
6114
+ display: table-row !important;
6115
+ }
6116
+ th.visible-lg,
6117
+ td.visible-lg {
6118
+ display: table-cell !important;
6119
+ }
6120
+}
6121
+@media (min-width: 1200px) {
6122
+ .visible-lg-block {
6123
+ display: block !important;
6124
+ }
6125
+}
6126
+@media (min-width: 1200px) {
6127
+ .visible-lg-inline {
6128
+ display: inline !important;
6129
+ }
6130
+}
6131
+@media (min-width: 1200px) {
6132
+ .visible-lg-inline-block {
6133
+ display: inline-block !important;
6134
+ }
6135
+}
6136
+@media (max-width: 767px) {
6137
+ .hidden-xs {
6138
+ display: none !important;
6139
+ }
6140
+}
6141
+@media (min-width: 768px) and (max-width: 991px) {
6142
+ .hidden-sm {
6143
+ display: none !important;
6144
+ }
6145
+}
6146
+@media (min-width: 992px) and (max-width: 1199px) {
6147
+ .hidden-md {
6148
+ display: none !important;
6149
+ }
6150
+}
6151
+@media (min-width: 1200px) {
6152
+ .hidden-lg {
6153
+ display: none !important;
6154
+ }
6155
+}
6156
+.visible-print {
6157
+ display: none !important;
6158
+}
6159
+@media print {
6160
+ .visible-print {
6161
+ display: block !important;
6162
+ }
6163
+ table.visible-print {
6164
+ display: table;
6165
+ }
6166
+ tr.visible-print {
6167
+ display: table-row !important;
6168
+ }
6169
+ th.visible-print,
6170
+ td.visible-print {
6171
+ display: table-cell !important;
6172
+ }
6173
+}
6174
+.visible-print-block {
6175
+ display: none !important;
6176
+}
6177
+@media print {
6178
+ .visible-print-block {
6179
+ display: block !important;
6180
+ }
6181
+}
6182
+.visible-print-inline {
6183
+ display: none !important;
6184
+}
6185
+@media print {
6186
+ .visible-print-inline {
6187
+ display: inline !important;
6188
+ }
6189
+}
6190
+.visible-print-inline-block {
6191
+ display: none !important;
6192
+}
6193
+@media print {
6194
+ .visible-print-inline-block {
6195
+ display: inline-block !important;
6196
+ }
6197
+}
6198
+@media print {
6199
+ .hidden-print {
6200
+ display: none !important;
6201
+ }
6202
+}
6203
+/*# sourceMappingURL=bootstrap.css.map */
securis/src/main/webapp/css/bootstrap.css.map
....@@ -0,0 +1 @@
1
+{"version":3,"file":"bootstrap.css","sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EA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A;Efk8CH;Ae97CC;EACE,YAAA;Efg8CH;Ael7CC;EACE,mBAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,2BAAA;Ef07CH;Ae37CC;EACE,kBAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,2BAAA;Efm8CH;Aep8CC;EACE,kBAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,2BAAA;Ef48CH;Ae78CC;EACE,kBAAA;Ef+8CH;Aeh9CC;EACE,2BAAA;Efk9CH;Aen9CC;EACE,0BAAA;Efq9CH;Aet9CC;EACE,iBAAA;Efw9CH;Aa59CD;EE9BI;IACE,aAAA;If6/CH;Eet/CD;IACE,aAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,qBAAA;If8/CD;Ee//CD;IACE,YAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,qBAAA;IfugDD;EexgDD;IACE,YAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,oBAAA;IfyhDD;Ee3gDD;IACE,aAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,YAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,qBAAA;If4hDD;Ee7hDD;IACE,YAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,qBAAA;IfqiDD;EetiDD;IACE,YAAA;IfwiDD;EeziDD;IACE,qBAAA;If2iDD;Ee5iDD;IACE,oBAAA;If8iDD;Ee1iDD;IACE,aAAA;If4iDD;Ee5jDD;IACE,YAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,oBAAA;IfokDD;EerkDD;IACE,WAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,oBAAA;If6kDD;Ee9kDD;IACE,WAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,oBAAA;IfslDD;EevlDD;IACE,WAAA;IfylDD;Ee1lDD;IACE,oBAAA;If4lDD;Ee7lDD;IACE,mBAAA;If+lDD;Ee3lDD;IACE,YAAA;If6lDD;Ee/kDD;IACE,mBAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,2BAAA;IfulDD;EexlDD;IACE,kBAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,2BAAA;IfgmDD;EejmDD;IACE,kBAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,2BAAA;IfymDD;Ee1mDD;IACE,kBAAA;If4mDD;Ee7mDD;IACE,2BAAA;If+mDD;EehnDD;IACE,0BAAA;IfknDD;EennDD;IACE,iBAAA;IfqnDD;EACF;AajnDD;EEvCI;IACE,aAAA;If2pDH;EeppDD;IACE,aAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,qBAAA;If4pDD;Ee7pDD;IACE,YAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,qBAAA;IfqqDD;EetqDD;IACE,YAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,oBAAA;IfurDD;EezqDD;IACE,aAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,YAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,qBAAA;If0rDD;Ee3rDD;IACE,YAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,qBAAA;IfmsDD;EepsDD;IACE,YAAA;IfssDD;EevsDD;IACE,qBAAA;IfysDD;Ee1sDD;IACE,oBAAA;If4sDD;EexsDD;IACE,aAAA;If0sDD;Ee1tDD;IACE,YAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,oBAAA;IfkuDD;EenuDD;IACE,WAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,oBAAA;If2uDD;Ee5uDD;IACE,WAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,oBAAA;IfovDD;EervDD;IACE,WAAA;IfuvDD;EexvDD;IACE,oBAAA;If0vDD;Ee3vDD;IACE,mBAAA;If6vDD;EezvDD;IACE,YAAA;If2vDD;Ee7uDD;IACE,mBAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,2BAAA;IfqvDD;EetvDD;IACE,kBAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,2BAAA;If8vDD;Ee/vDD;IACE,kBAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,2BAAA;IfuwDD;EexwDD;IACE,kBAAA;If0wDD;Ee3wDD;IACE,2BAAA;If6wDD;Ee9wDD;IACE,0BAAA;IfgxDD;EejxDD;IACE,iBAAA;IfmxDD;EACF;AaxwDD;EE9CI;IACE,aAAA;IfyzDH;EelzDD;IACE,aAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,qBAAA;If0zDD;Ee3zDD;IACE,YAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,qBAAA;Ifm0DD;Eep0DD;IACE,YAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,oBAAA;Ifq1DD;Eev0DD;IACE,aAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,YAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,qBAAA;Ifw1DD;Eez1DD;IACE,YAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,qBAAA;Ifi2DD;Eel2DD;IACE,YAAA;Ifo2DD;Eer2DD;IACE,qBAAA;Ifu2DD;Eex2DD;IACE,oBAAA;If02DD;Eet2DD;IACE,aAAA;Ifw2DD;Eex3DD;IACE,YAAA;If03DD;Ee33DD;IACE,oBAAA;If63DD;Ee93DD;IACE,oBAAA;Ifg4DD;Eej4DD;IACE,WAAA;Ifm4DD;Eep4DD;IACE,oBAAA;Ifs4DD;Eev4DD;IACE,oBAAA;Ify4DD;Ee14DD;IACE,WAAA;If44DD;Ee74DD;IACE,oBAAA;If+4DD;Eeh5DD;IACE,oBAAA;Ifk5DD;Een5DD;IACE,WAAA;Ifq5DD;Eet5DD;IACE,oBAAA;Ifw5DD;Eez5DD;IACE,mBAAA;If25DD;Eev5DD;IACE,YAAA;Ify5DD;Ee34DD;IACE,mBAAA;If64DD;Ee94DD;IACE,2BAAA;Ifg5DD;Eej5DD;IACE,2BAAA;Ifm5DD;Eep5DD;IACE,kBAAA;Ifs5DD;Eev5DD;IACE,2BAAA;Ify5DD;Ee15DD;IACE,2BAAA;If45DD;Ee75DD;IACE,kBAAA;If+5DD;Eeh6DD;IACE,2BAAA;Ifk6DD;Een6DD;IACE,2BAAA;Ifq6DD;Eet6DD;IACE,kBAAA;Ifw6DD;Eez6DD;IACE,2BAAA;If26DD;Ee56DD;IACE,0BAAA;If86DD;Ee/6DD;IACE,iBAAA;Ifi7DD;EACF;AgBr/DD;EACE,+BAAA;EhBu/DD;AgBr/DD;EACE,kBAAA;EhBu/DD;AgBj/DD;EACE,aAAA;EACA,iBAAA;EACA,qBAAA;EhBm/DD;AgBt/DD;;;;;;EAWQ,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,+BAAA;EhBm/DP;AgBjgED;EAoBI,wBAAA;EACA,kCAAA;EhBg/DH;AgBrgED;;;;;;EA8BQ,eAAA;EhB++DP;AgB7gED;EAoCI,+BAAA;EhB4+DH;AgBhhED;EAyCI,2BAAA;EhB0+DH;AgBn+DD;;;;;;EAOQ,cAAA;EhBo+DP;AgBz9DD;EACE,2BAAA;EhB29DD;AgB59DD;;;;;;EAQQ,2BAAA;EhB49DP;AgBp+DD;;EAeM,0BAAA;EhBy9DL;AgB/8DD;;EAIM,2BAAA;EhB+8DL;AgBr8DD;;EAIM,2BAAA;EhBq8DL;AgB37DD;EACE,kBAAA;EACA,aAAA;EACA,uBAAA;EhB67DD;AgBx7DG;;EACE,kBAAA;EACA,aAAA;EACA,qBAAA;EhB27DL;AiBvkEC;;;;;;;;;;;;EAOI,2BAAA;EjB8kEL;AiBxkEC;;;;;EAMI,2BAAA;EjBykEL;AiB5lEC;;;;;;;;;;;;EAOI,2BAAA;EjBmmEL;AiB7lEC;;;;;EAMI,2BAAA;EjB8lEL;AiBjnEC;;;;;;;;;;;;EAOI,2BAAA;EjBwnEL;AiBlnEC;;;;;EAMI,2BAAA;EjBmnEL;AiBtoEC;;;;;;;;;;;;EAOI,2BAAA;EjB6oEL;AiBvoEC;;;;;EAMI,2BAAA;EjBwoEL;AiB3pEC;;;;;;;;;;;;EAOI,2BAAA;EjBkqEL;AiB5pEC;;;;;EAMI,2BAAA;EjB6pEL;AgB78DD;EAAA;IA5DI,aAAA;IACA,qBAAA;IACA,oBAAA;IACA,kBAAA;IACA,8CAAA;IACA,2BAAA;IACA,mCAAA;IhB6gED;EgBv9DH;IAlDM,kBAAA;IhB4gEH;EgB19DH;;;;;;IAzCY,qBAAA;IhB2gET;EgBl+DH;IAjCM,WAAA;IhBsgEH;EgBr+DH;;;;;;IAxBY,gBAAA;IhBqgET;EgB7+DH;;;;;;IApBY,iBAAA;IhBygET;EgBr/DH;;;;IAPY,kBAAA;IhBkgET;EACF;AkB3tED;EACE,YAAA;EACA,WAAA;EACA,WAAA;EAIA,cAAA;ElB0tED;AkBvtED;EACE,gBAAA;EACA,aAAA;EACA,YAAA;EACA,qBAAA;EACA,iBAAA;EACA,sBAAA;EACA,gBAAA;EACA,WAAA;EACA,kCAAA;ElBytED;AkBttED;EACE,uBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;ElBwtED;AkB7sED;Eb4BE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELorET;AkB7sED;;EAEE,iBAAA;EACA,oBAAA;EACA,qBAAA;ElB+sED;AkB3sED;EACE,gBAAA;ElB6sED;AkBzsED;EACE,gBAAA;EACA,aAAA;ElB2sED;AkBvsED;;EAEE,cAAA;ElBysED;AkBrsED;;;EZxEE,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENixED;AkBrsED;EACE,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;ElBusED;AkB7qED;EACE,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EbzDA,0DAAA;EACQ,kDAAA;EAsHR,wFAAA;EACK,2EAAA;EACG,wEAAA;ELonET;AmB7vEC;EACE,uBAAA;EACA,YAAA;EdcF,wFAAA;EACQ,gFAAA;ELkvET;AKltEC;EAAgC,gBAAA;EACA,YAAA;ELqtEjC;AKptEC;EAAgC,gBAAA;ELutEjC;AKttEC;EAAgC,gBAAA;ELytEjC;AkBrrEC;;;EAGE,qBAAA;EACA,2BAAA;EACA,YAAA;ElBurEH;AkBnrEC;EACE,cAAA;ElBqrEH;AkBzqED;EACE,0BAAA;ElB2qED;AkB/pED;;;;EAIE,mBAAA;EAEA,4BAAA;ElBgqED;AkB9pEC;;;;EACE,mBAAA;ElBmqEH;AkBjqEC;;;;EACE,mBAAA;ElBsqEH;AkB5pED;EACE,qBAAA;ElB8pED;AkBtpED;;EAEE,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;ElBwpED;AkB9pED;;EASI,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,iBAAA;ElBypEH;AkBtpED;;;;EAIE,oBAAA;EACA,oBAAA;EACA,oBAAA;ElBwpED;AkBrpED;;EAEE,kBAAA;ElBupED;AkBnpED;;EAEE,uBAAA;EACA,oBAAA;EACA,kBAAA;EACA,wBAAA;EACA,qBAAA;EACA,iBAAA;ElBqpED;AkBnpED;;EAEE,eAAA;EACA,mBAAA;ElBqpED;AkB5oEC;;;;;;EAGE,qBAAA;ElBipEH;AkB3oEC;;;;EAEE,qBAAA;ElB+oEH;AkBzoEC;;;;EAGI,qBAAA;ElB4oEL;AkBjoED;EAEE,kBAAA;EACA,qBAAA;EAEA,kBAAA;ElBioED;AkB/nEC;;EAEE,iBAAA;EACA,kBAAA;ElBioEH;AkBvnED;;ECnPE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnB82ED;AmB52EC;EACE,cAAA;EACA,mBAAA;EnB82EH;AmB32EC;;EAEE,cAAA;EnB62EH;AkBnoED;;ECvPE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;EnB83ED;AmB53EC;EACE,cAAA;EACA,mBAAA;EnB83EH;AmB33EC;;EAEE,cAAA;EnB63EH;AkB1oED;EAEE,oBAAA;ElB2oED;AkB7oED;EAMI,uBAAA;ElB0oEH;AkBtoED;EACE,oBAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;ElBwoED;AkBtoED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElBwoED;AkBtoED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElBwoED;AkBpoED;;;;;;ECrVI,gBAAA;EnBi+EH;AkB5oED;ECjVI,uBAAA;EdmDF,0DAAA;EACQ,kDAAA;EL86ET;AmBh+EG;EACE,uBAAA;EdgDJ,2EAAA;EACQ,mEAAA;ELm7ET;AkBtpED;ECvUI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBg+EH;AkB3pED;ECjUI,gBAAA;EnB+9EH;AkB3pED;;;;;;ECxVI,gBAAA;EnB2/EH;AkBnqED;ECpVI,uBAAA;EdmDF,0DAAA;EACQ,kDAAA;ELw8ET;AmB1/EG;EACE,uBAAA;EdgDJ,2EAAA;EACQ,mEAAA;EL68ET;AkB7qED;EC1UI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnB0/EH;AkBlrED;ECpUI,gBAAA;EnBy/EH;AkBlrED;;;;;;EC3VI,gBAAA;EnBqhFH;AkB1rED;ECvVI,uBAAA;EdmDF,0DAAA;EACQ,kDAAA;ELk+ET;AmBphFG;EACE,uBAAA;EdgDJ,2EAAA;EACQ,mEAAA;ELu+ET;AkBpsED;EC7UI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBohFH;AkBzsED;ECvUI,gBAAA;EnBmhFH;AkBtsED;EACE,QAAA;ElBwsED;AkB/rED;EACE,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;ElBisED;AkB9mED;EAAA;IA7DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlB+qEH;EkBpnEH;IAtDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlB6qEH;EkBznEH;IAhDM,uBAAA;IACA,wBAAA;IlB4qEH;EkB7nEH;;;IA1CQ,aAAA;IlB4qEL;EkBloEH;IApCM,aAAA;IlByqEH;EkBroEH;IAhCM,kBAAA;IACA,wBAAA;IlBwqEH;EkBzoEH;;IAvBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBoqEH;EkBhpEH;;IAjBQ,iBAAA;IlBqqEL;EkBppEH;;IAZM,oBAAA;IACA,gBAAA;IlBoqEH;EkBzpEH;IAHM,QAAA;IlB+pEH;EACF;AkBrpED;;;;EASI,eAAA;EACA,kBAAA;EACA,kBAAA;ElBkpEH;AkB7pED;;EAiBI,kBAAA;ElBgpEH;AkBjqED;EJxcE,oBAAA;EACA,qBAAA;Ed4mFD;AkBloEC;EAAA;IANI,mBAAA;IACA,kBAAA;IACA,kBAAA;IlB4oEH;EACF;AkB5qED;EAwCI,QAAA;EACA,aAAA;ElBuoEH;AkB1nEG;EAAA;IAHI,qBAAA;IlBioEL;EACF;AkBrnEG;EAAA;IAHI,kBAAA;IlB4nEL;EACF;AoBzoFD;EACE,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,iBAAA;EACA,wBAAA;EACA,+BAAA;EACA,qBAAA;EC4BA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,oBAAA;EhB2KA,2BAAA;EACG,wBAAA;EACC,uBAAA;EACI,mBAAA;ELs8ET;AoB5oFG;;;EdpBF,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENoqFD;AoB9oFC;;EAEE,gBAAA;EACA,uBAAA;EpBgpFH;AoB7oFC;;EAEE,YAAA;EACA,wBAAA;Ef8BF,0DAAA;EACQ,kDAAA;ELknFT;AoB7oFC;;;EAGE,qBAAA;EACA,sBAAA;EE3CF,eAAA;EAGA,2BAAA;EjB8DA,0BAAA;EACQ,kBAAA;EL4nFT;AoBzoFD;EClDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB8rFD;AqB5rFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB8rFP;AqB5rFC;;;EAGE,wBAAA;ErB8rFH;AqBzrFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBqsFT;AoB9qFD;EClBI,gBAAA;EACA,2BAAA;ErBmsFH;AoB/qFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuuFD;AqBruFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuuFP;AqBruFC;;;EAGE,wBAAA;ErBuuFH;AqBluFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErB8uFT;AoBptFD;ECrBI,gBAAA;EACA,2BAAA;ErB4uFH;AoBptFD;ECzDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBgxFD;AqB9wFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBgxFP;AqB9wFC;;;EAGE,wBAAA;ErBgxFH;AqB3wFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBuxFT;AoBzvFD;ECzBI,gBAAA;EACA,2BAAA;ErBqxFH;AoBzvFD;EC7DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErByzFD;AqBvzFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErByzFP;AqBvzFC;;;EAGE,wBAAA;ErByzFH;AqBpzFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBg0FT;AoB9xFD;EC7BI,gBAAA;EACA,2BAAA;ErB8zFH;AoB9xFD;ECjEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBk2FD;AqBh2FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBk2FP;AqBh2FC;;;EAGE,wBAAA;ErBk2FH;AqB71FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBy2FT;AoBn0FD;ECjCI,gBAAA;EACA,2BAAA;ErBu2FH;AoBn0FD;ECrEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB24FD;AqBz4FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB24FP;AqBz4FC;;;EAGE,wBAAA;ErB24FH;AqBt4FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBk5FT;AoBx2FD;ECrCI,gBAAA;EACA,2BAAA;ErBg5FH;AoBn2FD;EACE,gBAAA;EACA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","sourcesContent":[null,"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n * {\n text-shadow: none !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links for images, or javascript/internal links\n a[href^=\"javascript:\"]:after,\n a[href^=\"#\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .table {\n td,\n th {\n background-color: #fff !important;\n }\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n width: 100% \\9; // Force IE10 and below to size SVG images correctly\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\n// Undo browser default styling\ncite {\n font-style: normal;\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n content: \"\";\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n > td,\n > th {\n background-color: @table-bg-accent;\n }\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n > td,\n > th {\n background-color: @table-bg-hover;\n }\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n -webkit-overflow-scrolling: touch;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: not-allowed;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: @input-height-base;\n // IE8+ misaligns the text within date inputs, so we reset\n line-height: @line-height-base ~\"\\0\";\n\n &.input-sm {\n line-height: @input-height-small;\n }\n &.input-lg {\n line-height: @input-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n min-height: @line-height-computed; // clear the floating input if there is no label text\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: not-allowed;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n}\n.input-lg + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Reposition feedback icon if label is hidden with \"screenreader only\" state\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n right: (@grid-gutter-width / 2);\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n }\n }\n .form-control {\n &:extend(.input-lg);\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n }\n }\n .form-control {\n &:extend(.input-sm);\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n cursor: pointer;\n border-radius: 0;\n\n &,\n &:active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition(height .35s ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: not-allowed;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n &:focus {\n // Remove focus outline when dropdown JS adds it after closing the menu\n outline: 0;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `opacity`. We cannot\n// use `display: none;` or `visibility: hidden;` as that also hides the popover.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 for more.\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n position: absolute;\n z-index: -1;\n .opacity(0);\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n .translate3d(0, 0, 0);\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: 0;\n }\n }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n .translate3d(0, 0, 0);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: not-allowed;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: not-allowed;\n }\n }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n \n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n a.list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n// Account for lower percentages\n.progress-bar {\n &[aria-valuenow=\"1\"],\n &[aria-valuenow=\"2\"] {\n min-width: 30px;\n }\n\n &[aria-valuenow=\"0\"] {\n color: @gray-light;\n min-width: 30px;\n background-color: transparent;\n background-image: none;\n box-shadow: none;\n }\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n > .pull-left {\n margin-right: 10px;\n }\n > .pull-right {\n margin-left: 10px;\n }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse > .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n\n // Modifier class for 16:9 aspect ratio\n &.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n }\n\n // Modifier class for 4:3 aspect ratio\n &.embed-responsive-4by3 {\n padding-bottom: 75%;\n }\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate3d(0, -25%, 0);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate3d(0, 0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]}
securis/src/main/webapp/css/bootstrap.min.css
....@@ -0,0 +1,5 @@
1
+/*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
securis/src/main/webapp/css/chosen-spinner.css
....@@ -0,0 +1,12 @@
1
+/* Additional styles to display a spinner image while options are loading */
2
+.localytics-chosen.loading+.chosen-container-multi .chosen-choices {
3
+ background-image: url('spinner.gif');
4
+ background-repeat: no-repeat;
5
+ background-position: 95%;
6
+}
7
+.localytics-chosen.loading+.chosen-container-single .chosen-single span {
8
+ background: url('spinner.gif') no-repeat right;
9
+}
10
+.localytics-chosen.loading+.chosen-container-single .chosen-single .search-choice-close {
11
+ display: none;
12
+}
securis/src/main/webapp/css/chosen-sprite.png
Binary files differ
securis/src/main/webapp/css/chosen-sprite@2x.png
Binary files differ
securis/src/main/webapp/css/chosen.css
....@@ -0,0 +1,430 @@
1
+/* @group Base */
2
+.chosen-container {
3
+ position: relative;
4
+ display: inline-block;
5
+ vertical-align: middle;
6
+ font-size: 13px;
7
+ zoom: 1;
8
+ *display: inline;
9
+ -webkit-user-select: none;
10
+ -moz-user-select: none;
11
+ user-select: none;
12
+}
13
+.chosen-container .chosen-drop {
14
+ position: absolute;
15
+ top: 100%;
16
+ left: -9999px;
17
+ z-index: 1010;
18
+ -webkit-box-sizing: border-box;
19
+ -moz-box-sizing: border-box;
20
+ box-sizing: border-box;
21
+ width: 100%;
22
+ border: 1px solid #aaa;
23
+ border-top: 0;
24
+ background: #fff;
25
+ box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
26
+}
27
+.chosen-container.chosen-with-drop .chosen-drop {
28
+ left: 0;
29
+}
30
+.chosen-container a {
31
+ cursor: pointer;
32
+}
33
+
34
+/* @end */
35
+/* @group Single Chosen */
36
+.chosen-container-single .chosen-single {
37
+ position: relative;
38
+ display: block;
39
+ overflow: hidden;
40
+ padding: 0 0 0 8px;
41
+ height: 23px;
42
+ border: 1px solid #aaa;
43
+ border-radius: 5px;
44
+ background-color: #fff;
45
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
46
+ background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
47
+ background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
48
+ background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
49
+ background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
50
+ background-clip: padding-box;
51
+ box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
52
+ color: #444;
53
+ text-decoration: none;
54
+ white-space: nowrap;
55
+ line-height: 24px;
56
+}
57
+.chosen-container-single .chosen-default {
58
+ color: #999;
59
+}
60
+.chosen-container-single .chosen-single span {
61
+ display: block;
62
+ overflow: hidden;
63
+ margin-right: 26px;
64
+ text-overflow: ellipsis;
65
+ white-space: nowrap;
66
+}
67
+.chosen-container-single .chosen-single-with-deselect span {
68
+ margin-right: 38px;
69
+}
70
+.chosen-container-single .chosen-single abbr {
71
+ position: absolute;
72
+ top: 6px;
73
+ right: 26px;
74
+ display: block;
75
+ width: 12px;
76
+ height: 12px;
77
+ background: url('chosen-sprite.png') -42px 1px no-repeat;
78
+ font-size: 1px;
79
+}
80
+.chosen-container-single .chosen-single abbr:hover {
81
+ background-position: -42px -10px;
82
+}
83
+.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
84
+ background-position: -42px -10px;
85
+}
86
+.chosen-container-single .chosen-single div {
87
+ position: absolute;
88
+ top: 0;
89
+ right: 0;
90
+ display: block;
91
+ width: 18px;
92
+ height: 100%;
93
+}
94
+.chosen-container-single .chosen-single div b {
95
+ display: block;
96
+ width: 100%;
97
+ height: 100%;
98
+ background: url('chosen-sprite.png') no-repeat 0px 2px;
99
+}
100
+.chosen-container-single .chosen-search {
101
+ position: relative;
102
+ z-index: 1010;
103
+ margin: 0;
104
+ padding: 3px 4px;
105
+ white-space: nowrap;
106
+}
107
+.chosen-container-single .chosen-search input[type="text"] {
108
+ -webkit-box-sizing: border-box;
109
+ -moz-box-sizing: border-box;
110
+ box-sizing: border-box;
111
+ margin: 1px 0;
112
+ padding: 4px 20px 4px 5px;
113
+ width: 100%;
114
+ height: auto;
115
+ outline: 0;
116
+ border: 1px solid #aaa;
117
+ background: white url('chosen-sprite.png') no-repeat 100% -20px;
118
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
119
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
120
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
121
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
122
+ background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
123
+ font-size: 1em;
124
+ font-family: sans-serif;
125
+ line-height: normal;
126
+ border-radius: 0;
127
+}
128
+.chosen-container-single .chosen-drop {
129
+ margin-top: -1px;
130
+ border-radius: 0 0 4px 4px;
131
+ background-clip: padding-box;
132
+}
133
+.chosen-container-single.chosen-container-single-nosearch .chosen-search {
134
+ position: absolute;
135
+ left: -9999px;
136
+}
137
+
138
+/* @end */
139
+/* @group Results */
140
+.chosen-container .chosen-results {
141
+ position: relative;
142
+ overflow-x: hidden;
143
+ overflow-y: auto;
144
+ margin: 0 4px 4px 0;
145
+ padding: 0 0 0 4px;
146
+ max-height: 240px;
147
+ -webkit-overflow-scrolling: touch;
148
+}
149
+.chosen-container .chosen-results li {
150
+ display: none;
151
+ margin: 0;
152
+ padding: 5px 6px;
153
+ list-style: none;
154
+ line-height: 15px;
155
+}
156
+.chosen-container .chosen-results li.active-result {
157
+ display: list-item;
158
+ cursor: pointer;
159
+}
160
+.chosen-container .chosen-results li.disabled-result {
161
+ display: list-item;
162
+ color: #ccc;
163
+ cursor: default;
164
+}
165
+.chosen-container .chosen-results li.highlighted {
166
+ background-color: #3875d7;
167
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
168
+ background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
169
+ background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
170
+ background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
171
+ background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
172
+ color: #fff;
173
+}
174
+.chosen-container .chosen-results li.no-results {
175
+ display: list-item;
176
+ background: #f4f4f4;
177
+}
178
+.chosen-container .chosen-results li.group-result {
179
+ display: list-item;
180
+ font-weight: bold;
181
+ cursor: default;
182
+}
183
+.chosen-container .chosen-results li.group-option {
184
+ padding-left: 15px;
185
+}
186
+.chosen-container .chosen-results li em {
187
+ font-style: normal;
188
+ text-decoration: underline;
189
+}
190
+
191
+/* @end */
192
+/* @group Multi Chosen */
193
+.chosen-container-multi .chosen-choices {
194
+ position: relative;
195
+ overflow: hidden;
196
+ -webkit-box-sizing: border-box;
197
+ -moz-box-sizing: border-box;
198
+ box-sizing: border-box;
199
+ margin: 0;
200
+ padding: 0;
201
+ width: 100%;
202
+ height: auto !important;
203
+ height: 1%;
204
+ border: 1px solid #aaa;
205
+ background-color: #fff;
206
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
207
+ background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
208
+ background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
209
+ background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
210
+ background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
211
+ cursor: text;
212
+}
213
+.chosen-container-multi .chosen-choices li {
214
+ float: left;
215
+ list-style: none;
216
+}
217
+.chosen-container-multi .chosen-choices li.search-field {
218
+ margin: 0;
219
+ padding: 0;
220
+ white-space: nowrap;
221
+}
222
+.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
223
+ margin: 1px 0;
224
+ padding: 5px;
225
+ height: 15px;
226
+ outline: 0;
227
+ border: 0 !important;
228
+ background: transparent !important;
229
+ box-shadow: none;
230
+ color: #666;
231
+ font-size: 100%;
232
+ font-family: sans-serif;
233
+ line-height: normal;
234
+ border-radius: 0;
235
+}
236
+.chosen-container-multi .chosen-choices li.search-field .default {
237
+ color: #999;
238
+}
239
+.chosen-container-multi .chosen-choices li.search-choice {
240
+ position: relative;
241
+ margin: 3px 0 3px 5px;
242
+ padding: 3px 20px 3px 5px;
243
+ border: 1px solid #aaa;
244
+ border-radius: 3px;
245
+ background-color: #e4e4e4;
246
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
247
+ background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
248
+ background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
249
+ background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
250
+ background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
251
+ background-clip: padding-box;
252
+ box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
253
+ color: #333;
254
+ line-height: 13px;
255
+ cursor: default;
256
+}
257
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
258
+ position: absolute;
259
+ top: 4px;
260
+ right: 3px;
261
+ display: block;
262
+ width: 12px;
263
+ height: 12px;
264
+ background: url('chosen-sprite.png') -42px 1px no-repeat;
265
+ font-size: 1px;
266
+}
267
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
268
+ background-position: -42px -10px;
269
+}
270
+.chosen-container-multi .chosen-choices li.search-choice-disabled {
271
+ padding-right: 5px;
272
+ border: 1px solid #ccc;
273
+ background-color: #e4e4e4;
274
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
275
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
276
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
277
+ background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
278
+ background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
279
+ color: #666;
280
+}
281
+.chosen-container-multi .chosen-choices li.search-choice-focus {
282
+ background: #d4d4d4;
283
+}
284
+.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
285
+ background-position: -42px -10px;
286
+}
287
+.chosen-container-multi .chosen-results {
288
+ margin: 0;
289
+ padding: 0;
290
+}
291
+.chosen-container-multi .chosen-drop .result-selected {
292
+ display: list-item;
293
+ color: #ccc;
294
+ cursor: default;
295
+}
296
+
297
+/* @end */
298
+/* @group Active */
299
+.chosen-container-active .chosen-single {
300
+ border: 1px solid #5897fb;
301
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
302
+}
303
+.chosen-container-active.chosen-with-drop .chosen-single {
304
+ border: 1px solid #aaa;
305
+ -moz-border-radius-bottomright: 0;
306
+ border-bottom-right-radius: 0;
307
+ -moz-border-radius-bottomleft: 0;
308
+ border-bottom-left-radius: 0;
309
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
310
+ background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);
311
+ background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);
312
+ background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);
313
+ background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
314
+ box-shadow: 0 1px 0 #fff inset;
315
+}
316
+.chosen-container-active.chosen-with-drop .chosen-single div {
317
+ border-left: none;
318
+ background: transparent;
319
+}
320
+.chosen-container-active.chosen-with-drop .chosen-single div b {
321
+ background-position: -18px 2px;
322
+}
323
+.chosen-container-active .chosen-choices {
324
+ border: 1px solid #5897fb;
325
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
326
+}
327
+.chosen-container-active .chosen-choices li.search-field input[type="text"] {
328
+ color: #111 !important;
329
+}
330
+
331
+/* @end */
332
+/* @group Disabled Support */
333
+.chosen-disabled {
334
+ opacity: 0.5 !important;
335
+ cursor: default;
336
+}
337
+.chosen-disabled .chosen-single {
338
+ cursor: default;
339
+}
340
+.chosen-disabled .chosen-choices .search-choice .search-choice-close {
341
+ cursor: default;
342
+}
343
+
344
+/* @end */
345
+/* @group Right to Left */
346
+.chosen-rtl {
347
+ text-align: right;
348
+}
349
+.chosen-rtl .chosen-single {
350
+ overflow: visible;
351
+ padding: 0 8px 0 0;
352
+}
353
+.chosen-rtl .chosen-single span {
354
+ margin-right: 0;
355
+ margin-left: 26px;
356
+ direction: rtl;
357
+}
358
+.chosen-rtl .chosen-single-with-deselect span {
359
+ margin-left: 38px;
360
+}
361
+.chosen-rtl .chosen-single div {
362
+ right: auto;
363
+ left: 3px;
364
+}
365
+.chosen-rtl .chosen-single abbr {
366
+ right: auto;
367
+ left: 26px;
368
+}
369
+.chosen-rtl .chosen-choices li {
370
+ float: right;
371
+}
372
+.chosen-rtl .chosen-choices li.search-field input[type="text"] {
373
+ direction: rtl;
374
+}
375
+.chosen-rtl .chosen-choices li.search-choice {
376
+ margin: 3px 5px 3px 0;
377
+ padding: 3px 5px 3px 19px;
378
+}
379
+.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
380
+ right: auto;
381
+ left: 4px;
382
+}
383
+.chosen-rtl.chosen-container-single-nosearch .chosen-search,
384
+.chosen-rtl .chosen-drop {
385
+ left: 9999px;
386
+}
387
+.chosen-rtl.chosen-container-single .chosen-results {
388
+ margin: 0 0 4px 4px;
389
+ padding: 0 4px 0 0;
390
+}
391
+.chosen-rtl .chosen-results li.group-option {
392
+ padding-right: 15px;
393
+ padding-left: 0;
394
+}
395
+.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
396
+ border-right: none;
397
+}
398
+.chosen-rtl .chosen-search input[type="text"] {
399
+ padding: 4px 5px 4px 20px;
400
+ background: white url('chosen-sprite.png') no-repeat -30px -20px;
401
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
402
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
403
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
404
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
405
+ background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
406
+ direction: rtl;
407
+}
408
+.chosen-rtl.chosen-container-single .chosen-single div b {
409
+ background-position: 6px 2px;
410
+}
411
+.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
412
+ background-position: -12px 2px;
413
+}
414
+
415
+/* @end */
416
+/* @group Retina compatibility */
417
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
418
+ .chosen-rtl .chosen-search input[type="text"],
419
+ .chosen-container-single .chosen-single abbr,
420
+ .chosen-container-single .chosen-single div b,
421
+ .chosen-container-single .chosen-search input[type="text"],
422
+ .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
423
+ .chosen-container .chosen-results-scroll-down span,
424
+ .chosen-container .chosen-results-scroll-up span {
425
+ background-image: url('chosen-sprite@2x.png') !important;
426
+ background-size: 52px 37px !important;
427
+ background-repeat: no-repeat !important;
428
+ }
429
+}
430
+/* @end */
securis/src/main/webapp/css/font-awesome.min.css
....@@ -0,0 +1,4 @@
1
+/*!
2
+ * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
3
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}
securis/src/main/webapp/css/securis.css
....@@ -0,0 +1,90 @@
1
+body {
2
+ padding-top: 50px;
3
+ padding-bottom: 20px;
4
+}
5
+
6
+@media (min-width: 1400px) {
7
+ .container {
8
+ width: 1350px !important;
9
+ }
10
+}
11
+
12
+@media (min-width: 1600px) {
13
+ .container {
14
+ width: 1550px !important;
15
+ }
16
+}
17
+
18
+
19
+a {
20
+ cursor: default !important;
21
+}
22
+.animate-show {
23
+ -webkit-transition: all linear 0.5s;
24
+ transition: all linear 0.5s;
25
+ opacity:1;
26
+}
27
+
28
+.animate-show.ng-hide-add,
29
+.animate-show.ng-hide-remove {
30
+ -webkit-transition: all linear 0.5s;
31
+ transition: all linear 0.5s;
32
+ display: block !important;
33
+}
34
+
35
+.animate-show.ng-hide {
36
+ opacity: 0;
37
+}
38
+
39
+input.ng-invalid, textarea.ng-invalid {
40
+ border: solid 1px red;
41
+}
42
+
43
+input.ng-dirty.ng-valid, textarea.ng-dirty.ng-valid {
44
+ border: solid 1px green;
45
+}
46
+
47
+.alert.inline-alert {
48
+ padding-top: 5px;
49
+ padding-bottom: 5px;
50
+ margin-bottom: 5px;
51
+}
52
+
53
+.chosen-choices {
54
+ min-width: 100% !important;
55
+ height: 34px !important;
56
+ padding: 3px 6px;
57
+ font-size: 14px;
58
+ vertical-align: middle;
59
+ border: 1px solid #ccc;
60
+ border-radius: 4px;
61
+}
62
+
63
+.chosen-container {
64
+ min-width: 100% !important;
65
+ border: none;
66
+ padding: 0px;
67
+}
68
+.chosen-container-multi li.search-field input[type="text"] {
69
+ min-height: 25px !important;
70
+ height: 25px !important;
71
+}
72
+
73
+.btn-file {
74
+ position: relative;
75
+ overflow: hidden;
76
+}
77
+.btn-file input[type=file] {
78
+ position: absolute;
79
+ top: 0;
80
+ right: 0;
81
+ min-width: 100%;
82
+ min-height: 100%;
83
+ font-size: 999px;
84
+ text-align: right;
85
+ filter: alpha(opacity=0);
86
+ opacity: 0;
87
+ background: red;
88
+ cursor: inherit;
89
+ display: block;
90
+}
securis/src/main/webapp/css/spinner.gif
Binary files differ
securis/src/main/webapp/css/toaster.css
....@@ -0,0 +1,207 @@
1
+/*
2
+ * Toastr
3
+ * Version 2.0.1
4
+ * Copyright 2012 John Papa and Hans Fjällemark.
5
+ * All Rights Reserved.
6
+ * Use, reproduction, distribution, and modification of this code is subject to the terms and
7
+ * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
8
+ *
9
+ * Author: John Papa and Hans Fjällemark
10
+ * Project: https://github.com/CodeSeven/toastr
11
+ */
12
+.toast-title {
13
+ font-weight: bold;
14
+}
15
+.toast-message {
16
+ -ms-word-wrap: break-word;
17
+ word-wrap: break-word;
18
+}
19
+.toast-message a,
20
+.toast-message label {
21
+ color: #ffffff;
22
+}
23
+.toast-message a:hover {
24
+ color: #cccccc;
25
+ text-decoration: none;
26
+}
27
+
28
+.toast-close-button {
29
+ position: relative;
30
+ right: -0.3em;
31
+ top: -0.3em;
32
+ float: right;
33
+ font-size: 20px;
34
+ font-weight: bold;
35
+ color: #ffffff;
36
+ -webkit-text-shadow: 0 1px 0 #ffffff;
37
+ text-shadow: 0 1px 0 #ffffff;
38
+ opacity: 0.8;
39
+ -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
40
+ filter: alpha(opacity=80);
41
+}
42
+.toast-close-button:hover,
43
+.toast-close-button:focus {
44
+ color: #000000;
45
+ text-decoration: none;
46
+ cursor: pointer;
47
+ opacity: 0.4;
48
+ -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
49
+ filter: alpha(opacity=40);
50
+}
51
+
52
+/*Additional properties for button version
53
+ iOS requires the button element instead of an anchor tag.
54
+ If you want the anchor version, it requires `href="#"`.*/
55
+button.toast-close-button {
56
+ padding: 0;
57
+ cursor: pointer;
58
+ background: transparent;
59
+ border: 0;
60
+ -webkit-appearance: none;
61
+}
62
+.toast-top-full-width {
63
+ top: 0;
64
+ right: 0;
65
+ width: 100%;
66
+}
67
+.toast-bottom-full-width {
68
+ bottom: 0;
69
+ right: 0;
70
+ width: 100%;
71
+}
72
+.toast-top-left {
73
+ top: 12px;
74
+ left: 12px;
75
+}
76
+.toast-top-right {
77
+ top: 12px;
78
+ right: 12px;
79
+}
80
+.toast-bottom-right {
81
+ right: 12px;
82
+ bottom: 12px;
83
+}
84
+.toast-bottom-left {
85
+ bottom: 12px;
86
+ left: 12px;
87
+}
88
+#toast-container {
89
+ position: fixed;
90
+ z-index: 999999;
91
+ /*overrides*/
92
+
93
+}
94
+#toast-container * {
95
+ -moz-box-sizing: border-box;
96
+ -webkit-box-sizing: border-box;
97
+ box-sizing: border-box;
98
+}
99
+#toast-container > div {
100
+ margin: 0 0 6px;
101
+ padding: 15px 15px 15px 50px;
102
+ width: 300px;
103
+ -moz-border-radius: 3px 3px 3px 3px;
104
+ -webkit-border-radius: 3px 3px 3px 3px;
105
+ border-radius: 3px 3px 3px 3px;
106
+ background-position: 15px center;
107
+ background-repeat: no-repeat;
108
+ -moz-box-shadow: 0 0 12px #999999;
109
+ -webkit-box-shadow: 0 0 12px #999999;
110
+ box-shadow: 0 0 12px #999999;
111
+ color: #ffffff;
112
+ opacity: 0.8;
113
+ -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
114
+ filter: alpha(opacity=80);
115
+}
116
+#toast-container > :hover {
117
+ -moz-box-shadow: 0 0 12px #000000;
118
+ -webkit-box-shadow: 0 0 12px #000000;
119
+ box-shadow: 0 0 12px #000000;
120
+ opacity: 1;
121
+ -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
122
+ filter: alpha(opacity=100);
123
+ cursor: pointer;
124
+}
125
+#toast-container > .toast-info {
126
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
127
+}
128
+#toast-container > .toast-error {
129
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
130
+}
131
+#toast-container > .toast-success {
132
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
133
+}
134
+#toast-container > .toast-warning {
135
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
136
+}
137
+#toast-container.toast-top-full-width > div,
138
+#toast-container.toast-bottom-full-width > div {
139
+ width: 96%;
140
+ margin: auto;
141
+}
142
+.toast {
143
+ background-color: #030303;
144
+}
145
+.toast-success {
146
+ background-color: #51a351;
147
+}
148
+.toast-error {
149
+ background-color: #bd362f;
150
+}
151
+.toast-info {
152
+ background-color: #2f96b4;
153
+}
154
+.toast-warning {
155
+ background-color: #f89406;
156
+}
157
+/*Responsive Design*/
158
+@media all and (max-width: 240px) {
159
+ #toast-container > div {
160
+ padding: 8px 8px 8px 50px;
161
+ width: 11em;
162
+ }
163
+ #toast-container .toast-close-button {
164
+ right: -0.2em;
165
+ top: -0.2em;
166
+}
167
+ }
168
+@media all and (min-width: 241px) and (max-width: 480px) {
169
+ #toast-container > div {
170
+ padding: 8px 8px 8px 50px;
171
+ width: 18em;
172
+ }
173
+ #toast-container .toast-close-button {
174
+ right: -0.2em;
175
+ top: -0.2em;
176
+}
177
+}
178
+@media all and (min-width: 481px) and (max-width: 768px) {
179
+ #toast-container > div {
180
+ padding: 15px 15px 15px 50px;
181
+ width: 25em;
182
+ }
183
+}
184
+
185
+ /*
186
+ * AngularJS-Toaster
187
+ * Version 0.3
188
+ */
189
+#toast-container > div.ng-enter,
190
+#toast-container > div.ng-leave
191
+{
192
+ -webkit-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
193
+ -moz-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
194
+ -ms-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
195
+ -o-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
196
+ transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all;
197
+}
198
+
199
+#toast-container > div.ng-enter.ng-enter-active,
200
+#toast-container > div.ng-leave {
201
+ opacity: 0.8;
202
+}
203
+
204
+#toast-container > div.ng-leave.ng-leave-active,
205
+#toast-container > div.ng-enter {
206
+ opacity: 0;
207
+}
securis/src/main/webapp/favicon.ico
Binary files differ
securis/src/main/webapp/fonts/glyphicons-halflings-regular.eot
Binary files differ
securis/src/main/webapp/fonts/glyphicons-halflings-regular.svg
....@@ -0,0 +1,229 @@
1
+<?xml version="1.0" standalone="no"?>
2
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+<svg xmlns="http://www.w3.org/2000/svg">
4
+<metadata></metadata>
5
+<defs>
6
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
7
+<font-face units-per-em="1200" ascent="960" descent="-240" />
8
+<missing-glyph horiz-adv-x="500" />
9
+<glyph />
10
+<glyph />
11
+<glyph unicode="&#xd;" />
12
+<glyph unicode=" " />
13
+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
14
+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
15
+<glyph unicode="&#xa0;" />
16
+<glyph unicode="&#x2000;" horiz-adv-x="652" />
17
+<glyph unicode="&#x2001;" horiz-adv-x="1304" />
18
+<glyph unicode="&#x2002;" horiz-adv-x="652" />
19
+<glyph unicode="&#x2003;" horiz-adv-x="1304" />
20
+<glyph unicode="&#x2004;" horiz-adv-x="434" />
21
+<glyph unicode="&#x2005;" horiz-adv-x="326" />
22
+<glyph unicode="&#x2006;" horiz-adv-x="217" />
23
+<glyph unicode="&#x2007;" horiz-adv-x="217" />
24
+<glyph unicode="&#x2008;" horiz-adv-x="163" />
25
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
26
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
27
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
28
+<glyph unicode="&#x205f;" horiz-adv-x="326" />
29
+<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
30
+<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
31
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
32
+<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
33
+<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
34
+<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
35
+<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
36
+<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
37
+<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
38
+<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
39
+<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
40
+<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
41
+<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
42
+<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
43
+<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
44
+<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
45
+<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
46
+<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
47
+<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
48
+<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
49
+<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
50
+<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
51
+<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
52
+<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
53
+<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
54
+<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
55
+<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
56
+<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
57
+<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
58
+<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
59
+<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
60
+<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
61
+<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
62
+<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
63
+<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
64
+<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
65
+<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
66
+<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
67
+<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
68
+<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
69
+<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
70
+<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
71
+<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
72
+<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
73
+<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
74
+<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
75
+<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
76
+<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
77
+<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
78
+<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
79
+<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
80
+<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
81
+<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
82
+<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
83
+<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
84
+<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
85
+<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
86
+<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
87
+<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
88
+<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
89
+<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
90
+<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
91
+<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
92
+<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
93
+<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
94
+<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
95
+<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
96
+<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
97
+<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
98
+<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
99
+<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
100
+<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
101
+<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
102
+<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
103
+<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
104
+<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
105
+<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
106
+<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
107
+<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
108
+<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
109
+<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
110
+<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
111
+<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
112
+<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
113
+<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
114
+<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
115
+<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
116
+<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
117
+<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
118
+<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
119
+<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
120
+<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
121
+<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
122
+<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
123
+<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
124
+<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
125
+<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
126
+<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
127
+<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
128
+<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
129
+<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
130
+<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
131
+<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
132
+<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
133
+<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
134
+<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
135
+<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
136
+<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
137
+<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
138
+<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
139
+<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
140
+<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
141
+<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
142
+<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
143
+<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
144
+<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
145
+<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
146
+<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
147
+<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
148
+<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
149
+<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
150
+<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
151
+<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
152
+<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
153
+<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
154
+<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
155
+<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
156
+<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
157
+<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
158
+<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
159
+<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
160
+<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
161
+<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
162
+<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
163
+<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
164
+<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
165
+<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
166
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
167
+<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
168
+<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
169
+<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
170
+<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
171
+<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
172
+<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
173
+<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
174
+<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
175
+<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
176
+<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
177
+<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
178
+<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
179
+<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
180
+<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
181
+<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
182
+<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
183
+<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
184
+<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
185
+<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
186
+<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
187
+<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
188
+<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
189
+<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
190
+<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
191
+<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
192
+<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
193
+<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
194
+<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
195
+<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
196
+<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
197
+<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
198
+<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
199
+<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
200
+<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
201
+<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
202
+<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
203
+<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
204
+<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
205
+<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
206
+<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
207
+<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
208
+<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
209
+<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
210
+<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
211
+<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
212
+<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
213
+<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
214
+<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
215
+<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
216
+<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
217
+<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
218
+<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
219
+<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
220
+<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
221
+<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
222
+<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
223
+<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
224
+<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
225
+<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
226
+<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
227
+<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
228
+</font>
229
+</defs></svg>
securis/src/main/webapp/fonts/glyphicons-halflings-regular.ttf
Binary files differ
securis/src/main/webapp/fonts/glyphicons-halflings-regular.woff
Binary files differ
securis/src/main/webapp/header.html
....@@ -0,0 +1,19 @@
1
+
2
+ <div class="navbar navbar-inverse navbar-fixed-top">
3
+ <div class="container">
4
+ <div class="navbar-header">
5
+ <ul class="nav navbar-nav navbar-left">
6
+ <li i18n style="color: white; padding-top: 15px;">SeCuris</li>
7
+ <li><a i18n href="/licenses">Licenses</a></li>
8
+ <li><a i18n href="/admin">Admin</a></li>
9
+ </ul>
10
+ </div>
11
+ <div class="navbar-collapse collapse">
12
+ <ul class="nav navbar-nav navbar-right">
13
+ <li><a i18n href="#about">About</a></li>
14
+ <li><a i18n href="#contact">Contact</a></li>
15
+ <li><a i18n ng-click="logout()">Logout</a></li>
16
+ </ul>
17
+ </div>
18
+ </div>
19
+ </div>
securis/src/main/webapp/humans.txt
....@@ -0,0 +1,15 @@
1
+# humanstxt.org/
2
+# The humans responsible & technology colophon
3
+
4
+# TEAM
5
+
6
+ <name> -- <role> -- <twitter>
7
+
8
+# THANKS
9
+
10
+ <name>
11
+
12
+# TECHNOLOGY COLOPHON
13
+
14
+ HTML5, CSS3
15
+ jQuery, Modernizr
securis/src/main/webapp/images/securis_100.png
Binary files differ
securis/src/main/webapp/images/securis_40.png
Binary files differ
securis/src/main/webapp/index.html
....@@ -0,0 +1,5 @@
1
+<html>
2
+ <body>
3
+ <h1>SeCuris Server</h1>
4
+ </body>
5
+</html>
securis/src/main/webapp/js/admin.js
....@@ -0,0 +1,242 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+ var app = angular.module('securis');
5
+
6
+ var HTTP_ERRORS = {
7
+ 401: "Unathorized action",
8
+ 403: "Forbidden action",
9
+ 500: "Server error",
10
+ 418: "Application error",
11
+ 404: "Element not found"
12
+ }
13
+
14
+ app.directive(
15
+ 'catalogField',
16
+ function() {
17
+ return {
18
+ restrict : 'A', // only activate on element
19
+ // attribute
20
+ require : '?ngModel', // get a hold of
21
+ // NgModelController
22
+ link : function(scope, element, attrs, ngModel) {
23
+ if (!ngModel)
24
+ return; // do nothing if no ng-model
25
+ // TODO: Replace the hard-coded form ID ('catalogForm') by the
26
+ // appropiate dynamic field
27
+ scope.catalogForm[attrs.name] = scope.catalogForm[scope.field.name];
28
+ scope.catalogForm[attrs.name].$name = attrs.name;
29
+ }
30
+ };
31
+ });
32
+
33
+ app.controller('AdminCtrl', [
34
+ '$scope',
35
+ '$http',
36
+ 'toaster',
37
+ 'Catalogs',
38
+ '$store',
39
+ '$L',
40
+ function($scope, $http, toaster, Catalogs, $store, $L) {
41
+ $store.set('location', '/admin');
42
+
43
+ $scope.showForm = false;
44
+ $scope.isNew = false;
45
+ $scope.formu = {};
46
+ $scope.catalogIndex = 0;
47
+ $scope.catalogMetadata = {};
48
+ $scope.catalogsList = null;
49
+ $scope.list = null;
50
+
51
+
52
+ var _changeCatalog = function(index) {
53
+ $scope.showForm = false;
54
+ $scope.formu = {};
55
+ if (!$scope.catalogsList) $scope.catalogsList = Catalogs.getList(); // catalog list is also in index.data
56
+ if (typeof index === 'number') $scope.catalogIndex = index;
57
+ Catalogs.setCurrent($scope.catalogIndex);
58
+ $scope.catalogMetadata = Catalogs.getMetadata();
59
+ $scope.list = Catalogs.query();
60
+ $scope.refs = {}
61
+ Catalogs.loadRefs(function(refs) {
62
+ console.log('Updated refs in form');
63
+ console.log(refs);
64
+ $scope.refs = refs;
65
+ });
66
+ }
67
+
68
+ Catalogs.init().then(_changeCatalog);
69
+
70
+ $scope.selectCatalog = _changeCatalog;
71
+
72
+ $scope.edit = function(data) {
73
+ $scope.showForm = true;
74
+ $scope.isNew = false;
75
+ // Next line is a workaround due to some issues with values with ID == 0
76
+ $('select').val(null);
77
+ $scope.formu = {}
78
+ var fields = Catalogs.getMetadata().fields;
79
+ console.log($scope);
80
+
81
+ fields.forEach(function(field) {
82
+ if (field.type === 'select') {
83
+ // next lines are a workaround to avoid an issue where we try to show a form with "select" fields (if select field value doesn't change
84
+ $scope.formu[field.name] = null;
85
+ setTimeout(function() {
86
+ $scope.formu[field.name] = data[field.name];
87
+ $scope.$apply();
88
+ }, 0);
89
+ } else {
90
+ if (!field.listingOnly) $scope.formu[field.name] = data[field.name] || null;
91
+ }
92
+ })
93
+ setTimeout(function() {
94
+ $('#'+Catalogs.getFFF()).focus();
95
+ }, 0);
96
+ }
97
+
98
+ $scope.delete = function(data) {
99
+ BootstrapDialog.confirm($L.get('The record will be deleted, are you sure?'), function(result){
100
+ if(result) {
101
+ var promise = Catalogs.remove(data).$promise;
102
+ promise.then(function(data) {
103
+ $scope.list = Catalogs.query();
104
+ Catalogs.refreshRef($scope.refs, Catalogs.getMetadata().resource, $scope.list);
105
+ toaster.pop('success', Catalogs.getName(), $L.get("Element deleted successfully"));
106
+ },function(error) {
107
+ console.log(error);
108
+ toaster.pop('error', Catalogs.getName(), $L.get("Error deleting element, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000);
109
+ });
110
+ }
111
+ });
112
+ $scope.showForm = false;
113
+ $scope.isNew = false;
114
+ }
115
+
116
+ } ]);
117
+
118
+ app.controller('CatalogFormCtrl', [ '$scope', '$http', 'toaster', 'Catalogs', '$L',
119
+ function($scope, $http, toaster, Catalogs, $L) {
120
+ $scope.scope = $scope;
121
+ console.log('Form: currentCatalog:' + $scope.cataLogIndex);
122
+
123
+ $scope.inputType = function(field) {
124
+
125
+ if (field.readOnly && field.type === 'date')
126
+ return 'readonly_date';
127
+ if (field.readOnly && (!field.pk || !$scope.isNew ))
128
+ return 'readonly';
129
+ if (field.type === 'select')
130
+ return 'select';
131
+ if (field.type === 'multiselect')
132
+ return 'multiselect';
133
+ if (field.type === 'metadata')
134
+ return 'metadata';
135
+ if (field.type === 'password')
136
+ return 'password';
137
+ if (!field.multiline)
138
+ return 'normal';
139
+ if (field.multiline)
140
+ return 'textarea';
141
+
142
+ }
143
+
144
+ $scope.editNew = function() {
145
+ $scope.$parent.isNew = true;
146
+ $scope.$parent.showForm = true;
147
+ $('select').val(null);
148
+ $scope.$parent.formu = {};
149
+
150
+ var fields = Catalogs.getMetadata().fields;
151
+ fields.forEach(function(field) {
152
+ if (!field.listingOnly) $scope.$parent.formu[field.name] = null;
153
+ })
154
+ setTimeout(function() {
155
+ $('#'+Catalogs.getFFF()).focus();
156
+ }, 0);
157
+
158
+ }
159
+ $scope.cancel = function() {
160
+ $scope.$parent.showForm = false;
161
+ $scope.catalogForm.$setPristine();
162
+ }
163
+
164
+ $scope.saveCatalog = function() {
165
+ if ($scope.catalogForm.$invalid) {
166
+ toaster.pop('error', Catalogs.getName(), $L.get("There are wrong data in current form, please fix it before to save"));
167
+ } else {
168
+ var promise = Catalogs.save($scope.formu).$promise;
169
+ promise.then(function(data, otro) {
170
+ if ($scope.isNew) {
171
+ $scope.catalogForm.$setPristine();
172
+ $scope.$parent.formu = {}
173
+ $('#'+ Catalogs.getFFF()).focus();
174
+ } else {
175
+ $scope.cancel();
176
+ }
177
+ $scope.$parent.list = Catalogs.query();
178
+ Catalogs.refreshRef($scope.refs, Catalogs.getMetadata().resource, $scope.$parent.list);
179
+
180
+ toaster.pop('success', Catalogs.getName(), $L.get("Element saved successfully"));
181
+ }, function(error) {
182
+ console.log(error);
183
+ toaster.pop('error', Catalogs.getName(), $L.get("Error saving element, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000);
184
+ });
185
+ }
186
+ }
187
+
188
+ $scope.selectFieldChanged = function(onchangehandler) {
189
+ if (onchangehandler) {
190
+ $scope[onchangehandler]();
191
+ }
192
+ }
193
+ // Metadata management
194
+
195
+ $scope.createMetadataRow = function() {
196
+ if (!$scope.formu.metadata) {
197
+ $scope.formu.metadata = [];
198
+ }
199
+ $scope.formu.metadata.push({key: '', value: '', mandatory: true});
200
+ }
201
+ $scope.removeMetadataKey = function(row_md) {
202
+ $scope.formu.metadata.splice( $scope.formu.metadata.indexOf(row_md), 1 );
203
+ }
204
+ $scope.updateMetadata = function() {
205
+ // Called when Application ID change in current field
206
+ var newAppId = $scope.formu['application_id'];
207
+ if (newAppId) {
208
+ // Only if there is a "valid" value selected we should update the metadata
209
+ Catalogs.getResource('application').get({appId: newAppId}).$promise.then(function(app) {
210
+ $scope.formu.metadata = [];
211
+ app.metadata.forEach(function(md) {
212
+ $scope.formu.metadata.push({
213
+ key: md.key,
214
+ value: md.value,
215
+ mandatory: md.mandatory
216
+ });
217
+ });
218
+ });
219
+ }
220
+ }
221
+
222
+ } ]);
223
+
224
+ app.controller('CatalogListCtrl', [ '$scope', '$http', '$filter', 'Catalogs',
225
+ function($scope, $http, $filter, Catalogs) {
226
+
227
+ $scope.print = function(name, row) {
228
+ var value = row[name];
229
+ var type = Catalogs.getField(name).type;
230
+ var printedValue = type === 'date' ? $filter('date')(value, 'yyyy-MM-dd') : value;
231
+ if (printedValue !== value) // this line is a work around to allow search in formatted fields
232
+ row['_display_'+name] = printedValue;
233
+ return printedValue;
234
+ }
235
+
236
+ $scope.display = function(name) {
237
+ return Catalogs.getField(name).display;
238
+ }
239
+
240
+ } ]);
241
+
242
+})();
securis/src/main/webapp/js/angular/angular-animate.min.js
....@@ -0,0 +1,32 @@
1
+/*
2
+ AngularJS v1.3.0
3
+ (c) 2010-2014 Google, Inc. http://angularjs.org
4
+ License: MIT
5
+*/
6
+(function(M,f,S){'use strict';f.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(T,B,k){k=k.ngAnimateChildren;f.isString(k)&&0===k.length?B.data("$$ngAnimateChildren",!0):T.$watch(k,function(f){B.data("$$ngAnimateChildren",!!f)})}}).factory("$$animateReflow",["$$rAF","$document",function(f,B){return function(k){return f(function(){k()})}}]).config(["$provide","$animateProvider",function(T,B){function k(f){for(var g=0;g<f.length;g++){var k=f[g];if(1==k.nodeType)return k}}
7
+function N(f,g){return k(f)==k(g)}var s=f.noop,g=f.forEach,ba=B.$$selectors,$=f.isArray,ca=f.isString,da=f.isObject,t={running:!0};T.decorator("$animate",["$delegate","$$q","$injector","$sniffer","$rootElement","$$asyncCallback","$rootScope","$document","$templateRequest",function(O,M,I,U,x,C,P,S,V){function A(a,c){var b=a.data("$$ngAnimateState")||{};c&&(b.running=!0,b.structural=!0,a.data("$$ngAnimateState",b));return b.disabled||b.running&&b.structural}function z(a){var c,b=M.defer();b.promise.$$cancelFn=
8
+function(){c&&c()};P.$$postDigest(function(){c=a(function(){b.resolve()})});return b.promise}function J(a){if(da(a))return a.tempClasses&&ca(a.tempClasses)&&(a.tempClasses=a.tempClasses.split(/\s+/)),a}function W(a,c,b){b=b||{};var e={};g(b,function(a,d){g(d.split(" "),function(d){e[d]=a})});var m=Object.create(null);g((a.attr("class")||"").split(/\s+/),function(a){m[a]=!0});var f=[],k=[];g(c.classes,function(a,d){var b=m[d],c=e[d]||{};!1===a?(b||"addClass"==c.event)&&k.push(d):!0===a&&(b&&"removeClass"!=
9
+c.event||f.push(d))});return 0<f.length+k.length&&[f.join(" "),k.join(" ")]}function Q(a){if(a){var c=[],b={};a=a.substr(1).split(".");(U.transitions||U.animations)&&c.push(I.get(ba[""]));for(var e=0;e<a.length;e++){var f=a[e],k=ba[f];k&&!b[f]&&(c.push(I.get(k)),b[f]=!0)}return c}}function R(a,c,b,e){function m(a,d){var b=a[d],c=a["before"+d.charAt(0).toUpperCase()+d.substr(1)];if(b||c)return"leave"==d&&(c=b,b=null),l.push({event:d,fn:b}),H.push({event:d,fn:c}),!0}function k(c,h,G){var w=[];g(c,function(a){a.fn&&
10
+w.push(a)});var f=0;g(w,function(c,n){var u=function(){a:{if(h){(h[n]||s)();if(++f<w.length)break a;h=null}G()}};switch(c.event){case "setClass":h.push(c.fn(a,F,d,u,e));break;case "animate":h.push(c.fn(a,b,e.from,e.to,u));break;case "addClass":h.push(c.fn(a,F||b,u,e));break;case "removeClass":h.push(c.fn(a,d||b,u,e));break;default:h.push(c.fn(a,u,e))}});h&&0===h.length&&G()}var p=a[0];if(p){e&&(e.to=e.to||{},e.from=e.from||{});var F,d;$(b)&&(F=b[0],d=b[1],F?d?b=F+" "+d:(b=F,c="addClass"):(b=d,c="removeClass"));
11
+var h="setClass"==c,G=h||"addClass"==c||"removeClass"==c||"animate"==c,w=a.attr("class")+" "+b;if(X(w)){var u=s,n=[],H=[],q=s,r=[],l=[],w=(" "+w).replace(/\s+/g,".");g(Q(w),function(a){!m(a,c)&&h&&(m(a,"addClass"),m(a,"removeClass"))});return{node:p,event:c,className:b,isClassBased:G,isSetClassOperation:h,applyStyles:function(){e&&a.css(f.extend(e.from||{},e.to||{}))},before:function(a){u=a;k(H,n,function(){u=s;a()})},after:function(a){q=a;k(l,r,function(){q=s;a()})},cancel:function(){n&&(g(n,function(a){(a||
12
+s)(!0)}),u(!0));r&&(g(r,function(a){(a||s)(!0)}),q(!0))}}}}}function y(a,c,b,e,m,k,p,F){function d(d){var h="$animate:"+d;H&&H[h]&&0<H[h].length&&C(function(){b.triggerHandler(h,{event:a,className:c})})}function h(){d("before")}function G(){d("after")}function w(){w.hasBeenRun||(w.hasBeenRun=!0,k())}function u(){if(!u.hasBeenRun){n&&n.applyStyles();u.hasBeenRun=!0;p&&p.tempClasses&&g(p.tempClasses,function(a){b.removeClass(a)});var h=b.data("$$ngAnimateState");h&&(n&&n.isClassBased?l(b,c):(C(function(){var d=
13
+b.data("$$ngAnimateState")||{};v==d.index&&l(b,c,a)}),b.data("$$ngAnimateState",h)));d("close");F()}}var n=R(b,a,c,p);if(!n)return w(),h(),G(),u(),s;a=n.event;c=n.className;var H=f.element._data(n.node),H=H&&H.events;e||(e=m?m.parent():b.parent());if(Y(b,e))return w(),h(),G(),u(),s;e=b.data("$$ngAnimateState")||{};var q=e.active||{},r=e.totalActive||0,t=e.last;m=!1;if(0<r){r=[];if(n.isClassBased)"setClass"==t.event?(r.push(t),l(b,c)):q[c]&&(aa=q[c],aa.event==a?m=!0:(r.push(aa),l(b,c)));else if("leave"==
14
+a&&q["ng-leave"])m=!0;else{for(var aa in q)r.push(q[aa]);e={};l(b,!0)}0<r.length&&g(r,function(a){a.cancel()})}!n.isClassBased||n.isSetClassOperation||"animate"==a||m||(m="addClass"==a==b.hasClass(c));if(m)return w(),h(),G(),d("close"),F(),s;q=e.active||{};r=e.totalActive||0;if("leave"==a)b.one("$destroy",function(a){a=f.element(this);var d=a.data("$$ngAnimateState");d&&(d=d.active["ng-leave"])&&(d.cancel(),l(a,"ng-leave"))});b.addClass("ng-animate");p&&p.tempClasses&&g(p.tempClasses,function(a){b.addClass(a)});
15
+var v=Z++;r++;q[c]=n;b.data("$$ngAnimateState",{last:n,active:q,index:v,totalActive:r});h();n.before(function(d){var h=b.data("$$ngAnimateState");d=d||!h||!h.active[c]||n.isClassBased&&h.active[c].event!=a;w();!0===d?u():(G(),n.after(u))});return n.cancel}function K(a){if(a=k(a))a=f.isFunction(a.getElementsByClassName)?a.getElementsByClassName("ng-animate"):a.querySelectorAll(".ng-animate"),g(a,function(a){a=f.element(a);(a=a.data("$$ngAnimateState"))&&a.active&&g(a.active,function(a){a.cancel()})})}
16
+function l(a,c){if(N(a,x))t.disabled||(t.running=!1,t.structural=!1);else if(c){var b=a.data("$$ngAnimateState")||{},e=!0===c;!e&&b.active&&b.active[c]&&(b.totalActive--,delete b.active[c]);if(e||!b.totalActive)a.removeClass("ng-animate"),a.removeData("$$ngAnimateState")}}function Y(a,c){if(t.disabled)return!0;if(N(a,x))return t.running;var b,e,k;do{if(0===c.length)break;var g=N(c,x),p=g?t:c.data("$$ngAnimateState")||{};if(p.disabled)return!0;g&&(k=!0);!1!==b&&(g=c.data("$$ngAnimateChildren"),f.isDefined(g)&&
17
+(b=g));e=e||p.running||p.last&&!p.last.isClassBased}while(c=c.parent());return!k||!b&&e}x.data("$$ngAnimateState",t);var L=P.$watch(function(){return V.totalPendingRequests},function(a,c){0===a&&(L(),P.$$postDigest(function(){P.$$postDigest(function(){t.running=!1})}))}),Z=0,E=B.classNameFilter(),X=E?function(a){return E.test(a)}:function(){return!0};return{animate:function(a,c,b,e,g){e=e||"ng-inline-animate";g=J(g)||{};g.from=b?c:null;g.to=b?b:c;return z(function(b){return y("animate",e,f.element(k(a)),
18
+null,null,s,g,b)})},enter:function(a,c,b,e){e=J(e);a=f.element(a);c=c&&f.element(c);b=b&&f.element(b);A(a,!0);O.enter(a,c,b);return z(function(g){return y("enter","ng-enter",f.element(k(a)),c,b,s,e,g)})},leave:function(a,c){c=J(c);a=f.element(a);K(a);A(a,!0);return z(function(b){return y("leave","ng-leave",f.element(k(a)),null,null,function(){O.leave(a)},c,b)})},move:function(a,c,b,e){e=J(e);a=f.element(a);c=c&&f.element(c);b=b&&f.element(b);K(a);A(a,!0);O.move(a,c,b);return z(function(g){return y("move",
19
+"ng-move",f.element(k(a)),c,b,s,e,g)})},addClass:function(a,c,b){return this.setClass(a,c,[],b)},removeClass:function(a,c,b){return this.setClass(a,[],c,b)},setClass:function(a,c,b,e){e=J(e);a=f.element(a);a=f.element(k(a));if(A(a))return O.$$setClassImmediately(a,c,b,e);var m,l=a.data("$$animateClasses"),p=!!l;l||(l={classes:{}});m=l.classes;c=$(c)?c:c.split(" ");g(c,function(a){a&&a.length&&(m[a]=!0)});b=$(b)?b:b.split(" ");g(b,function(a){a&&a.length&&(m[a]=!1)});if(p)return e&&l.options&&(l.options=
20
+f.extend(l.options||{},e)),l.promise;a.data("$$animateClasses",l={classes:m,options:e});return l.promise=z(function(b){var d=a.parent(),h=k(a),c=h.parentNode;if(!c||c.$$NG_REMOVED||h.$$NG_REMOVED)b();else{h=a.data("$$animateClasses");a.removeData("$$animateClasses");var c=a.data("$$ngAnimateState")||{},e=W(a,h,c.active);return e?y("setClass",e,a,d,null,function(){e[0]&&O.$$addClassImmediately(a,e[0]);e[1]&&O.$$removeClassImmediately(a,e[1])},h.options,b):b()}})},cancel:function(a){a.$$cancelFn()},
21
+enabled:function(a,c){switch(arguments.length){case 2:if(a)l(c);else{var b=c.data("$$ngAnimateState")||{};b.disabled=!0;c.data("$$ngAnimateState",b)}break;case 1:t.disabled=!a;break;default:a=!t.disabled}return!!a}}}]);B.register("",["$window","$sniffer","$timeout","$$animateReflow",function(t,B,I,U){function x(){e||(e=U(function(){b=[];e=null;a={}}))}function C(c,d){e&&e();b.push(d);e=U(function(){g(b,function(a){a()});b=[];e=null;a={}})}function P(a,d){var h=k(a);a=f.element(h);p.push(a);h=Date.now()+
22
+d;h<=N||(I.cancel(m),N=h,m=I(function(){T(p);p=[]},d,!1))}function T(a){g(a,function(a){(a=a.data("$$ngAnimateCSS3Data"))&&g(a.closeAnimationFns,function(a){a()})})}function V(b,d){var h=d?a[d]:null;if(!h){var c=0,e=0,f=0,k=0;g(b,function(a){if(1==a.nodeType){a=t.getComputedStyle(a)||{};c=Math.max(A(a[L+"Duration"]),c);e=Math.max(A(a[L+"Delay"]),e);k=Math.max(A(a[E+"Delay"]),k);var d=A(a[E+"Duration"]);0<d&&(d*=parseInt(a[E+"IterationCount"],10)||1);f=Math.max(d,f)}});h={total:0,transitionDelay:e,
23
+transitionDuration:c,animationDelay:k,animationDuration:f};d&&(a[d]=h)}return h}function A(a){var d=0;a=ca(a)?a.split(/\s*,\s*/):[];g(a,function(a){d=Math.max(parseFloat(a)||0,d)});return d}function z(b,d,h,e){b=0<=["ng-enter","ng-leave","ng-move"].indexOf(h);var f,g=d.parent(),n=g.data("$$ngAnimateKey");n||(g.data("$$ngAnimateKey",++c),n=c);f=n+"-"+k(d).getAttribute("class");var g=f+" "+h,n=a[g]?++a[g].total:0,l={};if(0<n){var q=h+"-stagger",l=f+" "+q;(f=!a[l])&&d.addClass(q);l=V(d,l);f&&d.removeClass(q)}d.addClass(h);
24
+var q=d.data("$$ngAnimateCSS3Data")||{},r=V(d,g);f=r.transitionDuration;r=r.animationDuration;if(b&&0===f&&0===r)return d.removeClass(h),!1;h=e||b&&0<f;b=0<r&&0<l.animationDelay&&0===l.animationDuration;d.data("$$ngAnimateCSS3Data",{stagger:l,cacheKey:g,running:q.running||0,itemIndex:n,blockTransition:h,closeAnimationFns:q.closeAnimationFns||[]});g=k(d);h&&(W(g,!0),e&&d.css(e));b&&(g.style[E+"PlayState"]="paused");return!0}function J(a,d,b,c,e){function f(){d.off(C,l);d.removeClass(q);d.removeClass(r);
25
+z&&I.cancel(z);K(d,b);var a=k(d),c;for(c in p)a.style.removeProperty(p[c])}function l(a){a.stopPropagation();var d=a.originalEvent||a;a=d.$manualTimeStamp||d.timeStamp||Date.now();d=parseFloat(d.elapsedTime.toFixed(3));Math.max(a-B,0)>=A&&d>=x&&c()}var m=k(d);a=d.data("$$ngAnimateCSS3Data");if(-1!=m.getAttribute("class").indexOf(b)&&a){var q="",r="";g(b.split(" "),function(a,d){var b=(0<d?" ":"")+a;q+=b+"-active";r+=b+"-pending"});var p=[],t=a.itemIndex,v=a.stagger,s=0;if(0<t){s=0;0<v.transitionDelay&&
26
+0===v.transitionDuration&&(s=v.transitionDelay*t);var y=0;0<v.animationDelay&&0===v.animationDuration&&(y=v.animationDelay*t,p.push(Y+"animation-play-state"));s=Math.round(100*Math.max(s,y))/100}s||(d.addClass(q),a.blockTransition&&W(m,!1));var D=V(d,a.cacheKey+" "+q),x=Math.max(D.transitionDuration,D.animationDuration);if(0===x)d.removeClass(q),K(d,b),c();else{!s&&e&&(D.transitionDuration||(d.css("transition",D.animationDuration+"s linear all"),p.push("transition")),d.css(e));var t=Math.max(D.transitionDelay,
27
+D.animationDelay),A=1E3*t;0<p.length&&(v=m.getAttribute("style")||"",";"!==v.charAt(v.length-1)&&(v+=";"),m.setAttribute("style",v+" "));var B=Date.now(),C=X+" "+Z,t=1E3*(s+1.5*(t+x)),z;0<s&&(d.addClass(r),z=I(function(){z=null;0<D.transitionDuration&&W(m,!1);0<D.animationDuration&&(m.style[E+"PlayState"]="");d.addClass(q);d.removeClass(r);e&&(0===D.transitionDuration&&d.css("transition",D.animationDuration+"s linear all"),d.css(e),p.push("transition"))},1E3*s,!1));d.on(C,l);a.closeAnimationFns.push(function(){f();
28
+c()});a.running++;P(d,t);return f}}else c()}function W(a,d){a.style[L+"Property"]=d?"none":""}function Q(a,d,b,c){if(z(a,d,b,c))return function(a){a&&K(d,b)}}function R(a,d,b,c,e){if(d.data("$$ngAnimateCSS3Data"))return J(a,d,b,c,e);K(d,b);c()}function y(a,d,b,c,e){var f=Q(a,d,b,e.from);if(f){var g=f;C(d,function(){g=R(a,d,b,c,e.to)});return function(a){(g||s)(a)}}x();c()}function K(a,d){a.removeClass(d);var b=a.data("$$ngAnimateCSS3Data");b&&(b.running&&b.running--,b.running&&0!==b.running||a.removeData("$$ngAnimateCSS3Data"))}
29
+function l(a,d){var b="";a=$(a)?a:a.split(/\s+/);g(a,function(a,c){a&&0<a.length&&(b+=(0<c?" ":"")+a+d)});return b}var Y="",L,Z,E,X;M.ontransitionend===S&&M.onwebkittransitionend!==S?(Y="-webkit-",L="WebkitTransition",Z="webkitTransitionEnd transitionend"):(L="transition",Z="transitionend");M.onanimationend===S&&M.onwebkitanimationend!==S?(Y="-webkit-",E="WebkitAnimation",X="webkitAnimationEnd animationend"):(E="animation",X="animationend");var a={},c=0,b=[],e,m=null,N=0,p=[];return{animate:function(a,
30
+d,b,c,e,f){f=f||{};f.from=b;f.to=c;return y("animate",a,d,e,f)},enter:function(a,b,c){c=c||{};return y("enter",a,"ng-enter",b,c)},leave:function(a,b,c){c=c||{};return y("leave",a,"ng-leave",b,c)},move:function(a,b,c){c=c||{};return y("move",a,"ng-move",b,c)},beforeSetClass:function(a,b,c,e,f){f=f||{};b=l(c,"-remove")+" "+l(b,"-add");if(f=Q("setClass",a,b,f.from))return C(a,e),f;x();e()},beforeAddClass:function(a,b,c,e){e=e||{};if(b=Q("addClass",a,l(b,"-add"),e.from))return C(a,c),b;x();c()},beforeRemoveClass:function(a,
31
+b,c,e){e=e||{};if(b=Q("removeClass",a,l(b,"-remove"),e.from))return C(a,c),b;x();c()},setClass:function(a,b,c,e,f){f=f||{};c=l(c,"-remove");b=l(b,"-add");return R("setClass",a,c+" "+b,e,f.to)},addClass:function(a,b,c,e){e=e||{};return R("addClass",a,l(b,"-add"),c,e.to)},removeClass:function(a,b,c,e){e=e||{};return R("removeClass",a,l(b,"-remove"),c,e.to)}}}])}])})(window,window.angular);
32
+//# sourceMappingURL=angular-animate.min.js.map
securis/src/main/webapp/js/angular/angular-animate.min.js.map
....@@ -0,0 +1,8 @@
1
+{
2
+"version":3,
3
+"file":"angular-animate.min.js",
4
+"lineCount":31,
5
+"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAgXtCD,CAAAE,OAAA,CAAe,WAAf,CAA4B,CAAC,IAAD,CAA5B,CAAAC,UAAA,CAgBa,mBAhBb,CAgBkC,QAAQ,EAAG,CAEzC,MAAO,SAAQ,CAACC,CAAD,CAAQC,CAAR,CAAiBC,CAAjB,CAAwB,CACjCC,CAAAA,CAAMD,CAAAE,kBACNR,EAAAS,SAAA,CAAiBF,CAAjB,CAAJ,EAA4C,CAA5C,GAA6BA,CAAAG,OAA7B,CACEL,CAAAM,KAAA,CAJsBC,qBAItB,CAAkC,CAAA,CAAlC,CADF,CAGER,CAAAS,OAAA,CAAaN,CAAb,CAAkB,QAAQ,CAACO,CAAD,CAAQ,CAChCT,CAAAM,KAAA,CAPoBC,qBAOpB,CAAkC,CAAEE,CAAAA,CAApC,CADgC,CAAlC,CALmC,CAFE,CAhB7C,CAAAC,QAAA,CAkCW,iBAlCX,CAkC8B,CAAC,OAAD,CAAU,WAAV,CAAuB,QAAQ,CAACC,CAAD,CAAQC,CAAR,CAAmB,CAE5E,MAAO,SAAQ,CAACC,CAAD,CAAK,CAElB,MAAOF,EAAA,CAAM,QAAQ,EAAG,CAOtBE,CAAA,EAPsB,CAAjB,CAFW,CAFwD,CAAlD,CAlC9B,CAAAC,OAAA,CAkDU,CAAC,UAAD,CAAa,kBAAb,CAAiC,QAAQ,CAACC,CAAD,CAAWC,CAAX,CAA6B,CAc5EC,QAASA,EAAkB,CAACjB,CAAD,CAAU,CACnC,IAAQ,IAAAkB,EAAI,CAAZ,CAAeA,CAAf,CAAmBlB,CAAAK,OAAnB,CAAmCa,CAAA,EAAnC,CAAwC,CACtC,IAAIC,EAAMnB,CAAA,CAAQkB,CAAR,CACV,IATeE,CASf,EAAID,CAAAE,SAAJ,CACE,MAAOF,EAH6B,CADL,CAduC;AA+B5EG,QAASA,EAAiB,CAACC,CAAD,CAAOC,CAAP,CAAa,CACrC,MAAOP,EAAA,CAAmBM,CAAnB,CAAP,EAAmCN,CAAA,CAAmBO,CAAnB,CADE,CA9BvC,IAAIC,EAAO9B,CAAA8B,KAAX,CACIC,EAAU/B,CAAA+B,QADd,CAEIC,GAAYX,CAAAY,YAFhB,CAGIC,EAAUlC,CAAAkC,QAHd,CAIIzB,GAAWT,CAAAS,SAJf,CAKI0B,GAAWnC,CAAAmC,SALf,CAWIC,EAAmB,CAACC,QAAS,CAAA,CAAV,CAuBvBjB,EAAAkB,UAAA,CAAmB,UAAnB,CACI,CAAC,WAAD,CAAc,KAAd,CAAqB,WAArB,CAAkC,UAAlC,CAA8C,cAA9C,CAA8D,iBAA9D,CAAiF,YAAjF,CAA+F,WAA/F,CAA4G,kBAA5G,CACP,QAAQ,CAACC,CAAD,CAAcC,CAAd,CAAqBC,CAArB,CAAkCC,CAAlC,CAA8CC,CAA9C,CAA8DC,CAA9D,CAAiFC,CAAjF,CAA+F5B,CAA/F,CAA4G6B,CAA5G,CAA8H,CAqCjIC,QAASA,EAA2B,CAAC1C,CAAD,CAAU2C,CAAV,CAAkB,CACpD,IAAIrC,EAAON,CAAAM,KAAA,CAlEQsC,kBAkER,CAAPtC,EAAyC,EACzCqC,EAAJ,GACErC,CAAA0B,QAEA,CAFe,CAAA,CAEf,CADA1B,CAAAuC,WACA,CADkB,CAAA,CAClB,CAAA7C,CAAAM,KAAA,CAtEiBsC,kBAsEjB,CAA+BtC,CAA/B,CAHF,CAKA,OAAOA,EAAAwC,SAAP,EAAyBxC,CAAA0B,QAAzB,EAAyC1B,CAAAuC,WAPW,CAUtDE,QAASA,EAAsB,CAAClC,CAAD,CAAK,CAAA,IAC9BmC,CAD8B,CACpBC,EAAQd,CAAAc,MAAA,EACtBA,EAAAC,QAAAC,WAAA;AAA2BC,QAAQ,EAAG,CACpCJ,CAAA,EAAYA,CAAA,EADwB,CAGtCR,EAAAa,aAAA,CAAwB,QAAQ,EAAG,CACjCL,CAAA,CAAWnC,CAAA,CAAG,QAAQ,EAAG,CACvBoC,CAAAK,QAAA,EADuB,CAAd,CADsB,CAAnC,CAKA,OAAOL,EAAAC,QAV2B,CAapCK,QAASA,EAAmB,CAACC,CAAD,CAAU,CAIpC,GAAI1B,EAAA,CAAS0B,CAAT,CAAJ,CAIE,MAHIA,EAAAC,YAGGD,EAHoBpD,EAAA,CAASoD,CAAAC,YAAT,CAGpBD,GAFLA,CAAAC,YAEKD,CAFiBA,CAAAC,YAAAC,MAAA,CAA0B,KAA1B,CAEjBF,EAAAA,CAR2B,CAYtCG,QAASA,EAAqB,CAAC3D,CAAD,CAAU4D,CAAV,CAAiBC,CAAjB,CAAoC,CAChEA,CAAA,CAAoBA,CAApB,EAAyC,EAEzC,KAAIC,EAAS,EACbpC,EAAA,CAAQmC,CAAR,CAA2B,QAAQ,CAACvD,CAAD,CAAOyD,CAAP,CAAiB,CAClDrC,CAAA,CAAQqC,CAAAL,MAAA,CAAe,GAAf,CAAR,CAA6B,QAAQ,CAACM,CAAD,CAAI,CACvCF,CAAA,CAAOE,CAAP,CAAA,CAAU1D,CAD6B,CAAzC,CADkD,CAApD,CAMA,KAAI2D,EAAaC,MAAAC,OAAA,CAAc,IAAd,CACjBzC,EAAA,CAAQgC,CAAC1D,CAAAoE,KAAA,CAAa,OAAb,CAADV,EAA0B,EAA1BA,OAAA,CAAoC,KAApC,CAAR,CAAoD,QAAQ,CAACW,CAAD,CAAY,CACtEJ,CAAA,CAAWI,CAAX,CAAA,CAAwB,CAAA,CAD8C,CAAxE,CAXgE,KAe5DC,EAAQ,EAfoD,CAehDC,EAAW,EAC3B7C,EAAA,CAAQkC,CAAAY,QAAR,CAAuB,QAAQ,CAACC,CAAD,CAASJ,CAAT,CAAoB,CACjD,IAAIK,EAAWT,CAAA,CAAWI,CAAX,CAAf,CACIM,EAAoBb,CAAA,CAAOO,CAAP,CAApBM,EAAyC,EAU9B,EAAA,CAAf,GAAIF,CAAJ,EAEMC,CAFN,EAE6C,UAF7C,EAEkBC,CAAAC,MAFlB,GAGIL,CAAAM,KAAA,CAAcR,CAAd,CAHJ,CAKsB,CAAA,CALtB,GAKWI,CALX,GAOOC,CAPP,EAO8C,aAP9C;AAOmBC,CAAAC,MAPnB,EAQIN,CAAAO,KAAA,CAAWR,CAAX,CARJ,CAZiD,CAAnD,CAyBA,OAA0C,EAA1C,CAAQC,CAAAjE,OAAR,CAAuBkE,CAAAlE,OAAvB,EAA+C,CAACiE,CAAAQ,KAAA,CAAW,GAAX,CAAD,CAAkBP,CAAAO,KAAA,CAAc,GAAd,CAAlB,CAzCiB,CA4ClEhB,QAASA,EAAM,CAACiB,CAAD,CAAO,CACpB,GAAIA,CAAJ,CAAU,CAAA,IACJC,EAAU,EADN,CAEJC,EAAU,EACVT,EAAAA,CAAUO,CAAAG,OAAA,CAAY,CAAZ,CAAAxB,MAAA,CAAqB,GAArB,CAUd,EAAIrB,CAAA8C,YAAJ,EAA4B9C,CAAA+C,WAA5B,GACEJ,CAAAH,KAAA,CAAazC,CAAAiD,IAAA,CAAc1D,EAAA,CAAU,EAAV,CAAd,CAAb,CAGF,KAAQ,IAAAT,EAAE,CAAV,CAAaA,CAAb,CAAiBsD,CAAAnE,OAAjB,CAAiCa,CAAA,EAAjC,CAAsC,CAAA,IAChCoE,EAAQd,CAAA,CAAQtD,CAAR,CADwB,CAEhCqE,EAAsB5D,EAAA,CAAU2D,CAAV,CACtBC,EAAJ,EAA4B,CAAAN,CAAA,CAAQK,CAAR,CAA5B,GACEN,CAAAH,KAAA,CAAazC,CAAAiD,IAAA,CAAcE,CAAd,CAAb,CACA,CAAAN,CAAA,CAAQK,CAAR,CAAA,CAAiB,CAAA,CAFnB,CAHoC,CAQtC,MAAON,EAzBC,CADU,CA8BtBQ,QAASA,EAAe,CAACxF,CAAD,CAAUyF,CAAV,CAA0BpB,CAA1B,CAAqCb,CAArC,CAA8C,CAyDpEkC,QAASA,EAAiB,CAACC,CAAD,CAAmBf,CAAnB,CAA0B,CAClD,IAAIgB,EAAUD,CAAA,CAAiBf,CAAjB,CAAd,CACIiB,EAAWF,CAAA,CAAiB,QAAjB,CAA4Bf,CAAAkB,OAAA,CAAa,CAAb,CAAAC,YAAA,EAA5B,CAA4DnB,CAAAM,OAAA,CAAa,CAAb,CAA5D,CACf,IAAIU,CAAJ,EAAeC,CAAf,CAYE,MAXa,OAWN,EAXHjB,CAWG,GAVLiB,CAEA,CAFWD,CAEX,CAAAA,CAAA,CAAU,IAQL,EANPI,CAAAnB,KAAA,CAAW,CACTD,MAAQA,CADC,CACM/D,GAAK+E,CADX,CAAX,CAMO,CAHPK,CAAApB,KAAA,CAAY,CACVD,MAAQA,CADE,CACK/D,GAAKgF,CADV,CAAZ,CAGO,CAAA,CAAA,CAfyC,CAmBpDK,QAASA,EAAG,CAACC,CAAD,CAAMC,CAAN,CAAqBC,CAArB,CAAoC,CAC9C,IAAIjB,EAAa,EACjB1D,EAAA,CAAQyE,CAAR,CAAa,QAAQ,CAACG,CAAD,CAAY,CAC/BA,CAAAzF,GAAA;AAAgBuE,CAAAP,KAAA,CAAgByB,CAAhB,CADe,CAAjC,CAIA,KAAIC,EAAQ,CAaZ7E,EAAA,CAAQ0D,CAAR,CAAoB,QAAQ,CAACkB,CAAD,CAAYE,CAAZ,CAAmB,CAC7C,IAAIC,EAAWA,QAAQ,EAAG,CAbW,CAAA,CAAA,CACrC,GAAIL,CAAJ,CAAmB,CACjB,CAACA,CAAA,CAYsBI,CAZtB,CAAD,EAAyB/E,CAAzB,GACA,IAAI,EAAE8E,CAAN,CAAcnB,CAAA/E,OAAd,CAAiC,MAAA,CACjC+F,EAAA,CAAgB,IAHC,CAKnBC,CAAA,EANqC,CAaX,CAG1B,QAAOC,CAAA1B,MAAP,EACE,KAAK,UAAL,CACEwB,CAAAvB,KAAA,CAAmByB,CAAAzF,GAAA,CAAab,CAAb,CAAsB0G,CAAtB,CAAoCC,CAApC,CAAqDF,CAArD,CAA+DjD,CAA/D,CAAnB,CACA,MACF,MAAK,SAAL,CACE4C,CAAAvB,KAAA,CAAmByB,CAAAzF,GAAA,CAAab,CAAb,CAAsBqE,CAAtB,CAAiCb,CAAAoD,KAAjC,CAA+CpD,CAAAqD,GAA/C,CAA2DJ,CAA3D,CAAnB,CACA,MACF,MAAK,UAAL,CACEL,CAAAvB,KAAA,CAAmByB,CAAAzF,GAAA,CAAab,CAAb,CAAsB0G,CAAtB,EAAsCrC,CAAtC,CAAqDoC,CAArD,CAA+DjD,CAA/D,CAAnB,CACA,MACF,MAAK,aAAL,CACE4C,CAAAvB,KAAA,CAAmByB,CAAAzF,GAAA,CAAab,CAAb,CAAsB2G,CAAtB,EAAyCtC,CAAzC,CAAqDoC,CAArD,CAA+DjD,CAA/D,CAAnB,CACA,MACF,SACE4C,CAAAvB,KAAA,CAAmByB,CAAAzF,GAAA,CAAab,CAAb,CAAsByG,CAAtB,CAAgCjD,CAAhC,CAAnB,CAdJ,CAJ6C,CAA/C,CAuBI4C,EAAJ,EAA8C,CAA9C,GAAqBA,CAAA/F,OAArB,EACEgG,CAAA,EA3C4C,CAzEhD,IAAIS,EAAO9G,CAAA,CAAQ,CAAR,CACX,IAAK8G,CAAL,CAAA,CAIItD,CAAJ,GACEA,CAAAqD,GACA,CADarD,CAAAqD,GACb,EAD2B,EAC3B,CAAArD,CAAAoD,KAAA,CAAepD,CAAAoD,KAAf,EAA+B,EAFjC,CAKA,KAAIF,CAAJ,CACIC,CACA9E,EAAA,CAAQwC,CAAR,CAAJ,GACEqC,CAEA,CAFerC,CAAA,CAAU,CAAV,CAEf,CADAsC,CACA,CADkBtC,CAAA,CAAU,CAAV,CAClB,CAAKqC,CAAL,CAGYC,CAAL,CAILtC,CAJK,CAIOqC,CAJP,CAIsB,GAJtB,CAI4BC,CAJ5B,EACLtC,CACA,CADYqC,CACZ,CAAAjB,CAAA,CAAiB,UAFZ,CAHP,EACEpB,CACA,CADYsC,CACZ,CAAAlB,CAAA,CAAiB,aAFnB,CAHF,CAcA;IAAIsB,EAAwC,UAAxCA,EAAsBtB,CAA1B,CACIuB,EAAeD,CAAfC,EACoC,UADpCA,EACkBvB,CADlBuB,EAEoC,aAFpCA,EAEkBvB,CAFlBuB,EAGoC,SAHpCA,EAGkBvB,CAJtB,CAOIjB,EADmBxE,CAAAoE,KAAA6C,CAAa,OAAbA,CACnBzC,CAA6B,GAA7BA,CAAmCH,CACvC,IAAK6C,CAAA,CAAsB1C,CAAtB,CAAL,CAAA,CArCoE,IAyChE2C,EAAiB1F,CAzC+C,CA0ChE2F,EAAe,EA1CiD,CA2ChEnB,EAAS,EA3CuD,CA4ChEoB,EAAgB5F,CA5CgD,CA6ChE6F,EAAc,EA7CkD,CA8ChEtB,EAAQ,EA9CwD,CAgDhEuB,EAAkBC,CAAC,GAADA,CAAOhD,CAAPgD,SAAA,CAAwB,MAAxB,CAA+B,GAA/B,CACtB9F,EAAA,CAAQoC,CAAA,CAAOyD,CAAP,CAAR,CAAiC,QAAQ,CAAC5B,CAAD,CAAmB,CAC5C8B,CAAA/B,CAAA+B,CAAkB9B,CAAlB8B,CAAoChC,CAApCgC,CACd,EAAgBV,CAAhB,GACErB,CAAA,CAAkBC,CAAlB,CAAoC,UAApC,CACA,CAAAD,CAAA,CAAkBC,CAAlB,CAAoC,aAApC,CAFF,CAF0D,CAA5D,CA0EA,OAAO,CACLmB,KAAOA,CADF,CAELlC,MAAQa,CAFH,CAGLpB,UAAYA,CAHP,CAIL2C,aAAeA,CAJV,CAKLD,oBAAsBA,CALjB,CAMLW,YAAcA,QAAQ,EAAG,CACnBlE,CAAJ,EACExD,CAAA2H,IAAA,CAAYhI,CAAAiI,OAAA,CAAepE,CAAAoD,KAAf,EAA+B,EAA/B,CAAmCpD,CAAAqD,GAAnC,EAAiD,EAAjD,CAAZ,CAFqB,CANpB,CAWLZ,OAASA,QAAQ,CAACI,CAAD,CAAgB,CAC/Bc,CAAA,CAAiBd,CACjBH,EAAA,CAAID,CAAJ,CAAYmB,CAAZ,CAA0B,QAAQ,EAAG,CACnCD,CAAA,CAAiB1F,CACjB4E,EAAA,EAFmC,CAArC,CAF+B,CAX5B,CAkBLL,MAAQA,QAAQ,CAACK,CAAD,CAAgB,CAC9BgB,CAAA,CAAgBhB,CAChBH,EAAA,CAAIF,CAAJ,CAAWsB,CAAX,CAAwB,QAAQ,EAAG,CACjCD,CAAA,CAAgB5F,CAChB4E,EAAA,EAFiC,CAAnC,CAF8B,CAlB3B,CAyBLwB,OAASA,QAAQ,EAAG,CACdT,CAAJ,GACE1F,CAAA,CAAQ0F,CAAR,CAAsB,QAAQ,CAACpE,CAAD,CAAW,CACvC,CAACA,CAAD;AAAavB,CAAb,EAAmB,CAAA,CAAnB,CADuC,CAAzC,CAGA,CAAA0F,CAAA,CAAe,CAAA,CAAf,CAJF,CAMIG,EAAJ,GACE5F,CAAA,CAAQ4F,CAAR,CAAqB,QAAQ,CAACtE,CAAD,CAAW,CACtC,CAACA,CAAD,EAAavB,CAAb,EAAmB,CAAA,CAAnB,CADsC,CAAxC,CAGA,CAAA4F,CAAA,CAAc,CAAA,CAAd,CAJF,CAPkB,CAzBf,CAtFP,CAjCA,CAJoE,CAyoBtES,QAASA,EAAgB,CAACrC,CAAD,CAAiBpB,CAAjB,CAA4BrE,CAA5B,CAAqC+H,CAArC,CAAoDC,CAApD,CAAkEC,CAAlE,CAAgFzE,CAAhF,CAAyF0E,CAAzF,CAAuG,CAmJ9HC,QAASA,EAAe,CAACC,CAAD,CAAiB,CACvC,IAAIC,EAAY,WAAZA,CAA0BD,CAC1BE,EAAJ,EAAqBA,CAAA,CAAcD,CAAd,CAArB,EAAmF,CAAnF,CAAiDC,CAAA,CAAcD,CAAd,CAAAhI,OAAjD,EACEkC,CAAA,CAAgB,QAAQ,EAAG,CACzBvC,CAAAuI,eAAA,CAAuBF,CAAvB,CAAkC,CAChCzD,MAAQa,CADwB,CAEhCpB,UAAYA,CAFoB,CAAlC,CADyB,CAA3B,CAHqC,CAYzCmE,QAASA,EAAuB,EAAG,CACjCL,CAAA,CAAgB,QAAhB,CADiC,CAInCM,QAASA,EAAsB,EAAG,CAChCN,CAAA,CAAgB,OAAhB,CADgC,CAWlCO,QAASA,EAAgB,EAAG,CACrBA,CAAAC,WAAL,GACED,CAAAC,WACA,CAD8B,CAAA,CAC9B,CAAAV,CAAA,EAFF,CAD0B,CAO5BW,QAASA,EAAc,EAAG,CACxB,GAAKD,CAAAC,CAAAD,WAAL,CAAgC,CAC1BE,CAAJ,EACEA,CAAAnB,YAAA,EAGFkB,EAAAD,WAAA,CAA4B,CAAA,CACxBnF,EAAJ,EAAeA,CAAAC,YAAf,EACE/B,CAAA,CAAQ8B,CAAAC,YAAR,CAA6B,QAAQ,CAACY,CAAD,CAAY,CAC/CrE,CAAA8I,YAAA,CAAoBzE,CAApB,CAD+C,CAAjD,CAKF,KAAI/D,EAAON,CAAAM,KAAA,CAz/BIsC,kBAy/BJ,CACPtC,EAAJ,GAMMuI,CAAJ,EAAcA,CAAA7B,aAAd,CACE+B,CAAA,CAAQ/I,CAAR,CAAiBqE,CAAjB,CADF,EAGE9B,CAAA,CAAgB,QAAQ,EAAG,CACzB,IAAIjC;AAAON,CAAAM,KAAA,CApgCFsC,kBAogCE,CAAPtC,EAAyC,EACzC0I,EAAJ,EAA2B1I,CAAAkG,MAA3B,EACEuC,CAAA,CAAQ/I,CAAR,CAAiBqE,CAAjB,CAA4BoB,CAA5B,CAHuB,CAA3B,CAMA,CAAAzF,CAAAM,KAAA,CAzgCWsC,kBAygCX,CAA+BtC,CAA/B,CATF,CANF,CA3BF6H,EAAA,CAAgB,OAAhB,CACAD,EAAA,EAagC,CADR,CAnL1B,IAAIW,EAASrD,CAAA,CAAgBxF,CAAhB,CAAyByF,CAAzB,CAAyCpB,CAAzC,CAAoDb,CAApD,CACb,IAAKqF,CAAAA,CAAL,CAKE,MAJAH,EAAA,EAHejH,CAIf+G,CAAA,EAJe/G,CAKfgH,CAAA,EALehH,CAMfmH,CAAA,EANenH,CAAAA,CAUjBgE,EAAA,CAAiBoD,CAAAjE,MACjBP,EAAA,CAAYwE,CAAAxE,UACZ,KAAIiE,EAAgB3I,CAAAK,QAAAiJ,MAAA,CAAsBJ,CAAA/B,KAAtB,CAApB,CACAwB,EAAgBA,CAAhBA,EAAiCA,CAAAY,OAE5BnB,EAAL,GACEA,CADF,CACkBC,CAAA,CAAeA,CAAAmB,OAAA,EAAf,CAAuCnJ,CAAAmJ,OAAA,EADzD,CAQA,IAAIC,CAAA,CAAmBpJ,CAAnB,CAA4B+H,CAA5B,CAAJ,CAKE,MAJAW,EAAA,EAxBejH,CAyBf+G,CAAA,EAzBe/G,CA0BfgH,CAAA,EA1BehH,CA2BfmH,CAAA,EA3BenH,CAAAA,CA+Bb4H,EAAAA,CAAkBrJ,CAAAM,KAAA,CAv1BHsC,kBAu1BG,CAAlByG,EAAoD,EACxD,KAAIxF,EAAwBwF,CAAAC,OAAxBzF,EAAiD,EAArD,CACI0F,EAAwBF,CAAAG,YAAxBD,EAAsD,CAD1D,CAEIE,EAAwBJ,CAAAK,KACxBC,EAAAA,CAAgB,CAAA,CAEpB,IAA4B,CAA5B,CAAIJ,CAAJ,CAA+B,CACzBK,CAAAA,CAAqB,EACzB,IAAKf,CAAA7B,aAAL,CAWkC,UAA3B,EAAIyC,CAAA7E,MAAJ,EACLgF,CAAA/E,KAAA,CAAwB4E,CAAxB,CACA,CAAAV,CAAA,CAAQ/I,CAAR,CAAiBqE,CAAjB,CAFK,EAIER,CAAA,CAAkBQ,CAAlB,CAJF,GAKDwF,EACJ,CADchG,CAAA,CAAkBQ,CAAlB,CACd,CAAIwF,EAAAjF,MAAJ,EAAqBa,CAArB,CACEkE,CADF,CACkB,CAAA,CADlB,EAGEC,CAAA/E,KAAA,CAAwBgF,EAAxB,CACA,CAAAd,CAAA,CAAQ/I,CAAR,CAAiBqE,CAAjB,CAJF,CANK,CAXP,KACE,IAAsB,OAAtB;AAAIoB,CAAJ,EAAiC5B,CAAA,CAAkB,UAAlB,CAAjC,CACE8F,CAAA,CAAgB,CAAA,CADlB,KAEO,CAEL,IAAQrE,IAAAA,EAAR,GAAiBzB,EAAjB,CACE+F,CAAA/E,KAAA,CAAwBhB,CAAA,CAAkByB,EAAlB,CAAxB,CAEF+D,EAAA,CAAiB,EACjBN,EAAA,CAAQ/I,CAAR,CAAiB,CAAA,CAAjB,CANK,CAsBuB,CAAhC,CAAI4J,CAAAvJ,OAAJ,EACEqB,CAAA,CAAQkI,CAAR,CAA4B,QAAQ,CAACE,CAAD,CAAY,CAC9CA,CAAAjC,OAAA,EAD8C,CAAhD,CA5B2B,CAkC3Bb,CAAA6B,CAAA7B,aAAJ,EACQ6B,CAAA9B,oBADR,EAEyB,SAFzB,EAEOtB,CAFP,EAGQkE,CAHR,GAIEA,CAJF,CAIqC,UAJrC,EAImBlE,CAJnB,EAIoDzF,CAAA0E,SAAA,CAAiBL,CAAjB,CAJpD,CAOA,IAAIsF,CAAJ,CAKE,MAJAjB,EAAA,EA/EejH,CAgFf+G,CAAA,EAhFe/G,CAiFfgH,CAAA,EAjFehH,CAuKf0G,CAAA,CAAgB,OAAhB,CAvKe1G,CAwKfyG,CAAA,EAxKezG,CAAAA,CAsFjBoC,EAAA,CAAwBwF,CAAAC,OAAxB,EAAiD,EACjDC,EAAA,CAAwBF,CAAAG,YAAxB,EAAsD,CAEtD,IAAsB,OAAtB,EAAI/D,CAAJ,CAIEzF,CAAA+J,IAAA,CAAY,UAAZ,CAAwB,QAAQ,CAACC,CAAD,CAAI,CAC9BhK,CAAAA,CAAUL,CAAAK,QAAA,CAAgB,IAAhB,CACd,KAAIiK,EAAQjK,CAAAM,KAAA,CAv5BGsC,kBAu5BH,CACRqH,EAAJ,GACMC,CADN,CAC6BD,CAAAX,OAAA,CAAa,UAAb,CAD7B,IAGIY,CAAArC,OAAA,EACA,CAAAkB,CAAA,CAAQ/I,CAAR,CAAiB,UAAjB,CAJJ,CAHkC,CAApC,CAeFA,EAAAmK,SAAA,CAl6BwBC,YAk6BxB,CACI5G,EAAJ,EAAeA,CAAAC,YAAf,EACE/B,CAAA,CAAQ8B,CAAAC,YAAR,CAA6B,QAAQ,CAACY,CAAD,CAAY,CAC/CrE,CAAAmK,SAAA,CAAiB9F,CAAjB,CAD+C,CAAjD,CAKF;IAAI2E,EAAsBqB,CAAA,EAC1Bd,EAAA,EACA1F,EAAA,CAAkBQ,CAAlB,CAAA,CAA+BwE,CAE/B7I,EAAAM,KAAA,CA/6BmBsC,kBA+6BnB,CAA+B,CAC7B8G,KAAOb,CADsB,CAE7BS,OAASzF,CAFoB,CAG7B2C,MAAQwC,CAHqB,CAI7BQ,YAAcD,CAJe,CAA/B,CASAf,EAAA,EACAK,EAAA5C,OAAA,CAAc,QAAQ,CAACqE,CAAD,CAAY,CAChC,IAAIhK,EAAON,CAAAM,KAAA,CA17BMsC,kBA07BN,CACX0H,EAAA,CAAYA,CAAZ,EACc,CAAChK,CADf,EACuB,CAACA,CAAAgJ,OAAA,CAAYjF,CAAZ,CADxB,EAEewE,CAAA7B,aAFf,EAEsC1G,CAAAgJ,OAAA,CAAYjF,CAAZ,CAAAO,MAFtC,EAEsEa,CAEtEiD,EAAA,EACkB,EAAA,CAAlB,GAAI4B,CAAJ,CACE1B,CAAA,EADF,EAGEH,CAAA,EACA,CAAAI,CAAA7C,MAAA,CAAa4C,CAAb,CAJF,CAPgC,CAAlC,CAeA,OAAOC,EAAAhB,OAjJuH,CA0NhI0C,QAASA,EAAqB,CAACvK,CAAD,CAAU,CAEtC,GADI8G,CACJ,CADW7F,CAAA,CAAmBjB,CAAnB,CACX,CACMwK,CAGJ,CAHY7K,CAAA8K,WAAA,CAAmB3D,CAAA4D,uBAAnB,CAAA,CACV5D,CAAA4D,uBAAA,CAnhCoBN,YAmhCpB,CADU,CAEVtD,CAAA6D,iBAAA,CAAsB,aAAtB,CACF,CAAAjJ,CAAA,CAAQ8I,CAAR,CAAe,QAAQ,CAACxK,CAAD,CAAU,CAC/BA,CAAA,CAAUL,CAAAK,QAAA,CAAgBA,CAAhB,CAEV,EADIM,CACJ,CADWN,CAAAM,KAAA,CAzhCIsC,kBAyhCJ,CACX,GAAYtC,CAAAgJ,OAAZ,EACE5H,CAAA,CAAQpB,CAAAgJ,OAAR,CAAqB,QAAQ,CAACT,CAAD,CAAS,CACpCA,CAAAhB,OAAA,EADoC,CAAtC,CAJ6B,CAAjC,CANoC,CAr/ByF;AAugCjIkB,QAASA,EAAO,CAAC/I,CAAD,CAAUqE,CAAV,CAAqB,CACnC,GAAI/C,CAAA,CAAkBtB,CAAlB,CAA2BsC,CAA3B,CAAJ,CACOP,CAAAe,SAAL,GACEf,CAAAC,QACA,CAD2B,CAAA,CAC3B,CAAAD,CAAAc,WAAA,CAA8B,CAAA,CAFhC,CADF,KAKO,IAAIwB,CAAJ,CAAe,CACpB,IAAI/D,EAAON,CAAAM,KAAA,CA1iCMsC,kBA0iCN,CAAPtC,EAAyC,EAA7C,CAEIsK,EAAiC,CAAA,CAAjCA,GAAmBvG,CAClBuG,EAAAA,CAAL,EAAyBtK,CAAAgJ,OAAzB,EAAwChJ,CAAAgJ,OAAA,CAAYjF,CAAZ,CAAxC,GACE/D,CAAAkJ,YAAA,EACA,CAAA,OAAOlJ,CAAAgJ,OAAA,CAAYjF,CAAZ,CAFT,CAKA,IAAIuG,CAAJ,EAAyBpB,CAAAlJ,CAAAkJ,YAAzB,CACExJ,CAAA8I,YAAA,CAjjCoBsB,YAijCpB,CACA,CAAApK,CAAA6K,WAAA,CApjCejI,kBAojCf,CAXkB,CANa,CAsBrCwG,QAASA,EAAkB,CAACpJ,CAAD,CAAU+H,CAAV,CAAyB,CAClD,GAAIhG,CAAAe,SAAJ,CACE,MAAO,CAAA,CAGT,IAAIxB,CAAA,CAAkBtB,CAAlB,CAA2BsC,CAA3B,CAAJ,CACE,MAAOP,EAAAC,QANyC,KAS9C8I,CAT8C,CASxBC,CATwB,CASAC,CAClD,GAAG,CAID,GAA6B,CAA7B,GAAIjD,CAAA1H,OAAJ,CAAgC,KAEhC,KAAI4K,EAAS3J,CAAA,CAAkByG,CAAlB,CAAiCzF,CAAjC,CAAb,CACI2H,EAAQgB,CAAA,CAASlJ,CAAT,CAA6BgG,CAAAzH,KAAA,CA1kCxBsC,kBA0kCwB,CAA7B,EAAqE,EACjF,IAAIqH,CAAAnH,SAAJ,CACE,MAAO,CAAA,CAKLmI,EAAJ,GACED,CADF,CACc,CAAA,CADd,CAM6B,EAAA,CAA7B,GAAIF,CAAJ,GACMI,CACJ,CAD0BnD,CAAAzH,KAAA,CAvlCRC,qBAulCQ,CAC1B,CAAIZ,CAAAwL,UAAA,CAAkBD,CAAlB,CAAJ;CACEJ,CADF,CACyBI,CADzB,CAFF,CAOAH,EAAA,CAAyBA,CAAzB,EACyBd,CAAAjI,QADzB,EAE0BiI,CAAAP,KAF1B,EAEwC,CAACO,CAAAP,KAAA1C,aA7BxC,CAAH,MA+BMe,CA/BN,CA+BsBA,CAAAoB,OAAA,EA/BtB,CAiCA,OAAO,CAAC6B,CAAR,EAAsB,CAACF,CAAvB,EAA+CC,CA3CG,CA3hCpDzI,CAAAhC,KAAA,CA9BqBsC,kBA8BrB,CAAoCb,CAApC,CAMA,KAAIqJ,EAAkB5I,CAAAhC,OAAA,CACpB,QAAQ,EAAG,CAAE,MAAOiC,EAAA4I,qBAAT,CADS,CAEpB,QAAQ,CAACnL,CAAD,CAAMoL,CAAN,CAAc,CACR,CAAZ,GAAIpL,CAAJ,GACAkL,CAAA,EASA,CAAA5I,CAAAa,aAAA,CAAwB,QAAQ,EAAG,CACjCb,CAAAa,aAAA,CAAwB,QAAQ,EAAG,CACjCtB,CAAAC,QAAA,CAA2B,CAAA,CADM,CAAnC,CADiC,CAAnC,CAVA,CADoB,CAFF,CAAtB,CAqBIqI,EAAyB,CArB7B,CAsBIkB,EAAkBvK,CAAAuK,gBAAA,EAtBtB,CAuBIrE,EAAyBqE,CAAD,CAElB,QAAQ,CAAClH,CAAD,CAAY,CACpB,MAAOkH,EAAAC,KAAA,CAAqBnH,CAArB,CADa,CAFF,CAClB,QAAQ,EAAG,CAAE,MAAO,CAAA,CAAT,CAkVrB,OAAO,CAiDLoH,QAAUA,QAAQ,CAACzL,CAAD,CAAU4G,CAAV,CAAgBC,CAAhB,CAAoBxC,CAApB,CAA+Bb,CAA/B,CAAwC,CACxDa,CAAA,CAAYA,CAAZ,EAAyB,mBACzBb,EAAA,CAAUD,CAAA,CAAoBC,CAApB,CAAV,EAA0C,EAC1CA,EAAAoD,KAAA,CAAeC,CAAA,CAAKD,CAAL,CAAY,IAC3BpD,EAAAqD,GAAA,CAAeA,CAAA,CAAKA,CAAL,CAAUD,CAEzB,OAAO7D,EAAA,CAAuB,QAAQ,CAAC2I,CAAD,CAAO,CAC3C,MAAO5D,EAAA,CAAiB,SAAjB,CAA4BzD,CAA5B,CAnbN1E,CAAAK,QAAA,CAAgBiB,CAAA,CAmbsDjB,CAnbtD,CAAhB,CAmbM;AAA0E,IAA1E,CAAgF,IAAhF,CAAsFyB,CAAtF,CAA4F+B,CAA5F,CAAqGkI,CAArG,CADoC,CAAtC,CANiD,CAjDrD,CA6FLC,MAAQA,QAAQ,CAAC3L,CAAD,CAAU+H,CAAV,CAAyBC,CAAzB,CAAuCxE,CAAvC,CAAgD,CAC9DA,CAAA,CAAUD,CAAA,CAAoBC,CAApB,CACVxD,EAAA,CAAUL,CAAAK,QAAA,CAAgBA,CAAhB,CACV+H,EAAA,CAA+BA,CAA/B,EA/dcpI,CAAAK,QAAA,CA+diB+H,CA/djB,CAgedC,EAAA,CAA8BA,CAA9B,EAhecrI,CAAAK,QAAA,CAgegBgI,CAhehB,CAkedtF,EAAA,CAA4B1C,CAA5B,CAAqC,CAAA,CAArC,CACAkC,EAAAyJ,MAAA,CAAgB3L,CAAhB,CAAyB+H,CAAzB,CAAwCC,CAAxC,CACA,OAAOjF,EAAA,CAAuB,QAAQ,CAAC2I,CAAD,CAAO,CAC3C,MAAO5D,EAAA,CAAiB,OAAjB,CAA0B,UAA1B,CAjeNnI,CAAAK,QAAA,CAAgBiB,CAAA,CAieqDjB,CAjerD,CAAhB,CAieM,CAAyE+H,CAAzE,CAAwFC,CAAxF,CAAsGvG,CAAtG,CAA4G+B,CAA5G,CAAqHkI,CAArH,CADoC,CAAtC,CARuD,CA7F3D,CAyILE,MAAQA,QAAQ,CAAC5L,CAAD,CAAUwD,CAAV,CAAmB,CACjCA,CAAA,CAAUD,CAAA,CAAoBC,CAApB,CACVxD,EAAA,CAAUL,CAAAK,QAAA,CAAgBA,CAAhB,CAEVuK,EAAA,CAAsBvK,CAAtB,CACA0C,EAAA,CAA4B1C,CAA5B,CAAqC,CAAA,CAArC,CACA,OAAO+C,EAAA,CAAuB,QAAQ,CAAC2I,CAAD,CAAO,CAC3C,MAAO5D,EAAA,CAAiB,OAAjB,CAA0B,UAA1B,CA3gBNnI,CAAAK,QAAA,CAAgBiB,CAAA,CA2gBqDjB,CA3gBrD,CAAhB,CA2gBM,CAAyE,IAAzE,CAA+E,IAA/E,CAAqF,QAAQ,EAAG,CACrGkC,CAAA0J,MAAA,CAAgB5L,CAAhB,CADqG,CAAhG,CAEJwD,CAFI,CAEKkI,CAFL,CADoC,CAAtC,CAN0B,CAzI9B,CAwLLG,KAAOA,QAAQ,CAAC7L,CAAD,CAAU+H,CAAV,CAAyBC,CAAzB,CAAuCxE,CAAvC,CAAgD,CAC7DA,CAAA,CAAUD,CAAA,CAAoBC,CAApB,CACVxD,EAAA,CAAUL,CAAAK,QAAA,CAAgBA,CAAhB,CACV+H,EAAA,CAA+BA,CAA/B,EA1jBcpI,CAAAK,QAAA,CA0jBiB+H,CA1jBjB,CA2jBdC,EAAA,CAA8BA,CAA9B,EA3jBcrI,CAAAK,QAAA,CA2jBgBgI,CA3jBhB,CA6jBduC,EAAA,CAAsBvK,CAAtB,CACA0C,EAAA,CAA4B1C,CAA5B,CAAqC,CAAA,CAArC,CACAkC,EAAA2J,KAAA,CAAe7L,CAAf,CAAwB+H,CAAxB,CAAuCC,CAAvC,CACA,OAAOjF,EAAA,CAAuB,QAAQ,CAAC2I,CAAD,CAAO,CAC3C,MAAO5D,EAAA,CAAiB,MAAjB;AAAyB,SAAzB,CA7jBNnI,CAAAK,QAAA,CAAgBiB,CAAA,CA6jBmDjB,CA7jBnD,CAAhB,CA6jBM,CAAuE+H,CAAvE,CAAsFC,CAAtF,CAAoGvG,CAApG,CAA0G+B,CAA1G,CAAmHkI,CAAnH,CADoC,CAAtC,CATsD,CAxL1D,CAoOLvB,SAAWA,QAAQ,CAACnK,CAAD,CAAUqE,CAAV,CAAqBb,CAArB,CAA8B,CAC/C,MAAO,KAAAsI,SAAA,CAAc9L,CAAd,CAAuBqE,CAAvB,CAAkC,EAAlC,CAAsCb,CAAtC,CADwC,CApO5C,CAsQLsF,YAAcA,QAAQ,CAAC9I,CAAD,CAAUqE,CAAV,CAAqBb,CAArB,CAA8B,CAClD,MAAO,KAAAsI,SAAA,CAAc9L,CAAd,CAAuB,EAAvB,CAA2BqE,CAA3B,CAAsCb,CAAtC,CAD2C,CAtQ/C,CAsSLsI,SAAWA,QAAQ,CAAC9L,CAAD,CAAU+L,CAAV,CAAeC,CAAf,CAAuBxI,CAAvB,CAAgC,CACjDA,CAAA,CAAUD,CAAA,CAAoBC,CAApB,CAGVxD,EAAA,CAAUL,CAAAK,QAAA,CAAgBA,CAAhB,CACVA,EAAA,CAtqBGL,CAAAK,QAAA,CAAgBiB,CAAA,CAsqBgBjB,CAtqBhB,CAAhB,CAwqBH,IAAI0C,CAAA,CAA4B1C,CAA5B,CAAJ,CACE,MAAOkC,EAAA+J,sBAAA,CAAgCjM,CAAhC,CAAyC+L,CAAzC,CAA8CC,CAA9C,CAAsDxI,CAAtD,CARwC,KAa7CgB,CAb6C,CAapCZ,EAAQ5D,CAAAM,KAAA,CAVH4L,kBAUG,CAb4B,CAc7CC,EAAW,CAAEvI,CAAAA,CACZA,EAAL,GACEA,CADF,CACU,CACF,QAAU,EADR,CADV,CAIAY,EAAA,CAAUZ,CAAAY,QAEVuH,EAAA,CAAMlK,CAAA,CAAQkK,CAAR,CAAA,CAAeA,CAAf,CAAqBA,CAAArI,MAAA,CAAU,GAAV,CAC3BhC,EAAA,CAAQqK,CAAR,CAAa,QAAQ,CAACK,CAAD,CAAI,CACnBA,CAAJ,EAASA,CAAA/L,OAAT,GACEmE,CAAA,CAAQ4H,CAAR,CADF,CACe,CAAA,CADf,CADuB,CAAzB,CAMAJ,EAAA,CAASnK,CAAA,CAAQmK,CAAR,CAAA,CAAkBA,CAAlB,CAA2BA,CAAAtI,MAAA,CAAa,GAAb,CACpChC,EAAA,CAAQsK,CAAR,CAAgB,QAAQ,CAACI,CAAD,CAAI,CACtBA,CAAJ,EAASA,CAAA/L,OAAT,GACEmE,CAAA,CAAQ4H,CAAR,CADF,CACe,CAAA,CADf,CAD0B,CAA5B,CAMA,IAAID,CAAJ,CAME,MALI3I,EAKGN,EALQU,CAAAJ,QAKRN,GAJLU,CAAAJ,QAIKN;AAJWvD,CAAAiI,OAAA,CAAehE,CAAAJ,QAAf,EAAgC,EAAhC,CAAoCA,CAApC,CAIXN,EAAAU,CAAAV,QAEPlD,EAAAM,KAAA,CAxCgB4L,kBAwChB,CAA0BtI,CAA1B,CAAkC,CAChCY,QAAUA,CADsB,CAEhChB,QAAUA,CAFsB,CAAlC,CAMF,OAAOI,EAAAV,QAAP,CAAuBH,CAAA,CAAuB,QAAQ,CAAC2I,CAAD,CAAO,CAC3D,IAAI3D,EAAgB/H,CAAAmJ,OAAA,EAApB,CACIkD,EAAcpL,CAAA,CAAmBjB,CAAnB,CADlB,CAEIsM,EAAaD,CAAAC,WAEjB,IAAKA,CAAAA,CAAL,EAAmBA,CAAA,aAAnB,EAAiDD,CAAA,aAAjD,CACEX,CAAA,EADF,KAAA,CAKI9H,CAAAA,CAAQ5D,CAAAM,KAAA,CAxDI4L,kBAwDJ,CACZlM,EAAA6K,WAAA,CAzDgBqB,kBAyDhB,CAEIjC,KAAAA,EAAQjK,CAAAM,KAAA,CAlvBGsC,kBAkvBH,CAARqH,EAA0C,EAA1CA,CACAzF,EAAUb,CAAA,CAAsB3D,CAAtB,CAA+B4D,CAA/B,CAAsCqG,CAAAX,OAAtC,CACd,OAAQ9E,EAAD,CAEHsD,CAAA,CAAiB,UAAjB,CAA6BtD,CAA7B,CAAsCxE,CAAtC,CAA+C+H,CAA/C,CAA8D,IAA9D,CAAoE,QAAQ,EAAG,CACzEvD,CAAA,CAAQ,CAAR,CAAJ,EAAgBtC,CAAAqK,sBAAA,CAAgCvM,CAAhC,CAAyCwE,CAAA,CAAQ,CAAR,CAAzC,CACZA,EAAA,CAAQ,CAAR,CAAJ,EAAgBtC,CAAAsK,yBAAA,CAAmCxM,CAAnC,CAA4CwE,CAAA,CAAQ,CAAR,CAA5C,CAF6D,CAA/E,CAGGZ,CAAAJ,QAHH,CAGkBkI,CAHlB,CAFG,CACHA,CAAA,EAXJ,CAL2D,CAAtC,CAjD0B,CAtS9C,CAyXL7D,OAASA,QAAQ,CAAC3E,CAAD,CAAU,CACzBA,CAAAC,WAAA,EADyB,CAzXtB;AA0YLsJ,QAAUA,QAAQ,CAAChM,CAAD,CAAQT,CAAR,CAAiB,CACjC,OAAO0M,SAAArM,OAAP,EACE,KAAK,CAAL,CACE,GAAII,CAAJ,CACEsI,CAAA,CAAQ/I,CAAR,CADF,KAEO,CACL,IAAIM,EAAON,CAAAM,KAAA,CA9xBAsC,kBA8xBA,CAAPtC,EAAyC,EAC7CA,EAAAwC,SAAA,CAAgB,CAAA,CAChB9C,EAAAM,KAAA,CAhyBWsC,kBAgyBX,CAA+BtC,CAA/B,CAHK,CAKT,KAEA,MAAK,CAAL,CACEyB,CAAAe,SAAA,CAA4B,CAACrC,CAC/B,MAEA,SACEA,CAAA,CAAQ,CAACsB,CAAAe,SAhBb,CAmBA,MAAO,CAAErC,CAAAA,CApBwB,CA1Y9B,CAlX0H,CAD/H,CADJ,CA8kCAO,EAAA2L,SAAA,CAA0B,EAA1B,CAA8B,CAAC,SAAD,CAAY,UAAZ,CAAwB,UAAxB,CAAoC,iBAApC,CACP,QAAQ,CAACC,CAAD,CAAYvK,CAAZ,CAAwBwK,CAAxB,CAAoCC,CAApC,CAAqD,CA6ClFC,QAASA,EAAqB,EAAG,CAC1BC,CAAL,GACEA,CADF,CAC0BF,CAAA,CAAgB,QAAQ,EAAG,CACjDG,CAAA,CAAuB,EACvBD,EAAA,CAAwB,IACxBE,EAAA,CAAc,EAHmC,CAA3B,CAD1B,CAD+B,CAUjCC,QAASA,EAAW,CAACnN,CAAD,CAAUoN,CAAV,CAAoB,CAClCJ,CAAJ,EACEA,CAAA,EAEFC,EAAApI,KAAA,CAA0BuI,CAA1B,CACAJ,EAAA,CAAwBF,CAAA,CAAgB,QAAQ,EAAG,CACjDpL,CAAA,CAAQuL,CAAR,CAA8B,QAAQ,CAACpM,CAAD,CAAK,CACzCA,CAAA,EADyC,CAA3C,CAIAoM,EAAA,CAAuB,EACvBD,EAAA,CAAwB,IACxBE,EAAA,CAAc,EAPmC,CAA3B,CALc,CAmBxCG,QAASA,EAAqB,CAACrN,CAAD,CAAUsN,CAAV,CAAqB,CACjD,IAAIxG,EAAO7F,CAAA,CAAmBjB,CAAnB,CACXA,EAAA,CAAUL,CAAAK,QAAA,CAAgB8G,CAAhB,CAIVyG,EAAA1I,KAAA,CAA2B7E,CAA3B,CAIIwN,EAAAA,CAAkBC,IAAAC,IAAA,EAAlBF;AAA+BF,CAC/BE,EAAJ,EAAuBG,CAAvB,GAIAd,CAAAhF,OAAA,CAAgB+F,CAAhB,CAGA,CADAD,CACA,CADmBH,CACnB,CAAAI,CAAA,CAAef,CAAA,CAAS,QAAQ,EAAG,CACjCgB,CAAA,CAAmBN,CAAnB,CACAA,EAAA,CAAwB,EAFS,CAApB,CAGZD,CAHY,CAGD,CAAA,CAHC,CAPf,CAXiD,CAwBnDO,QAASA,EAAkB,CAACC,CAAD,CAAW,CACpCpM,CAAA,CAAQoM,CAAR,CAAkB,QAAQ,CAAC9N,CAAD,CAAU,CAElC,CADI+N,CACJ,CADkB/N,CAAAM,KAAA,CAhEQ0N,qBAgER,CAClB,GACEtM,CAAA,CAAQqM,CAAAE,kBAAR,CAAuC,QAAQ,CAACpN,CAAD,CAAK,CAClDA,CAAA,EADkD,CAApD,CAHgC,CAApC,CADoC,CAWtCqN,QAASA,EAA0B,CAAClO,CAAD,CAAUmO,CAAV,CAAoB,CACrD,IAAI7N,EAAO6N,CAAA,CAAWjB,CAAA,CAAYiB,CAAZ,CAAX,CAAmC,IAC9C,IAAK7N,CAAAA,CAAL,CAAW,CACT,IAAI8N,EAAqB,CAAzB,CACIC,EAAkB,CADtB,CAEIC,EAAoB,CAFxB,CAGIC,EAAiB,CAGrB7M,EAAA,CAAQ1B,CAAR,CAAiB,QAAQ,CAACA,CAAD,CAAU,CACjC,GAjuCWoB,CAiuCX,EAAIpB,CAAAqB,SAAJ,CAAsC,CAChCmN,CAAAA,CAAgB5B,CAAA6B,iBAAA,CAAyBzO,CAAzB,CAAhBwO,EAAqD,EAGzDJ,EAAA,CAAqBM,IAAAC,IAAA,CAASC,CAAA,CADAJ,CAAAK,CAAcC,CAAdD,CA5FnBE,UA4FmBF,CACA,CAAT,CAAgDT,CAAhD,CAGrBC,EAAA,CAAmBK,IAAAC,IAAA,CAASC,CAAA,CADDJ,CAAAQ,CAAcF,CAAdE,CA7FnBC,OA6FmBD,CACC,CAAT,CAA6CX,CAA7C,CAGnBE,EAAA,CAAmBG,IAAAC,IAAA,CAASC,CAAA,CAAaJ,CAAA,CAAcU,CAAd,CAjGjCD,OAiGiC,CAAb,CAAT,CAAkEV,CAAlE,CAEnB,KAAIY,EAAaP,CAAA,CAAaJ,CAAA,CAAcU,CAAd,CArGnBH,UAqGmB,CAAb,CAED,EAAhB,CAAII,CAAJ,GACEA,CADF,EACeC,QAAA,CAASZ,CAAA,CAAcU,CAAd,CArGIG,gBAqGJ,CAAT,CAAwE,EAAxE,CADf,EAC8F,CAD9F,CAGAf,EAAA,CAAoBI,IAAAC,IAAA,CAASQ,CAAT,CAAoBb,CAApB,CAjBgB,CADL,CAAnC,CAqBAhO,EAAA,CAAO,CACLgP,MAAQ,CADH,CAELjB,gBAAiBA,CAFZ;AAGLD,mBAAoBA,CAHf,CAILG,eAAgBA,CAJX,CAKLD,kBAAmBA,CALd,CAOHH,EAAJ,GACEjB,CAAA,CAAYiB,CAAZ,CADF,CAC0B7N,CAD1B,CAnCS,CAuCX,MAAOA,EAzC8C,CA4CvDsO,QAASA,EAAY,CAACW,CAAD,CAAM,CACzB,IAAIC,EAAW,CACXC,EAAAA,CAASrP,EAAA,CAASmP,CAAT,CAAA,CACXA,CAAA7L,MAAA,CAAU,SAAV,CADW,CAEX,EACFhC,EAAA,CAAQ+N,CAAR,CAAgB,QAAQ,CAAChP,CAAD,CAAQ,CAC9B+O,CAAA,CAAWd,IAAAC,IAAA,CAASe,UAAA,CAAWjP,CAAX,CAAT,EAA8B,CAA9B,CAAiC+O,CAAjC,CADmB,CAAhC,CAGA,OAAOA,EARkB,CAqB3BG,QAASA,EAAY,CAAClK,CAAD,CAAiBzF,CAAjB,CAA0BqE,CAA1B,CAAqCuL,CAArC,CAA6C,CAC5D/M,CAAAA,CAAqE,CAArEA,EAAa,CAAC,UAAD,CAAY,UAAZ,CAAuB,SAAvB,CAAAgN,QAAA,CAA0CxL,CAA1C,CAEjB,KAAI8J,CAAJ,CAZIpG,EAYuB/H,CAZPmJ,OAAA,EAYpB,CAXI2G,EAAW/H,CAAAzH,KAAA,CAnIWyP,gBAmIX,CACVD,EAAL,GACE/H,CAAAzH,KAAA,CArIwByP,gBAqIxB,CAA0C,EAAEC,CAA5C,CACA,CAAAF,CAAA,CAAWE,CAFb,CAIA,EAAA,CAAOF,CAAP,CAAkB,GAAlB,CAAwB7O,CAAA,CAMGjB,CANH,CAAAiQ,aAAA,CAAyC,OAAzC,CAOpBC,KAAAA,EAAgB/B,CAAhB+B,CAA2B,GAA3BA,CAAiC7L,CAAjC6L,CACAC,EAAYjD,CAAA,CAAYgD,CAAZ,CAAA,CAA6B,EAAEhD,CAAA,CAAYgD,CAAZ,CAAAZ,MAA/B,CAAkE,CAD9EY,CAGAE,EAAU,EACd,IAAgB,CAAhB,CAAID,CAAJ,CAAmB,CACjB,IAAIE,EAAmBhM,CAAnBgM,CAA+B,UAAnC,CACIC,EAAkBnC,CAAlBmC,CAA6B,GAA7BA,CAAmCD,CAGvC,EAFIE,CAEJ,CAFmB,CAACrD,CAAA,CAAYoD,CAAZ,CAEpB,GAAgBtQ,CAAAmK,SAAA,CAAiBkG,CAAjB,CAEhBD,EAAA,CAAUlC,CAAA,CAA2BlO,CAA3B,CAAoCsQ,CAApC,CAEVC,EAAA,EAAgBvQ,CAAA8I,YAAA,CAAoBuH,CAApB,CATC,CAYnBrQ,CAAAmK,SAAA,CAAiB9F,CAAjB,CAEImM;IAAAA,EAAaxQ,CAAAM,KAAA,CAhKW0N,qBAgKX,CAAbwC,EAAsD,EAAtDA,CACAC,EAAUvC,CAAA,CAA2BlO,CAA3B,CAAoCkQ,CAApC,CACV9B,EAAAA,CAAqBqC,CAAArC,mBACrBE,EAAAA,CAAoBmC,CAAAnC,kBAExB,IAAIzL,CAAJ,EAAyC,CAAzC,GAAkBuL,CAAlB,EAAoE,CAApE,GAA8CE,CAA9C,CAEE,MADAtO,EAAA8I,YAAA,CAAoBzE,CAApB,CACO,CAAA,CAAA,CAGLqM,EAAAA,CAAkBd,CAAlBc,EAA6B7N,CAA7B6N,EAAgE,CAAhEA,CAA2CtC,CAC3CuC,EAAAA,CAAqC,CAArCA,CAAiBrC,CAAjBqC,EAC0C,CAD1CA,CACiBP,CAAA7B,eADjBoC,EAE+C,CAF/CA,GAEiBP,CAAA9B,kBAGrBtO,EAAAM,KAAA,CAhL4B0N,qBAgL5B,CAAsC,CACpCoC,QAAUA,CAD0B,CAEpCjC,SAAW+B,CAFyB,CAGpClO,QAAUwO,CAAAxO,QAAVA,EAAgC,CAHI,CAIpCmO,UAAYA,CAJwB,CAKpCO,gBAAkBA,CALkB,CAMpCzC,kBAPsBuC,CAAAvC,kBAOtBA,EAPsD,EAClB,CAAtC,CASInH,EAAAA,CAAO7F,CAAA,CAAmBjB,CAAnB,CAEP0Q,EAAJ,GACEE,CAAA,CAAiB9J,CAAjB,CAAuB,CAAA,CAAvB,CACA,CAAI8I,CAAJ,EACE5P,CAAA2H,IAAA,CAAYiI,CAAZ,CAHJ,CAOIe,EAAJ,GACkB7J,CAsKlB+J,MAAA,CAAW3B,CAAX,CA3W4B4B,WA2W5B,CAvKA,CAuK8D,QAvK9D,CAIA,OAAO,CAAA,CA5DyD,CA+DlEC,QAASA,EAAU,CAACtL,CAAD,CAAiBzF,CAAjB,CAA0BqE,CAA1B,CAAqC2M,CAArC,CAA8DpB,CAA9D,CAAsE,CAuHvFqB,QAASA,EAAK,EAAG,CACfjR,CAAAkR,IAAA,CAAYC,CAAZ,CAAiCC,CAAjC,CACApR,EAAA8I,YAAA,CAAoBuI,CAApB,CACArR,EAAA8I,YAAA,CAAoBwI,CAApB,CACIC;CAAJ,EACE1E,CAAAhF,OAAA,CAAgB0J,CAAhB,CAEFC,EAAA,CAAaxR,CAAb,CAAsBqE,CAAtB,CACA,KAAIyC,EAAO7F,CAAA,CAAmBjB,CAAnB,CAAX,CACSkB,CAAT,KAASA,CAAT,GAAcuQ,EAAd,CACE3K,CAAA+J,MAAAa,eAAA,CAA0BD,CAAA,CAAcvQ,CAAd,CAA1B,CAVa,CAcjBkQ,QAASA,EAAmB,CAACxM,CAAD,CAAQ,CAClCA,CAAA+M,gBAAA,EACA,KAAIC,EAAKhN,CAAAiN,cAALD,EAA4BhN,CAC5BkN,EAAAA,CAAYF,CAAAG,iBAAZD,EAAmCF,CAAAE,UAAnCA,EAAmDrE,IAAAC,IAAA,EAInDsE,EAAAA,CAActC,UAAA,CAAWkC,CAAAI,YAAAC,QAAA,CApVKC,CAoVL,CAAX,CASdxD,KAAAC,IAAA,CAASmD,CAAT,CAAqBK,CAArB,CAAgC,CAAhC,CAAJ,EAA0CC,CAA1C,EAA0DJ,CAA1D,EAAyEK,CAAzE,EACErB,CAAA,EAjBgC,CApIpC,IAAIlK,EAAO7F,CAAA,CAAmBjB,CAAnB,CACP+N,EAAAA,CAAc/N,CAAAM,KAAA,CA3MU0N,qBA2MV,CAClB,IAAsD,EAAtD,EAAIlH,CAAAmJ,aAAA,CAAkB,OAAlB,CAAAJ,QAAA,CAAmCxL,CAAnC,CAAJ,EAA4D0J,CAA5D,CAAA,CAKA,IAAIsD,EAAkB,EAAtB,CACIC,EAAmB,EACvB5P,EAAA,CAAQ2C,CAAAX,MAAA,CAAgB,GAAhB,CAAR,CAA8B,QAAQ,CAAC4B,CAAD,CAAQpE,CAAR,CAAW,CAC/C,IAAIoR,GAAc,CAAJ,CAAApR,CAAA,CAAQ,GAAR,CAAc,EAAxBoR,EAA8BhN,CAClC+L,EAAA,EAAmBiB,CAAnB,CAA4B,SAC5BhB,EAAA,EAAoBgB,CAApB,CAA6B,UAHkB,CAAjD,CAOA,KAAIb,EAAgB,EAApB,CACItB,EAAYpC,CAAAoC,UADhB,CAEIC,EAAUrC,CAAAqC,QAFd,CAGImC,EAAc,CAClB,IAAgB,CAAhB,CAAIpC,CAAJ,CAAmB,CACbqC,CAAAA,CAAyB,CACC,EAA9B,CAAIpC,CAAA/B,gBAAJ;AAAkE,CAAlE,GAAmC+B,CAAAhC,mBAAnC,GACEoE,CADF,CAC2BpC,CAAA/B,gBAD3B,CACqD8B,CADrD,CAIA,KAAIsC,EAAwB,CACC,EAA7B,CAAIrC,CAAA7B,eAAJ,EAAgE,CAAhE,GAAkC6B,CAAA9B,kBAAlC,GACEmE,CACA,CADwBrC,CAAA7B,eACxB,CADiD4B,CACjD,CAAAsB,CAAA5M,KAAA,CAAmB6N,CAAnB,CAAgC,sBAAhC,CAFF,CAKAH,EAAA,CAAc7D,IAAAiE,MAAA,CAAqE,GAArE,CAAWjE,IAAAC,IAAA,CAAS6D,CAAT,CAAiCC,CAAjC,CAAX,CAAd,CAA0F,GAZzE,CAedF,CAAL,GACEvS,CAAAmK,SAAA,CAAiBkH,CAAjB,CACA,CAAItD,CAAA2C,gBAAJ,EACEE,CAAA,CAAiB9J,CAAjB,CAAuB,CAAA,CAAvB,CAHJ,CAQA,KAAI2J,EAAUvC,CAAA,CAA2BlO,CAA3B,CADM+N,CAAAI,SACN,CAD6B,GAC7B,CADmCkD,CACnC,CAAd,CACIgB,EAAc3D,IAAAC,IAAA,CAAS8B,CAAArC,mBAAT,CAAqCqC,CAAAnC,kBAArC,CAClB,IAAoB,CAApB,GAAI+D,CAAJ,CACErS,CAAA8I,YAAA,CAAoBuI,CAApB,CAEA,CADAG,CAAA,CAAaxR,CAAb,CAAsBqE,CAAtB,CACA,CAAA2M,CAAA,EAHF,KAAA,CAOKuB,CAAAA,CAAL,EAAoB3C,CAApB,GACOa,CAAArC,mBAIL,GAHEpO,CAAA2H,IAAA,CAAY,YAAZ,CAA0B8I,CAAAnC,kBAA1B,CAAsD,cAAtD,CACA,CAAAmD,CAAA5M,KAAA,CAAmB,YAAnB,CAEF,EAAA7E,CAAA2H,IAAA,CAAYiI,CAAZ,CALF,CAQIgD,KAAAA,EAAWlE,IAAAC,IAAA,CAAS8B,CAAApC,gBAAT;AAAkCoC,CAAAlC,eAAlC,CAAXqE,CACAR,EApQWS,GAoQXT,CAAeQ,CAEQ,EAA3B,CAAInB,CAAApR,OAAJ,GAIMyS,CAIJ,CAJehM,CAAAmJ,aAAA,CAAkB,OAAlB,CAIf,EAJ6C,EAI7C,CAH2C,GAG3C,GAHI6C,CAAAhN,OAAA,CAAgBgN,CAAAzS,OAAhB,CAAgC,CAAhC,CAGJ,GAFEyS,CAEF,EAFc,GAEd,EAAAhM,CAAAiM,aAAA,CAAkB,OAAlB,CAA2BD,CAA3B,CAxDUjC,GAwDV,CARF,CAWA,KAAIsB,EAAY1E,IAAAC,IAAA,EAAhB,CACIyD,EAAsB6B,CAAtB7B,CAA2C,GAA3CA,CAAiD8B,CADrD,CAGI3F,EApRWuF,GAoRXvF,EAAqBiF,CAArBjF,CArRoB4F,GAqRpB5F,EADqBsF,CACrBtF,CADgC+E,CAChC/E,EAHJ,CAKIiE,CACc,EAAlB,CAAIgB,CAAJ,GACEvS,CAAAmK,SAAA,CAAiBmH,CAAjB,CACA,CAAAC,CAAA,CAAiB1E,CAAA,CAAS,QAAQ,EAAG,CACnC0E,CAAA,CAAiB,IAEgB,EAAjC,CAAId,CAAArC,mBAAJ,EACEwC,CAAA,CAAiB9J,CAAjB,CAAuB,CAAA,CAAvB,CAE8B,EAAhC,CAAI2J,CAAAnC,kBAAJ,GACkBxH,CAsEtB+J,MAAA,CAAW3B,CAAX,CA3W4B4B,WA2W5B,CAvEI,CAuEqE,EAvErE,CAIA9Q,EAAAmK,SAAA,CAAiBkH,CAAjB,CACArR,EAAA8I,YAAA,CAAoBwI,CAApB,CAEI1B,EAAJ,GACqC,CAInC,GAJIa,CAAArC,mBAIJ,EAHEpO,CAAA2H,IAAA,CAAY,YAAZ,CAA0B8I,CAAAnC,kBAA1B,CAAsD,cAAtD,CAGF,CADAtO,CAAA2H,IAAA,CAAYiI,CAAZ,CACA,CAAA6B,CAAA5M,KAAA,CAAmB,YAAnB,CALF,CAbmC,CAApB,CAzRJgO,GAyRI,CAoBdN,CApBc,CAoBY,CAAA,CApBZ,CAFnB,CAyBAvS,EAAAmT,GAAA,CAAWhC,CAAX,CAAgCC,CAAhC,CACArD,EAAAE,kBAAApJ,KAAA,CAAmC,QAAQ,EAAG,CAC5CoM,CAAA,EACAD;CAAA,EAF4C,CAA9C,CAKAjD,EAAA/L,QAAA,EACAqL,EAAA,CAAsBrN,CAAtB,CAA+BsN,CAA/B,CACA,OAAO2D,EApEP,CA3CA,CAAA,IACED,EAAA,EAJqF,CA2JzFJ,QAASA,EAAgB,CAAC9J,CAAD,CAAOsM,CAAP,CAAa,CACpCtM,CAAA+J,MAAA,CAAW/B,CAAX,CA1WiBuE,UA0WjB,CAAA,CAA6CD,CAAA,CAAO,MAAP,CAAgB,EADzB,CAQtCE,QAASA,EAAa,CAAC7N,CAAD,CAAiBzF,CAAjB,CAA0BqE,CAA1B,CAAqCuL,CAArC,CAA6C,CACjE,GAAID,CAAA,CAAalK,CAAb,CAA6BzF,CAA7B,CAAsCqE,CAAtC,CAAiDuL,CAAjD,CAAJ,CACE,MAAO,SAAQ,CAACtF,CAAD,CAAY,CACzBA,CAAA,EAAakH,CAAA,CAAaxR,CAAb,CAAsBqE,CAAtB,CADY,CAFoC,CAQnEkP,QAASA,EAAY,CAAC9N,CAAD,CAAiBzF,CAAjB,CAA0BqE,CAA1B,CAAqCmP,CAArC,CAA6D5D,CAA7D,CAAqE,CACxF,GAAI5P,CAAAM,KAAA,CArXwB0N,qBAqXxB,CAAJ,CACE,MAAO+C,EAAA,CAAWtL,CAAX,CAA2BzF,CAA3B,CAAoCqE,CAApC,CAA+CmP,CAA/C,CAAuE5D,CAAvE,CAEP4B,EAAA,CAAaxR,CAAb,CAAsBqE,CAAtB,CACAmP,EAAA,EALsF,CAS1F/H,QAASA,EAAO,CAAChG,CAAD,CAAiBzF,CAAjB,CAA0BqE,CAA1B,CAAqCoP,CAArC,CAAwDjQ,CAAxD,CAAiE,CAI/E,IAAIkQ,EAAwBJ,CAAA,CAAc7N,CAAd,CAA8BzF,CAA9B,CAAuCqE,CAAvC,CAAkDb,CAAAoD,KAAlD,CAC5B,IAAK8M,CAAL,CAAA,CAWA,IAAI7L,EAAS6L,CACbvG,EAAA,CAAYnN,CAAZ,CAAqB,QAAQ,EAAG,CAI9B6H,CAAA,CAAS0L,CAAA,CAAa9N,CAAb,CAA6BzF,CAA7B,CAAsCqE,CAAtC,CAAiDoP,CAAjD,CAAoEjQ,CAAAqD,GAApE,CAJqB,CAAhC,CAOA,OAAO,SAAQ,CAACyD,CAAD,CAAY,CACzB,CAACzC,CAAD,EAAWpG,CAAX,EAAiB6I,CAAjB,CADyB,CAnB3B,CACEyC,CAAA,EACA0G,EAAA,EAP6E,CA6BjFjC,QAASA,EAAY,CAACxR,CAAD,CAAUqE,CAAV,CAAqB,CACxCrE,CAAA8I,YAAA,CAAoBzE,CAApB,CACA,KAAI/D,EAAON,CAAAM,KAAA,CA5ZiB0N,qBA4ZjB,CACP1N,EAAJ,GACMA,CAAA0B,QAGJ,EAFE1B,CAAA0B,QAAA,EAEF,CAAK1B,CAAA0B,QAAL,EAAsC,CAAtC,GAAqB1B,CAAA0B,QAArB,EACEhC,CAAA6K,WAAA,CAlawBmD,qBAkaxB,CALJ,CAHwC,CA9bwC;AAwhBlF2F,QAASA,EAAa,CAACnP,CAAD,CAAUoP,CAAV,CAAkB,CACtC,IAAIvP,EAAY,EAChBG,EAAA,CAAU3C,CAAA,CAAQ2C,CAAR,CAAA,CAAmBA,CAAnB,CAA6BA,CAAAd,MAAA,CAAc,KAAd,CACvChC,EAAA,CAAQ8C,CAAR,CAAiB,QAAQ,CAACc,CAAD,CAAQpE,CAAR,CAAW,CAC9BoE,CAAJ,EAA4B,CAA5B,CAAaA,CAAAjF,OAAb,GACEgE,CADF,GACoB,CAAJ,CAAAnD,CAAA,CAAQ,GAAR,CAAc,EAD9B,EACoCoE,CADpC,CAC4CsO,CAD5C,CADkC,CAApC,CAKA,OAAOvP,EAR+B,CAxhB0C,IAE9EqO,EAAa,EAFiE,CAE7D5D,CAF6D,CAE5CmE,CAF4C,CAEvB/D,CAFuB,CAEP8D,CAUvEtT,EAAAmU,gBAAJ,GAA+BjU,CAA/B,EAA4CF,CAAAoU,sBAA5C,GAA6ElU,CAA7E,EACE8S,CAEA,CAFa,UAEb,CADA5D,CACA,CADkB,kBAClB,CAAAmE,CAAA,CAAsB,mCAHxB,GAKEnE,CACA,CADkB,YAClB,CAAAmE,CAAA,CAAsB,eANxB,CASIvT,EAAAqU,eAAJ,GAA8BnU,CAA9B,EAA2CF,CAAAsU,qBAA3C,GAA2EpU,CAA3E,EACE8S,CAEA,CAFa,UAEb,CADAxD,CACA,CADiB,iBACjB,CAAA8D,CAAA,CAAqB,iCAHvB,GAKE9D,CACA,CADiB,WACjB,CAAA8D,CAAA,CAAqB,cANvB,CAoBA,KAAI9F,EAAc,EAAlB,CACI8C,EAAgB,CADpB,CAEI/C,EAAuB,EAF3B,CAGID,CAHJ,CA8BIY,EAAe,IA9BnB,CA+BID,EAAmB,CA/BvB,CAgCIJ,EAAwB,EAkY5B,OAAO,CACL9B,QAAUA,QAAQ,CAACzL,CAAD;AAAUqE,CAAV,CAAqBuC,CAArB,CAA2BC,CAA3B,CAA+BoN,CAA/B,CAAmDzQ,CAAnD,CAA4D,CAC5EA,CAAA,CAAUA,CAAV,EAAqB,EACrBA,EAAAoD,KAAA,CAAeA,CACfpD,EAAAqD,GAAA,CAAaA,CACb,OAAO4E,EAAA,CAAQ,SAAR,CAAmBzL,CAAnB,CAA4BqE,CAA5B,CAAuC4P,CAAvC,CAA2DzQ,CAA3D,CAJqE,CADzE,CAQLmI,MAAQA,QAAQ,CAAC3L,CAAD,CAAUiU,CAAV,CAA8BzQ,CAA9B,CAAuC,CACrDA,CAAA,CAAUA,CAAV,EAAqB,EACrB,OAAOiI,EAAA,CAAQ,OAAR,CAAiBzL,CAAjB,CAA0B,UAA1B,CAAsCiU,CAAtC,CAA0DzQ,CAA1D,CAF8C,CARlD,CAaLoI,MAAQA,QAAQ,CAAC5L,CAAD,CAAUiU,CAAV,CAA8BzQ,CAA9B,CAAuC,CACrDA,CAAA,CAAUA,CAAV,EAAqB,EACrB,OAAOiI,EAAA,CAAQ,OAAR,CAAiBzL,CAAjB,CAA0B,UAA1B,CAAsCiU,CAAtC,CAA0DzQ,CAA1D,CAF8C,CAblD,CAkBLqI,KAAOA,QAAQ,CAAC7L,CAAD,CAAUiU,CAAV,CAA8BzQ,CAA9B,CAAuC,CACpDA,CAAA,CAAUA,CAAV,EAAqB,EACrB,OAAOiI,EAAA,CAAQ,MAAR,CAAgBzL,CAAhB,CAAyB,SAAzB,CAAoCiU,CAApC,CAAwDzQ,CAAxD,CAF6C,CAlBjD,CAuBL0Q,eAAiBA,QAAQ,CAAClU,CAAD,CAAU+L,CAAV,CAAeC,CAAf,CAAuBiI,CAAvB,CAA2CzQ,CAA3C,CAAoD,CAC3EA,CAAA,CAAUA,CAAV,EAAqB,EACjBa,EAAAA,CAAYsP,CAAA,CAAc3H,CAAd,CAAsB,SAAtB,CAAZ3H,CAA+C,GAA/CA,CACYsP,CAAA,CAAc5H,CAAd,CAAmB,MAAnB,CAEhB,IADIoI,CACJ,CADyBb,CAAA,CAAc,UAAd,CAA0BtT,CAA1B,CAAmCqE,CAAnC,CAA8Cb,CAAAoD,KAA9C,CACzB,CAEE,MADAuG,EAAA,CAAYnN,CAAZ,CAAqBiU,CAArB,CACOE,CAAAA,CAETpH,EAAA,EACAkH,EAAA,EAV2E,CAvBxE,CAoCLG,eAAiBA,QAAQ,CAACpU,CAAD,CAAUqE,CAAV,CAAqB4P,CAArB,CAAyCzQ,CAAzC,CAAkD,CACzEA,CAAA,CAAUA,CAAV,EAAqB,EAErB,IADI2Q,CACJ,CADyBb,CAAA,CAAc,UAAd,CAA0BtT,CAA1B,CAAmC2T,CAAA,CAActP,CAAd,CAAyB,MAAzB,CAAnC,CAAqEb,CAAAoD,KAArE,CACzB,CAEE,MADAuG,EAAA,CAAYnN,CAAZ,CAAqBiU,CAArB,CACOE,CAAAA,CAETpH,EAAA,EACAkH,EAAA,EARyE,CApCtE,CA+CLI,kBAAoBA,QAAQ,CAACrU,CAAD;AAAUqE,CAAV,CAAqB4P,CAArB,CAAyCzQ,CAAzC,CAAkD,CAC5EA,CAAA,CAAUA,CAAV,EAAqB,EAErB,IADI2Q,CACJ,CADyBb,CAAA,CAAc,aAAd,CAA6BtT,CAA7B,CAAsC2T,CAAA,CAActP,CAAd,CAAyB,SAAzB,CAAtC,CAA2Eb,CAAAoD,KAA3E,CACzB,CAEE,MADAuG,EAAA,CAAYnN,CAAZ,CAAqBiU,CAArB,CACOE,CAAAA,CAETpH,EAAA,EACAkH,EAAA,EAR4E,CA/CzE,CA0DLnI,SAAWA,QAAQ,CAAC9L,CAAD,CAAU+L,CAAV,CAAeC,CAAf,CAAuBiI,CAAvB,CAA2CzQ,CAA3C,CAAoD,CACrEA,CAAA,CAAUA,CAAV,EAAqB,EACrBwI,EAAA,CAAS2H,CAAA,CAAc3H,CAAd,CAAsB,SAAtB,CACTD,EAAA,CAAM4H,CAAA,CAAc5H,CAAd,CAAmB,MAAnB,CAEN,OAAOwH,EAAA,CAAa,UAAb,CAAyBvT,CAAzB,CADSgM,CACT,CADkB,GAClB,CADwBD,CACxB,CAA6CkI,CAA7C,CAAiEzQ,CAAAqD,GAAjE,CAL8D,CA1DlE,CAkELsD,SAAWA,QAAQ,CAACnK,CAAD,CAAUqE,CAAV,CAAqB4P,CAArB,CAAyCzQ,CAAzC,CAAkD,CACnEA,CAAA,CAAUA,CAAV,EAAqB,EACrB,OAAO+P,EAAA,CAAa,UAAb,CAAyBvT,CAAzB,CAAkC2T,CAAA,CAActP,CAAd,CAAyB,MAAzB,CAAlC,CAAoE4P,CAApE,CAAwFzQ,CAAAqD,GAAxF,CAF4D,CAlEhE,CAuELiC,YAAcA,QAAQ,CAAC9I,CAAD,CAAUqE,CAAV,CAAqB4P,CAArB,CAAyCzQ,CAAzC,CAAkD,CACtEA,CAAA,CAAUA,CAAV,EAAqB,EACrB,OAAO+P,EAAA,CAAa,aAAb,CAA4BvT,CAA5B,CAAqC2T,CAAA,CAActP,CAAd,CAAyB,SAAzB,CAArC,CAA0E4P,CAA1E,CAA8FzQ,CAAAqD,GAA9F,CAF+D,CAvEnE,CA3c2E,CADtD,CAA9B,CAjnC4E,CAAtE,CAlDV,CAhXsC,CAArC,CAAD,CA0jEGnH,MA1jEH,CA0jEWA,MAAAC,QA1jEX;",
6
+"sources":["angular-animate.js"],
7
+"names":["window","angular","undefined","module","directive","scope","element","attrs","val","ngAnimateChildren","isString","length","data","NG_ANIMATE_CHILDREN","$watch","value","factory","$$rAF","$document","fn","config","$provide","$animateProvider","extractElementNode","i","elm","ELEMENT_NODE","nodeType","isMatchingElement","elm1","elm2","noop","forEach","selectors","$$selectors","isArray","isObject","rootAnimateState","running","decorator","$delegate","$$q","$injector","$sniffer","$rootElement","$$asyncCallback","$rootScope","$templateRequest","classBasedAnimationsBlocked","setter","NG_ANIMATE_STATE","structural","disabled","runAnimationPostDigest","cancelFn","defer","promise","$$cancelFn","defer.promise.$$cancelFn","$$postDigest","resolve","parseAnimateOptions","options","tempClasses","split","resolveElementClasses","cache","runningAnimations","lookup","selector","s","hasClasses","Object","create","attr","className","toAdd","toRemove","classes","status","hasClass","matchingAnimation","event","push","join","name","matches","flagMap","substr","transitions","animations","get","klass","selectorFactoryName","animationRunner","animationEvent","registerAnimation","animationFactory","afterFn","beforeFn","charAt","toUpperCase","after","before","run","fns","cancellations","allCompleteFn","animation","count","index","progress","classNameAdd","classNameRemove","from","to","node","isSetClassOperation","isClassBased","currentClassName","isAnimatableClassName","beforeComplete","beforeCancel","afterComplete","afterCancel","animationLookup","replace","created","applyStyles","css","extend","cancel","performAnimation","parentElement","afterElement","domOperation","doneCallback","fireDOMCallback","animationPhase","eventName","elementEvents","triggerHandler","fireBeforeCallbackAsync","fireAfterCallbackAsync","fireDOMOperation","hasBeenRun","closeAnimation","runner","removeClass","cleanup","localAnimationCount","_data","events","parent","animationsDisabled","ngAnimateState","active","totalActiveAnimations","totalActive","lastAnimation","last","skipAnimation","animationsToCancel","current","operation","one","e","state","activeLeaveAnimation","addClass","NG_ANIMATE_CLASS_NAME","globalAnimationCounter","cancelled","cancelChildAnimations","nodes","isFunction","getElementsByClassName","querySelectorAll","removeAnimations","removeData","allowChildAnimations","parentRunningAnimation","hasParent","isRoot","animateChildrenFlag","isDefined","deregisterWatch","totalPendingRequests","oldVal","classNameFilter","test","animate","done","enter","leave","move","setClass","add","remove","$$setClassImmediately","STORAGE_KEY","hasCache","c","elementNode","parentNode","$$addClassImmediately","$$removeClassImmediately","enabled","arguments","register","$window","$timeout","$$animateReflow","clearCacheAfterReflow","cancelAnimationReflow","animationReflowQueue","lookupCache","afterReflow","callback","animationCloseHandler","totalTime","animationElementQueue","futureTimestamp","Date","now","closingTimestamp","closingTimer","closeAllAnimations","elements","elementData","NG_ANIMATE_CSS_DATA_KEY","closeAnimationFns","getElementAnimationDetails","cacheKey","transitionDuration","transitionDelay","animationDuration","animationDelay","elementStyles","getComputedStyle","Math","max","parseMaxTime","transitionDurationStyle","TRANSITION_PROP","DURATION_KEY","transitionDelayStyle","DELAY_KEY","ANIMATION_PROP","aDuration","parseInt","ANIMATION_ITERATION_COUNT_KEY","total","str","maxValue","values","parseFloat","animateSetup","styles","indexOf","parentID","NG_ANIMATE_PARENT_KEY","parentCounter","getAttribute","eventCacheKey","itemIndex","stagger","staggerClassName","staggerCacheKey","applyClasses","formerData","timings","blockTransition","blockAnimation","blockTransitions","style","ANIMATION_PLAYSTATE_KEY","animateRun","activeAnimationComplete","onEnd","off","css3AnimationEvents","onAnimationProgress","activeClassName","pendingClassName","staggerTimeout","animateClose","appliedStyles","removeProperty","stopPropagation","ev","originalEvent","timeStamp","$manualTimeStamp","elapsedTime","toFixed","ELAPSED_TIME_MAX_DECIMAL_PLACES","startTime","maxDelayTime","maxDuration","prefix","staggerTime","transitionStaggerDelay","animationStaggerDelay","CSS_PREFIX","round","maxDelay","ONE_SECOND","oldStyle","setAttribute","ANIMATIONEND_EVENT","TRANSITIONEND_EVENT","CLOSING_TIME_BUFFER","on","bool","PROPERTY_KEY","animateBefore","animateAfter","afterAnimationComplete","animationComplete","preReflowCancellation","suffixClasses","suffix","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","animationCompleted","beforeSetClass","cancellationMethod","beforeAddClass","beforeRemoveClass"]
8
+}
securis/src/main/webapp/js/angular/angular-resource.min.js
....@@ -0,0 +1,13 @@
1
+/*
2
+ AngularJS v1.3.0
3
+ (c) 2010-2014 Google, Inc. http://angularjs.org
4
+ License: MIT
5
+*/
6
+(function(I,d,B){'use strict';function D(f,q){q=q||{};d.forEach(q,function(d,h){delete q[h]});for(var h in f)!f.hasOwnProperty(h)||"$"===h.charAt(0)&&"$"===h.charAt(1)||(q[h]=f[h]);return q}var w=d.$$minErr("$resource"),C=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var f=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}};
7
+this.$get=["$http","$q",function(q,h){function t(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function v(x,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){u(a)&&(a=a());var d;if(a&&a.charAt&&"@"==a.charAt(0)){d=b;var e=a.substr(1);if(null==e||""===e||"hasOwnProperty"===e||!C.test("."+e))throw w("badmember",e);for(var e=e.split("."),n=0,g=e.length;n<g&&d!==B;n++){var h=e[n];d=null!==d?d[h]:B}}else d=a;c[k]=d});return c}function F(b){return b.resource}function e(b){D(b||
8
+{},this)}var G=new t(x,m);l=s({},f.defaults.actions,l);e.prototype.toJSON=function(){var b=s({},this);delete b.$promise;delete b.$resolved;return b};r(l,function(b,k){var g=/^(POST|PUT|PATCH)$/i.test(b.method);e[k]=function(a,y,m,x){var n={},f,l,z;switch(arguments.length){case 4:z=x,l=m;case 3:case 2:if(u(y)){if(u(a)){l=a;z=y;break}l=y;z=m}else{n=a;f=y;l=m;break}case 1:u(a)?l=a:g?f=a:n=a;break;case 0:break;default:throw w("badargs",arguments.length);}var t=this instanceof e,p=t?f:b.isArray?[]:new e(f),
9
+A={},v=b.interceptor&&b.interceptor.response||F,C=b.interceptor&&b.interceptor.responseError||B;r(b,function(b,a){"params"!=a&&"isArray"!=a&&"interceptor"!=a&&(A[a]=H(b))});g&&(A.data=f);G.setUrlParams(A,s({},c(f,b.params||{}),n),b.url);n=q(A).then(function(a){var c=a.data,g=p.$promise;if(c){if(d.isArray(c)!==!!b.isArray)throw w("badcfg",k,b.isArray?"array":"object",d.isArray(c)?"array":"object");b.isArray?(p.length=0,r(c,function(a){"object"===typeof a?p.push(new e(a)):p.push(a)})):(D(c,p),p.$promise=
10
+g)}p.$resolved=!0;a.resource=p;return a},function(a){p.$resolved=!0;(z||E)(a);return h.reject(a)});n=n.then(function(a){var b=v(a);(l||E)(b,a.headers);return b},C);return t?n:(p.$promise=n,p.$resolved=!1,p)};e.prototype["$"+k]=function(a,b,c){u(a)&&(c=b,b=a,a={});a=e[k].call(this,a,this,b,c);return a.$promise||a}});e.bind=function(b){return v(x,s({},g,b),l)};return e}var E=d.noop,r=d.forEach,s=d.extend,H=d.copy,u=d.isFunction;t.prototype={setUrlParams:function(f,g,l){var m=this,c=l||m.template,h,
11
+e,q=m.urlParams={};r(c.split(/\W/),function(b){if("hasOwnProperty"===b)throw w("badname");!/^\d+$/.test(b)&&b&&(new RegExp("(^|[^\\\\]):"+b+"(\\W|$)")).test(c)&&(q[b]=!0)});c=c.replace(/\\:/g,":");g=g||{};r(m.urlParams,function(b,k){h=g.hasOwnProperty(k)?g[k]:m.defaults[k];d.isDefined(h)&&null!==h?(e=encodeURIComponent(h).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),c=c.replace(new RegExp(":"+
12
+k+"(\\W|$)","g"),function(b,a){return e+a})):c=c.replace(new RegExp("(/?):"+k+"(\\W|$)","g"),function(b,a,c){return"/"==c.charAt(0)?c:a+c})});m.defaults.stripTrailingSlashes&&(c=c.replace(/\/+$/,"")||"/");c=c.replace(/\/\.(?=\w+($|\?))/,".");f.url=c.replace(/\/\\\./,"/.");r(g,function(b,c){m.urlParams[c]||(f.params=f.params||{},f.params[c]=b)})}};return v}]})})(window,window.angular);
13
+//# sourceMappingURL=angular-resource.min.js.map
securis/src/main/webapp/js/angular/angular-resource.min.js.map
....@@ -0,0 +1,8 @@
1
+{
2
+"version":3,
3
+"file":"angular-resource.min.js",
4
+"lineCount":12,
5
+"mappings":"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",
6
+"sources":["angular-resource.js"],
7
+"names":["window","angular","undefined","shallowClearAndCopy","src","dst","forEach","value","key","hasOwnProperty","charAt","$resourceMinErr","$$minErr","MEMBER_NAME_REGEX","module","provider","defaults","stripTrailingSlashes","actions","method","isArray","$get","$http","$q","Route","template","extend","urlParams","resourceFactory","url","paramDefaults","options","extractParams","data","actionParams","ids","isFunction","path","test","keys","split","i","ii","length","obj","defaultResponseInterceptor","response","resource","Resource","route","prototype","toJSON","Resource.prototype.toJSON","$promise","$resolved","action","name","hasBody","a1","a2","a3","a4","params","success","error","arguments","isInstanceCall","httpConfig","responseInterceptor","interceptor","responseErrorInterceptor","responseError","copy","setUrlParams","promise","then","item","push","noop","reject","headers","result","call","bind","Resource.bind","additionalParamDefaults","config","actionUrl","self","val","encodedVal","param","RegExp","replace","_","urlParam","isDefined","encodeURIComponent","match","p1","leadingSlashes","tail"]
8
+}
securis/src/main/webapp/js/angular/angular-route.min.js
....@@ -0,0 +1,15 @@
1
+/*
2
+ AngularJS v1.3.0
3
+ (c) 2010-2014 Google, Inc. http://angularjs.org
4
+ License: MIT
5
+*/
6
+(function(p,e,B){'use strict';function u(q,h,f){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,b,c,g,x){function y(){k&&(f.cancel(k),k=null);l&&(l.$destroy(),l=null);m&&(k=f.leave(m),k.then(function(){k=null}),m=null)}function w(){var c=q.current&&q.current.locals;if(e.isDefined(c&&c.$template)){var c=a.$new(),g=q.current;m=x(c,function(c){f.enter(c,null,m||b).then(function(){!e.isDefined(s)||s&&!a.$eval(s)||h()});y()});l=g.scope=c;l.$emit("$viewContentLoaded");
7
+l.$eval(v)}else y()}var l,m,k,s=c.autoscroll,v=c.onload||"";a.$on("$routeChangeSuccess",w);w()}}}function z(e,h,f){return{restrict:"ECA",priority:-400,link:function(a,b){var c=f.current,g=c.locals;b.html(g.$template);var x=e(b.contents());c.controller&&(g.$scope=a,g=h(c.controller,g),c.controllerAs&&(a[c.controllerAs]=g),b.data("$ngControllerController",g),b.children().data("$ngControllerController",g));x(a)}}}p=e.module("ngRoute",["ng"]).provider("$route",function(){function q(a,b){return e.extend(new (e.extend(function(){},
8
+{prototype:a})),b)}function h(a,e){var c=e.caseInsensitiveMatch,g={originalPath:a,regexp:a},f=g.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,e,c,b){a="?"===b?b:null;b="*"===b?b:null;f.push({name:c,optional:!!a});e=e||"";return""+(a?"":e)+"(?:"+(a?e:"")+(b&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");g.regexp=new RegExp("^"+a+"$",c?"i":"");return g}var f={};this.when=function(a,b){f[a]=e.extend({reloadOnSearch:!0},b,a&&h(a,b));if(a){var c=
9
+"/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";f[c]=e.extend({redirectTo:a},h(c,b))}return this};this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(a,b,c,g,h,p,w){function l(b){var d=r.current;(u=(n=k())&&d&&n.$$route===d.$$route&&e.equals(n.pathParams,d.pathParams)&&!n.reloadOnSearch&&!v)||!d&&!n||a.$broadcast("$routeChangeStart",n,d).defaultPrevented&&
10
+b&&b.preventDefault()}function m(){var t=r.current,d=n;if(u)t.params=d.params,e.copy(t.params,c),a.$broadcast("$routeUpdate",t);else if(d||t)v=!1,(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?b.path(s(d.redirectTo,d.params)).search(d.params).replace():b.url(d.redirectTo(d.pathParams,b.path(),b.search())).replace()),g.when(d).then(function(){if(d){var a=e.extend({},d.resolve),b,c;e.forEach(a,function(d,b){a[b]=e.isString(d)?h.get(d):h.invoke(d,null,null,b)});e.isDefined(b=d.template)?e.isFunction(b)&&
11
+(b=b(d.params)):e.isDefined(c=d.templateUrl)&&(e.isFunction(c)&&(c=c(d.params)),c=w.getTrustedResourceUrl(c),e.isDefined(c)&&(d.loadedTemplateUrl=c,b=p(c)));e.isDefined(b)&&(a.$template=b);return g.all(a)}}).then(function(b){d==r.current&&(d&&(d.locals=b,e.copy(d.params,c)),a.$broadcast("$routeChangeSuccess",d,t))},function(b){d==r.current&&a.$broadcast("$routeChangeError",d,t,b)})}function k(){var a,d;e.forEach(f,function(c,g){var f;if(f=!d){var h=b.path();f=c.keys;var l={};if(c.regexp)if(h=c.regexp.exec(h)){for(var k=
12
+1,m=h.length;k<m;++k){var n=f[k-1],p=h[k];n&&p&&(l[n.name]=p)}f=l}else f=null;else f=null;f=a=f}f&&(d=q(c,{params:e.extend({},b.search(),a),pathParams:a}),d.$$route=c)});return d||f[null]&&q(f[null],{params:{},pathParams:{}})}function s(a,b){var c=[];e.forEach((a||"").split(":"),function(a,e){if(0===e)c.push(a);else{var f=a.match(/(\w+)(.*)/),g=f[1];c.push(b[g]);c.push(f[2]||"");delete b[g]}});return c.join("")}var v=!1,n,u,r={routes:f,reload:function(){v=!0;a.$evalAsync(function(){l();m()})},updateParams:function(a){if(this.current&&
13
+this.current.$$route){var c={},f=this;e.forEach(Object.keys(a),function(b){f.current.pathParams[b]||(c[b]=a[b])});a=e.extend({},this.current.params,a);b.path(s(this.current.$$route.originalPath,a));b.search(e.extend({},b.search(),c))}else throw A("norout");}};a.$on("$locationChangeStart",l);a.$on("$locationChangeSuccess",m);return r}]});var A=e.$$minErr("ngRoute");p.provider("$routeParams",function(){this.$get=function(){return{}}});p.directive("ngView",u);p.directive("ngView",z);u.$inject=["$route",
14
+"$anchorScroll","$animate"];z.$inject=["$compile","$controller","$route"]})(window,window.angular);
15
+//# sourceMappingURL=angular-route.min.js.map
securis/src/main/webapp/js/angular/angular-route.min.js.map
....@@ -0,0 +1,8 @@
1
+{
2
+"version":3,
3
+"file":"angular-route.min.js",
4
+"lineCount":14,
5
+"mappings":"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",
6
+"sources":["angular-route.js"],
7
+"names":["window","angular","undefined","ngViewFactory","$route","$anchorScroll","$animate","restrict","terminal","priority","transclude","link","scope","$element","attr","ctrl","$transclude","cleanupLastView","previousLeaveAnimation","cancel","currentScope","$destroy","currentElement","leave","then","update","locals","current","isDefined","$template","newScope","$new","clone","enter","onNgViewEnter","autoScrollExp","$eval","$emit","onloadExp","autoscroll","onload","$on","ngViewFillContentFactory","$compile","$controller","html","contents","controller","$scope","controllerAs","data","children","ngRouteModule","module","provider","$RouteProvider","inherit","parent","extra","extend","prototype","pathRegExp","path","opts","insensitive","caseInsensitiveMatch","ret","originalPath","regexp","keys","replace","_","slash","key","option","optional","star","push","name","RegExp","routes","when","this.when","route","reloadOnSearch","redirectPath","length","substr","redirectTo","otherwise","this.otherwise","params","$get","$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce","prepareRoute","$locationEvent","lastRoute","preparedRouteIsUpdateOnly","preparedRoute","parseRoute","$$route","equals","pathParams","forceReload","$broadcast","defaultPrevented","preventDefault","commitRoute","nextRoute","copy","isString","interpolate","search","url","resolve","template","templateUrl","forEach","value","get","invoke","isFunction","getTrustedResourceUrl","loadedTemplateUrl","all","error","match","m","exec","on","i","len","val","string","result","split","segment","segmentMatch","join","reload","$evalAsync","updateParams","newParams","searchParams","self","Object","$routeMinErr","$$minErr","$RouteParamsProvider","this.$get","directive","$inject"]
8
+}
securis/src/main/webapp/js/angular/angular.js
....@@ -0,0 +1,25584 @@
1
+/**
2
+ * @license AngularJS v1.3.0
3
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
4
+ * License: MIT
5
+ */
6
+(function(window, document, undefined) {'use strict';
7
+
8
+/**
9
+ * @description
10
+ *
11
+ * This object provides a utility for producing rich Error messages within
12
+ * Angular. It can be called as follows:
13
+ *
14
+ * var exampleMinErr = minErr('example');
15
+ * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
16
+ *
17
+ * The above creates an instance of minErr in the example namespace. The
18
+ * resulting error will have a namespaced error code of example.one. The
19
+ * resulting error will replace {0} with the value of foo, and {1} with the
20
+ * value of bar. The object is not restricted in the number of arguments it can
21
+ * take.
22
+ *
23
+ * If fewer arguments are specified than necessary for interpolation, the extra
24
+ * interpolation markers will be preserved in the final string.
25
+ *
26
+ * Since data will be parsed statically during a build step, some restrictions
27
+ * are applied with respect to how minErr instances are created and called.
28
+ * Instances should have names of the form namespaceMinErr for a minErr created
29
+ * using minErr('namespace') . Error codes, namespaces and template strings
30
+ * should all be static strings, not variables or general expressions.
31
+ *
32
+ * @param {string} module The namespace to use for the new minErr instance.
33
+ * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning
34
+ * error from returned function, for cases when a particular type of error is useful.
35
+ * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance
36
+ */
37
+
38
+function minErr(module, ErrorConstructor) {
39
+ ErrorConstructor = ErrorConstructor || Error;
40
+ return function () {
41
+ var code = arguments[0],
42
+ prefix = '[' + (module ? module + ':' : '') + code + '] ',
43
+ template = arguments[1],
44
+ templateArgs = arguments,
45
+ stringify = function (obj) {
46
+ if (typeof obj === 'function') {
47
+ return obj.toString().replace(/ \{[\s\S]*$/, '');
48
+ } else if (typeof obj === 'undefined') {
49
+ return 'undefined';
50
+ } else if (typeof obj !== 'string') {
51
+ return JSON.stringify(obj);
52
+ }
53
+ return obj;
54
+ },
55
+ message, i;
56
+
57
+ message = prefix + template.replace(/\{\d+\}/g, function (match) {
58
+ var index = +match.slice(1, -1), arg;
59
+
60
+ if (index + 2 < templateArgs.length) {
61
+ arg = templateArgs[index + 2];
62
+ if (typeof arg === 'function') {
63
+ return arg.toString().replace(/ ?\{[\s\S]*$/, '');
64
+ } else if (typeof arg === 'undefined') {
65
+ return 'undefined';
66
+ } else if (typeof arg !== 'string') {
67
+ return toJson(arg);
68
+ }
69
+ return arg;
70
+ }
71
+ return match;
72
+ });
73
+
74
+ message = message + '\nhttp://errors.angularjs.org/1.3.0/' +
75
+ (module ? module + '/' : '') + code;
76
+ for (i = 2; i < arguments.length; i++) {
77
+ message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
78
+ encodeURIComponent(stringify(arguments[i]));
79
+ }
80
+ return new ErrorConstructor(message);
81
+ };
82
+}
83
+
84
+/* We need to tell jshint what variables are being exported */
85
+/* global angular: true,
86
+ msie: true,
87
+ jqLite: true,
88
+ jQuery: true,
89
+ slice: true,
90
+ splice: true,
91
+ push: true,
92
+ toString: true,
93
+ ngMinErr: true,
94
+ angularModule: true,
95
+ uid: true,
96
+ REGEX_STRING_REGEXP: true,
97
+ VALIDITY_STATE_PROPERTY: true,
98
+
99
+ lowercase: true,
100
+ uppercase: true,
101
+ manualLowercase: true,
102
+ manualUppercase: true,
103
+ nodeName_: true,
104
+ isArrayLike: true,
105
+ forEach: true,
106
+ sortedKeys: true,
107
+ forEachSorted: true,
108
+ reverseParams: true,
109
+ nextUid: true,
110
+ setHashKey: true,
111
+ extend: true,
112
+ int: true,
113
+ inherit: true,
114
+ noop: true,
115
+ identity: true,
116
+ valueFn: true,
117
+ isUndefined: true,
118
+ isDefined: true,
119
+ isObject: true,
120
+ isString: true,
121
+ isNumber: true,
122
+ isDate: true,
123
+ isArray: true,
124
+ isFunction: true,
125
+ isRegExp: true,
126
+ isWindow: true,
127
+ isScope: true,
128
+ isFile: true,
129
+ isBlob: true,
130
+ isBoolean: true,
131
+ isPromiseLike: true,
132
+ trim: true,
133
+ isElement: true,
134
+ makeMap: true,
135
+ size: true,
136
+ includes: true,
137
+ arrayRemove: true,
138
+ isLeafNode: true,
139
+ copy: true,
140
+ shallowCopy: true,
141
+ equals: true,
142
+ csp: true,
143
+ concat: true,
144
+ sliceArgs: true,
145
+ bind: true,
146
+ toJsonReplacer: true,
147
+ toJson: true,
148
+ fromJson: true,
149
+ startingTag: true,
150
+ tryDecodeURIComponent: true,
151
+ parseKeyValue: true,
152
+ toKeyValue: true,
153
+ encodeUriSegment: true,
154
+ encodeUriQuery: true,
155
+ angularInit: true,
156
+ bootstrap: true,
157
+ getTestability: true,
158
+ snake_case: true,
159
+ bindJQuery: true,
160
+ assertArg: true,
161
+ assertArgFn: true,
162
+ assertNotHasOwnProperty: true,
163
+ getter: true,
164
+ getBlockNodes: true,
165
+ hasOwnProperty: true,
166
+ createMap: true,
167
+
168
+ NODE_TYPE_ELEMENT: true,
169
+ NODE_TYPE_TEXT: true,
170
+ NODE_TYPE_COMMENT: true,
171
+ NODE_TYPE_DOCUMENT: true,
172
+ NODE_TYPE_DOCUMENT_FRAGMENT: true,
173
+*/
174
+
175
+////////////////////////////////////
176
+
177
+/**
178
+ * @ngdoc module
179
+ * @name ng
180
+ * @module ng
181
+ * @description
182
+ *
183
+ * # ng (core module)
184
+ * The ng module is loaded by default when an AngularJS application is started. The module itself
185
+ * contains the essential components for an AngularJS application to function. The table below
186
+ * lists a high level breakdown of each of the services/factories, filters, directives and testing
187
+ * components available within this core module.
188
+ *
189
+ * <div doc-module-components="ng"></div>
190
+ */
191
+
192
+var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/;
193
+
194
+// The name of a form control's ValidityState property.
195
+// This is used so that it's possible for internal tests to create mock ValidityStates.
196
+var VALIDITY_STATE_PROPERTY = 'validity';
197
+
198
+/**
199
+ * @ngdoc function
200
+ * @name angular.lowercase
201
+ * @module ng
202
+ * @kind function
203
+ *
204
+ * @description Converts the specified string to lowercase.
205
+ * @param {string} string String to be converted to lowercase.
206
+ * @returns {string} Lowercased string.
207
+ */
208
+var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};
209
+var hasOwnProperty = Object.prototype.hasOwnProperty;
210
+
211
+/**
212
+ * @ngdoc function
213
+ * @name angular.uppercase
214
+ * @module ng
215
+ * @kind function
216
+ *
217
+ * @description Converts the specified string to uppercase.
218
+ * @param {string} string String to be converted to uppercase.
219
+ * @returns {string} Uppercased string.
220
+ */
221
+var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};
222
+
223
+
224
+var manualLowercase = function(s) {
225
+ /* jshint bitwise: false */
226
+ return isString(s)
227
+ ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
228
+ : s;
229
+};
230
+var manualUppercase = function(s) {
231
+ /* jshint bitwise: false */
232
+ return isString(s)
233
+ ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
234
+ : s;
235
+};
236
+
237
+
238
+// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish
239
+// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods
240
+// with correct but slower alternatives.
241
+if ('i' !== 'I'.toLowerCase()) {
242
+ lowercase = manualLowercase;
243
+ uppercase = manualUppercase;
244
+}
245
+
246
+
247
+var /** holds major version number for IE or NaN for real browsers */
248
+ msie,
249
+ jqLite, // delay binding since jQuery could be loaded after us.
250
+ jQuery, // delay binding
251
+ slice = [].slice,
252
+ splice = [].splice,
253
+ push = [].push,
254
+ toString = Object.prototype.toString,
255
+ ngMinErr = minErr('ng'),
256
+
257
+ /** @name angular */
258
+ angular = window.angular || (window.angular = {}),
259
+ angularModule,
260
+ uid = 0;
261
+
262
+/**
263
+ * documentMode is an IE-only property
264
+ * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
265
+ */
266
+msie = document.documentMode;
267
+
268
+
269
+/**
270
+ * @private
271
+ * @param {*} obj
272
+ * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,
273
+ * String ...)
274
+ */
275
+function isArrayLike(obj) {
276
+ if (obj == null || isWindow(obj)) {
277
+ return false;
278
+ }
279
+
280
+ var length = obj.length;
281
+
282
+ if (obj.nodeType === NODE_TYPE_ELEMENT && length) {
283
+ return true;
284
+ }
285
+
286
+ return isString(obj) || isArray(obj) || length === 0 ||
287
+ typeof length === 'number' && length > 0 && (length - 1) in obj;
288
+}
289
+
290
+/**
291
+ * @ngdoc function
292
+ * @name angular.forEach
293
+ * @module ng
294
+ * @kind function
295
+ *
296
+ * @description
297
+ * Invokes the `iterator` function once for each item in `obj` collection, which can be either an
298
+ * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value`
299
+ * is the value of an object property or an array element, `key` is the object property key or
300
+ * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional.
301
+ *
302
+ * It is worth noting that `.forEach` does not iterate over inherited properties because it filters
303
+ * using the `hasOwnProperty` method.
304
+ *
305
+ ```js
306
+ var values = {name: 'misko', gender: 'male'};
307
+ var log = [];
308
+ angular.forEach(values, function(value, key) {
309
+ this.push(key + ': ' + value);
310
+ }, log);
311
+ expect(log).toEqual(['name: misko', 'gender: male']);
312
+ ```
313
+ *
314
+ * @param {Object|Array} obj Object to iterate over.
315
+ * @param {Function} iterator Iterator function.
316
+ * @param {Object=} context Object to become context (`this`) for the iterator function.
317
+ * @returns {Object|Array} Reference to `obj`.
318
+ */
319
+
320
+function forEach(obj, iterator, context) {
321
+ var key, length;
322
+ if (obj) {
323
+ if (isFunction(obj)) {
324
+ for (key in obj) {
325
+ // Need to check if hasOwnProperty exists,
326
+ // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
327
+ if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
328
+ iterator.call(context, obj[key], key, obj);
329
+ }
330
+ }
331
+ } else if (isArray(obj) || isArrayLike(obj)) {
332
+ var isPrimitive = typeof obj !== 'object';
333
+ for (key = 0, length = obj.length; key < length; key++) {
334
+ if (isPrimitive || key in obj) {
335
+ iterator.call(context, obj[key], key, obj);
336
+ }
337
+ }
338
+ } else if (obj.forEach && obj.forEach !== forEach) {
339
+ obj.forEach(iterator, context, obj);
340
+ } else {
341
+ for (key in obj) {
342
+ if (obj.hasOwnProperty(key)) {
343
+ iterator.call(context, obj[key], key, obj);
344
+ }
345
+ }
346
+ }
347
+ }
348
+ return obj;
349
+}
350
+
351
+function sortedKeys(obj) {
352
+ var keys = [];
353
+ for (var key in obj) {
354
+ if (obj.hasOwnProperty(key)) {
355
+ keys.push(key);
356
+ }
357
+ }
358
+ return keys.sort();
359
+}
360
+
361
+function forEachSorted(obj, iterator, context) {
362
+ var keys = sortedKeys(obj);
363
+ for ( var i = 0; i < keys.length; i++) {
364
+ iterator.call(context, obj[keys[i]], keys[i]);
365
+ }
366
+ return keys;
367
+}
368
+
369
+
370
+/**
371
+ * when using forEach the params are value, key, but it is often useful to have key, value.
372
+ * @param {function(string, *)} iteratorFn
373
+ * @returns {function(*, string)}
374
+ */
375
+function reverseParams(iteratorFn) {
376
+ return function(value, key) { iteratorFn(key, value); };
377
+}
378
+
379
+/**
380
+ * A consistent way of creating unique IDs in angular.
381
+ *
382
+ * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before
383
+ * we hit number precision issues in JavaScript.
384
+ *
385
+ * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M
386
+ *
387
+ * @returns {number} an unique alpha-numeric string
388
+ */
389
+function nextUid() {
390
+ return ++uid;
391
+}
392
+
393
+
394
+/**
395
+ * Set or clear the hashkey for an object.
396
+ * @param obj object
397
+ * @param h the hashkey (!truthy to delete the hashkey)
398
+ */
399
+function setHashKey(obj, h) {
400
+ if (h) {
401
+ obj.$$hashKey = h;
402
+ }
403
+ else {
404
+ delete obj.$$hashKey;
405
+ }
406
+}
407
+
408
+/**
409
+ * @ngdoc function
410
+ * @name angular.extend
411
+ * @module ng
412
+ * @kind function
413
+ *
414
+ * @description
415
+ * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s)
416
+ * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so
417
+ * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`.
418
+ *
419
+ * @param {Object} dst Destination object.
420
+ * @param {...Object} src Source object(s).
421
+ * @returns {Object} Reference to `dst`.
422
+ */
423
+function extend(dst) {
424
+ var h = dst.$$hashKey;
425
+
426
+ for (var i = 1, ii = arguments.length; i < ii; i++) {
427
+ var obj = arguments[i];
428
+ if (obj) {
429
+ var keys = Object.keys(obj);
430
+ for (var j = 0, jj = keys.length; j < jj; j++) {
431
+ var key = keys[j];
432
+ dst[key] = obj[key];
433
+ }
434
+ }
435
+ }
436
+
437
+ setHashKey(dst, h);
438
+ return dst;
439
+}
440
+
441
+function int(str) {
442
+ return parseInt(str, 10);
443
+}
444
+
445
+
446
+function inherit(parent, extra) {
447
+ return extend(new (extend(function() {}, {prototype:parent}))(), extra);
448
+}
449
+
450
+/**
451
+ * @ngdoc function
452
+ * @name angular.noop
453
+ * @module ng
454
+ * @kind function
455
+ *
456
+ * @description
457
+ * A function that performs no operations. This function can be useful when writing code in the
458
+ * functional style.
459
+ ```js
460
+ function foo(callback) {
461
+ var result = calculateResult();
462
+ (callback || angular.noop)(result);
463
+ }
464
+ ```
465
+ */
466
+function noop() {}
467
+noop.$inject = [];
468
+
469
+
470
+/**
471
+ * @ngdoc function
472
+ * @name angular.identity
473
+ * @module ng
474
+ * @kind function
475
+ *
476
+ * @description
477
+ * A function that returns its first argument. This function is useful when writing code in the
478
+ * functional style.
479
+ *
480
+ ```js
481
+ function transformer(transformationFn, value) {
482
+ return (transformationFn || angular.identity)(value);
483
+ };
484
+ ```
485
+ */
486
+function identity($) {return $;}
487
+identity.$inject = [];
488
+
489
+
490
+function valueFn(value) {return function() {return value;};}
491
+
492
+/**
493
+ * @ngdoc function
494
+ * @name angular.isUndefined
495
+ * @module ng
496
+ * @kind function
497
+ *
498
+ * @description
499
+ * Determines if a reference is undefined.
500
+ *
501
+ * @param {*} value Reference to check.
502
+ * @returns {boolean} True if `value` is undefined.
503
+ */
504
+function isUndefined(value){return typeof value === 'undefined';}
505
+
506
+
507
+/**
508
+ * @ngdoc function
509
+ * @name angular.isDefined
510
+ * @module ng
511
+ * @kind function
512
+ *
513
+ * @description
514
+ * Determines if a reference is defined.
515
+ *
516
+ * @param {*} value Reference to check.
517
+ * @returns {boolean} True if `value` is defined.
518
+ */
519
+function isDefined(value){return typeof value !== 'undefined';}
520
+
521
+
522
+/**
523
+ * @ngdoc function
524
+ * @name angular.isObject
525
+ * @module ng
526
+ * @kind function
527
+ *
528
+ * @description
529
+ * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not
530
+ * considered to be objects. Note that JavaScript arrays are objects.
531
+ *
532
+ * @param {*} value Reference to check.
533
+ * @returns {boolean} True if `value` is an `Object` but not `null`.
534
+ */
535
+function isObject(value){
536
+ // http://jsperf.com/isobject4
537
+ return value !== null && typeof value === 'object';
538
+}
539
+
540
+
541
+/**
542
+ * @ngdoc function
543
+ * @name angular.isString
544
+ * @module ng
545
+ * @kind function
546
+ *
547
+ * @description
548
+ * Determines if a reference is a `String`.
549
+ *
550
+ * @param {*} value Reference to check.
551
+ * @returns {boolean} True if `value` is a `String`.
552
+ */
553
+function isString(value){return typeof value === 'string';}
554
+
555
+
556
+/**
557
+ * @ngdoc function
558
+ * @name angular.isNumber
559
+ * @module ng
560
+ * @kind function
561
+ *
562
+ * @description
563
+ * Determines if a reference is a `Number`.
564
+ *
565
+ * @param {*} value Reference to check.
566
+ * @returns {boolean} True if `value` is a `Number`.
567
+ */
568
+function isNumber(value){return typeof value === 'number';}
569
+
570
+
571
+/**
572
+ * @ngdoc function
573
+ * @name angular.isDate
574
+ * @module ng
575
+ * @kind function
576
+ *
577
+ * @description
578
+ * Determines if a value is a date.
579
+ *
580
+ * @param {*} value Reference to check.
581
+ * @returns {boolean} True if `value` is a `Date`.
582
+ */
583
+function isDate(value) {
584
+ return toString.call(value) === '[object Date]';
585
+}
586
+
587
+
588
+/**
589
+ * @ngdoc function
590
+ * @name angular.isArray
591
+ * @module ng
592
+ * @kind function
593
+ *
594
+ * @description
595
+ * Determines if a reference is an `Array`.
596
+ *
597
+ * @param {*} value Reference to check.
598
+ * @returns {boolean} True if `value` is an `Array`.
599
+ */
600
+var isArray = Array.isArray;
601
+
602
+/**
603
+ * @ngdoc function
604
+ * @name angular.isFunction
605
+ * @module ng
606
+ * @kind function
607
+ *
608
+ * @description
609
+ * Determines if a reference is a `Function`.
610
+ *
611
+ * @param {*} value Reference to check.
612
+ * @returns {boolean} True if `value` is a `Function`.
613
+ */
614
+function isFunction(value){return typeof value === 'function';}
615
+
616
+
617
+/**
618
+ * Determines if a value is a regular expression object.
619
+ *
620
+ * @private
621
+ * @param {*} value Reference to check.
622
+ * @returns {boolean} True if `value` is a `RegExp`.
623
+ */
624
+function isRegExp(value) {
625
+ return toString.call(value) === '[object RegExp]';
626
+}
627
+
628
+
629
+/**
630
+ * Checks if `obj` is a window object.
631
+ *
632
+ * @private
633
+ * @param {*} obj Object to check
634
+ * @returns {boolean} True if `obj` is a window obj.
635
+ */
636
+function isWindow(obj) {
637
+ return obj && obj.window === obj;
638
+}
639
+
640
+
641
+function isScope(obj) {
642
+ return obj && obj.$evalAsync && obj.$watch;
643
+}
644
+
645
+
646
+function isFile(obj) {
647
+ return toString.call(obj) === '[object File]';
648
+}
649
+
650
+
651
+function isBlob(obj) {
652
+ return toString.call(obj) === '[object Blob]';
653
+}
654
+
655
+
656
+function isBoolean(value) {
657
+ return typeof value === 'boolean';
658
+}
659
+
660
+
661
+function isPromiseLike(obj) {
662
+ return obj && isFunction(obj.then);
663
+}
664
+
665
+
666
+var trim = function(value) {
667
+ return isString(value) ? value.trim() : value;
668
+};
669
+
670
+
671
+/**
672
+ * @ngdoc function
673
+ * @name angular.isElement
674
+ * @module ng
675
+ * @kind function
676
+ *
677
+ * @description
678
+ * Determines if a reference is a DOM element (or wrapped jQuery element).
679
+ *
680
+ * @param {*} value Reference to check.
681
+ * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
682
+ */
683
+function isElement(node) {
684
+ return !!(node &&
685
+ (node.nodeName // we are a direct element
686
+ || (node.prop && node.attr && node.find))); // we have an on and find method part of jQuery API
687
+}
688
+
689
+/**
690
+ * @param str 'key1,key2,...'
691
+ * @returns {object} in the form of {key1:true, key2:true, ...}
692
+ */
693
+function makeMap(str) {
694
+ var obj = {}, items = str.split(","), i;
695
+ for ( i = 0; i < items.length; i++ )
696
+ obj[ items[i] ] = true;
697
+ return obj;
698
+}
699
+
700
+
701
+function nodeName_(element) {
702
+ return lowercase(element.nodeName || element[0].nodeName);
703
+}
704
+
705
+
706
+/**
707
+ * @description
708
+ * Determines the number of elements in an array, the number of properties an object has, or
709
+ * the length of a string.
710
+ *
711
+ * Note: This function is used to augment the Object type in Angular expressions. See
712
+ * {@link angular.Object} for more information about Angular arrays.
713
+ *
714
+ * @param {Object|Array|string} obj Object, array, or string to inspect.
715
+ * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object
716
+ * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.
717
+ */
718
+function size(obj, ownPropsOnly) {
719
+ var count = 0, key;
720
+
721
+ if (isArray(obj) || isString(obj)) {
722
+ return obj.length;
723
+ } else if (isObject(obj)) {
724
+ for (key in obj)
725
+ if (!ownPropsOnly || obj.hasOwnProperty(key))
726
+ count++;
727
+ }
728
+
729
+ return count;
730
+}
731
+
732
+
733
+function includes(array, obj) {
734
+ return Array.prototype.indexOf.call(array, obj) != -1;
735
+}
736
+
737
+function arrayRemove(array, value) {
738
+ var index = array.indexOf(value);
739
+ if (index >=0)
740
+ array.splice(index, 1);
741
+ return value;
742
+}
743
+
744
+function isLeafNode (node) {
745
+ if (node) {
746
+ switch (nodeName_(node)) {
747
+ case "option":
748
+ case "pre":
749
+ case "title":
750
+ return true;
751
+ }
752
+ }
753
+ return false;
754
+}
755
+
756
+/**
757
+ * @ngdoc function
758
+ * @name angular.copy
759
+ * @module ng
760
+ * @kind function
761
+ *
762
+ * @description
763
+ * Creates a deep copy of `source`, which should be an object or an array.
764
+ *
765
+ * * If no destination is supplied, a copy of the object or array is created.
766
+ * * If a destination is provided, all of its elements (for array) or properties (for objects)
767
+ * are deleted and then all elements/properties from the source are copied to it.
768
+ * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.
769
+ * * If `source` is identical to 'destination' an exception will be thrown.
770
+ *
771
+ * @param {*} source The source that will be used to make a copy.
772
+ * Can be any type, including primitives, `null`, and `undefined`.
773
+ * @param {(Object|Array)=} destination Destination into which the source is copied. If
774
+ * provided, must be of the same type as `source`.
775
+ * @returns {*} The copy or updated `destination`, if `destination` was specified.
776
+ *
777
+ * @example
778
+ <example module="copyExample">
779
+ <file name="index.html">
780
+ <div ng-controller="ExampleController">
781
+ <form novalidate class="simple-form">
782
+ Name: <input type="text" ng-model="user.name" /><br />
783
+ E-mail: <input type="email" ng-model="user.email" /><br />
784
+ Gender: <input type="radio" ng-model="user.gender" value="male" />male
785
+ <input type="radio" ng-model="user.gender" value="female" />female<br />
786
+ <button ng-click="reset()">RESET</button>
787
+ <button ng-click="update(user)">SAVE</button>
788
+ </form>
789
+ <pre>form = {{user | json}}</pre>
790
+ <pre>master = {{master | json}}</pre>
791
+ </div>
792
+
793
+ <script>
794
+ angular.module('copyExample', [])
795
+ .controller('ExampleController', ['$scope', function($scope) {
796
+ $scope.master= {};
797
+
798
+ $scope.update = function(user) {
799
+ // Example with 1 argument
800
+ $scope.master= angular.copy(user);
801
+ };
802
+
803
+ $scope.reset = function() {
804
+ // Example with 2 arguments
805
+ angular.copy($scope.master, $scope.user);
806
+ };
807
+
808
+ $scope.reset();
809
+ }]);
810
+ </script>
811
+ </file>
812
+ </example>
813
+ */
814
+function copy(source, destination, stackSource, stackDest) {
815
+ if (isWindow(source) || isScope(source)) {
816
+ throw ngMinErr('cpws',
817
+ "Can't copy! Making copies of Window or Scope instances is not supported.");
818
+ }
819
+
820
+ if (!destination) {
821
+ destination = source;
822
+ if (source) {
823
+ if (isArray(source)) {
824
+ destination = copy(source, [], stackSource, stackDest);
825
+ } else if (isDate(source)) {
826
+ destination = new Date(source.getTime());
827
+ } else if (isRegExp(source)) {
828
+ destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
829
+ destination.lastIndex = source.lastIndex;
830
+ } else if (isObject(source)) {
831
+ var emptyObject = Object.create(Object.getPrototypeOf(source));
832
+ destination = copy(source, emptyObject, stackSource, stackDest);
833
+ }
834
+ }
835
+ } else {
836
+ if (source === destination) throw ngMinErr('cpi',
837
+ "Can't copy! Source and destination are identical.");
838
+
839
+ stackSource = stackSource || [];
840
+ stackDest = stackDest || [];
841
+
842
+ if (isObject(source)) {
843
+ var index = stackSource.indexOf(source);
844
+ if (index !== -1) return stackDest[index];
845
+
846
+ stackSource.push(source);
847
+ stackDest.push(destination);
848
+ }
849
+
850
+ var result;
851
+ if (isArray(source)) {
852
+ destination.length = 0;
853
+ for ( var i = 0; i < source.length; i++) {
854
+ result = copy(source[i], null, stackSource, stackDest);
855
+ if (isObject(source[i])) {
856
+ stackSource.push(source[i]);
857
+ stackDest.push(result);
858
+ }
859
+ destination.push(result);
860
+ }
861
+ } else {
862
+ var h = destination.$$hashKey;
863
+ if (isArray(destination)) {
864
+ destination.length = 0;
865
+ } else {
866
+ forEach(destination, function(value, key) {
867
+ delete destination[key];
868
+ });
869
+ }
870
+ for ( var key in source) {
871
+ if(source.hasOwnProperty(key)) {
872
+ result = copy(source[key], null, stackSource, stackDest);
873
+ if (isObject(source[key])) {
874
+ stackSource.push(source[key]);
875
+ stackDest.push(result);
876
+ }
877
+ destination[key] = result;
878
+ }
879
+ }
880
+ setHashKey(destination,h);
881
+ }
882
+
883
+ }
884
+ return destination;
885
+}
886
+
887
+/**
888
+ * Creates a shallow copy of an object, an array or a primitive.
889
+ *
890
+ * Assumes that there are no proto properties for objects.
891
+ */
892
+function shallowCopy(src, dst) {
893
+ if (isArray(src)) {
894
+ dst = dst || [];
895
+
896
+ for (var i = 0, ii = src.length; i < ii; i++) {
897
+ dst[i] = src[i];
898
+ }
899
+ } else if (isObject(src)) {
900
+ dst = dst || {};
901
+
902
+ for (var key in src) {
903
+ if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
904
+ dst[key] = src[key];
905
+ }
906
+ }
907
+ }
908
+
909
+ return dst || src;
910
+}
911
+
912
+
913
+/**
914
+ * @ngdoc function
915
+ * @name angular.equals
916
+ * @module ng
917
+ * @kind function
918
+ *
919
+ * @description
920
+ * Determines if two objects or two values are equivalent. Supports value types, regular
921
+ * expressions, arrays and objects.
922
+ *
923
+ * Two objects or values are considered equivalent if at least one of the following is true:
924
+ *
925
+ * * Both objects or values pass `===` comparison.
926
+ * * Both objects or values are of the same type and all of their properties are equal by
927
+ * comparing them with `angular.equals`.
928
+ * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)
929
+ * * Both values represent the same regular expression (In JavaScript,
930
+ * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
931
+ * representation matches).
932
+ *
933
+ * During a property comparison, properties of `function` type and properties with names
934
+ * that begin with `$` are ignored.
935
+ *
936
+ * Scope and DOMWindow objects are being compared only by identify (`===`).
937
+ *
938
+ * @param {*} o1 Object or value to compare.
939
+ * @param {*} o2 Object or value to compare.
940
+ * @returns {boolean} True if arguments are equal.
941
+ */
942
+function equals(o1, o2) {
943
+ if (o1 === o2) return true;
944
+ if (o1 === null || o2 === null) return false;
945
+ if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN
946
+ var t1 = typeof o1, t2 = typeof o2, length, key, keySet;
947
+ if (t1 == t2) {
948
+ if (t1 == 'object') {
949
+ if (isArray(o1)) {
950
+ if (!isArray(o2)) return false;
951
+ if ((length = o1.length) == o2.length) {
952
+ for(key=0; key<length; key++) {
953
+ if (!equals(o1[key], o2[key])) return false;
954
+ }
955
+ return true;
956
+ }
957
+ } else if (isDate(o1)) {
958
+ if (!isDate(o2)) return false;
959
+ return equals(o1.getTime(), o2.getTime());
960
+ } else if (isRegExp(o1) && isRegExp(o2)) {
961
+ return o1.toString() == o2.toString();
962
+ } else {
963
+ if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;
964
+ keySet = {};
965
+ for(key in o1) {
966
+ if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
967
+ if (!equals(o1[key], o2[key])) return false;
968
+ keySet[key] = true;
969
+ }
970
+ for(key in o2) {
971
+ if (!keySet.hasOwnProperty(key) &&
972
+ key.charAt(0) !== '$' &&
973
+ o2[key] !== undefined &&
974
+ !isFunction(o2[key])) return false;
975
+ }
976
+ return true;
977
+ }
978
+ }
979
+ }
980
+ return false;
981
+}
982
+
983
+var csp = function() {
984
+ if (isDefined(csp.isActive_)) return csp.isActive_;
985
+
986
+ var active = !!(document.querySelector('[ng-csp]') ||
987
+ document.querySelector('[data-ng-csp]'));
988
+
989
+ if (!active) {
990
+ try {
991
+ /* jshint -W031, -W054 */
992
+ new Function('');
993
+ /* jshint +W031, +W054 */
994
+ } catch (e) {
995
+ active = true;
996
+ }
997
+ }
998
+
999
+ return (csp.isActive_ = active);
1000
+};
1001
+
1002
+
1003
+
1004
+function concat(array1, array2, index) {
1005
+ return array1.concat(slice.call(array2, index));
1006
+}
1007
+
1008
+function sliceArgs(args, startIndex) {
1009
+ return slice.call(args, startIndex || 0);
1010
+}
1011
+
1012
+
1013
+/* jshint -W101 */
1014
+/**
1015
+ * @ngdoc function
1016
+ * @name angular.bind
1017
+ * @module ng
1018
+ * @kind function
1019
+ *
1020
+ * @description
1021
+ * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for
1022
+ * `fn`). You can supply optional `args` that are prebound to the function. This feature is also
1023
+ * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as
1024
+ * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).
1025
+ *
1026
+ * @param {Object} self Context which `fn` should be evaluated in.
1027
+ * @param {function()} fn Function to be bound.
1028
+ * @param {...*} args Optional arguments to be prebound to the `fn` function call.
1029
+ * @returns {function()} Function that wraps the `fn` with all the specified bindings.
1030
+ */
1031
+/* jshint +W101 */
1032
+function bind(self, fn) {
1033
+ var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
1034
+ if (isFunction(fn) && !(fn instanceof RegExp)) {
1035
+ return curryArgs.length
1036
+ ? function() {
1037
+ return arguments.length
1038
+ ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
1039
+ : fn.apply(self, curryArgs);
1040
+ }
1041
+ : function() {
1042
+ return arguments.length
1043
+ ? fn.apply(self, arguments)
1044
+ : fn.call(self);
1045
+ };
1046
+ } else {
1047
+ // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
1048
+ return fn;
1049
+ }
1050
+}
1051
+
1052
+
1053
+function toJsonReplacer(key, value) {
1054
+ var val = value;
1055
+
1056
+ if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {
1057
+ val = undefined;
1058
+ } else if (isWindow(value)) {
1059
+ val = '$WINDOW';
1060
+ } else if (value && document === value) {
1061
+ val = '$DOCUMENT';
1062
+ } else if (isScope(value)) {
1063
+ val = '$SCOPE';
1064
+ }
1065
+
1066
+ return val;
1067
+}
1068
+
1069
+
1070
+/**
1071
+ * @ngdoc function
1072
+ * @name angular.toJson
1073
+ * @module ng
1074
+ * @kind function
1075
+ *
1076
+ * @description
1077
+ * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be
1078
+ * stripped since angular uses this notation internally.
1079
+ *
1080
+ * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
1081
+ * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
1082
+ * @returns {string|undefined} JSON-ified string representing `obj`.
1083
+ */
1084
+function toJson(obj, pretty) {
1085
+ if (typeof obj === 'undefined') return undefined;
1086
+ return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null);
1087
+}
1088
+
1089
+
1090
+/**
1091
+ * @ngdoc function
1092
+ * @name angular.fromJson
1093
+ * @module ng
1094
+ * @kind function
1095
+ *
1096
+ * @description
1097
+ * Deserializes a JSON string.
1098
+ *
1099
+ * @param {string} json JSON string to deserialize.
1100
+ * @returns {Object|Array|string|number} Deserialized thingy.
1101
+ */
1102
+function fromJson(json) {
1103
+ return isString(json)
1104
+ ? JSON.parse(json)
1105
+ : json;
1106
+}
1107
+
1108
+
1109
+/**
1110
+ * @returns {string} Returns the string representation of the element.
1111
+ */
1112
+function startingTag(element) {
1113
+ element = jqLite(element).clone();
1114
+ try {
1115
+ // turns out IE does not let you set .html() on elements which
1116
+ // are not allowed to have children. So we just ignore it.
1117
+ element.empty();
1118
+ } catch(e) {}
1119
+ var elemHtml = jqLite('<div>').append(element).html();
1120
+ try {
1121
+ return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :
1122
+ elemHtml.
1123
+ match(/^(<[^>]+>)/)[1].
1124
+ replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });
1125
+ } catch(e) {
1126
+ return lowercase(elemHtml);
1127
+ }
1128
+
1129
+}
1130
+
1131
+
1132
+/////////////////////////////////////////////////
1133
+
1134
+/**
1135
+ * Tries to decode the URI component without throwing an exception.
1136
+ *
1137
+ * @private
1138
+ * @param str value potential URI component to check.
1139
+ * @returns {boolean} True if `value` can be decoded
1140
+ * with the decodeURIComponent function.
1141
+ */
1142
+function tryDecodeURIComponent(value) {
1143
+ try {
1144
+ return decodeURIComponent(value);
1145
+ } catch(e) {
1146
+ // Ignore any invalid uri component
1147
+ }
1148
+}
1149
+
1150
+
1151
+/**
1152
+ * Parses an escaped url query string into key-value pairs.
1153
+ * @returns {Object.<string,boolean|Array>}
1154
+ */
1155
+function parseKeyValue(/**string*/keyValue) {
1156
+ var obj = {}, key_value, key;
1157
+ forEach((keyValue || "").split('&'), function(keyValue) {
1158
+ if ( keyValue ) {
1159
+ key_value = keyValue.replace(/\+/g,'%20').split('=');
1160
+ key = tryDecodeURIComponent(key_value[0]);
1161
+ if ( isDefined(key) ) {
1162
+ var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
1163
+ if (!hasOwnProperty.call(obj, key)) {
1164
+ obj[key] = val;
1165
+ } else if(isArray(obj[key])) {
1166
+ obj[key].push(val);
1167
+ } else {
1168
+ obj[key] = [obj[key],val];
1169
+ }
1170
+ }
1171
+ }
1172
+ });
1173
+ return obj;
1174
+}
1175
+
1176
+function toKeyValue(obj) {
1177
+ var parts = [];
1178
+ forEach(obj, function(value, key) {
1179
+ if (isArray(value)) {
1180
+ forEach(value, function(arrayValue) {
1181
+ parts.push(encodeUriQuery(key, true) +
1182
+ (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));
1183
+ });
1184
+ } else {
1185
+ parts.push(encodeUriQuery(key, true) +
1186
+ (value === true ? '' : '=' + encodeUriQuery(value, true)));
1187
+ }
1188
+ });
1189
+ return parts.length ? parts.join('&') : '';
1190
+}
1191
+
1192
+
1193
+/**
1194
+ * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
1195
+ * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path
1196
+ * segments:
1197
+ * segment = *pchar
1198
+ * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
1199
+ * pct-encoded = "%" HEXDIG HEXDIG
1200
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
1201
+ * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
1202
+ * / "*" / "+" / "," / ";" / "="
1203
+ */
1204
+function encodeUriSegment(val) {
1205
+ return encodeUriQuery(val, true).
1206
+ replace(/%26/gi, '&').
1207
+ replace(/%3D/gi, '=').
1208
+ replace(/%2B/gi, '+');
1209
+}
1210
+
1211
+
1212
+/**
1213
+ * This method is intended for encoding *key* or *value* parts of query component. We need a custom
1214
+ * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
1215
+ * encoded per http://tools.ietf.org/html/rfc3986:
1216
+ * query = *( pchar / "/" / "?" )
1217
+ * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
1218
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
1219
+ * pct-encoded = "%" HEXDIG HEXDIG
1220
+ * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
1221
+ * / "*" / "+" / "," / ";" / "="
1222
+ */
1223
+function encodeUriQuery(val, pctEncodeSpaces) {
1224
+ return encodeURIComponent(val).
1225
+ replace(/%40/gi, '@').
1226
+ replace(/%3A/gi, ':').
1227
+ replace(/%24/g, '$').
1228
+ replace(/%2C/gi, ',').
1229
+ replace(/%3B/gi, ';').
1230
+ replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
1231
+}
1232
+
1233
+var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];
1234
+
1235
+function getNgAttribute(element, ngAttr) {
1236
+ var attr, i, ii = ngAttrPrefixes.length;
1237
+ element = jqLite(element);
1238
+ for (i=0; i<ii; ++i) {
1239
+ attr = ngAttrPrefixes[i] + ngAttr;
1240
+ if (isString(attr = element.attr(attr))) {
1241
+ return attr;
1242
+ }
1243
+ }
1244
+ return null;
1245
+}
1246
+
1247
+/**
1248
+ * @ngdoc directive
1249
+ * @name ngApp
1250
+ * @module ng
1251
+ *
1252
+ * @element ANY
1253
+ * @param {angular.Module} ngApp an optional application
1254
+ * {@link angular.module module} name to load.
1255
+ * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be
1256
+ * created in "strict-di" mode. This means that the application will fail to invoke functions which
1257
+ * do not use explicit function annotation (and are thus unsuitable for minification), as described
1258
+ * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in
1259
+ * tracking down the root of these bugs.
1260
+ *
1261
+ * @description
1262
+ *
1263
+ * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive
1264
+ * designates the **root element** of the application and is typically placed near the root element
1265
+ * of the page - e.g. on the `<body>` or `<html>` tags.
1266
+ *
1267
+ * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`
1268
+ * found in the document will be used to define the root element to auto-bootstrap as an
1269
+ * application. To run multiple applications in an HTML document you must manually bootstrap them using
1270
+ * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.
1271
+ *
1272
+ * You can specify an **AngularJS module** to be used as the root module for the application. This
1273
+ * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and
1274
+ * should contain the application code needed or have dependencies on other modules that will
1275
+ * contain the code. See {@link angular.module} for more information.
1276
+ *
1277
+ * In the example below if the `ngApp` directive were not placed on the `html` element then the
1278
+ * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
1279
+ * would not be resolved to `3`.
1280
+ *
1281
+ * `ngApp` is the easiest, and most common, way to bootstrap an application.
1282
+ *
1283
+ <example module="ngAppDemo">
1284
+ <file name="index.html">
1285
+ <div ng-controller="ngAppDemoController">
1286
+ I can add: {{a}} + {{b}} = {{ a+b }}
1287
+ </div>
1288
+ </file>
1289
+ <file name="script.js">
1290
+ angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {
1291
+ $scope.a = 1;
1292
+ $scope.b = 2;
1293
+ });
1294
+ </file>
1295
+ </example>
1296
+ *
1297
+ * Using `ngStrictDi`, you would see something like this:
1298
+ *
1299
+ <example ng-app-included="true">
1300
+ <file name="index.html">
1301
+ <div ng-app="ngAppStrictDemo" ng-strict-di>
1302
+ <div ng-controller="GoodController1">
1303
+ I can add: {{a}} + {{b}} = {{ a+b }}
1304
+
1305
+ <p>This renders because the controller does not fail to
1306
+ instantiate, by using explicit annotation style (see
1307
+ script.js for details)
1308
+ </p>
1309
+ </div>
1310
+
1311
+ <div ng-controller="GoodController2">
1312
+ Name: <input ng-model="name"><br />
1313
+ Hello, {{name}}!
1314
+
1315
+ <p>This renders because the controller does not fail to
1316
+ instantiate, by using explicit annotation style
1317
+ (see script.js for details)
1318
+ </p>
1319
+ </div>
1320
+
1321
+ <div ng-controller="BadController">
1322
+ I can add: {{a}} + {{b}} = {{ a+b }}
1323
+
1324
+ <p>The controller could not be instantiated, due to relying
1325
+ on automatic function annotations (which are disabled in
1326
+ strict mode). As such, the content of this section is not
1327
+ interpolated, and there should be an error in your web console.
1328
+ </p>
1329
+ </div>
1330
+ </div>
1331
+ </file>
1332
+ <file name="script.js">
1333
+ angular.module('ngAppStrictDemo', [])
1334
+ // BadController will fail to instantiate, due to relying on automatic function annotation,
1335
+ // rather than an explicit annotation
1336
+ .controller('BadController', function($scope) {
1337
+ $scope.a = 1;
1338
+ $scope.b = 2;
1339
+ })
1340
+ // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,
1341
+ // due to using explicit annotations using the array style and $inject property, respectively.
1342
+ .controller('GoodController1', ['$scope', function($scope) {
1343
+ $scope.a = 1;
1344
+ $scope.b = 2;
1345
+ }])
1346
+ .controller('GoodController2', GoodController2);
1347
+ function GoodController2($scope) {
1348
+ $scope.name = "World";
1349
+ }
1350
+ GoodController2.$inject = ['$scope'];
1351
+ </file>
1352
+ <file name="style.css">
1353
+ div[ng-controller] {
1354
+ margin-bottom: 1em;
1355
+ -webkit-border-radius: 4px;
1356
+ border-radius: 4px;
1357
+ border: 1px solid;
1358
+ padding: .5em;
1359
+ }
1360
+ div[ng-controller^=Good] {
1361
+ border-color: #d6e9c6;
1362
+ background-color: #dff0d8;
1363
+ color: #3c763d;
1364
+ }
1365
+ div[ng-controller^=Bad] {
1366
+ border-color: #ebccd1;
1367
+ background-color: #f2dede;
1368
+ color: #a94442;
1369
+ margin-bottom: 0;
1370
+ }
1371
+ </file>
1372
+ </example>
1373
+ */
1374
+function angularInit(element, bootstrap) {
1375
+ var appElement,
1376
+ module,
1377
+ config = {};
1378
+
1379
+ // The element `element` has priority over any other element
1380
+ forEach(ngAttrPrefixes, function(prefix) {
1381
+ var name = prefix + 'app';
1382
+
1383
+ if (!appElement && element.hasAttribute && element.hasAttribute(name)) {
1384
+ appElement = element;
1385
+ module = element.getAttribute(name);
1386
+ }
1387
+ });
1388
+ forEach(ngAttrPrefixes, function(prefix) {
1389
+ var name = prefix + 'app';
1390
+ var candidate;
1391
+
1392
+ if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) {
1393
+ appElement = candidate;
1394
+ module = candidate.getAttribute(name);
1395
+ }
1396
+ });
1397
+ if (appElement) {
1398
+ config.strictDi = getNgAttribute(appElement, "strict-di") !== null;
1399
+ bootstrap(appElement, module ? [module] : [], config);
1400
+ }
1401
+}
1402
+
1403
+/**
1404
+ * @ngdoc function
1405
+ * @name angular.bootstrap
1406
+ * @module ng
1407
+ * @description
1408
+ * Use this function to manually start up angular application.
1409
+ *
1410
+ * See: {@link guide/bootstrap Bootstrap}
1411
+ *
1412
+ * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually.
1413
+ * They must use {@link ng.directive:ngApp ngApp}.
1414
+ *
1415
+ * Angular will detect if it has been loaded into the browser more than once and only allow the
1416
+ * first loaded script to be bootstrapped and will report a warning to the browser console for
1417
+ * each of the subsequent scripts. This prevents strange results in applications, where otherwise
1418
+ * multiple instances of Angular try to work on the DOM.
1419
+ *
1420
+ * ```html
1421
+ * <!doctype html>
1422
+ * <html>
1423
+ * <body>
1424
+ * <div ng-controller="WelcomeController">
1425
+ * {{greeting}}
1426
+ * </div>
1427
+ *
1428
+ * <script src="angular.js"></script>
1429
+ * <script>
1430
+ * var app = angular.module('demo', [])
1431
+ * .controller('WelcomeController', function($scope) {
1432
+ * $scope.greeting = 'Welcome!';
1433
+ * });
1434
+ * angular.bootstrap(document, ['demo']);
1435
+ * </script>
1436
+ * </body>
1437
+ * </html>
1438
+ * ```
1439
+ *
1440
+ * @param {DOMElement} element DOM element which is the root of angular application.
1441
+ * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
1442
+ * Each item in the array should be the name of a predefined module or a (DI annotated)
1443
+ * function that will be invoked by the injector as a run block.
1444
+ * See: {@link angular.module modules}
1445
+ * @param {Object=} config an object for defining configuration options for the application. The
1446
+ * following keys are supported:
1447
+ *
1448
+ * - `strictDi`: disable automatic function annotation for the application. This is meant to
1449
+ * assist in finding bugs which break minified code.
1450
+ *
1451
+ * @returns {auto.$injector} Returns the newly created injector for this app.
1452
+ */
1453
+function bootstrap(element, modules, config) {
1454
+ if (!isObject(config)) config = {};
1455
+ var defaultConfig = {
1456
+ strictDi: false
1457
+ };
1458
+ config = extend(defaultConfig, config);
1459
+ var doBootstrap = function() {
1460
+ element = jqLite(element);
1461
+
1462
+ if (element.injector()) {
1463
+ var tag = (element[0] === document) ? 'document' : startingTag(element);
1464
+ //Encode angle brackets to prevent input from being sanitized to empty string #8683
1465
+ throw ngMinErr(
1466
+ 'btstrpd',
1467
+ "App Already Bootstrapped with this Element '{0}'",
1468
+ tag.replace(/</,'&lt;').replace(/>/,'&gt;'));
1469
+ }
1470
+
1471
+ modules = modules || [];
1472
+ modules.unshift(['$provide', function($provide) {
1473
+ $provide.value('$rootElement', element);
1474
+ }]);
1475
+
1476
+ if (config.debugInfoEnabled) {
1477
+ // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`.
1478
+ modules.push(['$compileProvider', function($compileProvider) {
1479
+ $compileProvider.debugInfoEnabled(true);
1480
+ }]);
1481
+ }
1482
+
1483
+ modules.unshift('ng');
1484
+ var injector = createInjector(modules, config.strictDi);
1485
+ injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',
1486
+ function bootstrapApply(scope, element, compile, injector) {
1487
+ scope.$apply(function() {
1488
+ element.data('$injector', injector);
1489
+ compile(element)(scope);
1490
+ });
1491
+ }]
1492
+ );
1493
+ return injector;
1494
+ };
1495
+
1496
+ var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/;
1497
+ var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;
1498
+
1499
+ if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) {
1500
+ config.debugInfoEnabled = true;
1501
+ window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, '');
1502
+ }
1503
+
1504
+ if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
1505
+ return doBootstrap();
1506
+ }
1507
+
1508
+ window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');
1509
+ angular.resumeBootstrap = function(extraModules) {
1510
+ forEach(extraModules, function(module) {
1511
+ modules.push(module);
1512
+ });
1513
+ doBootstrap();
1514
+ };
1515
+}
1516
+
1517
+/**
1518
+ * @ngdoc function
1519
+ * @name angular.reloadWithDebugInfo
1520
+ * @module ng
1521
+ * @description
1522
+ * Use this function to reload the current application with debug information turned on.
1523
+ * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`.
1524
+ *
1525
+ * See {@link ng.$compileProvider#debugInfoEnabled} for more.
1526
+ */
1527
+function reloadWithDebugInfo() {
1528
+ window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name;
1529
+ window.location.reload();
1530
+}
1531
+
1532
+/**
1533
+ * @name angular.getTestability
1534
+ * @module ng
1535
+ * @description
1536
+ * Get the testability service for the instance of Angular on the given
1537
+ * element.
1538
+ * @param {DOMElement} element DOM element which is the root of angular application.
1539
+ */
1540
+function getTestability(rootElement) {
1541
+ return angular.element(rootElement).injector().get('$$testability');
1542
+}
1543
+
1544
+var SNAKE_CASE_REGEXP = /[A-Z]/g;
1545
+function snake_case(name, separator) {
1546
+ separator = separator || '_';
1547
+ return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
1548
+ return (pos ? separator : '') + letter.toLowerCase();
1549
+ });
1550
+}
1551
+
1552
+var bindJQueryFired = false;
1553
+var skipDestroyOnNextJQueryCleanData;
1554
+function bindJQuery() {
1555
+ var originalCleanData;
1556
+
1557
+ if (bindJQueryFired) {
1558
+ return;
1559
+ }
1560
+
1561
+ // bind to jQuery if present;
1562
+ jQuery = window.jQuery;
1563
+ // Use jQuery if it exists with proper functionality, otherwise default to us.
1564
+ // Angular 1.2+ requires jQuery 1.7+ for on()/off() support.
1565
+ // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older
1566
+ // versions. It will not work for sure with jQuery <1.7, though.
1567
+ if (jQuery && jQuery.fn.on) {
1568
+ jqLite = jQuery;
1569
+ extend(jQuery.fn, {
1570
+ scope: JQLitePrototype.scope,
1571
+ isolateScope: JQLitePrototype.isolateScope,
1572
+ controller: JQLitePrototype.controller,
1573
+ injector: JQLitePrototype.injector,
1574
+ inheritedData: JQLitePrototype.inheritedData
1575
+ });
1576
+
1577
+ // All nodes removed from the DOM via various jQuery APIs like .remove()
1578
+ // are passed through jQuery.cleanData. Monkey-patch this method to fire
1579
+ // the $destroy event on all removed nodes.
1580
+ originalCleanData = jQuery.cleanData;
1581
+ jQuery.cleanData = function(elems) {
1582
+ var events;
1583
+ if (!skipDestroyOnNextJQueryCleanData) {
1584
+ for (var i = 0, elem; (elem = elems[i]) != null; i++) {
1585
+ events = jQuery._data(elem, "events");
1586
+ if (events && events.$destroy) {
1587
+ jQuery(elem).triggerHandler('$destroy');
1588
+ }
1589
+ }
1590
+ } else {
1591
+ skipDestroyOnNextJQueryCleanData = false;
1592
+ }
1593
+ originalCleanData(elems);
1594
+ };
1595
+ } else {
1596
+ jqLite = JQLite;
1597
+ }
1598
+
1599
+ angular.element = jqLite;
1600
+
1601
+ // Prevent double-proxying.
1602
+ bindJQueryFired = true;
1603
+}
1604
+
1605
+/**
1606
+ * throw error if the argument is falsy.
1607
+ */
1608
+function assertArg(arg, name, reason) {
1609
+ if (!arg) {
1610
+ throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required"));
1611
+ }
1612
+ return arg;
1613
+}
1614
+
1615
+function assertArgFn(arg, name, acceptArrayAnnotation) {
1616
+ if (acceptArrayAnnotation && isArray(arg)) {
1617
+ arg = arg[arg.length - 1];
1618
+ }
1619
+
1620
+ assertArg(isFunction(arg), name, 'not a function, got ' +
1621
+ (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));
1622
+ return arg;
1623
+}
1624
+
1625
+/**
1626
+ * throw error if the name given is hasOwnProperty
1627
+ * @param {String} name the name to test
1628
+ * @param {String} context the context in which the name is used, such as module or directive
1629
+ */
1630
+function assertNotHasOwnProperty(name, context) {
1631
+ if (name === 'hasOwnProperty') {
1632
+ throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context);
1633
+ }
1634
+}
1635
+
1636
+/**
1637
+ * Return the value accessible from the object by path. Any undefined traversals are ignored
1638
+ * @param {Object} obj starting object
1639
+ * @param {String} path path to traverse
1640
+ * @param {boolean} [bindFnToScope=true]
1641
+ * @returns {Object} value as accessible by path
1642
+ */
1643
+//TODO(misko): this function needs to be removed
1644
+function getter(obj, path, bindFnToScope) {
1645
+ if (!path) return obj;
1646
+ var keys = path.split('.');
1647
+ var key;
1648
+ var lastInstance = obj;
1649
+ var len = keys.length;
1650
+
1651
+ for (var i = 0; i < len; i++) {
1652
+ key = keys[i];
1653
+ if (obj) {
1654
+ obj = (lastInstance = obj)[key];
1655
+ }
1656
+ }
1657
+ if (!bindFnToScope && isFunction(obj)) {
1658
+ return bind(lastInstance, obj);
1659
+ }
1660
+ return obj;
1661
+}
1662
+
1663
+/**
1664
+ * Return the DOM siblings between the first and last node in the given array.
1665
+ * @param {Array} array like object
1666
+ * @returns {jqLite} jqLite collection containing the nodes
1667
+ */
1668
+function getBlockNodes(nodes) {
1669
+ // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original
1670
+ // collection, otherwise update the original collection.
1671
+ var node = nodes[0];
1672
+ var endNode = nodes[nodes.length - 1];
1673
+ var blockNodes = [node];
1674
+
1675
+ do {
1676
+ node = node.nextSibling;
1677
+ if (!node) break;
1678
+ blockNodes.push(node);
1679
+ } while (node !== endNode);
1680
+
1681
+ return jqLite(blockNodes);
1682
+}
1683
+
1684
+
1685
+/**
1686
+ * Creates a new object without a prototype. This object is useful for lookup without having to
1687
+ * guard against prototypically inherited properties via hasOwnProperty.
1688
+ *
1689
+ * Related micro-benchmarks:
1690
+ * - http://jsperf.com/object-create2
1691
+ * - http://jsperf.com/proto-map-lookup/2
1692
+ * - http://jsperf.com/for-in-vs-object-keys2
1693
+ *
1694
+ * @returns {Object}
1695
+ */
1696
+function createMap() {
1697
+ return Object.create(null);
1698
+}
1699
+
1700
+var NODE_TYPE_ELEMENT = 1;
1701
+var NODE_TYPE_TEXT = 3;
1702
+var NODE_TYPE_COMMENT = 8;
1703
+var NODE_TYPE_DOCUMENT = 9;
1704
+var NODE_TYPE_DOCUMENT_FRAGMENT = 11;
1705
+
1706
+/**
1707
+ * @ngdoc type
1708
+ * @name angular.Module
1709
+ * @module ng
1710
+ * @description
1711
+ *
1712
+ * Interface for configuring angular {@link angular.module modules}.
1713
+ */
1714
+
1715
+function setupModuleLoader(window) {
1716
+
1717
+ var $injectorMinErr = minErr('$injector');
1718
+ var ngMinErr = minErr('ng');
1719
+
1720
+ function ensure(obj, name, factory) {
1721
+ return obj[name] || (obj[name] = factory());
1722
+ }
1723
+
1724
+ var angular = ensure(window, 'angular', Object);
1725
+
1726
+ // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
1727
+ angular.$$minErr = angular.$$minErr || minErr;
1728
+
1729
+ return ensure(angular, 'module', function() {
1730
+ /** @type {Object.<string, angular.Module>} */
1731
+ var modules = {};
1732
+
1733
+ /**
1734
+ * @ngdoc function
1735
+ * @name angular.module
1736
+ * @module ng
1737
+ * @description
1738
+ *
1739
+ * The `angular.module` is a global place for creating, registering and retrieving Angular
1740
+ * modules.
1741
+ * All modules (angular core or 3rd party) that should be available to an application must be
1742
+ * registered using this mechanism.
1743
+ *
1744
+ * When passed two or more arguments, a new module is created. If passed only one argument, an
1745
+ * existing module (the name passed as the first argument to `module`) is retrieved.
1746
+ *
1747
+ *
1748
+ * # Module
1749
+ *
1750
+ * A module is a collection of services, directives, controllers, filters, and configuration information.
1751
+ * `angular.module` is used to configure the {@link auto.$injector $injector}.
1752
+ *
1753
+ * ```js
1754
+ * // Create a new module
1755
+ * var myModule = angular.module('myModule', []);
1756
+ *
1757
+ * // register a new service
1758
+ * myModule.value('appName', 'MyCoolApp');
1759
+ *
1760
+ * // configure existing services inside initialization blocks.
1761
+ * myModule.config(['$locationProvider', function($locationProvider) {
1762
+ * // Configure existing providers
1763
+ * $locationProvider.hashPrefix('!');
1764
+ * }]);
1765
+ * ```
1766
+ *
1767
+ * Then you can create an injector and load your modules like this:
1768
+ *
1769
+ * ```js
1770
+ * var injector = angular.injector(['ng', 'myModule'])
1771
+ * ```
1772
+ *
1773
+ * However it's more likely that you'll just use
1774
+ * {@link ng.directive:ngApp ngApp} or
1775
+ * {@link angular.bootstrap} to simplify this process for you.
1776
+ *
1777
+ * @param {!string} name The name of the module to create or retrieve.
1778
+ * @param {!Array.<string>=} requires If specified then new module is being created. If
1779
+ * unspecified then the module is being retrieved for further configuration.
1780
+ * @param {Function=} configFn Optional configuration function for the module. Same as
1781
+ * {@link angular.Module#config Module#config()}.
1782
+ * @returns {module} new module with the {@link angular.Module} api.
1783
+ */
1784
+ return function module(name, requires, configFn) {
1785
+ var assertNotHasOwnProperty = function(name, context) {
1786
+ if (name === 'hasOwnProperty') {
1787
+ throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
1788
+ }
1789
+ };
1790
+
1791
+ assertNotHasOwnProperty(name, 'module');
1792
+ if (requires && modules.hasOwnProperty(name)) {
1793
+ modules[name] = null;
1794
+ }
1795
+ return ensure(modules, name, function() {
1796
+ if (!requires) {
1797
+ throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
1798
+ "the module name or forgot to load it. If registering a module ensure that you " +
1799
+ "specify the dependencies as the second argument.", name);
1800
+ }
1801
+
1802
+ /** @type {!Array.<Array.<*>>} */
1803
+ var invokeQueue = [];
1804
+
1805
+ /** @type {!Array.<Function>} */
1806
+ var configBlocks = [];
1807
+
1808
+ /** @type {!Array.<Function>} */
1809
+ var runBlocks = [];
1810
+
1811
+ var config = invokeLater('$injector', 'invoke', 'push', configBlocks);
1812
+
1813
+ /** @type {angular.Module} */
1814
+ var moduleInstance = {
1815
+ // Private state
1816
+ _invokeQueue: invokeQueue,
1817
+ _configBlocks: configBlocks,
1818
+ _runBlocks: runBlocks,
1819
+
1820
+ /**
1821
+ * @ngdoc property
1822
+ * @name angular.Module#requires
1823
+ * @module ng
1824
+ *
1825
+ * @description
1826
+ * Holds the list of modules which the injector will load before the current module is
1827
+ * loaded.
1828
+ */
1829
+ requires: requires,
1830
+
1831
+ /**
1832
+ * @ngdoc property
1833
+ * @name angular.Module#name
1834
+ * @module ng
1835
+ *
1836
+ * @description
1837
+ * Name of the module.
1838
+ */
1839
+ name: name,
1840
+
1841
+
1842
+ /**
1843
+ * @ngdoc method
1844
+ * @name angular.Module#provider
1845
+ * @module ng
1846
+ * @param {string} name service name
1847
+ * @param {Function} providerType Construction function for creating new instance of the
1848
+ * service.
1849
+ * @description
1850
+ * See {@link auto.$provide#provider $provide.provider()}.
1851
+ */
1852
+ provider: invokeLater('$provide', 'provider'),
1853
+
1854
+ /**
1855
+ * @ngdoc method
1856
+ * @name angular.Module#factory
1857
+ * @module ng
1858
+ * @param {string} name service name
1859
+ * @param {Function} providerFunction Function for creating new instance of the service.
1860
+ * @description
1861
+ * See {@link auto.$provide#factory $provide.factory()}.
1862
+ */
1863
+ factory: invokeLater('$provide', 'factory'),
1864
+
1865
+ /**
1866
+ * @ngdoc method
1867
+ * @name angular.Module#service
1868
+ * @module ng
1869
+ * @param {string} name service name
1870
+ * @param {Function} constructor A constructor function that will be instantiated.
1871
+ * @description
1872
+ * See {@link auto.$provide#service $provide.service()}.
1873
+ */
1874
+ service: invokeLater('$provide', 'service'),
1875
+
1876
+ /**
1877
+ * @ngdoc method
1878
+ * @name angular.Module#value
1879
+ * @module ng
1880
+ * @param {string} name service name
1881
+ * @param {*} object Service instance object.
1882
+ * @description
1883
+ * See {@link auto.$provide#value $provide.value()}.
1884
+ */
1885
+ value: invokeLater('$provide', 'value'),
1886
+
1887
+ /**
1888
+ * @ngdoc method
1889
+ * @name angular.Module#constant
1890
+ * @module ng
1891
+ * @param {string} name constant name
1892
+ * @param {*} object Constant value.
1893
+ * @description
1894
+ * Because the constant are fixed, they get applied before other provide methods.
1895
+ * See {@link auto.$provide#constant $provide.constant()}.
1896
+ */
1897
+ constant: invokeLater('$provide', 'constant', 'unshift'),
1898
+
1899
+ /**
1900
+ * @ngdoc method
1901
+ * @name angular.Module#animation
1902
+ * @module ng
1903
+ * @param {string} name animation name
1904
+ * @param {Function} animationFactory Factory function for creating new instance of an
1905
+ * animation.
1906
+ * @description
1907
+ *
1908
+ * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.
1909
+ *
1910
+ *
1911
+ * Defines an animation hook that can be later used with
1912
+ * {@link ngAnimate.$animate $animate} service and directives that use this service.
1913
+ *
1914
+ * ```js
1915
+ * module.animation('.animation-name', function($inject1, $inject2) {
1916
+ * return {
1917
+ * eventName : function(element, done) {
1918
+ * //code to run the animation
1919
+ * //once complete, then run done()
1920
+ * return function cancellationFunction(element) {
1921
+ * //code to cancel the animation
1922
+ * }
1923
+ * }
1924
+ * }
1925
+ * })
1926
+ * ```
1927
+ *
1928
+ * See {@link ng.$animateProvider#register $animateProvider.register()} and
1929
+ * {@link ngAnimate ngAnimate module} for more information.
1930
+ */
1931
+ animation: invokeLater('$animateProvider', 'register'),
1932
+
1933
+ /**
1934
+ * @ngdoc method
1935
+ * @name angular.Module#filter
1936
+ * @module ng
1937
+ * @param {string} name Filter name.
1938
+ * @param {Function} filterFactory Factory function for creating new instance of filter.
1939
+ * @description
1940
+ * See {@link ng.$filterProvider#register $filterProvider.register()}.
1941
+ */
1942
+ filter: invokeLater('$filterProvider', 'register'),
1943
+
1944
+ /**
1945
+ * @ngdoc method
1946
+ * @name angular.Module#controller
1947
+ * @module ng
1948
+ * @param {string|Object} name Controller name, or an object map of controllers where the
1949
+ * keys are the names and the values are the constructors.
1950
+ * @param {Function} constructor Controller constructor function.
1951
+ * @description
1952
+ * See {@link ng.$controllerProvider#register $controllerProvider.register()}.
1953
+ */
1954
+ controller: invokeLater('$controllerProvider', 'register'),
1955
+
1956
+ /**
1957
+ * @ngdoc method
1958
+ * @name angular.Module#directive
1959
+ * @module ng
1960
+ * @param {string|Object} name Directive name, or an object map of directives where the
1961
+ * keys are the names and the values are the factories.
1962
+ * @param {Function} directiveFactory Factory function for creating new instance of
1963
+ * directives.
1964
+ * @description
1965
+ * See {@link ng.$compileProvider#directive $compileProvider.directive()}.
1966
+ */
1967
+ directive: invokeLater('$compileProvider', 'directive'),
1968
+
1969
+ /**
1970
+ * @ngdoc method
1971
+ * @name angular.Module#config
1972
+ * @module ng
1973
+ * @param {Function} configFn Execute this function on module load. Useful for service
1974
+ * configuration.
1975
+ * @description
1976
+ * Use this method to register work which needs to be performed on module loading.
1977
+ * For more about how to configure services, see
1978
+ * {@link providers#provider-recipe Provider Recipe}.
1979
+ */
1980
+ config: config,
1981
+
1982
+ /**
1983
+ * @ngdoc method
1984
+ * @name angular.Module#run
1985
+ * @module ng
1986
+ * @param {Function} initializationFn Execute this function after injector creation.
1987
+ * Useful for application initialization.
1988
+ * @description
1989
+ * Use this method to register work which should be performed when the injector is done
1990
+ * loading all modules.
1991
+ */
1992
+ run: function(block) {
1993
+ runBlocks.push(block);
1994
+ return this;
1995
+ }
1996
+ };
1997
+
1998
+ if (configFn) {
1999
+ config(configFn);
2000
+ }
2001
+
2002
+ return moduleInstance;
2003
+
2004
+ /**
2005
+ * @param {string} provider
2006
+ * @param {string} method
2007
+ * @param {String=} insertMethod
2008
+ * @returns {angular.Module}
2009
+ */
2010
+ function invokeLater(provider, method, insertMethod, queue) {
2011
+ if (!queue) queue = invokeQueue;
2012
+ return function() {
2013
+ queue[insertMethod || 'push']([provider, method, arguments]);
2014
+ return moduleInstance;
2015
+ };
2016
+ }
2017
+ });
2018
+ };
2019
+ });
2020
+
2021
+}
2022
+
2023
+/* global angularModule: true,
2024
+ version: true,
2025
+
2026
+ $LocaleProvider,
2027
+ $CompileProvider,
2028
+
2029
+ htmlAnchorDirective,
2030
+ inputDirective,
2031
+ inputDirective,
2032
+ formDirective,
2033
+ scriptDirective,
2034
+ selectDirective,
2035
+ styleDirective,
2036
+ optionDirective,
2037
+ ngBindDirective,
2038
+ ngBindHtmlDirective,
2039
+ ngBindTemplateDirective,
2040
+ ngClassDirective,
2041
+ ngClassEvenDirective,
2042
+ ngClassOddDirective,
2043
+ ngCspDirective,
2044
+ ngCloakDirective,
2045
+ ngControllerDirective,
2046
+ ngFormDirective,
2047
+ ngHideDirective,
2048
+ ngIfDirective,
2049
+ ngIncludeDirective,
2050
+ ngIncludeFillContentDirective,
2051
+ ngInitDirective,
2052
+ ngNonBindableDirective,
2053
+ ngPluralizeDirective,
2054
+ ngRepeatDirective,
2055
+ ngShowDirective,
2056
+ ngStyleDirective,
2057
+ ngSwitchDirective,
2058
+ ngSwitchWhenDirective,
2059
+ ngSwitchDefaultDirective,
2060
+ ngOptionsDirective,
2061
+ ngTranscludeDirective,
2062
+ ngModelDirective,
2063
+ ngListDirective,
2064
+ ngChangeDirective,
2065
+ patternDirective,
2066
+ patternDirective,
2067
+ requiredDirective,
2068
+ requiredDirective,
2069
+ minlengthDirective,
2070
+ minlengthDirective,
2071
+ maxlengthDirective,
2072
+ maxlengthDirective,
2073
+ ngValueDirective,
2074
+ ngModelOptionsDirective,
2075
+ ngAttributeAliasDirectives,
2076
+ ngEventDirectives,
2077
+
2078
+ $AnchorScrollProvider,
2079
+ $AnimateProvider,
2080
+ $BrowserProvider,
2081
+ $CacheFactoryProvider,
2082
+ $ControllerProvider,
2083
+ $DocumentProvider,
2084
+ $ExceptionHandlerProvider,
2085
+ $FilterProvider,
2086
+ $InterpolateProvider,
2087
+ $IntervalProvider,
2088
+ $HttpProvider,
2089
+ $HttpBackendProvider,
2090
+ $LocationProvider,
2091
+ $LogProvider,
2092
+ $ParseProvider,
2093
+ $RootScopeProvider,
2094
+ $QProvider,
2095
+ $$QProvider,
2096
+ $$SanitizeUriProvider,
2097
+ $SceProvider,
2098
+ $SceDelegateProvider,
2099
+ $SnifferProvider,
2100
+ $TemplateCacheProvider,
2101
+ $TemplateRequestProvider,
2102
+ $$TestabilityProvider,
2103
+ $TimeoutProvider,
2104
+ $$RAFProvider,
2105
+ $$AsyncCallbackProvider,
2106
+ $WindowProvider
2107
+*/
2108
+
2109
+
2110
+/**
2111
+ * @ngdoc object
2112
+ * @name angular.version
2113
+ * @module ng
2114
+ * @description
2115
+ * An object that contains information about the current AngularJS version. This object has the
2116
+ * following properties:
2117
+ *
2118
+ * - `full` – `{string}` – Full version string, such as "0.9.18".
2119
+ * - `major` – `{number}` – Major version number, such as "0".
2120
+ * - `minor` – `{number}` – Minor version number, such as "9".
2121
+ * - `dot` – `{number}` – Dot version number, such as "18".
2122
+ * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
2123
+ */
2124
+var version = {
2125
+ full: '1.3.0', // all of these placeholder strings will be replaced by grunt's
2126
+ major: 1, // package task
2127
+ minor: 3,
2128
+ dot: 0,
2129
+ codeName: 'superluminal-nudge'
2130
+};
2131
+
2132
+
2133
+function publishExternalAPI(angular){
2134
+ extend(angular, {
2135
+ 'bootstrap': bootstrap,
2136
+ 'copy': copy,
2137
+ 'extend': extend,
2138
+ 'equals': equals,
2139
+ 'element': jqLite,
2140
+ 'forEach': forEach,
2141
+ 'injector': createInjector,
2142
+ 'noop': noop,
2143
+ 'bind': bind,
2144
+ 'toJson': toJson,
2145
+ 'fromJson': fromJson,
2146
+ 'identity': identity,
2147
+ 'isUndefined': isUndefined,
2148
+ 'isDefined': isDefined,
2149
+ 'isString': isString,
2150
+ 'isFunction': isFunction,
2151
+ 'isObject': isObject,
2152
+ 'isNumber': isNumber,
2153
+ 'isElement': isElement,
2154
+ 'isArray': isArray,
2155
+ 'version': version,
2156
+ 'isDate': isDate,
2157
+ 'lowercase': lowercase,
2158
+ 'uppercase': uppercase,
2159
+ 'callbacks': {counter: 0},
2160
+ 'getTestability': getTestability,
2161
+ '$$minErr': minErr,
2162
+ '$$csp': csp,
2163
+ 'reloadWithDebugInfo': reloadWithDebugInfo
2164
+ });
2165
+
2166
+ angularModule = setupModuleLoader(window);
2167
+ try {
2168
+ angularModule('ngLocale');
2169
+ } catch (e) {
2170
+ angularModule('ngLocale', []).provider('$locale', $LocaleProvider);
2171
+ }
2172
+
2173
+ angularModule('ng', ['ngLocale'], ['$provide',
2174
+ function ngModule($provide) {
2175
+ // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.
2176
+ $provide.provider({
2177
+ $$sanitizeUri: $$SanitizeUriProvider
2178
+ });
2179
+ $provide.provider('$compile', $CompileProvider).
2180
+ directive({
2181
+ a: htmlAnchorDirective,
2182
+ input: inputDirective,
2183
+ textarea: inputDirective,
2184
+ form: formDirective,
2185
+ script: scriptDirective,
2186
+ select: selectDirective,
2187
+ style: styleDirective,
2188
+ option: optionDirective,
2189
+ ngBind: ngBindDirective,
2190
+ ngBindHtml: ngBindHtmlDirective,
2191
+ ngBindTemplate: ngBindTemplateDirective,
2192
+ ngClass: ngClassDirective,
2193
+ ngClassEven: ngClassEvenDirective,
2194
+ ngClassOdd: ngClassOddDirective,
2195
+ ngCloak: ngCloakDirective,
2196
+ ngController: ngControllerDirective,
2197
+ ngForm: ngFormDirective,
2198
+ ngHide: ngHideDirective,
2199
+ ngIf: ngIfDirective,
2200
+ ngInclude: ngIncludeDirective,
2201
+ ngInit: ngInitDirective,
2202
+ ngNonBindable: ngNonBindableDirective,
2203
+ ngPluralize: ngPluralizeDirective,
2204
+ ngRepeat: ngRepeatDirective,
2205
+ ngShow: ngShowDirective,
2206
+ ngStyle: ngStyleDirective,
2207
+ ngSwitch: ngSwitchDirective,
2208
+ ngSwitchWhen: ngSwitchWhenDirective,
2209
+ ngSwitchDefault: ngSwitchDefaultDirective,
2210
+ ngOptions: ngOptionsDirective,
2211
+ ngTransclude: ngTranscludeDirective,
2212
+ ngModel: ngModelDirective,
2213
+ ngList: ngListDirective,
2214
+ ngChange: ngChangeDirective,
2215
+ pattern: patternDirective,
2216
+ ngPattern: patternDirective,
2217
+ required: requiredDirective,
2218
+ ngRequired: requiredDirective,
2219
+ minlength: minlengthDirective,
2220
+ ngMinlength: minlengthDirective,
2221
+ maxlength: maxlengthDirective,
2222
+ ngMaxlength: maxlengthDirective,
2223
+ ngValue: ngValueDirective,
2224
+ ngModelOptions: ngModelOptionsDirective
2225
+ }).
2226
+ directive({
2227
+ ngInclude: ngIncludeFillContentDirective
2228
+ }).
2229
+ directive(ngAttributeAliasDirectives).
2230
+ directive(ngEventDirectives);
2231
+ $provide.provider({
2232
+ $anchorScroll: $AnchorScrollProvider,
2233
+ $animate: $AnimateProvider,
2234
+ $browser: $BrowserProvider,
2235
+ $cacheFactory: $CacheFactoryProvider,
2236
+ $controller: $ControllerProvider,
2237
+ $document: $DocumentProvider,
2238
+ $exceptionHandler: $ExceptionHandlerProvider,
2239
+ $filter: $FilterProvider,
2240
+ $interpolate: $InterpolateProvider,
2241
+ $interval: $IntervalProvider,
2242
+ $http: $HttpProvider,
2243
+ $httpBackend: $HttpBackendProvider,
2244
+ $location: $LocationProvider,
2245
+ $log: $LogProvider,
2246
+ $parse: $ParseProvider,
2247
+ $rootScope: $RootScopeProvider,
2248
+ $q: $QProvider,
2249
+ $$q: $$QProvider,
2250
+ $sce: $SceProvider,
2251
+ $sceDelegate: $SceDelegateProvider,
2252
+ $sniffer: $SnifferProvider,
2253
+ $templateCache: $TemplateCacheProvider,
2254
+ $templateRequest: $TemplateRequestProvider,
2255
+ $$testability: $$TestabilityProvider,
2256
+ $timeout: $TimeoutProvider,
2257
+ $window: $WindowProvider,
2258
+ $$rAF: $$RAFProvider,
2259
+ $$asyncCallback : $$AsyncCallbackProvider
2260
+ });
2261
+ }
2262
+ ]);
2263
+}
2264
+
2265
+/* global JQLitePrototype: true,
2266
+ addEventListenerFn: true,
2267
+ removeEventListenerFn: true,
2268
+ BOOLEAN_ATTR: true,
2269
+ ALIASED_ATTR: true,
2270
+*/
2271
+
2272
+//////////////////////////////////
2273
+//JQLite
2274
+//////////////////////////////////
2275
+
2276
+/**
2277
+ * @ngdoc function
2278
+ * @name angular.element
2279
+ * @module ng
2280
+ * @kind function
2281
+ *
2282
+ * @description
2283
+ * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.
2284
+ *
2285
+ * If jQuery is available, `angular.element` is an alias for the
2286
+ * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`
2287
+ * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite."
2288
+ *
2289
+ * <div class="alert alert-success">jqLite is a tiny, API-compatible subset of jQuery that allows
2290
+ * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most
2291
+ * commonly needed functionality with the goal of having a very small footprint.</div>
2292
+ *
2293
+ * To use jQuery, simply load it before `DOMContentLoaded` event fired.
2294
+ *
2295
+ * <div class="alert">**Note:** all element references in Angular are always wrapped with jQuery or
2296
+ * jqLite; they are never raw DOM references.</div>
2297
+ *
2298
+ * ## Angular's jqLite
2299
+ * jqLite provides only the following jQuery methods:
2300
+ *
2301
+ * - [`addClass()`](http://api.jquery.com/addClass/)
2302
+ * - [`after()`](http://api.jquery.com/after/)
2303
+ * - [`append()`](http://api.jquery.com/append/)
2304
+ * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters
2305
+ * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData
2306
+ * - [`children()`](http://api.jquery.com/children/) - Does not support selectors
2307
+ * - [`clone()`](http://api.jquery.com/clone/)
2308
+ * - [`contents()`](http://api.jquery.com/contents/)
2309
+ * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyles()`
2310
+ * - [`data()`](http://api.jquery.com/data/)
2311
+ * - [`detach()`](http://api.jquery.com/detach/)
2312
+ * - [`empty()`](http://api.jquery.com/empty/)
2313
+ * - [`eq()`](http://api.jquery.com/eq/)
2314
+ * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name
2315
+ * - [`hasClass()`](http://api.jquery.com/hasClass/)
2316
+ * - [`html()`](http://api.jquery.com/html/)
2317
+ * - [`next()`](http://api.jquery.com/next/) - Does not support selectors
2318
+ * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData
2319
+ * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors
2320
+ * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors
2321
+ * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors
2322
+ * - [`prepend()`](http://api.jquery.com/prepend/)
2323
+ * - [`prop()`](http://api.jquery.com/prop/)
2324
+ * - [`ready()`](http://api.jquery.com/ready/)
2325
+ * - [`remove()`](http://api.jquery.com/remove/)
2326
+ * - [`removeAttr()`](http://api.jquery.com/removeAttr/)
2327
+ * - [`removeClass()`](http://api.jquery.com/removeClass/)
2328
+ * - [`removeData()`](http://api.jquery.com/removeData/)
2329
+ * - [`replaceWith()`](http://api.jquery.com/replaceWith/)
2330
+ * - [`text()`](http://api.jquery.com/text/)
2331
+ * - [`toggleClass()`](http://api.jquery.com/toggleClass/)
2332
+ * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.
2333
+ * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces
2334
+ * - [`val()`](http://api.jquery.com/val/)
2335
+ * - [`wrap()`](http://api.jquery.com/wrap/)
2336
+ *
2337
+ * ## jQuery/jqLite Extras
2338
+ * Angular also provides the following additional methods and events to both jQuery and jqLite:
2339
+ *
2340
+ * ### Events
2341
+ * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
2342
+ * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM
2343
+ * element before it is removed.
2344
+ *
2345
+ * ### Methods
2346
+ * - `controller(name)` - retrieves the controller of the current element or its parent. By default
2347
+ * retrieves controller associated with the `ngController` directive. If `name` is provided as
2348
+ * camelCase directive name, then the controller for this directive will be retrieved (e.g.
2349
+ * `'ngModel'`).
2350
+ * - `injector()` - retrieves the injector of the current element or its parent.
2351
+ * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current
2352
+ * element or its parent.
2353
+ * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the
2354
+ * current element. This getter should be used only on elements that contain a directive which starts a new isolate
2355
+ * scope. Calling `scope()` on this element always returns the original non-isolate scope.
2356
+ * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
2357
+ * parent element is reached.
2358
+ *
2359
+ * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.
2360
+ * @returns {Object} jQuery object.
2361
+ */
2362
+
2363
+JQLite.expando = 'ng339';
2364
+
2365
+var jqCache = JQLite.cache = {},
2366
+ jqId = 1,
2367
+ addEventListenerFn = function(element, type, fn) {
2368
+ element.addEventListener(type, fn, false);
2369
+ },
2370
+ removeEventListenerFn = function(element, type, fn) {
2371
+ element.removeEventListener(type, fn, false);
2372
+ };
2373
+
2374
+/*
2375
+ * !!! This is an undocumented "private" function !!!
2376
+ */
2377
+JQLite._data = function(node) {
2378
+ //jQuery always returns an object on cache miss
2379
+ return this.cache[node[this.expando]] || {};
2380
+};
2381
+
2382
+function jqNextId() { return ++jqId; }
2383
+
2384
+
2385
+var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
2386
+var MOZ_HACK_REGEXP = /^moz([A-Z])/;
2387
+var MOUSE_EVENT_MAP= { mouseleave : "mouseout", mouseenter : "mouseover"};
2388
+var jqLiteMinErr = minErr('jqLite');
2389
+
2390
+/**
2391
+ * Converts snake_case to camelCase.
2392
+ * Also there is special case for Moz prefix starting with upper case letter.
2393
+ * @param name Name to normalize
2394
+ */
2395
+function camelCase(name) {
2396
+ return name.
2397
+ replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
2398
+ return offset ? letter.toUpperCase() : letter;
2399
+ }).
2400
+ replace(MOZ_HACK_REGEXP, 'Moz$1');
2401
+}
2402
+
2403
+var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
2404
+var HTML_REGEXP = /<|&#?\w+;/;
2405
+var TAG_NAME_REGEXP = /<([\w:]+)/;
2406
+var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi;
2407
+
2408
+var wrapMap = {
2409
+ 'option': [1, '<select multiple="multiple">', '</select>'],
2410
+
2411
+ 'thead': [1, '<table>', '</table>'],
2412
+ 'col': [2, '<table><colgroup>', '</colgroup></table>'],
2413
+ 'tr': [2, '<table><tbody>', '</tbody></table>'],
2414
+ 'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],
2415
+ '_default': [0, "", ""]
2416
+};
2417
+
2418
+wrapMap.optgroup = wrapMap.option;
2419
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
2420
+wrapMap.th = wrapMap.td;
2421
+
2422
+
2423
+function jqLiteIsTextNode(html) {
2424
+ return !HTML_REGEXP.test(html);
2425
+}
2426
+
2427
+function jqLiteAcceptsData(node) {
2428
+ // The window object can accept data but has no nodeType
2429
+ // Otherwise we are only interested in elements (1) and documents (9)
2430
+ var nodeType = node.nodeType;
2431
+ return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;
2432
+}
2433
+
2434
+function jqLiteBuildFragment(html, context) {
2435
+ var tmp, tag, wrap,
2436
+ fragment = context.createDocumentFragment(),
2437
+ nodes = [], i;
2438
+
2439
+ if (jqLiteIsTextNode(html)) {
2440
+ // Convert non-html into a text node
2441
+ nodes.push(context.createTextNode(html));
2442
+ } else {
2443
+ // Convert html into DOM nodes
2444
+ tmp = tmp || fragment.appendChild(context.createElement("div"));
2445
+ tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase();
2446
+ wrap = wrapMap[tag] || wrapMap._default;
2447
+ tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1></$2>") + wrap[2];
2448
+
2449
+ // Descend through wrappers to the right content
2450
+ i = wrap[0];
2451
+ while (i--) {
2452
+ tmp = tmp.lastChild;
2453
+ }
2454
+
2455
+ nodes = concat(nodes, tmp.childNodes);
2456
+
2457
+ tmp = fragment.firstChild;
2458
+ tmp.textContent = "";
2459
+ }
2460
+
2461
+ // Remove wrapper from fragment
2462
+ fragment.textContent = "";
2463
+ fragment.innerHTML = ""; // Clear inner HTML
2464
+ forEach(nodes, function(node) {
2465
+ fragment.appendChild(node);
2466
+ });
2467
+
2468
+ return fragment;
2469
+}
2470
+
2471
+function jqLiteParseHTML(html, context) {
2472
+ context = context || document;
2473
+ var parsed;
2474
+
2475
+ if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {
2476
+ return [context.createElement(parsed[1])];
2477
+ }
2478
+
2479
+ if ((parsed = jqLiteBuildFragment(html, context))) {
2480
+ return parsed.childNodes;
2481
+ }
2482
+
2483
+ return [];
2484
+}
2485
+
2486
+/////////////////////////////////////////////
2487
+function JQLite(element) {
2488
+ if (element instanceof JQLite) {
2489
+ return element;
2490
+ }
2491
+
2492
+ var argIsString;
2493
+
2494
+ if (isString(element)) {
2495
+ element = trim(element);
2496
+ argIsString = true;
2497
+ }
2498
+ if (!(this instanceof JQLite)) {
2499
+ if (argIsString && element.charAt(0) != '<') {
2500
+ throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');
2501
+ }
2502
+ return new JQLite(element);
2503
+ }
2504
+
2505
+ if (argIsString) {
2506
+ jqLiteAddNodes(this, jqLiteParseHTML(element));
2507
+ } else {
2508
+ jqLiteAddNodes(this, element);
2509
+ }
2510
+}
2511
+
2512
+function jqLiteClone(element) {
2513
+ return element.cloneNode(true);
2514
+}
2515
+
2516
+function jqLiteDealoc(element, onlyDescendants){
2517
+ if (!onlyDescendants) jqLiteRemoveData(element);
2518
+
2519
+ if (element.querySelectorAll) {
2520
+ var descendants = element.querySelectorAll('*');
2521
+ for (var i = 0, l = descendants.length; i < l; i++) {
2522
+ jqLiteRemoveData(descendants[i]);
2523
+ }
2524
+ }
2525
+}
2526
+
2527
+function jqLiteOff(element, type, fn, unsupported) {
2528
+ if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');
2529
+
2530
+ var expandoStore = jqLiteExpandoStore(element);
2531
+ var events = expandoStore && expandoStore.events;
2532
+ var handle = expandoStore && expandoStore.handle;
2533
+
2534
+ if (!handle) return; //no listeners registered
2535
+
2536
+ if (!type) {
2537
+ for (type in events) {
2538
+ if (type !== '$destroy') {
2539
+ removeEventListenerFn(element, type, handle);
2540
+ }
2541
+ delete events[type];
2542
+ }
2543
+ } else {
2544
+ forEach(type.split(' '), function(type) {
2545
+ if (isDefined(fn)) {
2546
+ var listenerFns = events[type];
2547
+ arrayRemove(listenerFns || [], fn);
2548
+ if (listenerFns && listenerFns.length > 0) {
2549
+ return;
2550
+ }
2551
+ }
2552
+
2553
+ removeEventListenerFn(element, type, handle);
2554
+ delete events[type];
2555
+ });
2556
+ }
2557
+}
2558
+
2559
+function jqLiteRemoveData(element, name) {
2560
+ var expandoId = element.ng339;
2561
+ var expandoStore = expandoId && jqCache[expandoId];
2562
+
2563
+ if (expandoStore) {
2564
+ if (name) {
2565
+ delete expandoStore.data[name];
2566
+ return;
2567
+ }
2568
+
2569
+ if (expandoStore.handle) {
2570
+ if (expandoStore.events.$destroy) {
2571
+ expandoStore.handle({}, '$destroy');
2572
+ }
2573
+ jqLiteOff(element);
2574
+ }
2575
+ delete jqCache[expandoId];
2576
+ element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it
2577
+ }
2578
+}
2579
+
2580
+
2581
+function jqLiteExpandoStore(element, createIfNecessary) {
2582
+ var expandoId = element.ng339,
2583
+ expandoStore = expandoId && jqCache[expandoId];
2584
+
2585
+ if (createIfNecessary && !expandoStore) {
2586
+ element.ng339 = expandoId = jqNextId();
2587
+ expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined};
2588
+ }
2589
+
2590
+ return expandoStore;
2591
+}
2592
+
2593
+
2594
+function jqLiteData(element, key, value) {
2595
+ if (jqLiteAcceptsData(element)) {
2596
+
2597
+ var isSimpleSetter = isDefined(value);
2598
+ var isSimpleGetter = !isSimpleSetter && key && !isObject(key);
2599
+ var massGetter = !key;
2600
+ var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter);
2601
+ var data = expandoStore && expandoStore.data;
2602
+
2603
+ if (isSimpleSetter) { // data('key', value)
2604
+ data[key] = value;
2605
+ } else {
2606
+ if (massGetter) { // data()
2607
+ return data;
2608
+ } else {
2609
+ if (isSimpleGetter) { // data('key')
2610
+ // don't force creation of expandoStore if it doesn't exist yet
2611
+ return data && data[key];
2612
+ } else { // mass-setter: data({key1: val1, key2: val2})
2613
+ extend(data, key);
2614
+ }
2615
+ }
2616
+ }
2617
+ }
2618
+}
2619
+
2620
+function jqLiteHasClass(element, selector) {
2621
+ if (!element.getAttribute) return false;
2622
+ return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " ").
2623
+ indexOf( " " + selector + " " ) > -1);
2624
+}
2625
+
2626
+function jqLiteRemoveClass(element, cssClasses) {
2627
+ if (cssClasses && element.setAttribute) {
2628
+ forEach(cssClasses.split(' '), function(cssClass) {
2629
+ element.setAttribute('class', trim(
2630
+ (" " + (element.getAttribute('class') || '') + " ")
2631
+ .replace(/[\n\t]/g, " ")
2632
+ .replace(" " + trim(cssClass) + " ", " "))
2633
+ );
2634
+ });
2635
+ }
2636
+}
2637
+
2638
+function jqLiteAddClass(element, cssClasses) {
2639
+ if (cssClasses && element.setAttribute) {
2640
+ var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
2641
+ .replace(/[\n\t]/g, " ");
2642
+
2643
+ forEach(cssClasses.split(' '), function(cssClass) {
2644
+ cssClass = trim(cssClass);
2645
+ if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
2646
+ existingClasses += cssClass + ' ';
2647
+ }
2648
+ });
2649
+
2650
+ element.setAttribute('class', trim(existingClasses));
2651
+ }
2652
+}
2653
+
2654
+
2655
+function jqLiteAddNodes(root, elements) {
2656
+ // THIS CODE IS VERY HOT. Don't make changes without benchmarking.
2657
+
2658
+ if (elements) {
2659
+
2660
+ // if a Node (the most common case)
2661
+ if (elements.nodeType) {
2662
+ root[root.length++] = elements;
2663
+ } else {
2664
+ var length = elements.length;
2665
+
2666
+ // if an Array or NodeList and not a Window
2667
+ if (typeof length === 'number' && elements.window !== elements) {
2668
+ if (length) {
2669
+ for (var i = 0; i < length; i++) {
2670
+ root[root.length++] = elements[i];
2671
+ }
2672
+ }
2673
+ } else {
2674
+ root[root.length++] = elements;
2675
+ }
2676
+ }
2677
+ }
2678
+}
2679
+
2680
+
2681
+function jqLiteController(element, name) {
2682
+ return jqLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');
2683
+}
2684
+
2685
+function jqLiteInheritedData(element, name, value) {
2686
+ // if element is the document object work with the html element instead
2687
+ // this makes $(document).scope() possible
2688
+ if(element.nodeType == NODE_TYPE_DOCUMENT) {
2689
+ element = element.documentElement;
2690
+ }
2691
+ var names = isArray(name) ? name : [name];
2692
+
2693
+ while (element) {
2694
+ for (var i = 0, ii = names.length; i < ii; i++) {
2695
+ if ((value = jqLite.data(element, names[i])) !== undefined) return value;
2696
+ }
2697
+
2698
+ // If dealing with a document fragment node with a host element, and no parent, use the host
2699
+ // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM
2700
+ // to lookup parent controllers.
2701
+ element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host);
2702
+ }
2703
+}
2704
+
2705
+function jqLiteEmpty(element) {
2706
+ jqLiteDealoc(element, true);
2707
+ while (element.firstChild) {
2708
+ element.removeChild(element.firstChild);
2709
+ }
2710
+}
2711
+
2712
+function jqLiteRemove(element, keepData) {
2713
+ if (!keepData) jqLiteDealoc(element);
2714
+ var parent = element.parentNode;
2715
+ if (parent) parent.removeChild(element);
2716
+}
2717
+
2718
+
2719
+function jqLiteDocumentLoaded(action, win) {
2720
+ win = win || window;
2721
+ if (win.document.readyState === 'complete') {
2722
+ // Force the action to be run async for consistent behaviour
2723
+ // from the action's point of view
2724
+ // i.e. it will definitely not be in a $apply
2725
+ win.setTimeout(action);
2726
+ } else {
2727
+ // No need to unbind this handler as load is only ever called once
2728
+ jqLite(win).on('load', action);
2729
+ }
2730
+}
2731
+
2732
+//////////////////////////////////////////
2733
+// Functions which are declared directly.
2734
+//////////////////////////////////////////
2735
+var JQLitePrototype = JQLite.prototype = {
2736
+ ready: function(fn) {
2737
+ var fired = false;
2738
+
2739
+ function trigger() {
2740
+ if (fired) return;
2741
+ fired = true;
2742
+ fn();
2743
+ }
2744
+
2745
+ // check if document is already loaded
2746
+ if (document.readyState === 'complete'){
2747
+ setTimeout(trigger);
2748
+ } else {
2749
+ this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9
2750
+ // we can not use jqLite since we are not done loading and jQuery could be loaded later.
2751
+ // jshint -W064
2752
+ JQLite(window).on('load', trigger); // fallback to window.onload for others
2753
+ // jshint +W064
2754
+ this.on('DOMContentLoaded', trigger);
2755
+ }
2756
+ },
2757
+ toString: function() {
2758
+ var value = [];
2759
+ forEach(this, function(e){ value.push('' + e);});
2760
+ return '[' + value.join(', ') + ']';
2761
+ },
2762
+
2763
+ eq: function(index) {
2764
+ return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);
2765
+ },
2766
+
2767
+ length: 0,
2768
+ push: push,
2769
+ sort: [].sort,
2770
+ splice: [].splice
2771
+};
2772
+
2773
+//////////////////////////////////////////
2774
+// Functions iterating getter/setters.
2775
+// these functions return self on setter and
2776
+// value on get.
2777
+//////////////////////////////////////////
2778
+var BOOLEAN_ATTR = {};
2779
+forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {
2780
+ BOOLEAN_ATTR[lowercase(value)] = value;
2781
+});
2782
+var BOOLEAN_ELEMENTS = {};
2783
+forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
2784
+ BOOLEAN_ELEMENTS[value] = true;
2785
+});
2786
+var ALIASED_ATTR = {
2787
+ 'ngMinlength' : 'minlength',
2788
+ 'ngMaxlength' : 'maxlength',
2789
+ 'ngMin' : 'min',
2790
+ 'ngMax' : 'max',
2791
+ 'ngPattern' : 'pattern'
2792
+};
2793
+
2794
+function getBooleanAttrName(element, name) {
2795
+ // check dom last since we will most likely fail on name
2796
+ var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
2797
+
2798
+ // booleanAttr is here twice to minimize DOM access
2799
+ return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;
2800
+}
2801
+
2802
+function getAliasedAttrName(element, name) {
2803
+ var nodeName = element.nodeName;
2804
+ return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name];
2805
+}
2806
+
2807
+forEach({
2808
+ data: jqLiteData,
2809
+ removeData: jqLiteRemoveData
2810
+}, function(fn, name) {
2811
+ JQLite[name] = fn;
2812
+});
2813
+
2814
+forEach({
2815
+ data: jqLiteData,
2816
+ inheritedData: jqLiteInheritedData,
2817
+
2818
+ scope: function(element) {
2819
+ // Can't use jqLiteData here directly so we stay compatible with jQuery!
2820
+ return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);
2821
+ },
2822
+
2823
+ isolateScope: function(element) {
2824
+ // Can't use jqLiteData here directly so we stay compatible with jQuery!
2825
+ return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');
2826
+ },
2827
+
2828
+ controller: jqLiteController,
2829
+
2830
+ injector: function(element) {
2831
+ return jqLiteInheritedData(element, '$injector');
2832
+ },
2833
+
2834
+ removeAttr: function(element, name) {
2835
+ element.removeAttribute(name);
2836
+ },
2837
+
2838
+ hasClass: jqLiteHasClass,
2839
+
2840
+ css: function(element, name, value) {
2841
+ name = camelCase(name);
2842
+
2843
+ if (isDefined(value)) {
2844
+ element.style[name] = value;
2845
+ } else {
2846
+ return element.style[name];
2847
+ }
2848
+ },
2849
+
2850
+ attr: function(element, name, value){
2851
+ var lowercasedName = lowercase(name);
2852
+ if (BOOLEAN_ATTR[lowercasedName]) {
2853
+ if (isDefined(value)) {
2854
+ if (!!value) {
2855
+ element[name] = true;
2856
+ element.setAttribute(name, lowercasedName);
2857
+ } else {
2858
+ element[name] = false;
2859
+ element.removeAttribute(lowercasedName);
2860
+ }
2861
+ } else {
2862
+ return (element[name] ||
2863
+ (element.attributes.getNamedItem(name)|| noop).specified)
2864
+ ? lowercasedName
2865
+ : undefined;
2866
+ }
2867
+ } else if (isDefined(value)) {
2868
+ element.setAttribute(name, value);
2869
+ } else if (element.getAttribute) {
2870
+ // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code
2871
+ // some elements (e.g. Document) don't have get attribute, so return undefined
2872
+ var ret = element.getAttribute(name, 2);
2873
+ // normalize non-existing attributes to undefined (as jQuery)
2874
+ return ret === null ? undefined : ret;
2875
+ }
2876
+ },
2877
+
2878
+ prop: function(element, name, value) {
2879
+ if (isDefined(value)) {
2880
+ element[name] = value;
2881
+ } else {
2882
+ return element[name];
2883
+ }
2884
+ },
2885
+
2886
+ text: (function() {
2887
+ getText.$dv = '';
2888
+ return getText;
2889
+
2890
+ function getText(element, value) {
2891
+ if (isUndefined(value)) {
2892
+ var nodeType = element.nodeType;
2893
+ return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : '';
2894
+ }
2895
+ element.textContent = value;
2896
+ }
2897
+ })(),
2898
+
2899
+ val: function(element, value) {
2900
+ if (isUndefined(value)) {
2901
+ if (element.multiple && nodeName_(element) === 'select') {
2902
+ var result = [];
2903
+ forEach(element.options, function (option) {
2904
+ if (option.selected) {
2905
+ result.push(option.value || option.text);
2906
+ }
2907
+ });
2908
+ return result.length === 0 ? null : result;
2909
+ }
2910
+ return element.value;
2911
+ }
2912
+ element.value = value;
2913
+ },
2914
+
2915
+ html: function(element, value) {
2916
+ if (isUndefined(value)) {
2917
+ return element.innerHTML;
2918
+ }
2919
+ jqLiteDealoc(element, true);
2920
+ element.innerHTML = value;
2921
+ },
2922
+
2923
+ empty: jqLiteEmpty
2924
+}, function(fn, name){
2925
+ /**
2926
+ * Properties: writes return selection, reads return first value
2927
+ */
2928
+ JQLite.prototype[name] = function(arg1, arg2) {
2929
+ var i, key;
2930
+ var nodeCount = this.length;
2931
+
2932
+ // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
2933
+ // in a way that survives minification.
2934
+ // jqLiteEmpty takes no arguments but is a setter.
2935
+ if (fn !== jqLiteEmpty &&
2936
+ (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {
2937
+ if (isObject(arg1)) {
2938
+
2939
+ // we are a write, but the object properties are the key/values
2940
+ for (i = 0; i < nodeCount; i++) {
2941
+ if (fn === jqLiteData) {
2942
+ // data() takes the whole object in jQuery
2943
+ fn(this[i], arg1);
2944
+ } else {
2945
+ for (key in arg1) {
2946
+ fn(this[i], key, arg1[key]);
2947
+ }
2948
+ }
2949
+ }
2950
+ // return self for chaining
2951
+ return this;
2952
+ } else {
2953
+ // we are a read, so read the first child.
2954
+ // TODO: do we still need this?
2955
+ var value = fn.$dv;
2956
+ // Only if we have $dv do we iterate over all, otherwise it is just the first element.
2957
+ var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount;
2958
+ for (var j = 0; j < jj; j++) {
2959
+ var nodeValue = fn(this[j], arg1, arg2);
2960
+ value = value ? value + nodeValue : nodeValue;
2961
+ }
2962
+ return value;
2963
+ }
2964
+ } else {
2965
+ // we are a write, so apply to all children
2966
+ for (i = 0; i < nodeCount; i++) {
2967
+ fn(this[i], arg1, arg2);
2968
+ }
2969
+ // return self for chaining
2970
+ return this;
2971
+ }
2972
+ };
2973
+});
2974
+
2975
+function createEventHandler(element, events) {
2976
+ var eventHandler = function (event, type) {
2977
+ // jQuery specific api
2978
+ event.isDefaultPrevented = function() {
2979
+ return event.defaultPrevented;
2980
+ };
2981
+
2982
+ var eventFns = events[type || event.type];
2983
+ var eventFnsLength = eventFns ? eventFns.length : 0;
2984
+
2985
+ if (!eventFnsLength) return;
2986
+
2987
+ if (isUndefined(event.immediatePropagationStopped)) {
2988
+ var originalStopImmediatePropagation = event.stopImmediatePropagation;
2989
+ event.stopImmediatePropagation = function() {
2990
+ event.immediatePropagationStopped = true;
2991
+
2992
+ if (event.stopPropagation) {
2993
+ event.stopPropagation();
2994
+ }
2995
+
2996
+ if (originalStopImmediatePropagation) {
2997
+ originalStopImmediatePropagation.call(event);
2998
+ }
2999
+ };
3000
+ }
3001
+
3002
+ event.isImmediatePropagationStopped = function() {
3003
+ return event.immediatePropagationStopped === true;
3004
+ };
3005
+
3006
+ // Copy event handlers in case event handlers array is modified during execution.
3007
+ if ((eventFnsLength > 1)) {
3008
+ eventFns = shallowCopy(eventFns);
3009
+ }
3010
+
3011
+ for (var i = 0; i < eventFnsLength; i++) {
3012
+ if (!event.isImmediatePropagationStopped()) {
3013
+ eventFns[i].call(element, event);
3014
+ }
3015
+ }
3016
+ };
3017
+
3018
+ // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all
3019
+ // events on `element`
3020
+ eventHandler.elem = element;
3021
+ return eventHandler;
3022
+}
3023
+
3024
+//////////////////////////////////////////
3025
+// Functions iterating traversal.
3026
+// These functions chain results into a single
3027
+// selector.
3028
+//////////////////////////////////////////
3029
+forEach({
3030
+ removeData: jqLiteRemoveData,
3031
+
3032
+ on: function jqLiteOn(element, type, fn, unsupported){
3033
+ if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');
3034
+
3035
+ // Do not add event handlers to non-elements because they will not be cleaned up.
3036
+ if (!jqLiteAcceptsData(element)) {
3037
+ return;
3038
+ }
3039
+
3040
+ var expandoStore = jqLiteExpandoStore(element, true);
3041
+ var events = expandoStore.events;
3042
+ var handle = expandoStore.handle;
3043
+
3044
+ if (!handle) {
3045
+ handle = expandoStore.handle = createEventHandler(element, events);
3046
+ }
3047
+
3048
+ // http://jsperf.com/string-indexof-vs-split
3049
+ var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type];
3050
+ var i = types.length;
3051
+
3052
+ while (i--) {
3053
+ type = types[i];
3054
+ var eventFns = events[type];
3055
+
3056
+ if (!eventFns) {
3057
+ events[type] = [];
3058
+
3059
+ if (type === 'mouseenter' || type === 'mouseleave') {
3060
+ // Refer to jQuery's implementation of mouseenter & mouseleave
3061
+ // Read about mouseenter and mouseleave:
3062
+ // http://www.quirksmode.org/js/events_mouse.html#link8
3063
+
3064
+ jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) {
3065
+ var target = this, related = event.relatedTarget;
3066
+ // For mousenter/leave call the handler if related is outside the target.
3067
+ // NB: No relatedTarget if the mouse left/entered the browser window
3068
+ if ( !related || (related !== target && !target.contains(related)) ){
3069
+ handle(event, type);
3070
+ }
3071
+ });
3072
+
3073
+ } else {
3074
+ if (type !== '$destroy') {
3075
+ addEventListenerFn(element, type, handle);
3076
+ }
3077
+ }
3078
+ eventFns = events[type];
3079
+ }
3080
+ eventFns.push(fn);
3081
+ }
3082
+ },
3083
+
3084
+ off: jqLiteOff,
3085
+
3086
+ one: function(element, type, fn) {
3087
+ element = jqLite(element);
3088
+
3089
+ //add the listener twice so that when it is called
3090
+ //you can remove the original function and still be
3091
+ //able to call element.off(ev, fn) normally
3092
+ element.on(type, function onFn() {
3093
+ element.off(type, fn);
3094
+ element.off(type, onFn);
3095
+ });
3096
+ element.on(type, fn);
3097
+ },
3098
+
3099
+ replaceWith: function(element, replaceNode) {
3100
+ var index, parent = element.parentNode;
3101
+ jqLiteDealoc(element);
3102
+ forEach(new JQLite(replaceNode), function(node){
3103
+ if (index) {
3104
+ parent.insertBefore(node, index.nextSibling);
3105
+ } else {
3106
+ parent.replaceChild(node, element);
3107
+ }
3108
+ index = node;
3109
+ });
3110
+ },
3111
+
3112
+ children: function(element) {
3113
+ var children = [];
3114
+ forEach(element.childNodes, function(element){
3115
+ if (element.nodeType === NODE_TYPE_ELEMENT)
3116
+ children.push(element);
3117
+ });
3118
+ return children;
3119
+ },
3120
+
3121
+ contents: function(element) {
3122
+ return element.contentDocument || element.childNodes || [];
3123
+ },
3124
+
3125
+ append: function(element, node) {
3126
+ var nodeType = element.nodeType;
3127
+ if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return;
3128
+
3129
+ node = new JQLite(node);
3130
+
3131
+ for (var i = 0, ii = node.length; i < ii; i++) {
3132
+ var child = node[i];
3133
+ element.appendChild(child);
3134
+ }
3135
+ },
3136
+
3137
+ prepend: function(element, node) {
3138
+ if (element.nodeType === NODE_TYPE_ELEMENT) {
3139
+ var index = element.firstChild;
3140
+ forEach(new JQLite(node), function(child){
3141
+ element.insertBefore(child, index);
3142
+ });
3143
+ }
3144
+ },
3145
+
3146
+ wrap: function(element, wrapNode) {
3147
+ wrapNode = jqLite(wrapNode).eq(0).clone()[0];
3148
+ var parent = element.parentNode;
3149
+ if (parent) {
3150
+ parent.replaceChild(wrapNode, element);
3151
+ }
3152
+ wrapNode.appendChild(element);
3153
+ },
3154
+
3155
+ remove: jqLiteRemove,
3156
+
3157
+ detach: function(element) {
3158
+ jqLiteRemove(element, true);
3159
+ },
3160
+
3161
+ after: function(element, newElement) {
3162
+ var index = element, parent = element.parentNode;
3163
+ newElement = new JQLite(newElement);
3164
+
3165
+ for (var i = 0, ii = newElement.length; i < ii; i++) {
3166
+ var node = newElement[i];
3167
+ parent.insertBefore(node, index.nextSibling);
3168
+ index = node;
3169
+ }
3170
+ },
3171
+
3172
+ addClass: jqLiteAddClass,
3173
+ removeClass: jqLiteRemoveClass,
3174
+
3175
+ toggleClass: function(element, selector, condition) {
3176
+ if (selector) {
3177
+ forEach(selector.split(' '), function(className){
3178
+ var classCondition = condition;
3179
+ if (isUndefined(classCondition)) {
3180
+ classCondition = !jqLiteHasClass(element, className);
3181
+ }
3182
+ (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);
3183
+ });
3184
+ }
3185
+ },
3186
+
3187
+ parent: function(element) {
3188
+ var parent = element.parentNode;
3189
+ return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null;
3190
+ },
3191
+
3192
+ next: function(element) {
3193
+ return element.nextElementSibling;
3194
+ },
3195
+
3196
+ find: function(element, selector) {
3197
+ if (element.getElementsByTagName) {
3198
+ return element.getElementsByTagName(selector);
3199
+ } else {
3200
+ return [];
3201
+ }
3202
+ },
3203
+
3204
+ clone: jqLiteClone,
3205
+
3206
+ triggerHandler: function(element, event, extraParameters) {
3207
+
3208
+ var dummyEvent, eventFnsCopy, handlerArgs;
3209
+ var eventName = event.type || event;
3210
+ var expandoStore = jqLiteExpandoStore(element);
3211
+ var events = expandoStore && expandoStore.events;
3212
+ var eventFns = events && events[eventName];
3213
+
3214
+ if (eventFns) {
3215
+ // Create a dummy event to pass to the handlers
3216
+ dummyEvent = {
3217
+ preventDefault: function() { this.defaultPrevented = true; },
3218
+ isDefaultPrevented: function() { return this.defaultPrevented === true; },
3219
+ stopImmediatePropagation: function() { this.immediatePropagationStopped = true; },
3220
+ isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; },
3221
+ stopPropagation: noop,
3222
+ type: eventName,
3223
+ target: element
3224
+ };
3225
+
3226
+ // If a custom event was provided then extend our dummy event with it
3227
+ if (event.type) {
3228
+ dummyEvent = extend(dummyEvent, event);
3229
+ }
3230
+
3231
+ // Copy event handlers in case event handlers array is modified during execution.
3232
+ eventFnsCopy = shallowCopy(eventFns);
3233
+ handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];
3234
+
3235
+ forEach(eventFnsCopy, function(fn) {
3236
+ if (!dummyEvent.isImmediatePropagationStopped()) {
3237
+ fn.apply(element, handlerArgs);
3238
+ }
3239
+ });
3240
+ }
3241
+ }
3242
+}, function(fn, name){
3243
+ /**
3244
+ * chaining functions
3245
+ */
3246
+ JQLite.prototype[name] = function(arg1, arg2, arg3) {
3247
+ var value;
3248
+
3249
+ for(var i = 0, ii = this.length; i < ii; i++) {
3250
+ if (isUndefined(value)) {
3251
+ value = fn(this[i], arg1, arg2, arg3);
3252
+ if (isDefined(value)) {
3253
+ // any function which returns a value needs to be wrapped
3254
+ value = jqLite(value);
3255
+ }
3256
+ } else {
3257
+ jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));
3258
+ }
3259
+ }
3260
+ return isDefined(value) ? value : this;
3261
+ };
3262
+
3263
+ // bind legacy bind/unbind to on/off
3264
+ JQLite.prototype.bind = JQLite.prototype.on;
3265
+ JQLite.prototype.unbind = JQLite.prototype.off;
3266
+});
3267
+
3268
+/**
3269
+ * Computes a hash of an 'obj'.
3270
+ * Hash of a:
3271
+ * string is string
3272
+ * number is number as string
3273
+ * object is either result of calling $$hashKey function on the object or uniquely generated id,
3274
+ * that is also assigned to the $$hashKey property of the object.
3275
+ *
3276
+ * @param obj
3277
+ * @returns {string} hash string such that the same input will have the same hash string.
3278
+ * The resulting string key is in 'type:hashKey' format.
3279
+ */
3280
+function hashKey(obj, nextUidFn) {
3281
+ var key = obj && obj.$$hashKey;
3282
+
3283
+ if (key) {
3284
+ if (typeof key === 'function') {
3285
+ key = obj.$$hashKey();
3286
+ }
3287
+ return key;
3288
+ }
3289
+
3290
+ var objType = typeof obj;
3291
+ if (objType == 'function' || (objType == 'object' && obj !== null)) {
3292
+ key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)();
3293
+ } else {
3294
+ key = objType + ':' + obj;
3295
+ }
3296
+
3297
+ return key;
3298
+}
3299
+
3300
+/**
3301
+ * HashMap which can use objects as keys
3302
+ */
3303
+function HashMap(array, isolatedUid) {
3304
+ if (isolatedUid) {
3305
+ var uid = 0;
3306
+ this.nextUid = function() {
3307
+ return ++uid;
3308
+ };
3309
+ }
3310
+ forEach(array, this.put, this);
3311
+}
3312
+HashMap.prototype = {
3313
+ /**
3314
+ * Store key value pair
3315
+ * @param key key to store can be any type
3316
+ * @param value value to store can be any type
3317
+ */
3318
+ put: function(key, value) {
3319
+ this[hashKey(key, this.nextUid)] = value;
3320
+ },
3321
+
3322
+ /**
3323
+ * @param key
3324
+ * @returns {Object} the value for the key
3325
+ */
3326
+ get: function(key) {
3327
+ return this[hashKey(key, this.nextUid)];
3328
+ },
3329
+
3330
+ /**
3331
+ * Remove the key/value pair
3332
+ * @param key
3333
+ */
3334
+ remove: function(key) {
3335
+ var value = this[key = hashKey(key, this.nextUid)];
3336
+ delete this[key];
3337
+ return value;
3338
+ }
3339
+};
3340
+
3341
+/**
3342
+ * @ngdoc function
3343
+ * @module ng
3344
+ * @name angular.injector
3345
+ * @kind function
3346
+ *
3347
+ * @description
3348
+ * Creates an injector object that can be used for retrieving services as well as for
3349
+ * dependency injection (see {@link guide/di dependency injection}).
3350
+ *
3351
+
3352
+ * @param {Array.<string|Function>} modules A list of module functions or their aliases. See
3353
+ * {@link angular.module}. The `ng` module must be explicitly added.
3354
+ * @returns {injector} Injector object. See {@link auto.$injector $injector}.
3355
+ *
3356
+ * @example
3357
+ * Typical usage
3358
+ * ```js
3359
+ * // create an injector
3360
+ * var $injector = angular.injector(['ng']);
3361
+ *
3362
+ * // use the injector to kick off your application
3363
+ * // use the type inference to auto inject arguments, or use implicit injection
3364
+ * $injector.invoke(function($rootScope, $compile, $document) {
3365
+ * $compile($document)($rootScope);
3366
+ * $rootScope.$digest();
3367
+ * });
3368
+ * ```
3369
+ *
3370
+ * Sometimes you want to get access to the injector of a currently running Angular app
3371
+ * from outside Angular. Perhaps, you want to inject and compile some markup after the
3372
+ * application has been bootstrapped. You can do this using the extra `injector()` added
3373
+ * to JQuery/jqLite elements. See {@link angular.element}.
3374
+ *
3375
+ * *This is fairly rare but could be the case if a third party library is injecting the
3376
+ * markup.*
3377
+ *
3378
+ * In the following example a new block of HTML containing a `ng-controller`
3379
+ * directive is added to the end of the document body by JQuery. We then compile and link
3380
+ * it into the current AngularJS scope.
3381
+ *
3382
+ * ```js
3383
+ * var $div = $('<div ng-controller="MyCtrl">{{content.label}}</div>');
3384
+ * $(document.body).append($div);
3385
+ *
3386
+ * angular.element(document).injector().invoke(function($compile) {
3387
+ * var scope = angular.element($div).scope();
3388
+ * $compile($div)(scope);
3389
+ * });
3390
+ * ```
3391
+ */
3392
+
3393
+
3394
+/**
3395
+ * @ngdoc module
3396
+ * @name auto
3397
+ * @description
3398
+ *
3399
+ * Implicit module which gets automatically added to each {@link auto.$injector $injector}.
3400
+ */
3401
+
3402
+var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
3403
+var FN_ARG_SPLIT = /,/;
3404
+var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
3405
+var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
3406
+var $injectorMinErr = minErr('$injector');
3407
+
3408
+function anonFn(fn) {
3409
+ // For anonymous functions, showing at the very least the function signature can help in
3410
+ // debugging.
3411
+ var fnText = fn.toString().replace(STRIP_COMMENTS, ''),
3412
+ args = fnText.match(FN_ARGS);
3413
+ if (args) {
3414
+ return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')';
3415
+ }
3416
+ return 'fn';
3417
+}
3418
+
3419
+function annotate(fn, strictDi, name) {
3420
+ var $inject,
3421
+ fnText,
3422
+ argDecl,
3423
+ last;
3424
+
3425
+ if (typeof fn === 'function') {
3426
+ if (!($inject = fn.$inject)) {
3427
+ $inject = [];
3428
+ if (fn.length) {
3429
+ if (strictDi) {
3430
+ if (!isString(name) || !name) {
3431
+ name = fn.name || anonFn(fn);
3432
+ }
3433
+ throw $injectorMinErr('strictdi',
3434
+ '{0} is not using explicit annotation and cannot be invoked in strict mode', name);
3435
+ }
3436
+ fnText = fn.toString().replace(STRIP_COMMENTS, '');
3437
+ argDecl = fnText.match(FN_ARGS);
3438
+ forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {
3439
+ arg.replace(FN_ARG, function(all, underscore, name) {
3440
+ $inject.push(name);
3441
+ });
3442
+ });
3443
+ }
3444
+ fn.$inject = $inject;
3445
+ }
3446
+ } else if (isArray(fn)) {
3447
+ last = fn.length - 1;
3448
+ assertArgFn(fn[last], 'fn');
3449
+ $inject = fn.slice(0, last);
3450
+ } else {
3451
+ assertArgFn(fn, 'fn', true);
3452
+ }
3453
+ return $inject;
3454
+}
3455
+
3456
+///////////////////////////////////////
3457
+
3458
+/**
3459
+ * @ngdoc service
3460
+ * @name $injector
3461
+ *
3462
+ * @description
3463
+ *
3464
+ * `$injector` is used to retrieve object instances as defined by
3465
+ * {@link auto.$provide provider}, instantiate types, invoke methods,
3466
+ * and load modules.
3467
+ *
3468
+ * The following always holds true:
3469
+ *
3470
+ * ```js
3471
+ * var $injector = angular.injector();
3472
+ * expect($injector.get('$injector')).toBe($injector);
3473
+ * expect($injector.invoke(function($injector) {
3474
+ * return $injector;
3475
+ * })).toBe($injector);
3476
+ * ```
3477
+ *
3478
+ * # Injection Function Annotation
3479
+ *
3480
+ * JavaScript does not have annotations, and annotations are needed for dependency injection. The
3481
+ * following are all valid ways of annotating function with injection arguments and are equivalent.
3482
+ *
3483
+ * ```js
3484
+ * // inferred (only works if code not minified/obfuscated)
3485
+ * $injector.invoke(function(serviceA){});
3486
+ *
3487
+ * // annotated
3488
+ * function explicit(serviceA) {};
3489
+ * explicit.$inject = ['serviceA'];
3490
+ * $injector.invoke(explicit);
3491
+ *
3492
+ * // inline
3493
+ * $injector.invoke(['serviceA', function(serviceA){}]);
3494
+ * ```
3495
+ *
3496
+ * ## Inference
3497
+ *
3498
+ * In JavaScript calling `toString()` on a function returns the function definition. The definition
3499
+ * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with
3500
+ * minification, and obfuscation tools since these tools change the argument names.
3501
+ *
3502
+ * ## `$inject` Annotation
3503
+ * By adding an `$inject` property onto a function the injection parameters can be specified.
3504
+ *
3505
+ * ## Inline
3506
+ * As an array of injection names, where the last item in the array is the function to call.
3507
+ */
3508
+
3509
+/**
3510
+ * @ngdoc method
3511
+ * @name $injector#get
3512
+ *
3513
+ * @description
3514
+ * Return an instance of the service.
3515
+ *
3516
+ * @param {string} name The name of the instance to retrieve.
3517
+ * @return {*} The instance.
3518
+ */
3519
+
3520
+/**
3521
+ * @ngdoc method
3522
+ * @name $injector#invoke
3523
+ *
3524
+ * @description
3525
+ * Invoke the method and supply the method arguments from the `$injector`.
3526
+ *
3527
+ * @param {!Function} fn The function to invoke. Function parameters are injected according to the
3528
+ * {@link guide/di $inject Annotation} rules.
3529
+ * @param {Object=} self The `this` for the invoked method.
3530
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this
3531
+ * object first, before the `$injector` is consulted.
3532
+ * @returns {*} the value returned by the invoked `fn` function.
3533
+ */
3534
+
3535
+/**
3536
+ * @ngdoc method
3537
+ * @name $injector#has
3538
+ *
3539
+ * @description
3540
+ * Allows the user to query if the particular service exists.
3541
+ *
3542
+ * @param {string} name Name of the service to query.
3543
+ * @returns {boolean} `true` if injector has given service.
3544
+ */
3545
+
3546
+/**
3547
+ * @ngdoc method
3548
+ * @name $injector#instantiate
3549
+ * @description
3550
+ * Create a new instance of JS type. The method takes a constructor function, invokes the new
3551
+ * operator, and supplies all of the arguments to the constructor function as specified by the
3552
+ * constructor annotation.
3553
+ *
3554
+ * @param {Function} Type Annotated constructor function.
3555
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this
3556
+ * object first, before the `$injector` is consulted.
3557
+ * @returns {Object} new instance of `Type`.
3558
+ */
3559
+
3560
+/**
3561
+ * @ngdoc method
3562
+ * @name $injector#annotate
3563
+ *
3564
+ * @description
3565
+ * Returns an array of service names which the function is requesting for injection. This API is
3566
+ * used by the injector to determine which services need to be injected into the function when the
3567
+ * function is invoked. There are three ways in which the function can be annotated with the needed
3568
+ * dependencies.
3569
+ *
3570
+ * # Argument names
3571
+ *
3572
+ * The simplest form is to extract the dependencies from the arguments of the function. This is done
3573
+ * by converting the function into a string using `toString()` method and extracting the argument
3574
+ * names.
3575
+ * ```js
3576
+ * // Given
3577
+ * function MyController($scope, $route) {
3578
+ * // ...
3579
+ * }
3580
+ *
3581
+ * // Then
3582
+ * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
3583
+ * ```
3584
+ *
3585
+ * This method does not work with code minification / obfuscation. For this reason the following
3586
+ * annotation strategies are supported.
3587
+ *
3588
+ * # The `$inject` property
3589
+ *
3590
+ * If a function has an `$inject` property and its value is an array of strings, then the strings
3591
+ * represent names of services to be injected into the function.
3592
+ * ```js
3593
+ * // Given
3594
+ * var MyController = function(obfuscatedScope, obfuscatedRoute) {
3595
+ * // ...
3596
+ * }
3597
+ * // Define function dependencies
3598
+ * MyController['$inject'] = ['$scope', '$route'];
3599
+ *
3600
+ * // Then
3601
+ * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
3602
+ * ```
3603
+ *
3604
+ * # The array notation
3605
+ *
3606
+ * It is often desirable to inline Injected functions and that's when setting the `$inject` property
3607
+ * is very inconvenient. In these situations using the array notation to specify the dependencies in
3608
+ * a way that survives minification is a better choice:
3609
+ *
3610
+ * ```js
3611
+ * // We wish to write this (not minification / obfuscation safe)
3612
+ * injector.invoke(function($compile, $rootScope) {
3613
+ * // ...
3614
+ * });
3615
+ *
3616
+ * // We are forced to write break inlining
3617
+ * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
3618
+ * // ...
3619
+ * };
3620
+ * tmpFn.$inject = ['$compile', '$rootScope'];
3621
+ * injector.invoke(tmpFn);
3622
+ *
3623
+ * // To better support inline function the inline annotation is supported
3624
+ * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
3625
+ * // ...
3626
+ * }]);
3627
+ *
3628
+ * // Therefore
3629
+ * expect(injector.annotate(
3630
+ * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
3631
+ * ).toEqual(['$compile', '$rootScope']);
3632
+ * ```
3633
+ *
3634
+ * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to
3635
+ * be retrieved as described above.
3636
+ *
3637
+ * @returns {Array.<string>} The names of the services which the function requires.
3638
+ */
3639
+
3640
+
3641
+
3642
+
3643
+/**
3644
+ * @ngdoc service
3645
+ * @name $provide
3646
+ *
3647
+ * @description
3648
+ *
3649
+ * The {@link auto.$provide $provide} service has a number of methods for registering components
3650
+ * with the {@link auto.$injector $injector}. Many of these functions are also exposed on
3651
+ * {@link angular.Module}.
3652
+ *
3653
+ * An Angular **service** is a singleton object created by a **service factory**. These **service
3654
+ * factories** are functions which, in turn, are created by a **service provider**.
3655
+ * The **service providers** are constructor functions. When instantiated they must contain a
3656
+ * property called `$get`, which holds the **service factory** function.
3657
+ *
3658
+ * When you request a service, the {@link auto.$injector $injector} is responsible for finding the
3659
+ * correct **service provider**, instantiating it and then calling its `$get` **service factory**
3660
+ * function to get the instance of the **service**.
3661
+ *
3662
+ * Often services have no configuration options and there is no need to add methods to the service
3663
+ * provider. The provider will be no more than a constructor function with a `$get` property. For
3664
+ * these cases the {@link auto.$provide $provide} service has additional helper methods to register
3665
+ * services without specifying a provider.
3666
+ *
3667
+ * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the
3668
+ * {@link auto.$injector $injector}
3669
+ * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by
3670
+ * providers and services.
3671
+ * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by
3672
+ * services, not providers.
3673
+ * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,
3674
+ * that will be wrapped in a **service provider** object, whose `$get` property will contain the
3675
+ * given factory function.
3676
+ * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`
3677
+ * that will be wrapped in a **service provider** object, whose `$get` property will instantiate
3678
+ * a new object using the given constructor function.
3679
+ *
3680
+ * See the individual methods for more information and examples.
3681
+ */
3682
+
3683
+/**
3684
+ * @ngdoc method
3685
+ * @name $provide#provider
3686
+ * @description
3687
+ *
3688
+ * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions
3689
+ * are constructor functions, whose instances are responsible for "providing" a factory for a
3690
+ * service.
3691
+ *
3692
+ * Service provider names start with the name of the service they provide followed by `Provider`.
3693
+ * For example, the {@link ng.$log $log} service has a provider called
3694
+ * {@link ng.$logProvider $logProvider}.
3695
+ *
3696
+ * Service provider objects can have additional methods which allow configuration of the provider
3697
+ * and its service. Importantly, you can configure what kind of service is created by the `$get`
3698
+ * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a
3699
+ * method {@link ng.$logProvider#debugEnabled debugEnabled}
3700
+ * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the
3701
+ * console or not.
3702
+ *
3703
+ * @param {string} name The name of the instance. NOTE: the provider will be available under `name +
3704
+ 'Provider'` key.
3705
+ * @param {(Object|function())} provider If the provider is:
3706
+ *
3707
+ * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using
3708
+ * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.
3709
+ * - `Constructor`: a new instance of the provider will be created using
3710
+ * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.
3711
+ *
3712
+ * @returns {Object} registered provider instance
3713
+
3714
+ * @example
3715
+ *
3716
+ * The following example shows how to create a simple event tracking service and register it using
3717
+ * {@link auto.$provide#provider $provide.provider()}.
3718
+ *
3719
+ * ```js
3720
+ * // Define the eventTracker provider
3721
+ * function EventTrackerProvider() {
3722
+ * var trackingUrl = '/track';
3723
+ *
3724
+ * // A provider method for configuring where the tracked events should been saved
3725
+ * this.setTrackingUrl = function(url) {
3726
+ * trackingUrl = url;
3727
+ * };
3728
+ *
3729
+ * // The service factory function
3730
+ * this.$get = ['$http', function($http) {
3731
+ * var trackedEvents = {};
3732
+ * return {
3733
+ * // Call this to track an event
3734
+ * event: function(event) {
3735
+ * var count = trackedEvents[event] || 0;
3736
+ * count += 1;
3737
+ * trackedEvents[event] = count;
3738
+ * return count;
3739
+ * },
3740
+ * // Call this to save the tracked events to the trackingUrl
3741
+ * save: function() {
3742
+ * $http.post(trackingUrl, trackedEvents);
3743
+ * }
3744
+ * };
3745
+ * }];
3746
+ * }
3747
+ *
3748
+ * describe('eventTracker', function() {
3749
+ * var postSpy;
3750
+ *
3751
+ * beforeEach(module(function($provide) {
3752
+ * // Register the eventTracker provider
3753
+ * $provide.provider('eventTracker', EventTrackerProvider);
3754
+ * }));
3755
+ *
3756
+ * beforeEach(module(function(eventTrackerProvider) {
3757
+ * // Configure eventTracker provider
3758
+ * eventTrackerProvider.setTrackingUrl('/custom-track');
3759
+ * }));
3760
+ *
3761
+ * it('tracks events', inject(function(eventTracker) {
3762
+ * expect(eventTracker.event('login')).toEqual(1);
3763
+ * expect(eventTracker.event('login')).toEqual(2);
3764
+ * }));
3765
+ *
3766
+ * it('saves to the tracking url', inject(function(eventTracker, $http) {
3767
+ * postSpy = spyOn($http, 'post');
3768
+ * eventTracker.event('login');
3769
+ * eventTracker.save();
3770
+ * expect(postSpy).toHaveBeenCalled();
3771
+ * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');
3772
+ * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');
3773
+ * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });
3774
+ * }));
3775
+ * });
3776
+ * ```
3777
+ */
3778
+
3779
+/**
3780
+ * @ngdoc method
3781
+ * @name $provide#factory
3782
+ * @description
3783
+ *
3784
+ * Register a **service factory**, which will be called to return the service instance.
3785
+ * This is short for registering a service where its provider consists of only a `$get` property,
3786
+ * which is the given service factory function.
3787
+ * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to
3788
+ * configure your service in a provider.
3789
+ *
3790
+ * @param {string} name The name of the instance.
3791
+ * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand
3792
+ * for `$provide.provider(name, {$get: $getFn})`.
3793
+ * @returns {Object} registered provider instance
3794
+ *
3795
+ * @example
3796
+ * Here is an example of registering a service
3797
+ * ```js
3798
+ * $provide.factory('ping', ['$http', function($http) {
3799
+ * return function ping() {
3800
+ * return $http.send('/ping');
3801
+ * };
3802
+ * }]);
3803
+ * ```
3804
+ * You would then inject and use this service like this:
3805
+ * ```js
3806
+ * someModule.controller('Ctrl', ['ping', function(ping) {
3807
+ * ping();
3808
+ * }]);
3809
+ * ```
3810
+ */
3811
+
3812
+
3813
+/**
3814
+ * @ngdoc method
3815
+ * @name $provide#service
3816
+ * @description
3817
+ *
3818
+ * Register a **service constructor**, which will be invoked with `new` to create the service
3819
+ * instance.
3820
+ * This is short for registering a service where its provider's `$get` property is the service
3821
+ * constructor function that will be used to instantiate the service instance.
3822
+ *
3823
+ * You should use {@link auto.$provide#service $provide.service(class)} if you define your service
3824
+ * as a type/class.
3825
+ *
3826
+ * @param {string} name The name of the instance.
3827
+ * @param {Function} constructor A class (constructor function) that will be instantiated.
3828
+ * @returns {Object} registered provider instance
3829
+ *
3830
+ * @example
3831
+ * Here is an example of registering a service using
3832
+ * {@link auto.$provide#service $provide.service(class)}.
3833
+ * ```js
3834
+ * var Ping = function($http) {
3835
+ * this.$http = $http;
3836
+ * };
3837
+ *
3838
+ * Ping.$inject = ['$http'];
3839
+ *
3840
+ * Ping.prototype.send = function() {
3841
+ * return this.$http.get('/ping');
3842
+ * };
3843
+ * $provide.service('ping', Ping);
3844
+ * ```
3845
+ * You would then inject and use this service like this:
3846
+ * ```js
3847
+ * someModule.controller('Ctrl', ['ping', function(ping) {
3848
+ * ping.send();
3849
+ * }]);
3850
+ * ```
3851
+ */
3852
+
3853
+
3854
+/**
3855
+ * @ngdoc method
3856
+ * @name $provide#value
3857
+ * @description
3858
+ *
3859
+ * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a
3860
+ * number, an array, an object or a function. This is short for registering a service where its
3861
+ * provider's `$get` property is a factory function that takes no arguments and returns the **value
3862
+ * service**.
3863
+ *
3864
+ * Value services are similar to constant services, except that they cannot be injected into a
3865
+ * module configuration function (see {@link angular.Module#config}) but they can be overridden by
3866
+ * an Angular
3867
+ * {@link auto.$provide#decorator decorator}.
3868
+ *
3869
+ * @param {string} name The name of the instance.
3870
+ * @param {*} value The value.
3871
+ * @returns {Object} registered provider instance
3872
+ *
3873
+ * @example
3874
+ * Here are some examples of creating value services.
3875
+ * ```js
3876
+ * $provide.value('ADMIN_USER', 'admin');
3877
+ *
3878
+ * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });
3879
+ *
3880
+ * $provide.value('halfOf', function(value) {
3881
+ * return value / 2;
3882
+ * });
3883
+ * ```
3884
+ */
3885
+
3886
+
3887
+/**
3888
+ * @ngdoc method
3889
+ * @name $provide#constant
3890
+ * @description
3891
+ *
3892
+ * Register a **constant service**, such as a string, a number, an array, an object or a function,
3893
+ * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be
3894
+ * injected into a module configuration function (see {@link angular.Module#config}) and it cannot
3895
+ * be overridden by an Angular {@link auto.$provide#decorator decorator}.
3896
+ *
3897
+ * @param {string} name The name of the constant.
3898
+ * @param {*} value The constant value.
3899
+ * @returns {Object} registered instance
3900
+ *
3901
+ * @example
3902
+ * Here a some examples of creating constants:
3903
+ * ```js
3904
+ * $provide.constant('SHARD_HEIGHT', 306);
3905
+ *
3906
+ * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);
3907
+ *
3908
+ * $provide.constant('double', function(value) {
3909
+ * return value * 2;
3910
+ * });
3911
+ * ```
3912
+ */
3913
+
3914
+
3915
+/**
3916
+ * @ngdoc method
3917
+ * @name $provide#decorator
3918
+ * @description
3919
+ *
3920
+ * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator
3921
+ * intercepts the creation of a service, allowing it to override or modify the behaviour of the
3922
+ * service. The object returned by the decorator may be the original service, or a new service
3923
+ * object which replaces or wraps and delegates to the original service.
3924
+ *
3925
+ * @param {string} name The name of the service to decorate.
3926
+ * @param {function()} decorator This function will be invoked when the service needs to be
3927
+ * instantiated and should return the decorated service instance. The function is called using
3928
+ * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.
3929
+ * Local injection arguments:
3930
+ *
3931
+ * * `$delegate` - The original service instance, which can be monkey patched, configured,
3932
+ * decorated or delegated to.
3933
+ *
3934
+ * @example
3935
+ * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting
3936
+ * calls to {@link ng.$log#error $log.warn()}.
3937
+ * ```js
3938
+ * $provide.decorator('$log', ['$delegate', function($delegate) {
3939
+ * $delegate.warn = $delegate.error;
3940
+ * return $delegate;
3941
+ * }]);
3942
+ * ```
3943
+ */
3944
+
3945
+
3946
+function createInjector(modulesToLoad, strictDi) {
3947
+ strictDi = (strictDi === true);
3948
+ var INSTANTIATING = {},
3949
+ providerSuffix = 'Provider',
3950
+ path = [],
3951
+ loadedModules = new HashMap([], true),
3952
+ providerCache = {
3953
+ $provide: {
3954
+ provider: supportObject(provider),
3955
+ factory: supportObject(factory),
3956
+ service: supportObject(service),
3957
+ value: supportObject(value),
3958
+ constant: supportObject(constant),
3959
+ decorator: decorator
3960
+ }
3961
+ },
3962
+ providerInjector = (providerCache.$injector =
3963
+ createInternalInjector(providerCache, function() {
3964
+ throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));
3965
+ })),
3966
+ instanceCache = {},
3967
+ instanceInjector = (instanceCache.$injector =
3968
+ createInternalInjector(instanceCache, function(servicename) {
3969
+ var provider = providerInjector.get(servicename + providerSuffix);
3970
+ return instanceInjector.invoke(provider.$get, provider, undefined, servicename);
3971
+ }));
3972
+
3973
+
3974
+ forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });
3975
+
3976
+ return instanceInjector;
3977
+
3978
+ ////////////////////////////////////
3979
+ // $provider
3980
+ ////////////////////////////////////
3981
+
3982
+ function supportObject(delegate) {
3983
+ return function(key, value) {
3984
+ if (isObject(key)) {
3985
+ forEach(key, reverseParams(delegate));
3986
+ } else {
3987
+ return delegate(key, value);
3988
+ }
3989
+ };
3990
+ }
3991
+
3992
+ function provider(name, provider_) {
3993
+ assertNotHasOwnProperty(name, 'service');
3994
+ if (isFunction(provider_) || isArray(provider_)) {
3995
+ provider_ = providerInjector.instantiate(provider_);
3996
+ }
3997
+ if (!provider_.$get) {
3998
+ throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name);
3999
+ }
4000
+ return providerCache[name + providerSuffix] = provider_;
4001
+ }
4002
+
4003
+ function enforceReturnValue(name, factory) {
4004
+ return function enforcedReturnValue() {
4005
+ var result = instanceInjector.invoke(factory, this, undefined, name);
4006
+ if (isUndefined(result)) {
4007
+ throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name);
4008
+ }
4009
+ return result;
4010
+ };
4011
+ }
4012
+
4013
+ function factory(name, factoryFn, enforce) {
4014
+ return provider(name, {
4015
+ $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
4016
+ });
4017
+ }
4018
+
4019
+ function service(name, constructor) {
4020
+ return factory(name, ['$injector', function($injector) {
4021
+ return $injector.instantiate(constructor);
4022
+ }]);
4023
+ }
4024
+
4025
+ function value(name, val) { return factory(name, valueFn(val), false); }
4026
+
4027
+ function constant(name, value) {
4028
+ assertNotHasOwnProperty(name, 'constant');
4029
+ providerCache[name] = value;
4030
+ instanceCache[name] = value;
4031
+ }
4032
+
4033
+ function decorator(serviceName, decorFn) {
4034
+ var origProvider = providerInjector.get(serviceName + providerSuffix),
4035
+ orig$get = origProvider.$get;
4036
+
4037
+ origProvider.$get = function() {
4038
+ var origInstance = instanceInjector.invoke(orig$get, origProvider);
4039
+ return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});
4040
+ };
4041
+ }
4042
+
4043
+ ////////////////////////////////////
4044
+ // Module Loading
4045
+ ////////////////////////////////////
4046
+ function loadModules(modulesToLoad){
4047
+ var runBlocks = [], moduleFn;
4048
+ forEach(modulesToLoad, function(module) {
4049
+ if (loadedModules.get(module)) return;
4050
+ loadedModules.put(module, true);
4051
+
4052
+ function runInvokeQueue(queue) {
4053
+ var i, ii;
4054
+ for(i = 0, ii = queue.length; i < ii; i++) {
4055
+ var invokeArgs = queue[i],
4056
+ provider = providerInjector.get(invokeArgs[0]);
4057
+
4058
+ provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
4059
+ }
4060
+ }
4061
+
4062
+ try {
4063
+ if (isString(module)) {
4064
+ moduleFn = angularModule(module);
4065
+ runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);
4066
+ runInvokeQueue(moduleFn._invokeQueue);
4067
+ runInvokeQueue(moduleFn._configBlocks);
4068
+ } else if (isFunction(module)) {
4069
+ runBlocks.push(providerInjector.invoke(module));
4070
+ } else if (isArray(module)) {
4071
+ runBlocks.push(providerInjector.invoke(module));
4072
+ } else {
4073
+ assertArgFn(module, 'module');
4074
+ }
4075
+ } catch (e) {
4076
+ if (isArray(module)) {
4077
+ module = module[module.length - 1];
4078
+ }
4079
+ if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {
4080
+ // Safari & FF's stack traces don't contain error.message content
4081
+ // unlike those of Chrome and IE
4082
+ // So if stack doesn't contain message, we create a new string that contains both.
4083
+ // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.
4084
+ /* jshint -W022 */
4085
+ e = e.message + '\n' + e.stack;
4086
+ }
4087
+ throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}",
4088
+ module, e.stack || e.message || e);
4089
+ }
4090
+ });
4091
+ return runBlocks;
4092
+ }
4093
+
4094
+ ////////////////////////////////////
4095
+ // internal Injector
4096
+ ////////////////////////////////////
4097
+
4098
+ function createInternalInjector(cache, factory) {
4099
+
4100
+ function getService(serviceName) {
4101
+ if (cache.hasOwnProperty(serviceName)) {
4102
+ if (cache[serviceName] === INSTANTIATING) {
4103
+ throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
4104
+ serviceName + ' <- ' + path.join(' <- '));
4105
+ }
4106
+ return cache[serviceName];
4107
+ } else {
4108
+ try {
4109
+ path.unshift(serviceName);
4110
+ cache[serviceName] = INSTANTIATING;
4111
+ return cache[serviceName] = factory(serviceName);
4112
+ } catch (err) {
4113
+ if (cache[serviceName] === INSTANTIATING) {
4114
+ delete cache[serviceName];
4115
+ }
4116
+ throw err;
4117
+ } finally {
4118
+ path.shift();
4119
+ }
4120
+ }
4121
+ }
4122
+
4123
+ function invoke(fn, self, locals, serviceName) {
4124
+ if (typeof locals === 'string') {
4125
+ serviceName = locals;
4126
+ locals = null;
4127
+ }
4128
+
4129
+ var args = [],
4130
+ $inject = annotate(fn, strictDi, serviceName),
4131
+ length, i,
4132
+ key;
4133
+
4134
+ for(i = 0, length = $inject.length; i < length; i++) {
4135
+ key = $inject[i];
4136
+ if (typeof key !== 'string') {
4137
+ throw $injectorMinErr('itkn',
4138
+ 'Incorrect injection token! Expected service name as string, got {0}', key);
4139
+ }
4140
+ args.push(
4141
+ locals && locals.hasOwnProperty(key)
4142
+ ? locals[key]
4143
+ : getService(key)
4144
+ );
4145
+ }
4146
+ if (isArray(fn)) {
4147
+ fn = fn[length];
4148
+ }
4149
+
4150
+ // http://jsperf.com/angularjs-invoke-apply-vs-switch
4151
+ // #5388
4152
+ return fn.apply(self, args);
4153
+ }
4154
+
4155
+ function instantiate(Type, locals, serviceName) {
4156
+ var Constructor = function() {},
4157
+ instance, returnedValue;
4158
+
4159
+ // Check if Type is annotated and use just the given function at n-1 as parameter
4160
+ // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
4161
+ Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;
4162
+ instance = new Constructor();
4163
+ returnedValue = invoke(Type, instance, locals, serviceName);
4164
+
4165
+ return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;
4166
+ }
4167
+
4168
+ return {
4169
+ invoke: invoke,
4170
+ instantiate: instantiate,
4171
+ get: getService,
4172
+ annotate: annotate,
4173
+ has: function(name) {
4174
+ return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
4175
+ }
4176
+ };
4177
+ }
4178
+}
4179
+
4180
+createInjector.$$annotate = annotate;
4181
+
4182
+/**
4183
+ * @ngdoc provider
4184
+ * @name $anchorScrollProvider
4185
+ *
4186
+ * @description
4187
+ * Use `$anchorScrollProvider` to disable automatic scrolling whenever
4188
+ * {@link ng.$location#hash $location.hash()} changes.
4189
+ */
4190
+function $AnchorScrollProvider() {
4191
+
4192
+ var autoScrollingEnabled = true;
4193
+
4194
+ /**
4195
+ * @ngdoc method
4196
+ * @name $anchorScrollProvider#disableAutoScrolling
4197
+ *
4198
+ * @description
4199
+ * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically will detect changes to
4200
+ * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />
4201
+ * Use this method to disable automatic scrolling.
4202
+ *
4203
+ * If automatic scrolling is disabled, one must explicitly call
4204
+ * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the
4205
+ * current hash.
4206
+ */
4207
+ this.disableAutoScrolling = function() {
4208
+ autoScrollingEnabled = false;
4209
+ };
4210
+
4211
+ /**
4212
+ * @ngdoc service
4213
+ * @name $anchorScroll
4214
+ * @kind function
4215
+ * @requires $window
4216
+ * @requires $location
4217
+ * @requires $rootScope
4218
+ *
4219
+ * @description
4220
+ * When called, it checks the current value of {@link ng.$location#hash $location.hash()} and
4221
+ * scrolls to the related element, according to the rules specified in the
4222
+ * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).
4223
+ *
4224
+ * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to
4225
+ * match any anchor whenever it changes. This can be disabled by calling
4226
+ * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}.
4227
+ *
4228
+ * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a
4229
+ * vertical scroll-offset (either fixed or dynamic).
4230
+ *
4231
+ * @property {(number|function|jqLite)} yOffset
4232
+ * If set, specifies a vertical scroll-offset. This is often useful when there are fixed
4233
+ * positioned elements at the top of the page, such as navbars, headers etc.
4234
+ *
4235
+ * `yOffset` can be specified in various ways:
4236
+ * - **number**: A fixed number of pixels to be used as offset.<br /><br />
4237
+ * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return
4238
+ * a number representing the offset (in pixels).<br /><br />
4239
+ * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from
4240
+ * the top of the page to the element's bottom will be used as offset.<br />
4241
+ * **Note**: The element will be taken into account only as long as its `position` is set to
4242
+ * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust
4243
+ * their height and/or positioning according to the viewport's size.
4244
+ *
4245
+ * <br />
4246
+ * <div class="alert alert-warning">
4247
+ * In order for `yOffset` to work properly, scrolling should take place on the document's root and
4248
+ * not some child element.
4249
+ * </div>
4250
+ *
4251
+ * @example
4252
+ <example module="anchorScrollExample">
4253
+ <file name="index.html">
4254
+ <div id="scrollArea" ng-controller="ScrollController">
4255
+ <a ng-click="gotoBottom()">Go to bottom</a>
4256
+ <a id="bottom"></a> You're at the bottom!
4257
+ </div>
4258
+ </file>
4259
+ <file name="script.js">
4260
+ angular.module('anchorScrollExample', [])
4261
+ .controller('ScrollController', ['$scope', '$location', '$anchorScroll',
4262
+ function ($scope, $location, $anchorScroll) {
4263
+ $scope.gotoBottom = function() {
4264
+ // set the location.hash to the id of
4265
+ // the element you wish to scroll to.
4266
+ $location.hash('bottom');
4267
+
4268
+ // call $anchorScroll()
4269
+ $anchorScroll();
4270
+ };
4271
+ }]);
4272
+ </file>
4273
+ <file name="style.css">
4274
+ #scrollArea {
4275
+ height: 280px;
4276
+ overflow: auto;
4277
+ }
4278
+
4279
+ #bottom {
4280
+ display: block;
4281
+ margin-top: 2000px;
4282
+ }
4283
+ </file>
4284
+ </example>
4285
+ *
4286
+ * <hr />
4287
+ * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value).
4288
+ * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details.
4289
+ *
4290
+ * @example
4291
+ <example module="anchorScrollOffsetExample">
4292
+ <file name="index.html">
4293
+ <div class="fixed-header" ng-controller="headerCtrl">
4294
+ <a href="" ng-click="gotoAnchor(x)" ng-repeat="x in [1,2,3,4,5]">
4295
+ Go to anchor {{x}}
4296
+ </a>
4297
+ </div>
4298
+ <div id="anchor{{x}}" class="anchor" ng-repeat="x in [1,2,3,4,5]">
4299
+ Anchor {{x}} of 5
4300
+ </div>
4301
+ </file>
4302
+ <file name="script.js">
4303
+ angular.module('anchorScrollOffsetExample', [])
4304
+ .run(['$anchorScroll', function($anchorScroll) {
4305
+ $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels
4306
+ }])
4307
+ .controller('headerCtrl', ['$anchorScroll', '$location', '$scope',
4308
+ function ($anchorScroll, $location, $scope) {
4309
+ $scope.gotoAnchor = function(x) {
4310
+ var newHash = 'anchor' + x;
4311
+ if ($location.hash() !== newHash) {
4312
+ // set the $location.hash to `newHash` and
4313
+ // $anchorScroll will automatically scroll to it
4314
+ $location.hash('anchor' + x);
4315
+ } else {
4316
+ // call $anchorScroll() explicitly,
4317
+ // since $location.hash hasn't changed
4318
+ $anchorScroll();
4319
+ }
4320
+ };
4321
+ }
4322
+ ]);
4323
+ </file>
4324
+ <file name="style.css">
4325
+ body {
4326
+ padding-top: 50px;
4327
+ }
4328
+
4329
+ .anchor {
4330
+ border: 2px dashed DarkOrchid;
4331
+ padding: 10px 10px 200px 10px;
4332
+ }
4333
+
4334
+ .fixed-header {
4335
+ background-color: rgba(0, 0, 0, 0.2);
4336
+ height: 50px;
4337
+ position: fixed;
4338
+ top: 0; left: 0; right: 0;
4339
+ }
4340
+
4341
+ .fixed-header > a {
4342
+ display: inline-block;
4343
+ margin: 5px 15px;
4344
+ }
4345
+ </file>
4346
+ </example>
4347
+ */
4348
+ this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {
4349
+ var document = $window.document;
4350
+ var scrollScheduled = false;
4351
+
4352
+ // Helper function to get first anchor from a NodeList
4353
+ // (using `Array#some()` instead of `angular#forEach()` since it's more performant
4354
+ // and working in all supported browsers.)
4355
+ function getFirstAnchor(list) {
4356
+ var result = null;
4357
+ Array.prototype.some.call(list, function(element) {
4358
+ if (nodeName_(element) === 'a') {
4359
+ result = element;
4360
+ return true;
4361
+ }
4362
+ });
4363
+ return result;
4364
+ }
4365
+
4366
+ function getYOffset() {
4367
+
4368
+ var offset = scroll.yOffset;
4369
+
4370
+ if (isFunction(offset)) {
4371
+ offset = offset();
4372
+ } else if (isElement(offset)) {
4373
+ var elem = offset[0];
4374
+ var style = $window.getComputedStyle(elem);
4375
+ if (style.position !== 'fixed') {
4376
+ offset = 0;
4377
+ } else {
4378
+ offset = elem.getBoundingClientRect().bottom;
4379
+ }
4380
+ } else if (!isNumber(offset)) {
4381
+ offset = 0;
4382
+ }
4383
+
4384
+ return offset;
4385
+ }
4386
+
4387
+ function scrollTo(elem) {
4388
+ if (elem) {
4389
+ elem.scrollIntoView();
4390
+
4391
+ var offset = getYOffset();
4392
+
4393
+ if (offset) {
4394
+ // `offset` is the number of pixels we should scroll UP in order to align `elem` properly.
4395
+ // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the
4396
+ // top of the viewport.
4397
+ //
4398
+ // IF the number of pixels from the top of `elem` to the end of the page's content is less
4399
+ // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some
4400
+ // way down the page.
4401
+ //
4402
+ // This is often the case for elements near the bottom of the page.
4403
+ //
4404
+ // In such cases we do not need to scroll the whole `offset` up, just the difference between
4405
+ // the top of the element and the offset, which is enough to align the top of `elem` at the
4406
+ // desired position.
4407
+ var elemTop = elem.getBoundingClientRect().top;
4408
+ $window.scrollBy(0, elemTop - offset);
4409
+ }
4410
+ } else {
4411
+ $window.scrollTo(0, 0);
4412
+ }
4413
+ }
4414
+
4415
+ function scroll() {
4416
+ var hash = $location.hash(), elm;
4417
+
4418
+ // empty hash, scroll to the top of the page
4419
+ if (!hash) scrollTo(null);
4420
+
4421
+ // element with given id
4422
+ else if ((elm = document.getElementById(hash))) scrollTo(elm);
4423
+
4424
+ // first anchor with given name :-D
4425
+ else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm);
4426
+
4427
+ // no element and hash == 'top', scroll to the top of the page
4428
+ else if (hash === 'top') scrollTo(null);
4429
+ }
4430
+
4431
+ // does not scroll when user clicks on anchor link that is currently on
4432
+ // (no url change, no $location.hash() change), browser native does scroll
4433
+ if (autoScrollingEnabled) {
4434
+ $rootScope.$watch(function autoScrollWatch() {return $location.hash();},
4435
+ function autoScrollWatchAction(newVal, oldVal) {
4436
+ // skip the initial scroll if $location.hash is empty
4437
+ if (newVal === oldVal && newVal === '') return;
4438
+
4439
+ jqLiteDocumentLoaded(function() {
4440
+ $rootScope.$evalAsync(scroll);
4441
+ });
4442
+ });
4443
+ }
4444
+
4445
+ return scroll;
4446
+ }];
4447
+}
4448
+
4449
+var $animateMinErr = minErr('$animate');
4450
+
4451
+/**
4452
+ * @ngdoc provider
4453
+ * @name $animateProvider
4454
+ *
4455
+ * @description
4456
+ * Default implementation of $animate that doesn't perform any animations, instead just
4457
+ * synchronously performs DOM
4458
+ * updates and calls done() callbacks.
4459
+ *
4460
+ * In order to enable animations the ngAnimate module has to be loaded.
4461
+ *
4462
+ * To see the functional implementation check out src/ngAnimate/animate.js
4463
+ */
4464
+var $AnimateProvider = ['$provide', function($provide) {
4465
+
4466
+
4467
+ this.$$selectors = {};
4468
+
4469
+
4470
+ /**
4471
+ * @ngdoc method
4472
+ * @name $animateProvider#register
4473
+ *
4474
+ * @description
4475
+ * Registers a new injectable animation factory function. The factory function produces the
4476
+ * animation object which contains callback functions for each event that is expected to be
4477
+ * animated.
4478
+ *
4479
+ * * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`
4480
+ * must be called once the element animation is complete. If a function is returned then the
4481
+ * animation service will use this function to cancel the animation whenever a cancel event is
4482
+ * triggered.
4483
+ *
4484
+ *
4485
+ * ```js
4486
+ * return {
4487
+ * eventFn : function(element, done) {
4488
+ * //code to run the animation
4489
+ * //once complete, then run done()
4490
+ * return function cancellationFunction() {
4491
+ * //code to cancel the animation
4492
+ * }
4493
+ * }
4494
+ * }
4495
+ * ```
4496
+ *
4497
+ * @param {string} name The name of the animation.
4498
+ * @param {Function} factory The factory function that will be executed to return the animation
4499
+ * object.
4500
+ */
4501
+ this.register = function(name, factory) {
4502
+ var key = name + '-animation';
4503
+ if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',
4504
+ "Expecting class selector starting with '.' got '{0}'.", name);
4505
+ this.$$selectors[name.substr(1)] = key;
4506
+ $provide.factory(key, factory);
4507
+ };
4508
+
4509
+ /**
4510
+ * @ngdoc method
4511
+ * @name $animateProvider#classNameFilter
4512
+ *
4513
+ * @description
4514
+ * Sets and/or returns the CSS class regular expression that is checked when performing
4515
+ * an animation. Upon bootstrap the classNameFilter value is not set at all and will
4516
+ * therefore enable $animate to attempt to perform an animation on any element.
4517
+ * When setting the classNameFilter value, animations will only be performed on elements
4518
+ * that successfully match the filter expression. This in turn can boost performance
4519
+ * for low-powered devices as well as applications containing a lot of structural operations.
4520
+ * @param {RegExp=} expression The className expression which will be checked against all animations
4521
+ * @return {RegExp} The current CSS className expression value. If null then there is no expression value
4522
+ */
4523
+ this.classNameFilter = function(expression) {
4524
+ if(arguments.length === 1) {
4525
+ this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;
4526
+ }
4527
+ return this.$$classNameFilter;
4528
+ };
4529
+
4530
+ this.$get = ['$$q', '$$asyncCallback', '$rootScope', function($$q, $$asyncCallback, $rootScope) {
4531
+
4532
+ var currentDefer;
4533
+
4534
+ function runAnimationPostDigest(fn) {
4535
+ var cancelFn, defer = $$q.defer();
4536
+ defer.promise.$$cancelFn = function ngAnimateMaybeCancel() {
4537
+ cancelFn && cancelFn();
4538
+ };
4539
+
4540
+ $rootScope.$$postDigest(function ngAnimatePostDigest() {
4541
+ cancelFn = fn(function ngAnimateNotifyComplete() {
4542
+ defer.resolve();
4543
+ });
4544
+ });
4545
+
4546
+ return defer.promise;
4547
+ }
4548
+
4549
+ function resolveElementClasses(element, classes) {
4550
+ var toAdd = [], toRemove = [];
4551
+
4552
+ var hasClasses = createMap();
4553
+ forEach((element.attr('class') || '').split(/\s+/), function(className) {
4554
+ hasClasses[className] = true;
4555
+ });
4556
+
4557
+ forEach(classes, function(status, className) {
4558
+ var hasClass = hasClasses[className];
4559
+
4560
+ // If the most recent class manipulation (via $animate) was to remove the class, and the
4561
+ // element currently has the class, the class is scheduled for removal. Otherwise, if
4562
+ // the most recent class manipulation (via $animate) was to add the class, and the
4563
+ // element does not currently have the class, the class is scheduled to be added.
4564
+ if (status === false && hasClass) {
4565
+ toRemove.push(className);
4566
+ } else if (status === true && !hasClass) {
4567
+ toAdd.push(className);
4568
+ }
4569
+ });
4570
+
4571
+ return (toAdd.length + toRemove.length) > 0 &&
4572
+ [toAdd.length ? toAdd : null, toRemove.length ? toRemove : null];
4573
+ }
4574
+
4575
+ function cachedClassManipulation(cache, classes, op) {
4576
+ for (var i=0, ii = classes.length; i < ii; ++i) {
4577
+ var className = classes[i];
4578
+ cache[className] = op;
4579
+ }
4580
+ }
4581
+
4582
+ function asyncPromise() {
4583
+ // only serve one instance of a promise in order to save CPU cycles
4584
+ if (!currentDefer) {
4585
+ currentDefer = $$q.defer();
4586
+ $$asyncCallback(function() {
4587
+ currentDefer.resolve();
4588
+ currentDefer = null;
4589
+ });
4590
+ }
4591
+ return currentDefer.promise;
4592
+ }
4593
+
4594
+ function applyStyles(element, options) {
4595
+ if (angular.isObject(options)) {
4596
+ var styles = extend(options.from || {}, options.to || {});
4597
+ element.css(styles);
4598
+ }
4599
+ }
4600
+
4601
+ /**
4602
+ *
4603
+ * @ngdoc service
4604
+ * @name $animate
4605
+ * @description The $animate service provides rudimentary DOM manipulation functions to
4606
+ * insert, remove and move elements within the DOM, as well as adding and removing classes.
4607
+ * This service is the core service used by the ngAnimate $animator service which provides
4608
+ * high-level animation hooks for CSS and JavaScript.
4609
+ *
4610
+ * $animate is available in the AngularJS core, however, the ngAnimate module must be included
4611
+ * to enable full out animation support. Otherwise, $animate will only perform simple DOM
4612
+ * manipulation operations.
4613
+ *
4614
+ * To learn more about enabling animation support, click here to visit the {@link ngAnimate
4615
+ * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service
4616
+ * page}.
4617
+ */
4618
+ return {
4619
+ animate : function(element, from, to) {
4620
+ applyStyles(element, { from: from, to: to });
4621
+ return asyncPromise();
4622
+ },
4623
+
4624
+ /**
4625
+ *
4626
+ * @ngdoc method
4627
+ * @name $animate#enter
4628
+ * @kind function
4629
+ * @description Inserts the element into the DOM either after the `after` element or
4630
+ * as the first child within the `parent` element. When the function is called a promise
4631
+ * is returned that will be resolved at a later time.
4632
+ * @param {DOMElement} element the element which will be inserted into the DOM
4633
+ * @param {DOMElement} parent the parent element which will append the element as
4634
+ * a child (if the after element is not present)
4635
+ * @param {DOMElement} after the sibling element which will append the element
4636
+ * after itself
4637
+ * @param {object=} options an optional collection of styles that will be applied to the element.
4638
+ * @return {Promise} the animation callback promise
4639
+ */
4640
+ enter : function(element, parent, after, options) {
4641
+ applyStyles(element, options);
4642
+ after ? after.after(element)
4643
+ : parent.prepend(element);
4644
+ return asyncPromise();
4645
+ },
4646
+
4647
+ /**
4648
+ *
4649
+ * @ngdoc method
4650
+ * @name $animate#leave
4651
+ * @kind function
4652
+ * @description Removes the element from the DOM. When the function is called a promise
4653
+ * is returned that will be resolved at a later time.
4654
+ * @param {DOMElement} element the element which will be removed from the DOM
4655
+ * @param {object=} options an optional collection of options that will be applied to the element.
4656
+ * @return {Promise} the animation callback promise
4657
+ */
4658
+ leave : function(element, options) {
4659
+ element.remove();
4660
+ return asyncPromise();
4661
+ },
4662
+
4663
+ /**
4664
+ *
4665
+ * @ngdoc method
4666
+ * @name $animate#move
4667
+ * @kind function
4668
+ * @description Moves the position of the provided element within the DOM to be placed
4669
+ * either after the `after` element or inside of the `parent` element. When the function
4670
+ * is called a promise is returned that will be resolved at a later time.
4671
+ *
4672
+ * @param {DOMElement} element the element which will be moved around within the
4673
+ * DOM
4674
+ * @param {DOMElement} parent the parent element where the element will be
4675
+ * inserted into (if the after element is not present)
4676
+ * @param {DOMElement} after the sibling element where the element will be
4677
+ * positioned next to
4678
+ * @param {object=} options an optional collection of options that will be applied to the element.
4679
+ * @return {Promise} the animation callback promise
4680
+ */
4681
+ move : function(element, parent, after, options) {
4682
+ // Do not remove element before insert. Removing will cause data associated with the
4683
+ // element to be dropped. Insert will implicitly do the remove.
4684
+ return this.enter(element, parent, after, options);
4685
+ },
4686
+
4687
+ /**
4688
+ *
4689
+ * @ngdoc method
4690
+ * @name $animate#addClass
4691
+ * @kind function
4692
+ * @description Adds the provided className CSS class value to the provided element.
4693
+ * When the function is called a promise is returned that will be resolved at a later time.
4694
+ * @param {DOMElement} element the element which will have the className value
4695
+ * added to it
4696
+ * @param {string} className the CSS class which will be added to the element
4697
+ * @param {object=} options an optional collection of options that will be applied to the element.
4698
+ * @return {Promise} the animation callback promise
4699
+ */
4700
+ addClass : function(element, className, options) {
4701
+ return this.setClass(element, className, [], options);
4702
+ },
4703
+
4704
+ $$addClassImmediately : function(element, className, options) {
4705
+ element = jqLite(element);
4706
+ className = !isString(className)
4707
+ ? (isArray(className) ? className.join(' ') : '')
4708
+ : className;
4709
+ forEach(element, function (element) {
4710
+ jqLiteAddClass(element, className);
4711
+ });
4712
+ applyStyles(element, options);
4713
+ return asyncPromise();
4714
+ },
4715
+
4716
+ /**
4717
+ *
4718
+ * @ngdoc method
4719
+ * @name $animate#removeClass
4720
+ * @kind function
4721
+ * @description Removes the provided className CSS class value from the provided element.
4722
+ * When the function is called a promise is returned that will be resolved at a later time.
4723
+ * @param {DOMElement} element the element which will have the className value
4724
+ * removed from it
4725
+ * @param {string} className the CSS class which will be removed from the element
4726
+ * @param {object=} options an optional collection of options that will be applied to the element.
4727
+ * @return {Promise} the animation callback promise
4728
+ */
4729
+ removeClass : function(element, className, options) {
4730
+ return this.setClass(element, [], className, options);
4731
+ },
4732
+
4733
+ $$removeClassImmediately : function(element, className, options) {
4734
+ element = jqLite(element);
4735
+ className = !isString(className)
4736
+ ? (isArray(className) ? className.join(' ') : '')
4737
+ : className;
4738
+ forEach(element, function (element) {
4739
+ jqLiteRemoveClass(element, className);
4740
+ });
4741
+ applyStyles(element, options);
4742
+ return asyncPromise();
4743
+ },
4744
+
4745
+ /**
4746
+ *
4747
+ * @ngdoc method
4748
+ * @name $animate#setClass
4749
+ * @kind function
4750
+ * @description Adds and/or removes the given CSS classes to and from the element.
4751
+ * When the function is called a promise is returned that will be resolved at a later time.
4752
+ * @param {DOMElement} element the element which will have its CSS classes changed
4753
+ * removed from it
4754
+ * @param {string} add the CSS classes which will be added to the element
4755
+ * @param {string} remove the CSS class which will be removed from the element
4756
+ * @param {object=} options an optional collection of options that will be applied to the element.
4757
+ * @return {Promise} the animation callback promise
4758
+ */
4759
+ setClass : function(element, add, remove, options) {
4760
+ var self = this;
4761
+ var STORAGE_KEY = '$$animateClasses';
4762
+ var createdCache = false;
4763
+ element = jqLite(element);
4764
+
4765
+ var cache = element.data(STORAGE_KEY);
4766
+ if (!cache) {
4767
+ cache = {
4768
+ classes: {},
4769
+ options : options
4770
+ };
4771
+ createdCache = true;
4772
+ } else if (options && cache.options) {
4773
+ cache.options = angular.extend(cache.options || {}, options);
4774
+ }
4775
+
4776
+ var classes = cache.classes;
4777
+
4778
+ add = isArray(add) ? add : add.split(' ');
4779
+ remove = isArray(remove) ? remove : remove.split(' ');
4780
+ cachedClassManipulation(classes, add, true);
4781
+ cachedClassManipulation(classes, remove, false);
4782
+
4783
+ if (createdCache) {
4784
+ cache.promise = runAnimationPostDigest(function(done) {
4785
+ var cache = element.data(STORAGE_KEY);
4786
+ element.removeData(STORAGE_KEY);
4787
+
4788
+ // in the event that the element is removed before postDigest
4789
+ // is run then the cache will be undefined and there will be
4790
+ // no need anymore to add or remove and of the element classes
4791
+ if (cache) {
4792
+ var classes = resolveElementClasses(element, cache.classes);
4793
+ if (classes) {
4794
+ self.$$setClassImmediately(element, classes[0], classes[1], cache.options);
4795
+ }
4796
+ }
4797
+
4798
+ done();
4799
+ });
4800
+ element.data(STORAGE_KEY, cache);
4801
+ }
4802
+
4803
+ return cache.promise;
4804
+ },
4805
+
4806
+ $$setClassImmediately : function(element, add, remove, options) {
4807
+ add && this.$$addClassImmediately(element, add);
4808
+ remove && this.$$removeClassImmediately(element, remove);
4809
+ applyStyles(element, options);
4810
+ return asyncPromise();
4811
+ },
4812
+
4813
+ enabled : noop,
4814
+ cancel : noop
4815
+ };
4816
+ }];
4817
+}];
4818
+
4819
+function $$AsyncCallbackProvider(){
4820
+ this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) {
4821
+ return $$rAF.supported
4822
+ ? function(fn) { return $$rAF(fn); }
4823
+ : function(fn) {
4824
+ return $timeout(fn, 0, false);
4825
+ };
4826
+ }];
4827
+}
4828
+
4829
+/* global stripHash: true */
4830
+
4831
+/**
4832
+ * ! This is a private undocumented service !
4833
+ *
4834
+ * @name $browser
4835
+ * @requires $log
4836
+ * @description
4837
+ * This object has two goals:
4838
+ *
4839
+ * - hide all the global state in the browser caused by the window object
4840
+ * - abstract away all the browser specific features and inconsistencies
4841
+ *
4842
+ * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`
4843
+ * service, which can be used for convenient testing of the application without the interaction with
4844
+ * the real browser apis.
4845
+ */
4846
+/**
4847
+ * @param {object} window The global window object.
4848
+ * @param {object} document jQuery wrapped document.
4849
+ * @param {function()} XHR XMLHttpRequest constructor.
4850
+ * @param {object} $log console.log or an object with the same interface.
4851
+ * @param {object} $sniffer $sniffer service
4852
+ */
4853
+function Browser(window, document, $log, $sniffer) {
4854
+ var self = this,
4855
+ rawDocument = document[0],
4856
+ location = window.location,
4857
+ history = window.history,
4858
+ setTimeout = window.setTimeout,
4859
+ clearTimeout = window.clearTimeout,
4860
+ pendingDeferIds = {};
4861
+
4862
+ self.isMock = false;
4863
+
4864
+ var outstandingRequestCount = 0;
4865
+ var outstandingRequestCallbacks = [];
4866
+
4867
+ // TODO(vojta): remove this temporary api
4868
+ self.$$completeOutstandingRequest = completeOutstandingRequest;
4869
+ self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };
4870
+
4871
+ /**
4872
+ * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`
4873
+ * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.
4874
+ */
4875
+ function completeOutstandingRequest(fn) {
4876
+ try {
4877
+ fn.apply(null, sliceArgs(arguments, 1));
4878
+ } finally {
4879
+ outstandingRequestCount--;
4880
+ if (outstandingRequestCount === 0) {
4881
+ while(outstandingRequestCallbacks.length) {
4882
+ try {
4883
+ outstandingRequestCallbacks.pop()();
4884
+ } catch (e) {
4885
+ $log.error(e);
4886
+ }
4887
+ }
4888
+ }
4889
+ }
4890
+ }
4891
+
4892
+ /**
4893
+ * @private
4894
+ * Note: this method is used only by scenario runner
4895
+ * TODO(vojta): prefix this method with $$ ?
4896
+ * @param {function()} callback Function that will be called when no outstanding request
4897
+ */
4898
+ self.notifyWhenNoOutstandingRequests = function(callback) {
4899
+ // force browser to execute all pollFns - this is needed so that cookies and other pollers fire
4900
+ // at some deterministic time in respect to the test runner's actions. Leaving things up to the
4901
+ // regular poller would result in flaky tests.
4902
+ forEach(pollFns, function(pollFn){ pollFn(); });
4903
+
4904
+ if (outstandingRequestCount === 0) {
4905
+ callback();
4906
+ } else {
4907
+ outstandingRequestCallbacks.push(callback);
4908
+ }
4909
+ };
4910
+
4911
+ //////////////////////////////////////////////////////////////
4912
+ // Poll Watcher API
4913
+ //////////////////////////////////////////////////////////////
4914
+ var pollFns = [],
4915
+ pollTimeout;
4916
+
4917
+ /**
4918
+ * @name $browser#addPollFn
4919
+ *
4920
+ * @param {function()} fn Poll function to add
4921
+ *
4922
+ * @description
4923
+ * Adds a function to the list of functions that poller periodically executes,
4924
+ * and starts polling if not started yet.
4925
+ *
4926
+ * @returns {function()} the added function
4927
+ */
4928
+ self.addPollFn = function(fn) {
4929
+ if (isUndefined(pollTimeout)) startPoller(100, setTimeout);
4930
+ pollFns.push(fn);
4931
+ return fn;
4932
+ };
4933
+
4934
+ /**
4935
+ * @param {number} interval How often should browser call poll functions (ms)
4936
+ * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.
4937
+ *
4938
+ * @description
4939
+ * Configures the poller to run in the specified intervals, using the specified
4940
+ * setTimeout fn and kicks it off.
4941
+ */
4942
+ function startPoller(interval, setTimeout) {
4943
+ (function check() {
4944
+ forEach(pollFns, function(pollFn){ pollFn(); });
4945
+ pollTimeout = setTimeout(check, interval);
4946
+ })();
4947
+ }
4948
+
4949
+ //////////////////////////////////////////////////////////////
4950
+ // URL API
4951
+ //////////////////////////////////////////////////////////////
4952
+
4953
+ var cachedState, lastHistoryState,
4954
+ lastBrowserUrl = location.href,
4955
+ baseElement = document.find('base'),
4956
+ reloadLocation = null;
4957
+
4958
+ cacheState();
4959
+ lastHistoryState = cachedState;
4960
+
4961
+ /**
4962
+ * @name $browser#url
4963
+ *
4964
+ * @description
4965
+ * GETTER:
4966
+ * Without any argument, this method just returns current value of location.href.
4967
+ *
4968
+ * SETTER:
4969
+ * With at least one argument, this method sets url to new value.
4970
+ * If html5 history api supported, pushState/replaceState is used, otherwise
4971
+ * location.href/location.replace is used.
4972
+ * Returns its own instance to allow chaining
4973
+ *
4974
+ * NOTE: this api is intended for use only by the $location service. Please use the
4975
+ * {@link ng.$location $location service} to change url.
4976
+ *
4977
+ * @param {string} url New url (when used as setter)
4978
+ * @param {boolean=} replace Should new url replace current history record?
4979
+ * @param {object=} state object to use with pushState/replaceState
4980
+ */
4981
+ self.url = function(url, replace, state) {
4982
+ // In modern browsers `history.state` is `null` by default; treating it separately
4983
+ // from `undefined` would cause `$browser.url('/foo')` to change `history.state`
4984
+ // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.
4985
+ if (isUndefined(state)) {
4986
+ state = null;
4987
+ }
4988
+
4989
+ // Android Browser BFCache causes location, history reference to become stale.
4990
+ if (location !== window.location) location = window.location;
4991
+ if (history !== window.history) history = window.history;
4992
+
4993
+ // setter
4994
+ if (url) {
4995
+ var sameState = lastHistoryState === state;
4996
+
4997
+ // Don't change anything if previous and current URLs and states match. This also prevents
4998
+ // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.
4999
+ // See https://github.com/angular/angular.js/commit/ffb2701
5000
+ if (lastBrowserUrl === url && (!$sniffer.history || sameState)) {
5001
+ return;
5002
+ }
5003
+ var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url);
5004
+ lastBrowserUrl = url;
5005
+ lastHistoryState = state;
5006
+ // Don't use history API if only the hash changed
5007
+ // due to a bug in IE10/IE11 which leads
5008
+ // to not firing a `hashchange` nor `popstate` event
5009
+ // in some cases (see #9143).
5010
+ if ($sniffer.history && (!sameBase || !sameState)) {
5011
+ history[replace ? 'replaceState' : 'pushState'](state, '', url);
5012
+ cacheState();
5013
+ // Do the assignment again so that those two variables are referentially identical.
5014
+ lastHistoryState = cachedState;
5015
+ } else {
5016
+ if (!sameBase) {
5017
+ reloadLocation = url;
5018
+ }
5019
+ if (replace) {
5020
+ location.replace(url);
5021
+ } else {
5022
+ location.href = url;
5023
+ }
5024
+ }
5025
+ return self;
5026
+ // getter
5027
+ } else {
5028
+ // - reloadLocation is needed as browsers don't allow to read out
5029
+ // the new location.href if a reload happened.
5030
+ // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
5031
+ return reloadLocation || location.href.replace(/%27/g,"'");
5032
+ }
5033
+ };
5034
+
5035
+ /**
5036
+ * @name $browser#state
5037
+ *
5038
+ * @description
5039
+ * This method is a getter.
5040
+ *
5041
+ * Return history.state or null if history.state is undefined.
5042
+ *
5043
+ * @returns {object} state
5044
+ */
5045
+ self.state = function() {
5046
+ return cachedState;
5047
+ };
5048
+
5049
+ var urlChangeListeners = [],
5050
+ urlChangeInit = false;
5051
+
5052
+ function cacheStateAndFireUrlChange() {
5053
+ cacheState();
5054
+ fireUrlChange();
5055
+ }
5056
+
5057
+ // This variable should be used *only* inside the cacheState function.
5058
+ var lastCachedState = null;
5059
+ function cacheState() {
5060
+ // This should be the only place in $browser where `history.state` is read.
5061
+ cachedState = window.history.state;
5062
+ cachedState = isUndefined(cachedState) ? null : cachedState;
5063
+
5064
+ // Prevent callbacks fo fire twice if both hashchange & popstate were fired.
5065
+ if (equals(cachedState, lastCachedState)) {
5066
+ cachedState = lastCachedState;
5067
+ }
5068
+ lastCachedState = cachedState;
5069
+ }
5070
+
5071
+ function fireUrlChange() {
5072
+ if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) {
5073
+ return;
5074
+ }
5075
+
5076
+ lastBrowserUrl = self.url();
5077
+ lastHistoryState = cachedState;
5078
+ forEach(urlChangeListeners, function(listener) {
5079
+ listener(self.url(), cachedState);
5080
+ });
5081
+ }
5082
+
5083
+ /**
5084
+ * @name $browser#onUrlChange
5085
+ *
5086
+ * @description
5087
+ * Register callback function that will be called, when url changes.
5088
+ *
5089
+ * It's only called when the url is changed from outside of angular:
5090
+ * - user types different url into address bar
5091
+ * - user clicks on history (forward/back) button
5092
+ * - user clicks on a link
5093
+ *
5094
+ * It's not called when url is changed by $browser.url() method
5095
+ *
5096
+ * The listener gets called with new url as parameter.
5097
+ *
5098
+ * NOTE: this api is intended for use only by the $location service. Please use the
5099
+ * {@link ng.$location $location service} to monitor url changes in angular apps.
5100
+ *
5101
+ * @param {function(string)} listener Listener function to be called when url changes.
5102
+ * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
5103
+ */
5104
+ self.onUrlChange = function(callback) {
5105
+ // TODO(vojta): refactor to use node's syntax for events
5106
+ if (!urlChangeInit) {
5107
+ // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
5108
+ // don't fire popstate when user change the address bar and don't fire hashchange when url
5109
+ // changed by push/replaceState
5110
+
5111
+ // html5 history api - popstate event
5112
+ if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange);
5113
+ // hashchange event
5114
+ jqLite(window).on('hashchange', cacheStateAndFireUrlChange);
5115
+
5116
+ urlChangeInit = true;
5117
+ }
5118
+
5119
+ urlChangeListeners.push(callback);
5120
+ return callback;
5121
+ };
5122
+
5123
+ /**
5124
+ * Checks whether the url has changed outside of Angular.
5125
+ * Needs to be exported to be able to check for changes that have been done in sync,
5126
+ * as hashchange/popstate events fire in async.
5127
+ */
5128
+ self.$$checkUrlChange = fireUrlChange;
5129
+
5130
+ //////////////////////////////////////////////////////////////
5131
+ // Misc API
5132
+ //////////////////////////////////////////////////////////////
5133
+
5134
+ /**
5135
+ * @name $browser#baseHref
5136
+ *
5137
+ * @description
5138
+ * Returns current <base href>
5139
+ * (always relative - without domain)
5140
+ *
5141
+ * @returns {string} The current base href
5142
+ */
5143
+ self.baseHref = function() {
5144
+ var href = baseElement.attr('href');
5145
+ return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : '';
5146
+ };
5147
+
5148
+ //////////////////////////////////////////////////////////////
5149
+ // Cookies API
5150
+ //////////////////////////////////////////////////////////////
5151
+ var lastCookies = {};
5152
+ var lastCookieString = '';
5153
+ var cookiePath = self.baseHref();
5154
+
5155
+ function safeDecodeURIComponent(str) {
5156
+ try {
5157
+ return decodeURIComponent(str);
5158
+ } catch (e) {
5159
+ return str;
5160
+ }
5161
+ }
5162
+
5163
+ /**
5164
+ * @name $browser#cookies
5165
+ *
5166
+ * @param {string=} name Cookie name
5167
+ * @param {string=} value Cookie value
5168
+ *
5169
+ * @description
5170
+ * The cookies method provides a 'private' low level access to browser cookies.
5171
+ * It is not meant to be used directly, use the $cookie service instead.
5172
+ *
5173
+ * The return values vary depending on the arguments that the method was called with as follows:
5174
+ *
5175
+ * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify
5176
+ * it
5177
+ * - cookies(name, value) -> set name to value, if value is undefined delete the cookie
5178
+ * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that
5179
+ * way)
5180
+ *
5181
+ * @returns {Object} Hash of all cookies (if called without any parameter)
5182
+ */
5183
+ self.cookies = function(name, value) {
5184
+ var cookieLength, cookieArray, cookie, i, index;
5185
+
5186
+ if (name) {
5187
+ if (value === undefined) {
5188
+ rawDocument.cookie = encodeURIComponent(name) + "=;path=" + cookiePath +
5189
+ ";expires=Thu, 01 Jan 1970 00:00:00 GMT";
5190
+ } else {
5191
+ if (isString(value)) {
5192
+ cookieLength = (rawDocument.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) +
5193
+ ';path=' + cookiePath).length + 1;
5194
+
5195
+ // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
5196
+ // - 300 cookies
5197
+ // - 20 cookies per unique domain
5198
+ // - 4096 bytes per cookie
5199
+ if (cookieLength > 4096) {
5200
+ $log.warn("Cookie '"+ name +
5201
+ "' possibly not set or overflowed because it was too large ("+
5202
+ cookieLength + " > 4096 bytes)!");
5203
+ }
5204
+ }
5205
+ }
5206
+ } else {
5207
+ if (rawDocument.cookie !== lastCookieString) {
5208
+ lastCookieString = rawDocument.cookie;
5209
+ cookieArray = lastCookieString.split("; ");
5210
+ lastCookies = {};
5211
+
5212
+ for (i = 0; i < cookieArray.length; i++) {
5213
+ cookie = cookieArray[i];
5214
+ index = cookie.indexOf('=');
5215
+ if (index > 0) { //ignore nameless cookies
5216
+ name = safeDecodeURIComponent(cookie.substring(0, index));
5217
+ // the first value that is seen for a cookie is the most
5218
+ // specific one. values for the same cookie name that
5219
+ // follow are for less specific paths.
5220
+ if (lastCookies[name] === undefined) {
5221
+ lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));
5222
+ }
5223
+ }
5224
+ }
5225
+ }
5226
+ return lastCookies;
5227
+ }
5228
+ };
5229
+
5230
+
5231
+ /**
5232
+ * @name $browser#defer
5233
+ * @param {function()} fn A function, who's execution should be deferred.
5234
+ * @param {number=} [delay=0] of milliseconds to defer the function execution.
5235
+ * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.
5236
+ *
5237
+ * @description
5238
+ * Executes a fn asynchronously via `setTimeout(fn, delay)`.
5239
+ *
5240
+ * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using
5241
+ * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed
5242
+ * via `$browser.defer.flush()`.
5243
+ *
5244
+ */
5245
+ self.defer = function(fn, delay) {
5246
+ var timeoutId;
5247
+ outstandingRequestCount++;
5248
+ timeoutId = setTimeout(function() {
5249
+ delete pendingDeferIds[timeoutId];
5250
+ completeOutstandingRequest(fn);
5251
+ }, delay || 0);
5252
+ pendingDeferIds[timeoutId] = true;
5253
+ return timeoutId;
5254
+ };
5255
+
5256
+
5257
+ /**
5258
+ * @name $browser#defer.cancel
5259
+ *
5260
+ * @description
5261
+ * Cancels a deferred task identified with `deferId`.
5262
+ *
5263
+ * @param {*} deferId Token returned by the `$browser.defer` function.
5264
+ * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
5265
+ * canceled.
5266
+ */
5267
+ self.defer.cancel = function(deferId) {
5268
+ if (pendingDeferIds[deferId]) {
5269
+ delete pendingDeferIds[deferId];
5270
+ clearTimeout(deferId);
5271
+ completeOutstandingRequest(noop);
5272
+ return true;
5273
+ }
5274
+ return false;
5275
+ };
5276
+
5277
+}
5278
+
5279
+function $BrowserProvider(){
5280
+ this.$get = ['$window', '$log', '$sniffer', '$document',
5281
+ function( $window, $log, $sniffer, $document){
5282
+ return new Browser($window, $document, $log, $sniffer);
5283
+ }];
5284
+}
5285
+
5286
+/**
5287
+ * @ngdoc service
5288
+ * @name $cacheFactory
5289
+ *
5290
+ * @description
5291
+ * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to
5292
+ * them.
5293
+ *
5294
+ * ```js
5295
+ *
5296
+ * var cache = $cacheFactory('cacheId');
5297
+ * expect($cacheFactory.get('cacheId')).toBe(cache);
5298
+ * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
5299
+ *
5300
+ * cache.put("key", "value");
5301
+ * cache.put("another key", "another value");
5302
+ *
5303
+ * // We've specified no options on creation
5304
+ * expect(cache.info()).toEqual({id: 'cacheId', size: 2});
5305
+ *
5306
+ * ```
5307
+ *
5308
+ *
5309
+ * @param {string} cacheId Name or id of the newly created cache.
5310
+ * @param {object=} options Options object that specifies the cache behavior. Properties:
5311
+ *
5312
+ * - `{number=}` `capacity` — turns the cache into LRU cache.
5313
+ *
5314
+ * @returns {object} Newly created cache object with the following set of methods:
5315
+ *
5316
+ * - `{object}` `info()` — Returns id, size, and options of cache.
5317
+ * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns
5318
+ * it.
5319
+ * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.
5320
+ * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.
5321
+ * - `{void}` `removeAll()` — Removes all cached values.
5322
+ * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.
5323
+ *
5324
+ * @example
5325
+ <example module="cacheExampleApp">
5326
+ <file name="index.html">
5327
+ <div ng-controller="CacheController">
5328
+ <input ng-model="newCacheKey" placeholder="Key">
5329
+ <input ng-model="newCacheValue" placeholder="Value">
5330
+ <button ng-click="put(newCacheKey, newCacheValue)">Cache</button>
5331
+
5332
+ <p ng-if="keys.length">Cached Values</p>
5333
+ <div ng-repeat="key in keys">
5334
+ <span ng-bind="key"></span>
5335
+ <span>: </span>
5336
+ <b ng-bind="cache.get(key)"></b>
5337
+ </div>
5338
+
5339
+ <p>Cache Info</p>
5340
+ <div ng-repeat="(key, value) in cache.info()">
5341
+ <span ng-bind="key"></span>
5342
+ <span>: </span>
5343
+ <b ng-bind="value"></b>
5344
+ </div>
5345
+ </div>
5346
+ </file>
5347
+ <file name="script.js">
5348
+ angular.module('cacheExampleApp', []).
5349
+ controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {
5350
+ $scope.keys = [];
5351
+ $scope.cache = $cacheFactory('cacheId');
5352
+ $scope.put = function(key, value) {
5353
+ if ($scope.cache.get(key) === undefined) {
5354
+ $scope.keys.push(key);
5355
+ }
5356
+ $scope.cache.put(key, value === undefined ? null : value);
5357
+ };
5358
+ }]);
5359
+ </file>
5360
+ <file name="style.css">
5361
+ p {
5362
+ margin: 10px 0 3px;
5363
+ }
5364
+ </file>
5365
+ </example>
5366
+ */
5367
+function $CacheFactoryProvider() {
5368
+
5369
+ this.$get = function() {
5370
+ var caches = {};
5371
+
5372
+ function cacheFactory(cacheId, options) {
5373
+ if (cacheId in caches) {
5374
+ throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId);
5375
+ }
5376
+
5377
+ var size = 0,
5378
+ stats = extend({}, options, {id: cacheId}),
5379
+ data = {},
5380
+ capacity = (options && options.capacity) || Number.MAX_VALUE,
5381
+ lruHash = {},
5382
+ freshEnd = null,
5383
+ staleEnd = null;
5384
+
5385
+ /**
5386
+ * @ngdoc type
5387
+ * @name $cacheFactory.Cache
5388
+ *
5389
+ * @description
5390
+ * A cache object used to store and retrieve data, primarily used by
5391
+ * {@link $http $http} and the {@link ng.directive:script script} directive to cache
5392
+ * templates and other data.
5393
+ *
5394
+ * ```js
5395
+ * angular.module('superCache')
5396
+ * .factory('superCache', ['$cacheFactory', function($cacheFactory) {
5397
+ * return $cacheFactory('super-cache');
5398
+ * }]);
5399
+ * ```
5400
+ *
5401
+ * Example test:
5402
+ *
5403
+ * ```js
5404
+ * it('should behave like a cache', inject(function(superCache) {
5405
+ * superCache.put('key', 'value');
5406
+ * superCache.put('another key', 'another value');
5407
+ *
5408
+ * expect(superCache.info()).toEqual({
5409
+ * id: 'super-cache',
5410
+ * size: 2
5411
+ * });
5412
+ *
5413
+ * superCache.remove('another key');
5414
+ * expect(superCache.get('another key')).toBeUndefined();
5415
+ *
5416
+ * superCache.removeAll();
5417
+ * expect(superCache.info()).toEqual({
5418
+ * id: 'super-cache',
5419
+ * size: 0
5420
+ * });
5421
+ * }));
5422
+ * ```
5423
+ */
5424
+ return caches[cacheId] = {
5425
+
5426
+ /**
5427
+ * @ngdoc method
5428
+ * @name $cacheFactory.Cache#put
5429
+ * @kind function
5430
+ *
5431
+ * @description
5432
+ * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be
5433
+ * retrieved later, and incrementing the size of the cache if the key was not already
5434
+ * present in the cache. If behaving like an LRU cache, it will also remove stale
5435
+ * entries from the set.
5436
+ *
5437
+ * It will not insert undefined values into the cache.
5438
+ *
5439
+ * @param {string} key the key under which the cached data is stored.
5440
+ * @param {*} value the value to store alongside the key. If it is undefined, the key
5441
+ * will not be stored.
5442
+ * @returns {*} the value stored.
5443
+ */
5444
+ put: function(key, value) {
5445
+ if (capacity < Number.MAX_VALUE) {
5446
+ var lruEntry = lruHash[key] || (lruHash[key] = {key: key});
5447
+
5448
+ refresh(lruEntry);
5449
+ }
5450
+
5451
+ if (isUndefined(value)) return;
5452
+ if (!(key in data)) size++;
5453
+ data[key] = value;
5454
+
5455
+ if (size > capacity) {
5456
+ this.remove(staleEnd.key);
5457
+ }
5458
+
5459
+ return value;
5460
+ },
5461
+
5462
+ /**
5463
+ * @ngdoc method
5464
+ * @name $cacheFactory.Cache#get
5465
+ * @kind function
5466
+ *
5467
+ * @description
5468
+ * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.
5469
+ *
5470
+ * @param {string} key the key of the data to be retrieved
5471
+ * @returns {*} the value stored.
5472
+ */
5473
+ get: function(key) {
5474
+ if (capacity < Number.MAX_VALUE) {
5475
+ var lruEntry = lruHash[key];
5476
+
5477
+ if (!lruEntry) return;
5478
+
5479
+ refresh(lruEntry);
5480
+ }
5481
+
5482
+ return data[key];
5483
+ },
5484
+
5485
+
5486
+ /**
5487
+ * @ngdoc method
5488
+ * @name $cacheFactory.Cache#remove
5489
+ * @kind function
5490
+ *
5491
+ * @description
5492
+ * Removes an entry from the {@link $cacheFactory.Cache Cache} object.
5493
+ *
5494
+ * @param {string} key the key of the entry to be removed
5495
+ */
5496
+ remove: function(key) {
5497
+ if (capacity < Number.MAX_VALUE) {
5498
+ var lruEntry = lruHash[key];
5499
+
5500
+ if (!lruEntry) return;
5501
+
5502
+ if (lruEntry == freshEnd) freshEnd = lruEntry.p;
5503
+ if (lruEntry == staleEnd) staleEnd = lruEntry.n;
5504
+ link(lruEntry.n,lruEntry.p);
5505
+
5506
+ delete lruHash[key];
5507
+ }
5508
+
5509
+ delete data[key];
5510
+ size--;
5511
+ },
5512
+
5513
+
5514
+ /**
5515
+ * @ngdoc method
5516
+ * @name $cacheFactory.Cache#removeAll
5517
+ * @kind function
5518
+ *
5519
+ * @description
5520
+ * Clears the cache object of any entries.
5521
+ */
5522
+ removeAll: function() {
5523
+ data = {};
5524
+ size = 0;
5525
+ lruHash = {};
5526
+ freshEnd = staleEnd = null;
5527
+ },
5528
+
5529
+
5530
+ /**
5531
+ * @ngdoc method
5532
+ * @name $cacheFactory.Cache#destroy
5533
+ * @kind function
5534
+ *
5535
+ * @description
5536
+ * Destroys the {@link $cacheFactory.Cache Cache} object entirely,
5537
+ * removing it from the {@link $cacheFactory $cacheFactory} set.
5538
+ */
5539
+ destroy: function() {
5540
+ data = null;
5541
+ stats = null;
5542
+ lruHash = null;
5543
+ delete caches[cacheId];
5544
+ },
5545
+
5546
+
5547
+ /**
5548
+ * @ngdoc method
5549
+ * @name $cacheFactory.Cache#info
5550
+ * @kind function
5551
+ *
5552
+ * @description
5553
+ * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.
5554
+ *
5555
+ * @returns {object} an object with the following properties:
5556
+ * <ul>
5557
+ * <li>**id**: the id of the cache instance</li>
5558
+ * <li>**size**: the number of entries kept in the cache instance</li>
5559
+ * <li>**...**: any additional properties from the options object when creating the
5560
+ * cache.</li>
5561
+ * </ul>
5562
+ */
5563
+ info: function() {
5564
+ return extend({}, stats, {size: size});
5565
+ }
5566
+ };
5567
+
5568
+
5569
+ /**
5570
+ * makes the `entry` the freshEnd of the LRU linked list
5571
+ */
5572
+ function refresh(entry) {
5573
+ if (entry != freshEnd) {
5574
+ if (!staleEnd) {
5575
+ staleEnd = entry;
5576
+ } else if (staleEnd == entry) {
5577
+ staleEnd = entry.n;
5578
+ }
5579
+
5580
+ link(entry.n, entry.p);
5581
+ link(entry, freshEnd);
5582
+ freshEnd = entry;
5583
+ freshEnd.n = null;
5584
+ }
5585
+ }
5586
+
5587
+
5588
+ /**
5589
+ * bidirectionally links two entries of the LRU linked list
5590
+ */
5591
+ function link(nextEntry, prevEntry) {
5592
+ if (nextEntry != prevEntry) {
5593
+ if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify
5594
+ if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify
5595
+ }
5596
+ }
5597
+ }
5598
+
5599
+
5600
+ /**
5601
+ * @ngdoc method
5602
+ * @name $cacheFactory#info
5603
+ *
5604
+ * @description
5605
+ * Get information about all the caches that have been created
5606
+ *
5607
+ * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`
5608
+ */
5609
+ cacheFactory.info = function() {
5610
+ var info = {};
5611
+ forEach(caches, function(cache, cacheId) {
5612
+ info[cacheId] = cache.info();
5613
+ });
5614
+ return info;
5615
+ };
5616
+
5617
+
5618
+ /**
5619
+ * @ngdoc method
5620
+ * @name $cacheFactory#get
5621
+ *
5622
+ * @description
5623
+ * Get access to a cache object by the `cacheId` used when it was created.
5624
+ *
5625
+ * @param {string} cacheId Name or id of a cache to access.
5626
+ * @returns {object} Cache object identified by the cacheId or undefined if no such cache.
5627
+ */
5628
+ cacheFactory.get = function(cacheId) {
5629
+ return caches[cacheId];
5630
+ };
5631
+
5632
+
5633
+ return cacheFactory;
5634
+ };
5635
+}
5636
+
5637
+/**
5638
+ * @ngdoc service
5639
+ * @name $templateCache
5640
+ *
5641
+ * @description
5642
+ * The first time a template is used, it is loaded in the template cache for quick retrieval. You
5643
+ * can load templates directly into the cache in a `script` tag, or by consuming the
5644
+ * `$templateCache` service directly.
5645
+ *
5646
+ * Adding via the `script` tag:
5647
+ *
5648
+ * ```html
5649
+ * <script type="text/ng-template" id="templateId.html">
5650
+ * <p>This is the content of the template</p>
5651
+ * </script>
5652
+ * ```
5653
+ *
5654
+ * **Note:** the `script` tag containing the template does not need to be included in the `head` of
5655
+ * the document, but it must be below the `ng-app` definition.
5656
+ *
5657
+ * Adding via the $templateCache service:
5658
+ *
5659
+ * ```js
5660
+ * var myApp = angular.module('myApp', []);
5661
+ * myApp.run(function($templateCache) {
5662
+ * $templateCache.put('templateId.html', 'This is the content of the template');
5663
+ * });
5664
+ * ```
5665
+ *
5666
+ * To retrieve the template later, simply use it in your HTML:
5667
+ * ```html
5668
+ * <div ng-include=" 'templateId.html' "></div>
5669
+ * ```
5670
+ *
5671
+ * or get it via Javascript:
5672
+ * ```js
5673
+ * $templateCache.get('templateId.html')
5674
+ * ```
5675
+ *
5676
+ * See {@link ng.$cacheFactory $cacheFactory}.
5677
+ *
5678
+ */
5679
+function $TemplateCacheProvider() {
5680
+ this.$get = ['$cacheFactory', function($cacheFactory) {
5681
+ return $cacheFactory('templates');
5682
+ }];
5683
+}
5684
+
5685
+/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!
5686
+ *
5687
+ * DOM-related variables:
5688
+ *
5689
+ * - "node" - DOM Node
5690
+ * - "element" - DOM Element or Node
5691
+ * - "$node" or "$element" - jqLite-wrapped node or element
5692
+ *
5693
+ *
5694
+ * Compiler related stuff:
5695
+ *
5696
+ * - "linkFn" - linking fn of a single directive
5697
+ * - "nodeLinkFn" - function that aggregates all linking fns for a particular node
5698
+ * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node
5699
+ * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList)
5700
+ */
5701
+
5702
+
5703
+/**
5704
+ * @ngdoc service
5705
+ * @name $compile
5706
+ * @kind function
5707
+ *
5708
+ * @description
5709
+ * Compiles an HTML string or DOM into a template and produces a template function, which
5710
+ * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.
5711
+ *
5712
+ * The compilation is a process of walking the DOM tree and matching DOM elements to
5713
+ * {@link ng.$compileProvider#directive directives}.
5714
+ *
5715
+ * <div class="alert alert-warning">
5716
+ * **Note:** This document is an in-depth reference of all directive options.
5717
+ * For a gentle introduction to directives with examples of common use cases,
5718
+ * see the {@link guide/directive directive guide}.
5719
+ * </div>
5720
+ *
5721
+ * ## Comprehensive Directive API
5722
+ *
5723
+ * There are many different options for a directive.
5724
+ *
5725
+ * The difference resides in the return value of the factory function.
5726
+ * You can either return a "Directive Definition Object" (see below) that defines the directive properties,
5727
+ * or just the `postLink` function (all other properties will have the default values).
5728
+ *
5729
+ * <div class="alert alert-success">
5730
+ * **Best Practice:** It's recommended to use the "directive definition object" form.
5731
+ * </div>
5732
+ *
5733
+ * Here's an example directive declared with a Directive Definition Object:
5734
+ *
5735
+ * ```js
5736
+ * var myModule = angular.module(...);
5737
+ *
5738
+ * myModule.directive('directiveName', function factory(injectables) {
5739
+ * var directiveDefinitionObject = {
5740
+ * priority: 0,
5741
+ * template: '<div></div>', // or // function(tElement, tAttrs) { ... },
5742
+ * // or
5743
+ * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },
5744
+ * transclude: false,
5745
+ * restrict: 'A',
5746
+ * templateNamespace: 'html',
5747
+ * scope: false,
5748
+ * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },
5749
+ * controllerAs: 'stringAlias',
5750
+ * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],
5751
+ * compile: function compile(tElement, tAttrs, transclude) {
5752
+ * return {
5753
+ * pre: function preLink(scope, iElement, iAttrs, controller) { ... },
5754
+ * post: function postLink(scope, iElement, iAttrs, controller) { ... }
5755
+ * }
5756
+ * // or
5757
+ * // return function postLink( ... ) { ... }
5758
+ * },
5759
+ * // or
5760
+ * // link: {
5761
+ * // pre: function preLink(scope, iElement, iAttrs, controller) { ... },
5762
+ * // post: function postLink(scope, iElement, iAttrs, controller) { ... }
5763
+ * // }
5764
+ * // or
5765
+ * // link: function postLink( ... ) { ... }
5766
+ * };
5767
+ * return directiveDefinitionObject;
5768
+ * });
5769
+ * ```
5770
+ *
5771
+ * <div class="alert alert-warning">
5772
+ * **Note:** Any unspecified options will use the default value. You can see the default values below.
5773
+ * </div>
5774
+ *
5775
+ * Therefore the above can be simplified as:
5776
+ *
5777
+ * ```js
5778
+ * var myModule = angular.module(...);
5779
+ *
5780
+ * myModule.directive('directiveName', function factory(injectables) {
5781
+ * var directiveDefinitionObject = {
5782
+ * link: function postLink(scope, iElement, iAttrs) { ... }
5783
+ * };
5784
+ * return directiveDefinitionObject;
5785
+ * // or
5786
+ * // return function postLink(scope, iElement, iAttrs) { ... }
5787
+ * });
5788
+ * ```
5789
+ *
5790
+ *
5791
+ *
5792
+ * ### Directive Definition Object
5793
+ *
5794
+ * The directive definition object provides instructions to the {@link ng.$compile
5795
+ * compiler}. The attributes are:
5796
+ *
5797
+ * #### `multiElement`
5798
+ * When this property is set to true, the HTML compiler will collect DOM nodes between
5799
+ * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them
5800
+ * together as the directive elements. It is recomended that this feature be used on directives
5801
+ * which are not strictly behavioural (such as {@link ngClick}), and which
5802
+ * do not manipulate or replace child nodes (such as {@link ngInclude}).
5803
+ *
5804
+ * #### `priority`
5805
+ * When there are multiple directives defined on a single DOM element, sometimes it
5806
+ * is necessary to specify the order in which the directives are applied. The `priority` is used
5807
+ * to sort the directives before their `compile` functions get called. Priority is defined as a
5808
+ * number. Directives with greater numerical `priority` are compiled first. Pre-link functions
5809
+ * are also run in priority order, but post-link functions are run in reverse order. The order
5810
+ * of directives with the same priority is undefined. The default priority is `0`.
5811
+ *
5812
+ * #### `terminal`
5813
+ * If set to true then the current `priority` will be the last set of directives
5814
+ * which will execute (any directives at the current priority will still execute
5815
+ * as the order of execution on same `priority` is undefined). Note that expressions
5816
+ * and other directives used in the directive's template will also be excluded from execution.
5817
+ *
5818
+ * #### `scope`
5819
+ * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the
5820
+ * same element request a new scope, only one new scope is created. The new scope rule does not
5821
+ * apply for the root of the template since the root of the template always gets a new scope.
5822
+ *
5823
+ * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from
5824
+ * normal scope in that it does not prototypically inherit from the parent scope. This is useful
5825
+ * when creating reusable components, which should not accidentally read or modify data in the
5826
+ * parent scope.
5827
+ *
5828
+ * The 'isolate' scope takes an object hash which defines a set of local scope properties
5829
+ * derived from the parent scope. These local properties are useful for aliasing values for
5830
+ * templates. Locals definition is a hash of local scope property to its source:
5831
+ *
5832
+ * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is
5833
+ * always a string since DOM attributes are strings. If no `attr` name is specified then the
5834
+ * attribute name is assumed to be the same as the local name.
5835
+ * Given `<widget my-attr="hello {{name}}">` and widget definition
5836
+ * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect
5837
+ * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the
5838
+ * `localName` property on the widget scope. The `name` is read from the parent scope (not
5839
+ * component scope).
5840
+ *
5841
+ * * `=` or `=attr` - set up bi-directional binding between a local scope property and the
5842
+ * parent scope property of name defined via the value of the `attr` attribute. If no `attr`
5843
+ * name is specified then the attribute name is assumed to be the same as the local name.
5844
+ * Given `<widget my-attr="parentModel">` and widget definition of
5845
+ * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the
5846
+ * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected
5847
+ * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent
5848
+ * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You
5849
+ * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional.
5850
+ *
5851
+ * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.
5852
+ * If no `attr` name is specified then the attribute name is assumed to be the same as the
5853
+ * local name. Given `<widget my-attr="count = count + value">` and widget definition of
5854
+ * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to
5855
+ * a function wrapper for the `count = count + value` expression. Often it's desirable to
5856
+ * pass data from the isolated scope via an expression to the parent scope, this can be
5857
+ * done by passing a map of local variable names and values into the expression wrapper fn.
5858
+ * For example, if the expression is `increment(amount)` then we can specify the amount value
5859
+ * by calling the `localFn` as `localFn({amount: 22})`.
5860
+ *
5861
+ *
5862
+ * #### `bindToController`
5863
+ * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController` will
5864
+ * allow a component to have its properties bound to the controller, rather than to scope. When the controller
5865
+ * is instantiated, the initial values of the isolate scope bindings are already available.
5866
+ *
5867
+ * #### `controller`
5868
+ * Controller constructor function. The controller is instantiated before the
5869
+ * pre-linking phase and it is shared with other directives (see
5870
+ * `require` attribute). This allows the directives to communicate with each other and augment
5871
+ * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:
5872
+ *
5873
+ * * `$scope` - Current scope associated with the element
5874
+ * * `$element` - Current element
5875
+ * * `$attrs` - Current attributes object for the element
5876
+ * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope:
5877
+ * `function([scope], cloneLinkingFn, futureParentElement)`.
5878
+ * * `scope`: optional argument to override the scope.
5879
+ * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content.
5880
+ * * `futureParentElement`:
5881
+ * * defines the parent to which the `cloneLinkingFn` will add the cloned elements.
5882
+ * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`.
5883
+ * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements)
5884
+ * and when the `cloneLinkinFn` is passed,
5885
+ * as those elements need to created and cloned in a special way when they are defined outside their
5886
+ * usual containers (e.g. like `<svg>`).
5887
+ * * See also the `directive.templateNamespace` property.
5888
+ *
5889
+ *
5890
+ * #### `require`
5891
+ * Require another directive and inject its controller as the fourth argument to the linking function. The
5892
+ * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the
5893
+ * injected argument will be an array in corresponding order. If no such directive can be
5894
+ * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with:
5895
+ *
5896
+ * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
5897
+ * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
5898
+ * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.
5899
+ * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found.
5900
+ * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass
5901
+ * `null` to the `link` fn if not found.
5902
+ * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass
5903
+ * `null` to the `link` fn if not found.
5904
+ *
5905
+ *
5906
+ * #### `controllerAs`
5907
+ * Controller alias at the directive scope. An alias for the controller so it
5908
+ * can be referenced at the directive template. The directive needs to define a scope for this
5909
+ * configuration to be used. Useful in the case when directive is used as component.
5910
+ *
5911
+ *
5912
+ * #### `restrict`
5913
+ * String of subset of `EACM` which restricts the directive to a specific directive
5914
+ * declaration style. If omitted, the defaults (elements and attributes) are used.
5915
+ *
5916
+ * * `E` - Element name (default): `<my-directive></my-directive>`
5917
+ * * `A` - Attribute (default): `<div my-directive="exp"></div>`
5918
+ * * `C` - Class: `<div class="my-directive: exp;"></div>`
5919
+ * * `M` - Comment: `<!-- directive: my-directive exp -->`
5920
+ *
5921
+ *
5922
+ * #### `templateNamespace`
5923
+ * String representing the document type used by the markup in the template.
5924
+ * AngularJS needs this information as those elements need to be created and cloned
5925
+ * in a special way when they are defined outside their usual containers like `<svg>` and `<math>`.
5926
+ *
5927
+ * * `html` - All root nodes in the template are HTML. Root nodes may also be
5928
+ * top-level elements such as `<svg>` or `<math>`.
5929
+ * * `svg` - The root nodes in the template are SVG elements (excluding `<math>`).
5930
+ * * `math` - The root nodes in the template are MathML elements (excluding `<svg>`).
5931
+ *
5932
+ * If no `templateNamespace` is specified, then the namespace is considered to be `html`.
5933
+ *
5934
+ * #### `template`
5935
+ * HTML markup that may:
5936
+ * * Replace the contents of the directive's element (default).
5937
+ * * Replace the directive's element itself (if `replace` is true - DEPRECATED).
5938
+ * * Wrap the contents of the directive's element (if `transclude` is true).
5939
+ *
5940
+ * Value may be:
5941
+ *
5942
+ * * A string. For example `<div red-on-hover>{{delete_str}}</div>`.
5943
+ * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`
5944
+ * function api below) and returns a string value.
5945
+ *
5946
+ *
5947
+ * #### `templateUrl`
5948
+ * This is similar to `template` but the template is loaded from the specified URL, asynchronously.
5949
+ *
5950
+ * Because template loading is asynchronous the compiler will suspend compilation of directives on that element
5951
+ * for later when the template has been resolved. In the meantime it will continue to compile and link
5952
+ * sibling and parent elements as though this element had not contained any directives.
5953
+ *
5954
+ * The compiler does not suspend the entire compilation to wait for templates to be loaded because this
5955
+ * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the
5956
+ * case when only one deeply nested directive has `templateUrl`.
5957
+ *
5958
+ * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}
5959
+ *
5960
+ * You can specify `templateUrl` as a string representing the URL or as a function which takes two
5961
+ * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns
5962
+ * a string value representing the url. In either case, the template URL is passed through {@link
5963
+ * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.
5964
+ *
5965
+ *
5966
+ * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0)
5967
+ * specify what the template should replace. Defaults to `false`.
5968
+ *
5969
+ * * `true` - the template will replace the directive's element.
5970
+ * * `false` - the template will replace the contents of the directive's element.
5971
+ *
5972
+ * The replacement process migrates all of the attributes / classes from the old element to the new
5973
+ * one. See the {@link guide/directive#template-expanding-directive
5974
+ * Directives Guide} for an example.
5975
+ *
5976
+ * There are very few scenarios where element replacement is required for the application function,
5977
+ * the main one being reusable custom components that are used within SVG contexts
5978
+ * (because SVG doesn't work with custom elements in the DOM tree).
5979
+ *
5980
+ * #### `transclude`
5981
+ * Extract the contents of the element where the directive appears and make it available to the directive.
5982
+ * The contents are compiled and provided to the directive as a **transclusion function**. See the
5983
+ * {@link $compile#transclusion Transclusion} section below.
5984
+ *
5985
+ * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the
5986
+ * directive's element or the entire element:
5987
+ *
5988
+ * * `true` - transclude the content (i.e. the child nodes) of the directive's element.
5989
+ * * `'element'` - transclude the whole of the directive's element including any directives on this
5990
+ * element that defined at a lower priority than this directive. When used, the `template`
5991
+ * property is ignored.
5992
+ *
5993
+ *
5994
+ * #### `compile`
5995
+ *
5996
+ * ```js
5997
+ * function compile(tElement, tAttrs, transclude) { ... }
5998
+ * ```
5999
+ *
6000
+ * The compile function deals with transforming the template DOM. Since most directives do not do
6001
+ * template transformation, it is not used often. The compile function takes the following arguments:
6002
+ *
6003
+ * * `tElement` - template element - The element where the directive has been declared. It is
6004
+ * safe to do template transformation on the element and child elements only.
6005
+ *
6006
+ * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared
6007
+ * between all directive compile functions.
6008
+ *
6009
+ * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`
6010
+ *
6011
+ * <div class="alert alert-warning">
6012
+ * **Note:** The template instance and the link instance may be different objects if the template has
6013
+ * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that
6014
+ * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration
6015
+ * should be done in a linking function rather than in a compile function.
6016
+ * </div>
6017
+
6018
+ * <div class="alert alert-warning">
6019
+ * **Note:** The compile function cannot handle directives that recursively use themselves in their
6020
+ * own templates or compile functions. Compiling these directives results in an infinite loop and a
6021
+ * stack overflow errors.
6022
+ *
6023
+ * This can be avoided by manually using $compile in the postLink function to imperatively compile
6024
+ * a directive's template instead of relying on automatic template compilation via `template` or
6025
+ * `templateUrl` declaration or manual compilation inside the compile function.
6026
+ * </div>
6027
+ *
6028
+ * <div class="alert alert-error">
6029
+ * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it
6030
+ * e.g. does not know about the right outer scope. Please use the transclude function that is passed
6031
+ * to the link function instead.
6032
+ * </div>
6033
+
6034
+ * A compile function can have a return value which can be either a function or an object.
6035
+ *
6036
+ * * returning a (post-link) function - is equivalent to registering the linking function via the
6037
+ * `link` property of the config object when the compile function is empty.
6038
+ *
6039
+ * * returning an object with function(s) registered via `pre` and `post` properties - allows you to
6040
+ * control when a linking function should be called during the linking phase. See info about
6041
+ * pre-linking and post-linking functions below.
6042
+ *
6043
+ *
6044
+ * #### `link`
6045
+ * This property is used only if the `compile` property is not defined.
6046
+ *
6047
+ * ```js
6048
+ * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }
6049
+ * ```
6050
+ *
6051
+ * The link function is responsible for registering DOM listeners as well as updating the DOM. It is
6052
+ * executed after the template has been cloned. This is where most of the directive logic will be
6053
+ * put.
6054
+ *
6055
+ * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the
6056
+ * directive for registering {@link ng.$rootScope.Scope#$watch watches}.
6057
+ *
6058
+ * * `iElement` - instance element - The element where the directive is to be used. It is safe to
6059
+ * manipulate the children of the element only in `postLink` function since the children have
6060
+ * already been linked.
6061
+ *
6062
+ * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared
6063
+ * between all directive linking functions.
6064
+ *
6065
+ * * `controller` - a controller instance - A controller instance if at least one directive on the
6066
+ * element defines a controller. The controller is shared among all the directives, which allows
6067
+ * the directives to use the controllers as a communication channel.
6068
+ *
6069
+ * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.
6070
+ * This is the same as the `$transclude`
6071
+ * parameter of directive controllers, see there for details.
6072
+ * `function([scope], cloneLinkingFn, futureParentElement)`.
6073
+ *
6074
+ * #### Pre-linking function
6075
+ *
6076
+ * Executed before the child elements are linked. Not safe to do DOM transformation since the
6077
+ * compiler linking function will fail to locate the correct elements for linking.
6078
+ *
6079
+ * #### Post-linking function
6080
+ *
6081
+ * Executed after the child elements are linked.
6082
+ *
6083
+ * Note that child elements that contain `templateUrl` directives will not have been compiled
6084
+ * and linked since they are waiting for their template to load asynchronously and their own
6085
+ * compilation and linking has been suspended until that occurs.
6086
+ *
6087
+ * It is safe to do DOM transformation in the post-linking function on elements that are not waiting
6088
+ * for their async templates to be resolved.
6089
+ *
6090
+ *
6091
+ * ### Transclusion
6092
+ *
6093
+ * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and
6094
+ * copying them to another part of the DOM, while maintaining their connection to the original AngularJS
6095
+ * scope from where they were taken.
6096
+ *
6097
+ * Transclusion is used (often with {@link ngTransclude}) to insert the
6098
+ * original contents of a directive's element into a specified place in the template of the directive.
6099
+ * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded
6100
+ * content has access to the properties on the scope from which it was taken, even if the directive
6101
+ * has isolated scope.
6102
+ * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}.
6103
+ *
6104
+ * This makes it possible for the widget to have private state for its template, while the transcluded
6105
+ * content has access to its originating scope.
6106
+ *
6107
+ * <div class="alert alert-warning">
6108
+ * **Note:** When testing an element transclude directive you must not place the directive at the root of the
6109
+ * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives
6110
+ * Testing Transclusion Directives}.
6111
+ * </div>
6112
+ *
6113
+ * #### Transclusion Functions
6114
+ *
6115
+ * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion
6116
+ * function** to the directive's `link` function and `controller`. This transclusion function is a special
6117
+ * **linking function** that will return the compiled contents linked to a new transclusion scope.
6118
+ *
6119
+ * <div class="alert alert-info">
6120
+ * If you are just using {@link ngTransclude} then you don't need to worry about this function, since
6121
+ * ngTransclude will deal with it for us.
6122
+ * </div>
6123
+ *
6124
+ * If you want to manually control the insertion and removal of the transcluded content in your directive
6125
+ * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery
6126
+ * object that contains the compiled DOM, which is linked to the correct transclusion scope.
6127
+ *
6128
+ * When you call a transclusion function you can pass in a **clone attach function**. This function accepts
6129
+ * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded
6130
+ * content and the `scope` is the newly created transclusion scope, to which the clone is bound.
6131
+ *
6132
+ * <div class="alert alert-info">
6133
+ * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function
6134
+ * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope.
6135
+ * </div>
6136
+ *
6137
+ * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone
6138
+ * attach function**:
6139
+ *
6140
+ * ```js
6141
+ * var transcludedContent, transclusionScope;
6142
+ *
6143
+ * $transclude(function(clone, scope) {
6144
+ * element.append(clone);
6145
+ * transcludedContent = clone;
6146
+ * transclusionScope = scope;
6147
+ * });
6148
+ * ```
6149
+ *
6150
+ * Later, if you want to remove the transcluded content from your DOM then you should also destroy the
6151
+ * associated transclusion scope:
6152
+ *
6153
+ * ```js
6154
+ * transcludedContent.remove();
6155
+ * transclusionScope.$destroy();
6156
+ * ```
6157
+ *
6158
+ * <div class="alert alert-info">
6159
+ * **Best Practice**: if you intend to add and remove transcluded content manually in your directive
6160
+ * (by calling the transclude function to get the DOM and and calling `element.remove()` to remove it),
6161
+ * then you are also responsible for calling `$destroy` on the transclusion scope.
6162
+ * </div>
6163
+ *
6164
+ * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat}
6165
+ * automatically destroy their transluded clones as necessary so you do not need to worry about this if
6166
+ * you are simply using {@link ngTransclude} to inject the transclusion into your directive.
6167
+ *
6168
+ *
6169
+ * #### Transclusion Scopes
6170
+ *
6171
+ * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion
6172
+ * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed
6173
+ * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it
6174
+ * was taken.
6175
+ *
6176
+ * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look
6177
+ * like this:
6178
+ *
6179
+ * ```html
6180
+ * <div ng-app>
6181
+ * <div isolate>
6182
+ * <div transclusion>
6183
+ * </div>
6184
+ * </div>
6185
+ * </div>
6186
+ * ```
6187
+ *
6188
+ * The `$parent` scope hierarchy will look like this:
6189
+ *
6190
+ * ```
6191
+ * - $rootScope
6192
+ * - isolate
6193
+ * - transclusion
6194
+ * ```
6195
+ *
6196
+ * but the scopes will inherit prototypically from different scopes to their `$parent`.
6197
+ *
6198
+ * ```
6199
+ * - $rootScope
6200
+ * - transclusion
6201
+ * - isolate
6202
+ * ```
6203
+ *
6204
+ *
6205
+ * ### Attributes
6206
+ *
6207
+ * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the
6208
+ * `link()` or `compile()` functions. It has a variety of uses.
6209
+ *
6210
+ * accessing *Normalized attribute names:*
6211
+ * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'.
6212
+ * the attributes object allows for normalized access to
6213
+ * the attributes.
6214
+ *
6215
+ * * *Directive inter-communication:* All directives share the same instance of the attributes
6216
+ * object which allows the directives to use the attributes object as inter directive
6217
+ * communication.
6218
+ *
6219
+ * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object
6220
+ * allowing other directives to read the interpolated value.
6221
+ *
6222
+ * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes
6223
+ * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also
6224
+ * the only way to easily get the actual value because during the linking phase the interpolation
6225
+ * hasn't been evaluated yet and so the value is at this time set to `undefined`.
6226
+ *
6227
+ * ```js
6228
+ * function linkingFn(scope, elm, attrs, ctrl) {
6229
+ * // get the attribute value
6230
+ * console.log(attrs.ngModel);
6231
+ *
6232
+ * // change the attribute
6233
+ * attrs.$set('ngModel', 'new value');
6234
+ *
6235
+ * // observe changes to interpolated attribute
6236
+ * attrs.$observe('ngModel', function(value) {
6237
+ * console.log('ngModel has changed value to ' + value);
6238
+ * });
6239
+ * }
6240
+ * ```
6241
+ *
6242
+ * ## Example
6243
+ *
6244
+ * <div class="alert alert-warning">
6245
+ * **Note**: Typically directives are registered with `module.directive`. The example below is
6246
+ * to illustrate how `$compile` works.
6247
+ * </div>
6248
+ *
6249
+ <example module="compileExample">
6250
+ <file name="index.html">
6251
+ <script>
6252
+ angular.module('compileExample', [], function($compileProvider) {
6253
+ // configure new 'compile' directive by passing a directive
6254
+ // factory function. The factory function injects the '$compile'
6255
+ $compileProvider.directive('compile', function($compile) {
6256
+ // directive factory creates a link function
6257
+ return function(scope, element, attrs) {
6258
+ scope.$watch(
6259
+ function(scope) {
6260
+ // watch the 'compile' expression for changes
6261
+ return scope.$eval(attrs.compile);
6262
+ },
6263
+ function(value) {
6264
+ // when the 'compile' expression changes
6265
+ // assign it into the current DOM
6266
+ element.html(value);
6267
+
6268
+ // compile the new DOM and link it to the current
6269
+ // scope.
6270
+ // NOTE: we only compile .childNodes so that
6271
+ // we don't get into infinite loop compiling ourselves
6272
+ $compile(element.contents())(scope);
6273
+ }
6274
+ );
6275
+ };
6276
+ });
6277
+ })
6278
+ .controller('GreeterController', ['$scope', function($scope) {
6279
+ $scope.name = 'Angular';
6280
+ $scope.html = 'Hello {{name}}';
6281
+ }]);
6282
+ </script>
6283
+ <div ng-controller="GreeterController">
6284
+ <input ng-model="name"> <br>
6285
+ <textarea ng-model="html"></textarea> <br>
6286
+ <div compile="html"></div>
6287
+ </div>
6288
+ </file>
6289
+ <file name="protractor.js" type="protractor">
6290
+ it('should auto compile', function() {
6291
+ var textarea = $('textarea');
6292
+ var output = $('div[compile]');
6293
+ // The initial state reads 'Hello Angular'.
6294
+ expect(output.getText()).toBe('Hello Angular');
6295
+ textarea.clear();
6296
+ textarea.sendKeys('{{name}}!');
6297
+ expect(output.getText()).toBe('Angular!');
6298
+ });
6299
+ </file>
6300
+ </example>
6301
+
6302
+ *
6303
+ *
6304
+ * @param {string|DOMElement} element Element or HTML string to compile into a template function.
6305
+ * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives.
6306
+ * @param {number} maxPriority only apply directives lower than given priority (Only effects the
6307
+ * root element(s), not their children)
6308
+ * @returns {function(scope, cloneAttachFn=)} a link function which is used to bind template
6309
+ * (a DOM element/tree) to a scope. Where:
6310
+ *
6311
+ * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.
6312
+ * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the
6313
+ * `template` and call the `cloneAttachFn` function allowing the caller to attach the
6314
+ * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is
6315
+ * called as: <br> `cloneAttachFn(clonedElement, scope)` where:
6316
+ *
6317
+ * * `clonedElement` - is a clone of the original `element` passed into the compiler.
6318
+ * * `scope` - is the current scope with which the linking function is working with.
6319
+ *
6320
+ * Calling the linking function returns the element of the template. It is either the original
6321
+ * element passed in, or the clone of the element if the `cloneAttachFn` is provided.
6322
+ *
6323
+ * After linking the view is not updated until after a call to $digest which typically is done by
6324
+ * Angular automatically.
6325
+ *
6326
+ * If you need access to the bound view, there are two ways to do it:
6327
+ *
6328
+ * - If you are not asking the linking function to clone the template, create the DOM element(s)
6329
+ * before you send them to the compiler and keep this reference around.
6330
+ * ```js
6331
+ * var element = $compile('<p>{{total}}</p>')(scope);
6332
+ * ```
6333
+ *
6334
+ * - if on the other hand, you need the element to be cloned, the view reference from the original
6335
+ * example would not point to the clone, but rather to the original template that was cloned. In
6336
+ * this case, you can access the clone via the cloneAttachFn:
6337
+ * ```js
6338
+ * var templateElement = angular.element('<p>{{total}}</p>'),
6339
+ * scope = ....;
6340
+ *
6341
+ * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {
6342
+ * //attach the clone to DOM document at the right place
6343
+ * });
6344
+ *
6345
+ * //now we have reference to the cloned DOM via `clonedElement`
6346
+ * ```
6347
+ *
6348
+ *
6349
+ * For information on how the compiler works, see the
6350
+ * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.
6351
+ */
6352
+
6353
+var $compileMinErr = minErr('$compile');
6354
+
6355
+/**
6356
+ * @ngdoc provider
6357
+ * @name $compileProvider
6358
+ *
6359
+ * @description
6360
+ */
6361
+$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];
6362
+function $CompileProvider($provide, $$sanitizeUriProvider) {
6363
+ var hasDirectives = {},
6364
+ Suffix = 'Directive',
6365
+ COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,
6366
+ CLASS_DIRECTIVE_REGEXP = /(([\d\w_\-]+)(?:\:([^;]+))?;?)/,
6367
+ ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),
6368
+ REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/;
6369
+
6370
+ // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
6371
+ // The assumption is that future DOM event attribute names will begin with
6372
+ // 'on' and be composed of only English letters.
6373
+ var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;
6374
+
6375
+ function parseIsolateBindings(scope, directiveName) {
6376
+ var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/;
6377
+
6378
+ var bindings = {};
6379
+
6380
+ forEach(scope, function(definition, scopeName) {
6381
+ var match = definition.match(LOCAL_REGEXP);
6382
+
6383
+ if (!match) {
6384
+ throw $compileMinErr('iscp',
6385
+ "Invalid isolate scope definition for directive '{0}'." +
6386
+ " Definition: {... {1}: '{2}' ...}",
6387
+ directiveName, scopeName, definition);
6388
+ }
6389
+
6390
+ bindings[scopeName] = {
6391
+ attrName: match[3] || scopeName,
6392
+ mode: match[1],
6393
+ optional: match[2] === '?'
6394
+ };
6395
+ });
6396
+
6397
+ return bindings;
6398
+ }
6399
+
6400
+ /**
6401
+ * @ngdoc method
6402
+ * @name $compileProvider#directive
6403
+ * @kind function
6404
+ *
6405
+ * @description
6406
+ * Register a new directive with the compiler.
6407
+ *
6408
+ * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which
6409
+ * will match as <code>ng-bind</code>), or an object map of directives where the keys are the
6410
+ * names and the values are the factories.
6411
+ * @param {Function|Array} directiveFactory An injectable directive factory function. See
6412
+ * {@link guide/directive} for more info.
6413
+ * @returns {ng.$compileProvider} Self for chaining.
6414
+ */
6415
+ this.directive = function registerDirective(name, directiveFactory) {
6416
+ assertNotHasOwnProperty(name, 'directive');
6417
+ if (isString(name)) {
6418
+ assertArg(directiveFactory, 'directiveFactory');
6419
+ if (!hasDirectives.hasOwnProperty(name)) {
6420
+ hasDirectives[name] = [];
6421
+ $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',
6422
+ function($injector, $exceptionHandler) {
6423
+ var directives = [];
6424
+ forEach(hasDirectives[name], function(directiveFactory, index) {
6425
+ try {
6426
+ var directive = $injector.invoke(directiveFactory);
6427
+ if (isFunction(directive)) {
6428
+ directive = { compile: valueFn(directive) };
6429
+ } else if (!directive.compile && directive.link) {
6430
+ directive.compile = valueFn(directive.link);
6431
+ }
6432
+ directive.priority = directive.priority || 0;
6433
+ directive.index = index;
6434
+ directive.name = directive.name || name;
6435
+ directive.require = directive.require || (directive.controller && directive.name);
6436
+ directive.restrict = directive.restrict || 'EA';
6437
+ if (isObject(directive.scope)) {
6438
+ directive.$$isolateBindings = parseIsolateBindings(directive.scope, directive.name);
6439
+ }
6440
+ directives.push(directive);
6441
+ } catch (e) {
6442
+ $exceptionHandler(e);
6443
+ }
6444
+ });
6445
+ return directives;
6446
+ }]);
6447
+ }
6448
+ hasDirectives[name].push(directiveFactory);
6449
+ } else {
6450
+ forEach(name, reverseParams(registerDirective));
6451
+ }
6452
+ return this;
6453
+ };
6454
+
6455
+
6456
+ /**
6457
+ * @ngdoc method
6458
+ * @name $compileProvider#aHrefSanitizationWhitelist
6459
+ * @kind function
6460
+ *
6461
+ * @description
6462
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
6463
+ * urls during a[href] sanitization.
6464
+ *
6465
+ * The sanitization is a security measure aimed at prevent XSS attacks via html links.
6466
+ *
6467
+ * Any url about to be assigned to a[href] via data-binding is first normalized and turned into
6468
+ * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
6469
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
6470
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
6471
+ *
6472
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
6473
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
6474
+ * chaining otherwise.
6475
+ */
6476
+ this.aHrefSanitizationWhitelist = function(regexp) {
6477
+ if (isDefined(regexp)) {
6478
+ $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);
6479
+ return this;
6480
+ } else {
6481
+ return $$sanitizeUriProvider.aHrefSanitizationWhitelist();
6482
+ }
6483
+ };
6484
+
6485
+
6486
+ /**
6487
+ * @ngdoc method
6488
+ * @name $compileProvider#imgSrcSanitizationWhitelist
6489
+ * @kind function
6490
+ *
6491
+ * @description
6492
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
6493
+ * urls during img[src] sanitization.
6494
+ *
6495
+ * The sanitization is a security measure aimed at prevent XSS attacks via html links.
6496
+ *
6497
+ * Any url about to be assigned to img[src] via data-binding is first normalized and turned into
6498
+ * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`
6499
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
6500
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
6501
+ *
6502
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
6503
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
6504
+ * chaining otherwise.
6505
+ */
6506
+ this.imgSrcSanitizationWhitelist = function(regexp) {
6507
+ if (isDefined(regexp)) {
6508
+ $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);
6509
+ return this;
6510
+ } else {
6511
+ return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();
6512
+ }
6513
+ };
6514
+
6515
+ /**
6516
+ * @ngdoc method
6517
+ * @name $compileProvider#debugInfoEnabled
6518
+ *
6519
+ * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the
6520
+ * current debugInfoEnabled state
6521
+ * @returns {*} current value if used as getter or itself (chaining) if used as setter
6522
+ *
6523
+ * @kind function
6524
+ *
6525
+ * @description
6526
+ * Call this method to enable/disable various debug runtime information in the compiler such as adding
6527
+ * binding information and a reference to the current scope on to DOM elements.
6528
+ * If enabled, the compiler will add the following to DOM elements that have been bound to the scope
6529
+ * * `ng-binding` CSS class
6530
+ * * `$binding` data property containing an array of the binding expressions
6531
+ *
6532
+ * You may want to use this in production for a significant performance boost. See
6533
+ * {@link guide/production#disabling-debug-data Disabling Debug Data} for more.
6534
+ *
6535
+ * The default value is true.
6536
+ */
6537
+ var debugInfoEnabled = true;
6538
+ this.debugInfoEnabled = function(enabled) {
6539
+ if(isDefined(enabled)) {
6540
+ debugInfoEnabled = enabled;
6541
+ return this;
6542
+ }
6543
+ return debugInfoEnabled;
6544
+ };
6545
+
6546
+ this.$get = [
6547
+ '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse',
6548
+ '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',
6549
+ function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse,
6550
+ $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) {
6551
+
6552
+ var Attributes = function(element, attributesToCopy) {
6553
+ if (attributesToCopy) {
6554
+ var keys = Object.keys(attributesToCopy);
6555
+ var i, l, key;
6556
+
6557
+ for (i = 0, l = keys.length; i < l; i++) {
6558
+ key = keys[i];
6559
+ this[key] = attributesToCopy[key];
6560
+ }
6561
+ } else {
6562
+ this.$attr = {};
6563
+ }
6564
+
6565
+ this.$$element = element;
6566
+ };
6567
+
6568
+ Attributes.prototype = {
6569
+ $normalize: directiveNormalize,
6570
+
6571
+
6572
+ /**
6573
+ * @ngdoc method
6574
+ * @name $compile.directive.Attributes#$addClass
6575
+ * @kind function
6576
+ *
6577
+ * @description
6578
+ * Adds the CSS class value specified by the classVal parameter to the element. If animations
6579
+ * are enabled then an animation will be triggered for the class addition.
6580
+ *
6581
+ * @param {string} classVal The className value that will be added to the element
6582
+ */
6583
+ $addClass : function(classVal) {
6584
+ if(classVal && classVal.length > 0) {
6585
+ $animate.addClass(this.$$element, classVal);
6586
+ }
6587
+ },
6588
+
6589
+ /**
6590
+ * @ngdoc method
6591
+ * @name $compile.directive.Attributes#$removeClass
6592
+ * @kind function
6593
+ *
6594
+ * @description
6595
+ * Removes the CSS class value specified by the classVal parameter from the element. If
6596
+ * animations are enabled then an animation will be triggered for the class removal.
6597
+ *
6598
+ * @param {string} classVal The className value that will be removed from the element
6599
+ */
6600
+ $removeClass : function(classVal) {
6601
+ if(classVal && classVal.length > 0) {
6602
+ $animate.removeClass(this.$$element, classVal);
6603
+ }
6604
+ },
6605
+
6606
+ /**
6607
+ * @ngdoc method
6608
+ * @name $compile.directive.Attributes#$updateClass
6609
+ * @kind function
6610
+ *
6611
+ * @description
6612
+ * Adds and removes the appropriate CSS class values to the element based on the difference
6613
+ * between the new and old CSS class values (specified as newClasses and oldClasses).
6614
+ *
6615
+ * @param {string} newClasses The current CSS className value
6616
+ * @param {string} oldClasses The former CSS className value
6617
+ */
6618
+ $updateClass : function(newClasses, oldClasses) {
6619
+ var toAdd = tokenDifference(newClasses, oldClasses);
6620
+ if (toAdd && toAdd.length) {
6621
+ $animate.addClass(this.$$element, toAdd);
6622
+ }
6623
+
6624
+ var toRemove = tokenDifference(oldClasses, newClasses);
6625
+ if (toRemove && toRemove.length) {
6626
+ $animate.removeClass(this.$$element, toRemove);
6627
+ }
6628
+ },
6629
+
6630
+ /**
6631
+ * Set a normalized attribute on the element in a way such that all directives
6632
+ * can share the attribute. This function properly handles boolean attributes.
6633
+ * @param {string} key Normalized key. (ie ngAttribute)
6634
+ * @param {string|boolean} value The value to set. If `null` attribute will be deleted.
6635
+ * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.
6636
+ * Defaults to true.
6637
+ * @param {string=} attrName Optional none normalized name. Defaults to key.
6638
+ */
6639
+ $set: function(key, value, writeAttr, attrName) {
6640
+ // TODO: decide whether or not to throw an error if "class"
6641
+ //is set through this function since it may cause $updateClass to
6642
+ //become unstable.
6643
+
6644
+ var node = this.$$element[0],
6645
+ booleanKey = getBooleanAttrName(node, key),
6646
+ aliasedKey = getAliasedAttrName(node, key),
6647
+ observer = key,
6648
+ normalizedVal,
6649
+ nodeName;
6650
+
6651
+ if (booleanKey) {
6652
+ this.$$element.prop(key, value);
6653
+ attrName = booleanKey;
6654
+ } else if(aliasedKey) {
6655
+ this[aliasedKey] = value;
6656
+ observer = aliasedKey;
6657
+ }
6658
+
6659
+ this[key] = value;
6660
+
6661
+ // translate normalized key to actual key
6662
+ if (attrName) {
6663
+ this.$attr[key] = attrName;
6664
+ } else {
6665
+ attrName = this.$attr[key];
6666
+ if (!attrName) {
6667
+ this.$attr[key] = attrName = snake_case(key, '-');
6668
+ }
6669
+ }
6670
+
6671
+ nodeName = nodeName_(this.$$element);
6672
+
6673
+ if ((nodeName === 'a' && key === 'href') ||
6674
+ (nodeName === 'img' && key === 'src')) {
6675
+ // sanitize a[href] and img[src] values
6676
+ this[key] = value = $$sanitizeUri(value, key === 'src');
6677
+ } else if (nodeName === 'img' && key === 'srcset') {
6678
+ // sanitize img[srcset] values
6679
+ var result = "";
6680
+
6681
+ // first check if there are spaces because it's not the same pattern
6682
+ var trimmedSrcset = trim(value);
6683
+ // ( 999x ,| 999w ,| ,|, )
6684
+ var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/;
6685
+ var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/;
6686
+
6687
+ // split srcset into tuple of uri and descriptor except for the last item
6688
+ var rawUris = trimmedSrcset.split(pattern);
6689
+
6690
+ // for each tuples
6691
+ var nbrUrisWith2parts = Math.floor(rawUris.length / 2);
6692
+ for (var i=0; i<nbrUrisWith2parts; i++) {
6693
+ var innerIdx = i*2;
6694
+ // sanitize the uri
6695
+ result += $$sanitizeUri(trim( rawUris[innerIdx]), true);
6696
+ // add the descriptor
6697
+ result += ( " " + trim(rawUris[innerIdx+1]));
6698
+ }
6699
+
6700
+ // split the last item into uri and descriptor
6701
+ var lastTuple = trim(rawUris[i*2]).split(/\s/);
6702
+
6703
+ // sanitize the last uri
6704
+ result += $$sanitizeUri(trim(lastTuple[0]), true);
6705
+
6706
+ // and add the last descriptor if any
6707
+ if( lastTuple.length === 2) {
6708
+ result += (" " + trim(lastTuple[1]));
6709
+ }
6710
+ this[key] = value = result;
6711
+ }
6712
+
6713
+ if (writeAttr !== false) {
6714
+ if (value === null || value === undefined) {
6715
+ this.$$element.removeAttr(attrName);
6716
+ } else {
6717
+ this.$$element.attr(attrName, value);
6718
+ }
6719
+ }
6720
+
6721
+ // fire observers
6722
+ var $$observers = this.$$observers;
6723
+ $$observers && forEach($$observers[observer], function(fn) {
6724
+ try {
6725
+ fn(value);
6726
+ } catch (e) {
6727
+ $exceptionHandler(e);
6728
+ }
6729
+ });
6730
+ },
6731
+
6732
+
6733
+ /**
6734
+ * @ngdoc method
6735
+ * @name $compile.directive.Attributes#$observe
6736
+ * @kind function
6737
+ *
6738
+ * @description
6739
+ * Observes an interpolated attribute.
6740
+ *
6741
+ * The observer function will be invoked once during the next `$digest` following
6742
+ * compilation. The observer is then invoked whenever the interpolated value
6743
+ * changes.
6744
+ *
6745
+ * @param {string} key Normalized key. (ie ngAttribute) .
6746
+ * @param {function(interpolatedValue)} fn Function that will be called whenever
6747
+ the interpolated value of the attribute changes.
6748
+ * See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info.
6749
+ * @returns {function()} Returns a deregistration function for this observer.
6750
+ */
6751
+ $observe: function(key, fn) {
6752
+ var attrs = this,
6753
+ $$observers = (attrs.$$observers || (attrs.$$observers = createMap())),
6754
+ listeners = ($$observers[key] || ($$observers[key] = []));
6755
+
6756
+ listeners.push(fn);
6757
+ $rootScope.$evalAsync(function() {
6758
+ if (!listeners.$$inter) {
6759
+ // no one registered attribute interpolation function, so lets call it manually
6760
+ fn(attrs[key]);
6761
+ }
6762
+ });
6763
+
6764
+ return function() {
6765
+ arrayRemove(listeners, fn);
6766
+ };
6767
+ }
6768
+ };
6769
+
6770
+
6771
+ function safeAddClass($element, className) {
6772
+ try {
6773
+ $element.addClass(className);
6774
+ } catch(e) {
6775
+ // ignore, since it means that we are trying to set class on
6776
+ // SVG element, where class name is read-only.
6777
+ }
6778
+ }
6779
+
6780
+
6781
+ var startSymbol = $interpolate.startSymbol(),
6782
+ endSymbol = $interpolate.endSymbol(),
6783
+ denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}')
6784
+ ? identity
6785
+ : function denormalizeTemplate(template) {
6786
+ return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol);
6787
+ },
6788
+ NG_ATTR_BINDING = /^ngAttr[A-Z]/;
6789
+
6790
+ compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) {
6791
+ var bindings = $element.data('$binding') || [];
6792
+
6793
+ if (isArray(binding)) {
6794
+ bindings = bindings.concat(binding);
6795
+ } else {
6796
+ bindings.push(binding);
6797
+ }
6798
+
6799
+ $element.data('$binding', bindings);
6800
+ } : noop;
6801
+
6802
+ compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) {
6803
+ safeAddClass($element, 'ng-binding');
6804
+ } : noop;
6805
+
6806
+ compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) {
6807
+ var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope';
6808
+ $element.data(dataName, scope);
6809
+ } : noop;
6810
+
6811
+ compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) {
6812
+ safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope');
6813
+ } : noop;
6814
+
6815
+ return compile;
6816
+
6817
+ //================================
6818
+
6819
+ function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,
6820
+ previousCompileContext) {
6821
+ if (!($compileNodes instanceof jqLite)) {
6822
+ // jquery always rewraps, whereas we need to preserve the original selector so that we can
6823
+ // modify it.
6824
+ $compileNodes = jqLite($compileNodes);
6825
+ }
6826
+ // We can not compile top level text elements since text nodes can be merged and we will
6827
+ // not be able to attach scope data to them, so we will wrap them in <span>
6828
+ forEach($compileNodes, function(node, index){
6829
+ if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) {
6830
+ $compileNodes[index] = jqLite(node).wrap('<span></span>').parent()[0];
6831
+ }
6832
+ });
6833
+ var compositeLinkFn =
6834
+ compileNodes($compileNodes, transcludeFn, $compileNodes,
6835
+ maxPriority, ignoreDirective, previousCompileContext);
6836
+ compile.$$addScopeClass($compileNodes);
6837
+ var namespace = null;
6838
+ return function publicLinkFn(scope, cloneConnectFn, transcludeControllers, parentBoundTranscludeFn, futureParentElement){
6839
+ assertArg(scope, 'scope');
6840
+ if (!namespace) {
6841
+ namespace = detectNamespaceForChildElements(futureParentElement);
6842
+ }
6843
+ var $linkNode;
6844
+ if (namespace !== 'html') {
6845
+ // When using a directive with replace:true and templateUrl the $compileNodes
6846
+ // (or a child element inside of them)
6847
+ // might change, so we need to recreate the namespace adapted compileNodes
6848
+ // for call to the link function.
6849
+ // Note: This will already clone the nodes...
6850
+ $linkNode = jqLite(
6851
+ wrapTemplate(namespace, jqLite('<div>').append($compileNodes).html())
6852
+ );
6853
+ } else if (cloneConnectFn) {
6854
+ // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart
6855
+ // and sometimes changes the structure of the DOM.
6856
+ $linkNode = JQLitePrototype.clone.call($compileNodes);
6857
+ } else {
6858
+ $linkNode = $compileNodes;
6859
+ }
6860
+
6861
+ if (transcludeControllers) {
6862
+ for (var controllerName in transcludeControllers) {
6863
+ $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance);
6864
+ }
6865
+ }
6866
+
6867
+ compile.$$addScopeInfo($linkNode, scope);
6868
+
6869
+ if (cloneConnectFn) cloneConnectFn($linkNode, scope);
6870
+ if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);
6871
+ return $linkNode;
6872
+ };
6873
+ }
6874
+
6875
+ function detectNamespaceForChildElements(parentElement) {
6876
+ // TODO: Make this detect MathML as well...
6877
+ var node = parentElement && parentElement[0];
6878
+ if (!node) {
6879
+ return 'html';
6880
+ } else {
6881
+ return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg': 'html';
6882
+ }
6883
+ }
6884
+
6885
+ /**
6886
+ * Compile function matches each node in nodeList against the directives. Once all directives
6887
+ * for a particular node are collected their compile functions are executed. The compile
6888
+ * functions return values - the linking functions - are combined into a composite linking
6889
+ * function, which is the a linking function for the node.
6890
+ *
6891
+ * @param {NodeList} nodeList an array of nodes or NodeList to compile
6892
+ * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the
6893
+ * scope argument is auto-generated to the new child of the transcluded parent scope.
6894
+ * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then
6895
+ * the rootElement must be set the jqLite collection of the compile root. This is
6896
+ * needed so that the jqLite collection items can be replaced with widgets.
6897
+ * @param {number=} maxPriority Max directive priority.
6898
+ * @returns {Function} A composite linking function of all of the matched directives or null.
6899
+ */
6900
+ function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,
6901
+ previousCompileContext) {
6902
+ var linkFns = [],
6903
+ attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound;
6904
+
6905
+ for (var i = 0; i < nodeList.length; i++) {
6906
+ attrs = new Attributes();
6907
+
6908
+ // we must always refer to nodeList[i] since the nodes can be replaced underneath us.
6909
+ directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,
6910
+ ignoreDirective);
6911
+
6912
+ nodeLinkFn = (directives.length)
6913
+ ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,
6914
+ null, [], [], previousCompileContext)
6915
+ : null;
6916
+
6917
+ if (nodeLinkFn && nodeLinkFn.scope) {
6918
+ compile.$$addScopeClass(attrs.$$element);
6919
+ }
6920
+
6921
+ childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||
6922
+ !(childNodes = nodeList[i].childNodes) ||
6923
+ !childNodes.length)
6924
+ ? null
6925
+ : compileNodes(childNodes,
6926
+ nodeLinkFn ? (
6927
+ (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)
6928
+ && nodeLinkFn.transclude) : transcludeFn);
6929
+
6930
+ if (nodeLinkFn || childLinkFn) {
6931
+ linkFns.push(i, nodeLinkFn, childLinkFn);
6932
+ linkFnFound = true;
6933
+ nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn;
6934
+ }
6935
+
6936
+ //use the previous context only for the first element in the virtual group
6937
+ previousCompileContext = null;
6938
+ }
6939
+
6940
+ // return a linking function if we have found anything, null otherwise
6941
+ return linkFnFound ? compositeLinkFn : null;
6942
+
6943
+ function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {
6944
+ var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn;
6945
+ var stableNodeList;
6946
+
6947
+
6948
+ if (nodeLinkFnFound) {
6949
+ // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our
6950
+ // offsets don't get screwed up
6951
+ var nodeListLength = nodeList.length;
6952
+ stableNodeList = new Array(nodeListLength);
6953
+
6954
+ // create a sparse array by only copying the elements which have a linkFn
6955
+ for (i = 0; i < linkFns.length; i+=3) {
6956
+ idx = linkFns[i];
6957
+ stableNodeList[idx] = nodeList[idx];
6958
+ }
6959
+ } else {
6960
+ stableNodeList = nodeList;
6961
+ }
6962
+
6963
+ for(i = 0, ii = linkFns.length; i < ii;) {
6964
+ node = stableNodeList[linkFns[i++]];
6965
+ nodeLinkFn = linkFns[i++];
6966
+ childLinkFn = linkFns[i++];
6967
+
6968
+ if (nodeLinkFn) {
6969
+ if (nodeLinkFn.scope) {
6970
+ childScope = scope.$new();
6971
+ compile.$$addScopeInfo(jqLite(node), childScope);
6972
+ } else {
6973
+ childScope = scope;
6974
+ }
6975
+
6976
+ if ( nodeLinkFn.transcludeOnThisElement ) {
6977
+ childBoundTranscludeFn = createBoundTranscludeFn(
6978
+ scope, nodeLinkFn.transclude, parentBoundTranscludeFn,
6979
+ nodeLinkFn.elementTranscludeOnThisElement);
6980
+
6981
+ } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {
6982
+ childBoundTranscludeFn = parentBoundTranscludeFn;
6983
+
6984
+ } else if (!parentBoundTranscludeFn && transcludeFn) {
6985
+ childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);
6986
+
6987
+ } else {
6988
+ childBoundTranscludeFn = null;
6989
+ }
6990
+
6991
+ nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);
6992
+
6993
+ } else if (childLinkFn) {
6994
+ childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);
6995
+ }
6996
+ }
6997
+ }
6998
+ }
6999
+
7000
+ function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn, elementTransclusion) {
7001
+
7002
+ var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {
7003
+
7004
+ if (!transcludedScope) {
7005
+ transcludedScope = scope.$new(false, containingScope);
7006
+ transcludedScope.$$transcluded = true;
7007
+ }
7008
+
7009
+ return transcludeFn(transcludedScope, cloneFn, controllers, previousBoundTranscludeFn, futureParentElement);
7010
+ };
7011
+
7012
+ return boundTranscludeFn;
7013
+ }
7014
+
7015
+ /**
7016
+ * Looks for directives on the given node and adds them to the directive collection which is
7017
+ * sorted.
7018
+ *
7019
+ * @param node Node to search.
7020
+ * @param directives An array to which the directives are added to. This array is sorted before
7021
+ * the function returns.
7022
+ * @param attrs The shared attrs object which is used to populate the normalized attributes.
7023
+ * @param {number=} maxPriority Max directive priority.
7024
+ */
7025
+ function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {
7026
+ var nodeType = node.nodeType,
7027
+ attrsMap = attrs.$attr,
7028
+ match,
7029
+ className;
7030
+
7031
+ switch(nodeType) {
7032
+ case NODE_TYPE_ELEMENT: /* Element */
7033
+ // use the node name: <directive>
7034
+ addDirective(directives,
7035
+ directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective);
7036
+
7037
+ // iterate over the attributes
7038
+ for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,
7039
+ j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
7040
+ var attrStartName = false;
7041
+ var attrEndName = false;
7042
+
7043
+ attr = nAttrs[j];
7044
+ name = attr.name;
7045
+ value = trim(attr.value);
7046
+
7047
+ // support ngAttr attribute binding
7048
+ ngAttrName = directiveNormalize(name);
7049
+ if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
7050
+ name = snake_case(ngAttrName.substr(6), '-');
7051
+ }
7052
+
7053
+ var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
7054
+ if (directiveIsMultiElement(directiveNName)) {
7055
+ if (ngAttrName === directiveNName + 'Start') {
7056
+ attrStartName = name;
7057
+ attrEndName = name.substr(0, name.length - 5) + 'end';
7058
+ name = name.substr(0, name.length - 6);
7059
+ }
7060
+ }
7061
+
7062
+ nName = directiveNormalize(name.toLowerCase());
7063
+ attrsMap[nName] = name;
7064
+ if (isNgAttr || !attrs.hasOwnProperty(nName)) {
7065
+ attrs[nName] = value;
7066
+ if (getBooleanAttrName(node, nName)) {
7067
+ attrs[nName] = true; // presence means true
7068
+ }
7069
+ }
7070
+ addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);
7071
+ addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
7072
+ attrEndName);
7073
+ }
7074
+
7075
+ // use class as directive
7076
+ className = node.className;
7077
+ if (isString(className) && className !== '') {
7078
+ while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {
7079
+ nName = directiveNormalize(match[2]);
7080
+ if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {
7081
+ attrs[nName] = trim(match[3]);
7082
+ }
7083
+ className = className.substr(match.index + match[0].length);
7084
+ }
7085
+ }
7086
+ break;
7087
+ case NODE_TYPE_TEXT: /* Text Node */
7088
+ addTextInterpolateDirective(directives, node.nodeValue);
7089
+ break;
7090
+ case NODE_TYPE_COMMENT: /* Comment */
7091
+ try {
7092
+ match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);
7093
+ if (match) {
7094
+ nName = directiveNormalize(match[1]);
7095
+ if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {
7096
+ attrs[nName] = trim(match[2]);
7097
+ }
7098
+ }
7099
+ } catch (e) {
7100
+ // turns out that under some circumstances IE9 throws errors when one attempts to read
7101
+ // comment's node value.
7102
+ // Just ignore it and continue. (Can't seem to reproduce in test case.)
7103
+ }
7104
+ break;
7105
+ }
7106
+
7107
+ directives.sort(byPriority);
7108
+ return directives;
7109
+ }
7110
+
7111
+ /**
7112
+ * Given a node with an directive-start it collects all of the siblings until it finds
7113
+ * directive-end.
7114
+ * @param node
7115
+ * @param attrStart
7116
+ * @param attrEnd
7117
+ * @returns {*}
7118
+ */
7119
+ function groupScan(node, attrStart, attrEnd) {
7120
+ var nodes = [];
7121
+ var depth = 0;
7122
+ if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {
7123
+ var startNode = node;
7124
+ do {
7125
+ if (!node) {
7126
+ throw $compileMinErr('uterdir',
7127
+ "Unterminated attribute, found '{0}' but no matching '{1}' found.",
7128
+ attrStart, attrEnd);
7129
+ }
7130
+ if (node.nodeType == NODE_TYPE_ELEMENT) {
7131
+ if (node.hasAttribute(attrStart)) depth++;
7132
+ if (node.hasAttribute(attrEnd)) depth--;
7133
+ }
7134
+ nodes.push(node);
7135
+ node = node.nextSibling;
7136
+ } while (depth > 0);
7137
+ } else {
7138
+ nodes.push(node);
7139
+ }
7140
+
7141
+ return jqLite(nodes);
7142
+ }
7143
+
7144
+ /**
7145
+ * Wrapper for linking function which converts normal linking function into a grouped
7146
+ * linking function.
7147
+ * @param linkFn
7148
+ * @param attrStart
7149
+ * @param attrEnd
7150
+ * @returns {Function}
7151
+ */
7152
+ function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {
7153
+ return function(scope, element, attrs, controllers, transcludeFn) {
7154
+ element = groupScan(element[0], attrStart, attrEnd);
7155
+ return linkFn(scope, element, attrs, controllers, transcludeFn);
7156
+ };
7157
+ }
7158
+
7159
+ /**
7160
+ * Once the directives have been collected, their compile functions are executed. This method
7161
+ * is responsible for inlining directive templates as well as terminating the application
7162
+ * of the directives if the terminal directive has been reached.
7163
+ *
7164
+ * @param {Array} directives Array of collected directives to execute their compile function.
7165
+ * this needs to be pre-sorted by priority order.
7166
+ * @param {Node} compileNode The raw DOM node to apply the compile functions to
7167
+ * @param {Object} templateAttrs The shared attribute function
7168
+ * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the
7169
+ * scope argument is auto-generated to the new
7170
+ * child of the transcluded parent scope.
7171
+ * @param {JQLite} jqCollection If we are working on the root of the compile tree then this
7172
+ * argument has the root jqLite array so that we can replace nodes
7173
+ * on it.
7174
+ * @param {Object=} originalReplaceDirective An optional directive that will be ignored when
7175
+ * compiling the transclusion.
7176
+ * @param {Array.<Function>} preLinkFns
7177
+ * @param {Array.<Function>} postLinkFns
7178
+ * @param {Object} previousCompileContext Context used for previous compilation of the current
7179
+ * node
7180
+ * @returns {Function} linkFn
7181
+ */
7182
+ function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,
7183
+ jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,
7184
+ previousCompileContext) {
7185
+ previousCompileContext = previousCompileContext || {};
7186
+
7187
+ var terminalPriority = -Number.MAX_VALUE,
7188
+ newScopeDirective,
7189
+ controllerDirectives = previousCompileContext.controllerDirectives,
7190
+ controllers,
7191
+ newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,
7192
+ templateDirective = previousCompileContext.templateDirective,
7193
+ nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,
7194
+ hasTranscludeDirective = false,
7195
+ hasTemplate = false,
7196
+ hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,
7197
+ $compileNode = templateAttrs.$$element = jqLite(compileNode),
7198
+ directive,
7199
+ directiveName,
7200
+ $template,
7201
+ replaceDirective = originalReplaceDirective,
7202
+ childTranscludeFn = transcludeFn,
7203
+ linkFn,
7204
+ directiveValue;
7205
+
7206
+ // executes all directives on the current element
7207
+ for(var i = 0, ii = directives.length; i < ii; i++) {
7208
+ directive = directives[i];
7209
+ var attrStart = directive.$$start;
7210
+ var attrEnd = directive.$$end;
7211
+
7212
+ // collect multiblock sections
7213
+ if (attrStart) {
7214
+ $compileNode = groupScan(compileNode, attrStart, attrEnd);
7215
+ }
7216
+ $template = undefined;
7217
+
7218
+ if (terminalPriority > directive.priority) {
7219
+ break; // prevent further processing of directives
7220
+ }
7221
+
7222
+ if (directiveValue = directive.scope) {
7223
+
7224
+ // skip the check for directives with async templates, we'll check the derived sync
7225
+ // directive when the template arrives
7226
+ if (!directive.templateUrl) {
7227
+ if (isObject(directiveValue)) {
7228
+ // This directive is trying to add an isolated scope.
7229
+ // Check that there is no scope of any kind already
7230
+ assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective,
7231
+ directive, $compileNode);
7232
+ newIsolateScopeDirective = directive;
7233
+ } else {
7234
+ // This directive is trying to add a child scope.
7235
+ // Check that there is no isolated scope already
7236
+ assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,
7237
+ $compileNode);
7238
+ }
7239
+ }
7240
+
7241
+ newScopeDirective = newScopeDirective || directive;
7242
+ }
7243
+
7244
+ directiveName = directive.name;
7245
+
7246
+ if (!directive.templateUrl && directive.controller) {
7247
+ directiveValue = directive.controller;
7248
+ controllerDirectives = controllerDirectives || {};
7249
+ assertNoDuplicate("'" + directiveName + "' controller",
7250
+ controllerDirectives[directiveName], directive, $compileNode);
7251
+ controllerDirectives[directiveName] = directive;
7252
+ }
7253
+
7254
+ if (directiveValue = directive.transclude) {
7255
+ hasTranscludeDirective = true;
7256
+
7257
+ // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.
7258
+ // This option should only be used by directives that know how to safely handle element transclusion,
7259
+ // where the transcluded nodes are added or replaced after linking.
7260
+ if (!directive.$$tlb) {
7261
+ assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);
7262
+ nonTlbTranscludeDirective = directive;
7263
+ }
7264
+
7265
+ if (directiveValue == 'element') {
7266
+ hasElementTranscludeDirective = true;
7267
+ terminalPriority = directive.priority;
7268
+ $template = $compileNode;
7269
+ $compileNode = templateAttrs.$$element =
7270
+ jqLite(document.createComment(' ' + directiveName + ': ' +
7271
+ templateAttrs[directiveName] + ' '));
7272
+ compileNode = $compileNode[0];
7273
+ replaceWith(jqCollection, sliceArgs($template), compileNode);
7274
+
7275
+ childTranscludeFn = compile($template, transcludeFn, terminalPriority,
7276
+ replaceDirective && replaceDirective.name, {
7277
+ // Don't pass in:
7278
+ // - controllerDirectives - otherwise we'll create duplicates controllers
7279
+ // - newIsolateScopeDirective or templateDirective - combining templates with
7280
+ // element transclusion doesn't make sense.
7281
+ //
7282
+ // We need only nonTlbTranscludeDirective so that we prevent putting transclusion
7283
+ // on the same element more than once.
7284
+ nonTlbTranscludeDirective: nonTlbTranscludeDirective
7285
+ });
7286
+ } else {
7287
+ $template = jqLite(jqLiteClone(compileNode)).contents();
7288
+ $compileNode.empty(); // clear contents
7289
+ childTranscludeFn = compile($template, transcludeFn);
7290
+ }
7291
+ }
7292
+
7293
+ if (directive.template) {
7294
+ hasTemplate = true;
7295
+ assertNoDuplicate('template', templateDirective, directive, $compileNode);
7296
+ templateDirective = directive;
7297
+
7298
+ directiveValue = (isFunction(directive.template))
7299
+ ? directive.template($compileNode, templateAttrs)
7300
+ : directive.template;
7301
+
7302
+ directiveValue = denormalizeTemplate(directiveValue);
7303
+
7304
+ if (directive.replace) {
7305
+ replaceDirective = directive;
7306
+ if (jqLiteIsTextNode(directiveValue)) {
7307
+ $template = [];
7308
+ } else {
7309
+ $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue)));
7310
+ }
7311
+ compileNode = $template[0];
7312
+
7313
+ if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {
7314
+ throw $compileMinErr('tplrt',
7315
+ "Template for directive '{0}' must have exactly one root element. {1}",
7316
+ directiveName, '');
7317
+ }
7318
+
7319
+ replaceWith(jqCollection, $compileNode, compileNode);
7320
+
7321
+ var newTemplateAttrs = {$attr: {}};
7322
+
7323
+ // combine directives from the original node and from the template:
7324
+ // - take the array of directives for this element
7325
+ // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)
7326
+ // - collect directives from the template and sort them by priority
7327
+ // - combine directives as: processed + template + unprocessed
7328
+ var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);
7329
+ var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));
7330
+
7331
+ if (newIsolateScopeDirective) {
7332
+ markDirectivesAsIsolate(templateDirectives);
7333
+ }
7334
+ directives = directives.concat(templateDirectives).concat(unprocessedDirectives);
7335
+ mergeTemplateAttributes(templateAttrs, newTemplateAttrs);
7336
+
7337
+ ii = directives.length;
7338
+ } else {
7339
+ $compileNode.html(directiveValue);
7340
+ }
7341
+ }
7342
+
7343
+ if (directive.templateUrl) {
7344
+ hasTemplate = true;
7345
+ assertNoDuplicate('template', templateDirective, directive, $compileNode);
7346
+ templateDirective = directive;
7347
+
7348
+ if (directive.replace) {
7349
+ replaceDirective = directive;
7350
+ }
7351
+
7352
+ nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,
7353
+ templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {
7354
+ controllerDirectives: controllerDirectives,
7355
+ newIsolateScopeDirective: newIsolateScopeDirective,
7356
+ templateDirective: templateDirective,
7357
+ nonTlbTranscludeDirective: nonTlbTranscludeDirective
7358
+ });
7359
+ ii = directives.length;
7360
+ } else if (directive.compile) {
7361
+ try {
7362
+ linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);
7363
+ if (isFunction(linkFn)) {
7364
+ addLinkFns(null, linkFn, attrStart, attrEnd);
7365
+ } else if (linkFn) {
7366
+ addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);
7367
+ }
7368
+ } catch (e) {
7369
+ $exceptionHandler(e, startingTag($compileNode));
7370
+ }
7371
+ }
7372
+
7373
+ if (directive.terminal) {
7374
+ nodeLinkFn.terminal = true;
7375
+ terminalPriority = Math.max(terminalPriority, directive.priority);
7376
+ }
7377
+
7378
+ }
7379
+
7380
+ nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;
7381
+ nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;
7382
+ nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective;
7383
+ nodeLinkFn.templateOnThisElement = hasTemplate;
7384
+ nodeLinkFn.transclude = childTranscludeFn;
7385
+
7386
+ previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;
7387
+
7388
+ // might be normal or delayed nodeLinkFn depending on if templateUrl is present
7389
+ return nodeLinkFn;
7390
+
7391
+ ////////////////////
7392
+
7393
+ function addLinkFns(pre, post, attrStart, attrEnd) {
7394
+ if (pre) {
7395
+ if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);
7396
+ pre.require = directive.require;
7397
+ pre.directiveName = directiveName;
7398
+ if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
7399
+ pre = cloneAndAnnotateFn(pre, {isolateScope: true});
7400
+ }
7401
+ preLinkFns.push(pre);
7402
+ }
7403
+ if (post) {
7404
+ if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);
7405
+ post.require = directive.require;
7406
+ post.directiveName = directiveName;
7407
+ if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
7408
+ post = cloneAndAnnotateFn(post, {isolateScope: true});
7409
+ }
7410
+ postLinkFns.push(post);
7411
+ }
7412
+ }
7413
+
7414
+
7415
+ function getControllers(directiveName, require, $element, elementControllers) {
7416
+ var value, retrievalMethod = 'data', optional = false;
7417
+ var $searchElement = $element;
7418
+ var match;
7419
+ if (isString(require)) {
7420
+ match = require.match(REQUIRE_PREFIX_REGEXP);
7421
+ require = require.substring(match[0].length);
7422
+
7423
+ if (match[3]) {
7424
+ if (match[1]) match[3] = null;
7425
+ else match[1] = match[3];
7426
+ }
7427
+ if (match[1] === '^') {
7428
+ retrievalMethod = 'inheritedData';
7429
+ } else if (match[1] === '^^') {
7430
+ retrievalMethod = 'inheritedData';
7431
+ $searchElement = $element.parent();
7432
+ }
7433
+ if (match[2] === '?') {
7434
+ optional = true;
7435
+ }
7436
+
7437
+ value = null;
7438
+
7439
+ if (elementControllers && retrievalMethod === 'data') {
7440
+ if (value = elementControllers[require]) {
7441
+ value = value.instance;
7442
+ }
7443
+ }
7444
+ value = value || $searchElement[retrievalMethod]('$' + require + 'Controller');
7445
+
7446
+ if (!value && !optional) {
7447
+ throw $compileMinErr('ctreq',
7448
+ "Controller '{0}', required by directive '{1}', can't be found!",
7449
+ require, directiveName);
7450
+ }
7451
+ return value;
7452
+ } else if (isArray(require)) {
7453
+ value = [];
7454
+ forEach(require, function(require) {
7455
+ value.push(getControllers(directiveName, require, $element, elementControllers));
7456
+ });
7457
+ }
7458
+ return value;
7459
+ }
7460
+
7461
+
7462
+ function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {
7463
+ var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element,
7464
+ attrs;
7465
+
7466
+ if (compileNode === linkNode) {
7467
+ attrs = templateAttrs;
7468
+ $element = templateAttrs.$$element;
7469
+ } else {
7470
+ $element = jqLite(linkNode);
7471
+ attrs = new Attributes($element, templateAttrs);
7472
+ }
7473
+
7474
+ if (newIsolateScopeDirective) {
7475
+ isolateScope = scope.$new(true);
7476
+ }
7477
+
7478
+ transcludeFn = boundTranscludeFn && controllersBoundTransclude;
7479
+ if (controllerDirectives) {
7480
+ // TODO: merge `controllers` and `elementControllers` into single object.
7481
+ controllers = {};
7482
+ elementControllers = {};
7483
+ forEach(controllerDirectives, function(directive) {
7484
+ var locals = {
7485
+ $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,
7486
+ $element: $element,
7487
+ $attrs: attrs,
7488
+ $transclude: transcludeFn
7489
+ }, controllerInstance;
7490
+
7491
+ controller = directive.controller;
7492
+ if (controller == '@') {
7493
+ controller = attrs[directive.name];
7494
+ }
7495
+
7496
+ controllerInstance = $controller(controller, locals, true, directive.controllerAs);
7497
+
7498
+ // For directives with element transclusion the element is a comment,
7499
+ // but jQuery .data doesn't support attaching data to comment nodes as it's hard to
7500
+ // clean up (http://bugs.jquery.com/ticket/8335).
7501
+ // Instead, we save the controllers for the element in a local hash and attach to .data
7502
+ // later, once we have the actual element.
7503
+ elementControllers[directive.name] = controllerInstance;
7504
+ if (!hasElementTranscludeDirective) {
7505
+ $element.data('$' + directive.name + 'Controller', controllerInstance.instance);
7506
+ }
7507
+
7508
+ controllers[directive.name] = controllerInstance;
7509
+ });
7510
+ }
7511
+
7512
+ if (newIsolateScopeDirective) {
7513
+ var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/;
7514
+
7515
+ compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective ||
7516
+ templateDirective === newIsolateScopeDirective.$$originalDirective)));
7517
+ compile.$$addScopeClass($element, true);
7518
+
7519
+ var isolateScopeController = controllers && controllers[newIsolateScopeDirective.name];
7520
+ var isolateBindingContext = isolateScope;
7521
+ if (isolateScopeController && isolateScopeController.identifier &&
7522
+ newIsolateScopeDirective.bindToController === true) {
7523
+ isolateBindingContext = isolateScopeController.instance;
7524
+ }
7525
+
7526
+ forEach(isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings, function(definition, scopeName) {
7527
+ var attrName = definition.attrName,
7528
+ optional = definition.optional,
7529
+ mode = definition.mode, // @, =, or &
7530
+ lastValue,
7531
+ parentGet, parentSet, compare;
7532
+
7533
+ switch (mode) {
7534
+
7535
+ case '@':
7536
+ attrs.$observe(attrName, function(value) {
7537
+ isolateBindingContext[scopeName] = value;
7538
+ });
7539
+ attrs.$$observers[attrName].$$scope = scope;
7540
+ if( attrs[attrName] ) {
7541
+ // If the attribute has been provided then we trigger an interpolation to ensure
7542
+ // the value is there for use in the link fn
7543
+ isolateBindingContext[scopeName] = $interpolate(attrs[attrName])(scope);
7544
+ }
7545
+ break;
7546
+
7547
+ case '=':
7548
+ if (optional && !attrs[attrName]) {
7549
+ return;
7550
+ }
7551
+ parentGet = $parse(attrs[attrName]);
7552
+ if (parentGet.literal) {
7553
+ compare = equals;
7554
+ } else {
7555
+ compare = function(a,b) { return a === b || (a !== a && b !== b); };
7556
+ }
7557
+ parentSet = parentGet.assign || function() {
7558
+ // reset the change, or we will throw this exception on every $digest
7559
+ lastValue = isolateBindingContext[scopeName] = parentGet(scope);
7560
+ throw $compileMinErr('nonassign',
7561
+ "Expression '{0}' used with directive '{1}' is non-assignable!",
7562
+ attrs[attrName], newIsolateScopeDirective.name);
7563
+ };
7564
+ lastValue = isolateBindingContext[scopeName] = parentGet(scope);
7565
+ var parentValueWatch = function parentValueWatch(parentValue) {
7566
+ if (!compare(parentValue, isolateBindingContext[scopeName])) {
7567
+ // we are out of sync and need to copy
7568
+ if (!compare(parentValue, lastValue)) {
7569
+ // parent changed and it has precedence
7570
+ isolateBindingContext[scopeName] = parentValue;
7571
+ } else {
7572
+ // if the parent can be assigned then do so
7573
+ parentSet(scope, parentValue = isolateBindingContext[scopeName]);
7574
+ }
7575
+ }
7576
+ return lastValue = parentValue;
7577
+ };
7578
+ parentValueWatch.$stateful = true;
7579
+ var unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal);
7580
+ isolateScope.$on('$destroy', unwatch);
7581
+ break;
7582
+
7583
+ case '&':
7584
+ parentGet = $parse(attrs[attrName]);
7585
+ isolateBindingContext[scopeName] = function(locals) {
7586
+ return parentGet(scope, locals);
7587
+ };
7588
+ break;
7589
+ }
7590
+ });
7591
+ }
7592
+ if (controllers) {
7593
+ forEach(controllers, function(controller) {
7594
+ controller();
7595
+ });
7596
+ controllers = null;
7597
+ }
7598
+
7599
+ // PRELINKING
7600
+ for(i = 0, ii = preLinkFns.length; i < ii; i++) {
7601
+ linkFn = preLinkFns[i];
7602
+ invokeLinkFn(linkFn,
7603
+ linkFn.isolateScope ? isolateScope : scope,
7604
+ $element,
7605
+ attrs,
7606
+ linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),
7607
+ transcludeFn
7608
+ );
7609
+ }
7610
+
7611
+ // RECURSION
7612
+ // We only pass the isolate scope, if the isolate directive has a template,
7613
+ // otherwise the child elements do not belong to the isolate directive.
7614
+ var scopeToChild = scope;
7615
+ if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {
7616
+ scopeToChild = isolateScope;
7617
+ }
7618
+ childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);
7619
+
7620
+ // POSTLINKING
7621
+ for(i = postLinkFns.length - 1; i >= 0; i--) {
7622
+ linkFn = postLinkFns[i];
7623
+ invokeLinkFn(linkFn,
7624
+ linkFn.isolateScope ? isolateScope : scope,
7625
+ $element,
7626
+ attrs,
7627
+ linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),
7628
+ transcludeFn
7629
+ );
7630
+ }
7631
+
7632
+ // This is the function that is injected as `$transclude`.
7633
+ // Note: all arguments are optional!
7634
+ function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) {
7635
+ var transcludeControllers;
7636
+
7637
+ // No scope passed in:
7638
+ if (!isScope(scope)) {
7639
+ futureParentElement = cloneAttachFn;
7640
+ cloneAttachFn = scope;
7641
+ scope = undefined;
7642
+ }
7643
+
7644
+ if (hasElementTranscludeDirective) {
7645
+ transcludeControllers = elementControllers;
7646
+ }
7647
+ if (!futureParentElement) {
7648
+ futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element;
7649
+ }
7650
+ return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);
7651
+ }
7652
+ }
7653
+ }
7654
+
7655
+ function markDirectivesAsIsolate(directives) {
7656
+ // mark all directives as needing isolate scope.
7657
+ for (var j = 0, jj = directives.length; j < jj; j++) {
7658
+ directives[j] = inherit(directives[j], {$$isolateScope: true});
7659
+ }
7660
+ }
7661
+
7662
+ /**
7663
+ * looks up the directive and decorates it with exception handling and proper parameters. We
7664
+ * call this the boundDirective.
7665
+ *
7666
+ * @param {string} name name of the directive to look up.
7667
+ * @param {string} location The directive must be found in specific format.
7668
+ * String containing any of theses characters:
7669
+ *
7670
+ * * `E`: element name
7671
+ * * `A': attribute
7672
+ * * `C`: class
7673
+ * * `M`: comment
7674
+ * @returns {boolean} true if directive was added.
7675
+ */
7676
+ function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,
7677
+ endAttrName) {
7678
+ if (name === ignoreDirective) return null;
7679
+ var match = null;
7680
+ if (hasDirectives.hasOwnProperty(name)) {
7681
+ for(var directive, directives = $injector.get(name + Suffix),
7682
+ i = 0, ii = directives.length; i<ii; i++) {
7683
+ try {
7684
+ directive = directives[i];
7685
+ if ( (maxPriority === undefined || maxPriority > directive.priority) &&
7686
+ directive.restrict.indexOf(location) != -1) {
7687
+ if (startAttrName) {
7688
+ directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});
7689
+ }
7690
+ tDirectives.push(directive);
7691
+ match = directive;
7692
+ }
7693
+ } catch(e) { $exceptionHandler(e); }
7694
+ }
7695
+ }
7696
+ return match;
7697
+ }
7698
+
7699
+
7700
+ /**
7701
+ * looks up the directive and returns true if it is a multi-element directive,
7702
+ * and therefore requires DOM nodes between -start and -end markers to be grouped
7703
+ * together.
7704
+ *
7705
+ * @param {string} name name of the directive to look up.
7706
+ * @returns true if directive was registered as multi-element.
7707
+ */
7708
+ function directiveIsMultiElement(name) {
7709
+ if (hasDirectives.hasOwnProperty(name)) {
7710
+ for(var directive, directives = $injector.get(name + Suffix),
7711
+ i = 0, ii = directives.length; i<ii; i++) {
7712
+ directive = directives[i];
7713
+ if (directive.multiElement) {
7714
+ return true;
7715
+ }
7716
+ }
7717
+ }
7718
+ return false;
7719
+ }
7720
+
7721
+ /**
7722
+ * When the element is replaced with HTML template then the new attributes
7723
+ * on the template need to be merged with the existing attributes in the DOM.
7724
+ * The desired effect is to have both of the attributes present.
7725
+ *
7726
+ * @param {object} dst destination attributes (original DOM)
7727
+ * @param {object} src source attributes (from the directive template)
7728
+ */
7729
+ function mergeTemplateAttributes(dst, src) {
7730
+ var srcAttr = src.$attr,
7731
+ dstAttr = dst.$attr,
7732
+ $element = dst.$$element;
7733
+
7734
+ // reapply the old attributes to the new element
7735
+ forEach(dst, function(value, key) {
7736
+ if (key.charAt(0) != '$') {
7737
+ if (src[key] && src[key] !== value) {
7738
+ value += (key === 'style' ? ';' : ' ') + src[key];
7739
+ }
7740
+ dst.$set(key, value, true, srcAttr[key]);
7741
+ }
7742
+ });
7743
+
7744
+ // copy the new attributes on the old attrs object
7745
+ forEach(src, function(value, key) {
7746
+ if (key == 'class') {
7747
+ safeAddClass($element, value);
7748
+ dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;
7749
+ } else if (key == 'style') {
7750
+ $element.attr('style', $element.attr('style') + ';' + value);
7751
+ dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;
7752
+ // `dst` will never contain hasOwnProperty as DOM parser won't let it.
7753
+ // You will get an "InvalidCharacterError: DOM Exception 5" error if you
7754
+ // have an attribute like "has-own-property" or "data-has-own-property", etc.
7755
+ } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {
7756
+ dst[key] = value;
7757
+ dstAttr[key] = srcAttr[key];
7758
+ }
7759
+ });
7760
+ }
7761
+
7762
+
7763
+ function compileTemplateUrl(directives, $compileNode, tAttrs,
7764
+ $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {
7765
+ var linkQueue = [],
7766
+ afterTemplateNodeLinkFn,
7767
+ afterTemplateChildLinkFn,
7768
+ beforeTemplateCompileNode = $compileNode[0],
7769
+ origAsyncDirective = directives.shift(),
7770
+ // The fact that we have to copy and patch the directive seems wrong!
7771
+ derivedSyncDirective = extend({}, origAsyncDirective, {
7772
+ templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective
7773
+ }),
7774
+ templateUrl = (isFunction(origAsyncDirective.templateUrl))
7775
+ ? origAsyncDirective.templateUrl($compileNode, tAttrs)
7776
+ : origAsyncDirective.templateUrl,
7777
+ templateNamespace = origAsyncDirective.templateNamespace;
7778
+
7779
+ $compileNode.empty();
7780
+
7781
+ $templateRequest($sce.getTrustedResourceUrl(templateUrl))
7782
+ .then(function(content) {
7783
+ var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;
7784
+
7785
+ content = denormalizeTemplate(content);
7786
+
7787
+ if (origAsyncDirective.replace) {
7788
+ if (jqLiteIsTextNode(content)) {
7789
+ $template = [];
7790
+ } else {
7791
+ $template = removeComments(wrapTemplate(templateNamespace, trim(content)));
7792
+ }
7793
+ compileNode = $template[0];
7794
+
7795
+ if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {
7796
+ throw $compileMinErr('tplrt',
7797
+ "Template for directive '{0}' must have exactly one root element. {1}",
7798
+ origAsyncDirective.name, templateUrl);
7799
+ }
7800
+
7801
+ tempTemplateAttrs = {$attr: {}};
7802
+ replaceWith($rootElement, $compileNode, compileNode);
7803
+ var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);
7804
+
7805
+ if (isObject(origAsyncDirective.scope)) {
7806
+ markDirectivesAsIsolate(templateDirectives);
7807
+ }
7808
+ directives = templateDirectives.concat(directives);
7809
+ mergeTemplateAttributes(tAttrs, tempTemplateAttrs);
7810
+ } else {
7811
+ compileNode = beforeTemplateCompileNode;
7812
+ $compileNode.html(content);
7813
+ }
7814
+
7815
+ directives.unshift(derivedSyncDirective);
7816
+
7817
+ afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,
7818
+ childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,
7819
+ previousCompileContext);
7820
+ forEach($rootElement, function(node, i) {
7821
+ if (node == compileNode) {
7822
+ $rootElement[i] = $compileNode[0];
7823
+ }
7824
+ });
7825
+ afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);
7826
+
7827
+ while(linkQueue.length) {
7828
+ var scope = linkQueue.shift(),
7829
+ beforeTemplateLinkNode = linkQueue.shift(),
7830
+ linkRootElement = linkQueue.shift(),
7831
+ boundTranscludeFn = linkQueue.shift(),
7832
+ linkNode = $compileNode[0];
7833
+
7834
+ if (scope.$$destroyed) continue;
7835
+
7836
+ if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {
7837
+ var oldClasses = beforeTemplateLinkNode.className;
7838
+
7839
+ if (!(previousCompileContext.hasElementTranscludeDirective &&
7840
+ origAsyncDirective.replace)) {
7841
+ // it was cloned therefore we have to clone as well.
7842
+ linkNode = jqLiteClone(compileNode);
7843
+ }
7844
+ replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);
7845
+
7846
+ // Copy in CSS classes from original node
7847
+ safeAddClass(jqLite(linkNode), oldClasses);
7848
+ }
7849
+ if (afterTemplateNodeLinkFn.transcludeOnThisElement) {
7850
+ childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);
7851
+ } else {
7852
+ childBoundTranscludeFn = boundTranscludeFn;
7853
+ }
7854
+ afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,
7855
+ childBoundTranscludeFn);
7856
+ }
7857
+ linkQueue = null;
7858
+ });
7859
+
7860
+ return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {
7861
+ var childBoundTranscludeFn = boundTranscludeFn;
7862
+ if (scope.$$destroyed) return;
7863
+ if (linkQueue) {
7864
+ linkQueue.push(scope);
7865
+ linkQueue.push(node);
7866
+ linkQueue.push(rootElement);
7867
+ linkQueue.push(childBoundTranscludeFn);
7868
+ } else {
7869
+ if (afterTemplateNodeLinkFn.transcludeOnThisElement) {
7870
+ childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);
7871
+ }
7872
+ afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);
7873
+ }
7874
+ };
7875
+ }
7876
+
7877
+
7878
+ /**
7879
+ * Sorting function for bound directives.
7880
+ */
7881
+ function byPriority(a, b) {
7882
+ var diff = b.priority - a.priority;
7883
+ if (diff !== 0) return diff;
7884
+ if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;
7885
+ return a.index - b.index;
7886
+ }
7887
+
7888
+
7889
+ function assertNoDuplicate(what, previousDirective, directive, element) {
7890
+ if (previousDirective) {
7891
+ throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',
7892
+ previousDirective.name, directive.name, what, startingTag(element));
7893
+ }
7894
+ }
7895
+
7896
+
7897
+ function addTextInterpolateDirective(directives, text) {
7898
+ var interpolateFn = $interpolate(text, true);
7899
+ if (interpolateFn) {
7900
+ directives.push({
7901
+ priority: 0,
7902
+ compile: function textInterpolateCompileFn(templateNode) {
7903
+ var templateNodeParent = templateNode.parent(),
7904
+ hasCompileParent = !!templateNodeParent.length;
7905
+
7906
+ // When transcluding a template that has bindings in the root
7907
+ // we don't have a parent and thus need to add the class during linking fn.
7908
+ if (hasCompileParent) compile.$$addBindingClass(templateNodeParent);
7909
+
7910
+ return function textInterpolateLinkFn(scope, node) {
7911
+ var parent = node.parent();
7912
+ if (!hasCompileParent) compile.$$addBindingClass(parent);
7913
+ compile.$$addBindingInfo(parent, interpolateFn.expressions);
7914
+ scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {
7915
+ node[0].nodeValue = value;
7916
+ });
7917
+ };
7918
+ }
7919
+ });
7920
+ }
7921
+ }
7922
+
7923
+
7924
+ function wrapTemplate(type, template) {
7925
+ type = lowercase(type || 'html');
7926
+ switch(type) {
7927
+ case 'svg':
7928
+ case 'math':
7929
+ var wrapper = document.createElement('div');
7930
+ wrapper.innerHTML = '<'+type+'>'+template+'</'+type+'>';
7931
+ return wrapper.childNodes[0].childNodes;
7932
+ default:
7933
+ return template;
7934
+ }
7935
+ }
7936
+
7937
+
7938
+ function getTrustedContext(node, attrNormalizedName) {
7939
+ if (attrNormalizedName == "srcdoc") {
7940
+ return $sce.HTML;
7941
+ }
7942
+ var tag = nodeName_(node);
7943
+ // maction[xlink:href] can source SVG. It's not limited to <maction>.
7944
+ if (attrNormalizedName == "xlinkHref" ||
7945
+ (tag == "form" && attrNormalizedName == "action") ||
7946
+ (tag != "img" && (attrNormalizedName == "src" ||
7947
+ attrNormalizedName == "ngSrc"))) {
7948
+ return $sce.RESOURCE_URL;
7949
+ }
7950
+ }
7951
+
7952
+
7953
+ function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) {
7954
+ var interpolateFn = $interpolate(value, true);
7955
+
7956
+ // no interpolation found -> ignore
7957
+ if (!interpolateFn) return;
7958
+
7959
+
7960
+ if (name === "multiple" && nodeName_(node) === "select") {
7961
+ throw $compileMinErr("selmulti",
7962
+ "Binding to the 'multiple' attribute is not supported. Element: {0}",
7963
+ startingTag(node));
7964
+ }
7965
+
7966
+ directives.push({
7967
+ priority: 100,
7968
+ compile: function() {
7969
+ return {
7970
+ pre: function attrInterpolatePreLinkFn(scope, element, attr) {
7971
+ var $$observers = (attr.$$observers || (attr.$$observers = {}));
7972
+
7973
+ if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {
7974
+ throw $compileMinErr('nodomevents',
7975
+ "Interpolations for HTML DOM event attributes are disallowed. Please use the " +
7976
+ "ng- versions (such as ng-click instead of onclick) instead.");
7977
+ }
7978
+
7979
+ // If the attribute was removed, then we are done
7980
+ if (!attr[name]) {
7981
+ return;
7982
+ }
7983
+
7984
+ // we need to interpolate again, in case the attribute value has been updated
7985
+ // (e.g. by another directive's compile function)
7986
+ interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name),
7987
+ ALL_OR_NOTHING_ATTRS[name] || allOrNothing);
7988
+
7989
+ // if attribute was updated so that there is no interpolation going on we don't want to
7990
+ // register any observers
7991
+ if (!interpolateFn) return;
7992
+
7993
+ // initialize attr object so that it's ready in case we need the value for isolate
7994
+ // scope initialization, otherwise the value would not be available from isolate
7995
+ // directive's linking fn during linking phase
7996
+ attr[name] = interpolateFn(scope);
7997
+
7998
+ ($$observers[name] || ($$observers[name] = [])).$$inter = true;
7999
+ (attr.$$observers && attr.$$observers[name].$$scope || scope).
8000
+ $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {
8001
+ //special case for class attribute addition + removal
8002
+ //so that class changes can tap into the animation
8003
+ //hooks provided by the $animate service. Be sure to
8004
+ //skip animations when the first digest occurs (when
8005
+ //both the new and the old values are the same) since
8006
+ //the CSS classes are the non-interpolated values
8007
+ if(name === 'class' && newValue != oldValue) {
8008
+ attr.$updateClass(newValue, oldValue);
8009
+ } else {
8010
+ attr.$set(name, newValue);
8011
+ }
8012
+ });
8013
+ }
8014
+ };
8015
+ }
8016
+ });
8017
+ }
8018
+
8019
+
8020
+ /**
8021
+ * This is a special jqLite.replaceWith, which can replace items which
8022
+ * have no parents, provided that the containing jqLite collection is provided.
8023
+ *
8024
+ * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes
8025
+ * in the root of the tree.
8026
+ * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep
8027
+ * the shell, but replace its DOM node reference.
8028
+ * @param {Node} newNode The new DOM node.
8029
+ */
8030
+ function replaceWith($rootElement, elementsToRemove, newNode) {
8031
+ var firstElementToRemove = elementsToRemove[0],
8032
+ removeCount = elementsToRemove.length,
8033
+ parent = firstElementToRemove.parentNode,
8034
+ i, ii;
8035
+
8036
+ if ($rootElement) {
8037
+ for(i = 0, ii = $rootElement.length; i < ii; i++) {
8038
+ if ($rootElement[i] == firstElementToRemove) {
8039
+ $rootElement[i++] = newNode;
8040
+ for (var j = i, j2 = j + removeCount - 1,
8041
+ jj = $rootElement.length;
8042
+ j < jj; j++, j2++) {
8043
+ if (j2 < jj) {
8044
+ $rootElement[j] = $rootElement[j2];
8045
+ } else {
8046
+ delete $rootElement[j];
8047
+ }
8048
+ }
8049
+ $rootElement.length -= removeCount - 1;
8050
+
8051
+ // If the replaced element is also the jQuery .context then replace it
8052
+ // .context is a deprecated jQuery api, so we should set it only when jQuery set it
8053
+ // http://api.jquery.com/context/
8054
+ if ($rootElement.context === firstElementToRemove) {
8055
+ $rootElement.context = newNode;
8056
+ }
8057
+ break;
8058
+ }
8059
+ }
8060
+ }
8061
+
8062
+ if (parent) {
8063
+ parent.replaceChild(newNode, firstElementToRemove);
8064
+ }
8065
+
8066
+ // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it?
8067
+ var fragment = document.createDocumentFragment();
8068
+ fragment.appendChild(firstElementToRemove);
8069
+
8070
+ // Copy over user data (that includes Angular's $scope etc.). Don't copy private
8071
+ // data here because there's no public interface in jQuery to do that and copying over
8072
+ // event listeners (which is the main use of private data) wouldn't work anyway.
8073
+ jqLite(newNode).data(jqLite(firstElementToRemove).data());
8074
+
8075
+ // Remove data of the replaced element. We cannot just call .remove()
8076
+ // on the element it since that would deallocate scope that is needed
8077
+ // for the new node. Instead, remove the data "manually".
8078
+ if (!jQuery) {
8079
+ delete jqLite.cache[firstElementToRemove[jqLite.expando]];
8080
+ } else {
8081
+ // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after
8082
+ // the replaced element. The cleanData version monkey-patched by Angular would cause
8083
+ // the scope to be trashed and we do need the very same scope to work with the new
8084
+ // element. However, we cannot just cache the non-patched version and use it here as
8085
+ // that would break if another library patches the method after Angular does (one
8086
+ // example is jQuery UI). Instead, set a flag indicating scope destroying should be
8087
+ // skipped this one time.
8088
+ skipDestroyOnNextJQueryCleanData = true;
8089
+ jQuery.cleanData([firstElementToRemove]);
8090
+ }
8091
+
8092
+ for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {
8093
+ var element = elementsToRemove[k];
8094
+ jqLite(element).remove(); // must do this way to clean up expando
8095
+ fragment.appendChild(element);
8096
+ delete elementsToRemove[k];
8097
+ }
8098
+
8099
+ elementsToRemove[0] = newNode;
8100
+ elementsToRemove.length = 1;
8101
+ }
8102
+
8103
+
8104
+ function cloneAndAnnotateFn(fn, annotation) {
8105
+ return extend(function() { return fn.apply(null, arguments); }, fn, annotation);
8106
+ }
8107
+
8108
+
8109
+ function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) {
8110
+ try {
8111
+ linkFn(scope, $element, attrs, controllers, transcludeFn);
8112
+ } catch(e) {
8113
+ $exceptionHandler(e, startingTag($element));
8114
+ }
8115
+ }
8116
+ }];
8117
+}
8118
+
8119
+var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i;
8120
+/**
8121
+ * Converts all accepted directives format into proper directive name.
8122
+ * All of these will become 'myDirective':
8123
+ * my:Directive
8124
+ * my-directive
8125
+ * x-my-directive
8126
+ * data-my:directive
8127
+ *
8128
+ * Also there is special case for Moz prefix starting with upper case letter.
8129
+ * @param name Name to normalize
8130
+ */
8131
+function directiveNormalize(name) {
8132
+ return camelCase(name.replace(PREFIX_REGEXP, ''));
8133
+}
8134
+
8135
+/**
8136
+ * @ngdoc type
8137
+ * @name $compile.directive.Attributes
8138
+ *
8139
+ * @description
8140
+ * A shared object between directive compile / linking functions which contains normalized DOM
8141
+ * element attributes. The values reflect current binding state `{{ }}`. The normalization is
8142
+ * needed since all of these are treated as equivalent in Angular:
8143
+ *
8144
+ * ```
8145
+ * <span ng:bind="a" ng-bind="a" data-ng-bind="a" x-ng-bind="a">
8146
+ * ```
8147
+ */
8148
+
8149
+/**
8150
+ * @ngdoc property
8151
+ * @name $compile.directive.Attributes#$attr
8152
+ *
8153
+ * @description
8154
+ * A map of DOM element attribute names to the normalized name. This is
8155
+ * needed to do reverse lookup from normalized name back to actual name.
8156
+ */
8157
+
8158
+
8159
+/**
8160
+ * @ngdoc method
8161
+ * @name $compile.directive.Attributes#$set
8162
+ * @kind function
8163
+ *
8164
+ * @description
8165
+ * Set DOM element attribute value.
8166
+ *
8167
+ *
8168
+ * @param {string} name Normalized element attribute name of the property to modify. The name is
8169
+ * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}
8170
+ * property to the original name.
8171
+ * @param {string} value Value to set the attribute to. The value can be an interpolated string.
8172
+ */
8173
+
8174
+
8175
+
8176
+/**
8177
+ * Closure compiler type information
8178
+ */
8179
+
8180
+function nodesetLinkingFn(
8181
+ /* angular.Scope */ scope,
8182
+ /* NodeList */ nodeList,
8183
+ /* Element */ rootElement,
8184
+ /* function(Function) */ boundTranscludeFn
8185
+){}
8186
+
8187
+function directiveLinkingFn(
8188
+ /* nodesetLinkingFn */ nodesetLinkingFn,
8189
+ /* angular.Scope */ scope,
8190
+ /* Node */ node,
8191
+ /* Element */ rootElement,
8192
+ /* function(Function) */ boundTranscludeFn
8193
+){}
8194
+
8195
+function tokenDifference(str1, str2) {
8196
+ var values = '',
8197
+ tokens1 = str1.split(/\s+/),
8198
+ tokens2 = str2.split(/\s+/);
8199
+
8200
+ outer:
8201
+ for(var i = 0; i < tokens1.length; i++) {
8202
+ var token = tokens1[i];
8203
+ for(var j = 0; j < tokens2.length; j++) {
8204
+ if(token == tokens2[j]) continue outer;
8205
+ }
8206
+ values += (values.length > 0 ? ' ' : '') + token;
8207
+ }
8208
+ return values;
8209
+}
8210
+
8211
+function removeComments(jqNodes) {
8212
+ jqNodes = jqLite(jqNodes);
8213
+ var i = jqNodes.length;
8214
+
8215
+ if (i <= 1) {
8216
+ return jqNodes;
8217
+ }
8218
+
8219
+ while (i--) {
8220
+ var node = jqNodes[i];
8221
+ if (node.nodeType === NODE_TYPE_COMMENT) {
8222
+ splice.call(jqNodes, i, 1);
8223
+ }
8224
+ }
8225
+ return jqNodes;
8226
+}
8227
+
8228
+/**
8229
+ * @ngdoc provider
8230
+ * @name $controllerProvider
8231
+ * @description
8232
+ * The {@link ng.$controller $controller service} is used by Angular to create new
8233
+ * controllers.
8234
+ *
8235
+ * This provider allows controller registration via the
8236
+ * {@link ng.$controllerProvider#register register} method.
8237
+ */
8238
+function $ControllerProvider() {
8239
+ var controllers = {},
8240
+ globals = false,
8241
+ CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/;
8242
+
8243
+
8244
+ /**
8245
+ * @ngdoc method
8246
+ * @name $controllerProvider#register
8247
+ * @param {string|Object} name Controller name, or an object map of controllers where the keys are
8248
+ * the names and the values are the constructors.
8249
+ * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI
8250
+ * annotations in the array notation).
8251
+ */
8252
+ this.register = function(name, constructor) {
8253
+ assertNotHasOwnProperty(name, 'controller');
8254
+ if (isObject(name)) {
8255
+ extend(controllers, name);
8256
+ } else {
8257
+ controllers[name] = constructor;
8258
+ }
8259
+ };
8260
+
8261
+ /**
8262
+ * @ngdoc method
8263
+ * @name $controllerProvider#allowGlobals
8264
+ * @description If called, allows `$controller` to find controller constructors on `window`
8265
+ */
8266
+ this.allowGlobals = function() {
8267
+ globals = true;
8268
+ };
8269
+
8270
+
8271
+ this.$get = ['$injector', '$window', function($injector, $window) {
8272
+
8273
+ /**
8274
+ * @ngdoc service
8275
+ * @name $controller
8276
+ * @requires $injector
8277
+ *
8278
+ * @param {Function|string} constructor If called with a function then it's considered to be the
8279
+ * controller constructor function. Otherwise it's considered to be a string which is used
8280
+ * to retrieve the controller constructor using the following steps:
8281
+ *
8282
+ * * check if a controller with given name is registered via `$controllerProvider`
8283
+ * * check if evaluating the string on the current scope returns a constructor
8284
+ * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
8285
+ * `window` object (not recommended)
8286
+ *
8287
+ * @param {Object} locals Injection locals for Controller.
8288
+ * @return {Object} Instance of given controller.
8289
+ *
8290
+ * @description
8291
+ * `$controller` service is responsible for instantiating controllers.
8292
+ *
8293
+ * It's just a simple call to {@link auto.$injector $injector}, but extracted into
8294
+ * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).
8295
+ */
8296
+ return function(expression, locals, later, ident) {
8297
+ // PRIVATE API:
8298
+ // param `later` --- indicates that the controller's constructor is invoked at a later time.
8299
+ // If true, $controller will allocate the object with the correct
8300
+ // prototype chain, but will not invoke the controller until a returned
8301
+ // callback is invoked.
8302
+ // param `ident` --- An optional label which overrides the label parsed from the controller
8303
+ // expression, if any.
8304
+ var instance, match, constructor, identifier;
8305
+ later = later === true;
8306
+ if (ident && isString(ident)) {
8307
+ identifier = ident;
8308
+ }
8309
+
8310
+ if(isString(expression)) {
8311
+ match = expression.match(CNTRL_REG),
8312
+ constructor = match[1],
8313
+ identifier = identifier || match[3];
8314
+ expression = controllers.hasOwnProperty(constructor)
8315
+ ? controllers[constructor]
8316
+ : getter(locals.$scope, constructor, true) ||
8317
+ (globals ? getter($window, constructor, true) : undefined);
8318
+
8319
+ assertArgFn(expression, constructor, true);
8320
+ }
8321
+
8322
+ if (later) {
8323
+ // Instantiate controller later:
8324
+ // This machinery is used to create an instance of the object before calling the
8325
+ // controller's constructor itself.
8326
+ //
8327
+ // This allows properties to be added to the controller before the constructor is
8328
+ // invoked. Primarily, this is used for isolate scope bindings in $compile.
8329
+ //
8330
+ // This feature is not intended for use by applications, and is thus not documented
8331
+ // publicly.
8332
+ var Constructor = function() {};
8333
+ Constructor.prototype = (isArray(expression) ?
8334
+ expression[expression.length - 1] : expression).prototype;
8335
+ instance = new Constructor();
8336
+
8337
+ if (identifier) {
8338
+ addIdentifier(locals, identifier, instance, constructor || expression.name);
8339
+ }
8340
+
8341
+ return extend(function() {
8342
+ $injector.invoke(expression, instance, locals, constructor);
8343
+ return instance;
8344
+ }, {
8345
+ instance: instance,
8346
+ identifier: identifier
8347
+ });
8348
+ }
8349
+
8350
+ instance = $injector.instantiate(expression, locals, constructor);
8351
+
8352
+ if (identifier) {
8353
+ addIdentifier(locals, identifier, instance, constructor || expression.name);
8354
+ }
8355
+
8356
+ return instance;
8357
+ };
8358
+
8359
+ function addIdentifier(locals, identifier, instance, name) {
8360
+ if (!(locals && isObject(locals.$scope))) {
8361
+ throw minErr('$controller')('noscp',
8362
+ "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",
8363
+ name, identifier);
8364
+ }
8365
+
8366
+ locals.$scope[identifier] = instance;
8367
+ }
8368
+ }];
8369
+}
8370
+
8371
+/**
8372
+ * @ngdoc service
8373
+ * @name $document
8374
+ * @requires $window
8375
+ *
8376
+ * @description
8377
+ * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.
8378
+ *
8379
+ * @example
8380
+ <example module="documentExample">
8381
+ <file name="index.html">
8382
+ <div ng-controller="ExampleController">
8383
+ <p>$document title: <b ng-bind="title"></b></p>
8384
+ <p>window.document title: <b ng-bind="windowTitle"></b></p>
8385
+ </div>
8386
+ </file>
8387
+ <file name="script.js">
8388
+ angular.module('documentExample', [])
8389
+ .controller('ExampleController', ['$scope', '$document', function($scope, $document) {
8390
+ $scope.title = $document[0].title;
8391
+ $scope.windowTitle = angular.element(window.document)[0].title;
8392
+ }]);
8393
+ </file>
8394
+ </example>
8395
+ */
8396
+function $DocumentProvider(){
8397
+ this.$get = ['$window', function(window){
8398
+ return jqLite(window.document);
8399
+ }];
8400
+}
8401
+
8402
+/**
8403
+ * @ngdoc service
8404
+ * @name $exceptionHandler
8405
+ * @requires ng.$log
8406
+ *
8407
+ * @description
8408
+ * Any uncaught exception in angular expressions is delegated to this service.
8409
+ * The default implementation simply delegates to `$log.error` which logs it into
8410
+ * the browser console.
8411
+ *
8412
+ * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by
8413
+ * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.
8414
+ *
8415
+ * ## Example:
8416
+ *
8417
+ * ```js
8418
+ * angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {
8419
+ * return function (exception, cause) {
8420
+ * exception.message += ' (caused by "' + cause + '")';
8421
+ * throw exception;
8422
+ * };
8423
+ * });
8424
+ * ```
8425
+ *
8426
+ * This example will override the normal action of `$exceptionHandler`, to make angular
8427
+ * exceptions fail hard when they happen, instead of just logging to the console.
8428
+ *
8429
+ * <hr />
8430
+ * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind`
8431
+ * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler}
8432
+ * (unless executed during a digest).
8433
+ *
8434
+ * If you wish, you can manually delegate exceptions, e.g.
8435
+ * `try { ... } catch(e) { $exceptionHandler(e); }`
8436
+ *
8437
+ * @param {Error} exception Exception associated with the error.
8438
+ * @param {string=} cause optional information about the context in which
8439
+ * the error was thrown.
8440
+ *
8441
+ */
8442
+function $ExceptionHandlerProvider() {
8443
+ this.$get = ['$log', function($log) {
8444
+ return function(exception, cause) {
8445
+ $log.error.apply($log, arguments);
8446
+ };
8447
+ }];
8448
+}
8449
+
8450
+/**
8451
+ * Parse headers into key value object
8452
+ *
8453
+ * @param {string} headers Raw headers as a string
8454
+ * @returns {Object} Parsed headers as key value object
8455
+ */
8456
+function parseHeaders(headers) {
8457
+ var parsed = {}, key, val, i;
8458
+
8459
+ if (!headers) return parsed;
8460
+
8461
+ forEach(headers.split('\n'), function(line) {
8462
+ i = line.indexOf(':');
8463
+ key = lowercase(trim(line.substr(0, i)));
8464
+ val = trim(line.substr(i + 1));
8465
+
8466
+ if (key) {
8467
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
8468
+ }
8469
+ });
8470
+
8471
+ return parsed;
8472
+}
8473
+
8474
+
8475
+/**
8476
+ * Returns a function that provides access to parsed headers.
8477
+ *
8478
+ * Headers are lazy parsed when first requested.
8479
+ * @see parseHeaders
8480
+ *
8481
+ * @param {(string|Object)} headers Headers to provide access to.
8482
+ * @returns {function(string=)} Returns a getter function which if called with:
8483
+ *
8484
+ * - if called with single an argument returns a single header value or null
8485
+ * - if called with no arguments returns an object containing all headers.
8486
+ */
8487
+function headersGetter(headers) {
8488
+ var headersObj = isObject(headers) ? headers : undefined;
8489
+
8490
+ return function(name) {
8491
+ if (!headersObj) headersObj = parseHeaders(headers);
8492
+
8493
+ if (name) {
8494
+ return headersObj[lowercase(name)] || null;
8495
+ }
8496
+
8497
+ return headersObj;
8498
+ };
8499
+}
8500
+
8501
+
8502
+/**
8503
+ * Chain all given functions
8504
+ *
8505
+ * This function is used for both request and response transforming
8506
+ *
8507
+ * @param {*} data Data to transform.
8508
+ * @param {function(string=)} headers Http headers getter fn.
8509
+ * @param {(Function|Array.<Function>)} fns Function or an array of functions.
8510
+ * @returns {*} Transformed data.
8511
+ */
8512
+function transformData(data, headers, fns) {
8513
+ if (isFunction(fns))
8514
+ return fns(data, headers);
8515
+
8516
+ forEach(fns, function(fn) {
8517
+ data = fn(data, headers);
8518
+ });
8519
+
8520
+ return data;
8521
+}
8522
+
8523
+
8524
+function isSuccess(status) {
8525
+ return 200 <= status && status < 300;
8526
+}
8527
+
8528
+
8529
+/**
8530
+ * @ngdoc provider
8531
+ * @name $httpProvider
8532
+ * @description
8533
+ * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.
8534
+ * */
8535
+function $HttpProvider() {
8536
+ var JSON_START = /^\s*(\[|\{[^\{])/,
8537
+ JSON_END = /[\}\]]\s*$/,
8538
+ PROTECTION_PREFIX = /^\)\]\}',?\n/,
8539
+ APPLICATION_JSON = 'application/json',
8540
+ CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};
8541
+
8542
+ /**
8543
+ * @ngdoc property
8544
+ * @name $httpProvider#defaults
8545
+ * @description
8546
+ *
8547
+ * Object containing default values for all {@link ng.$http $http} requests.
8548
+ *
8549
+ * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
8550
+ * Defaults value is `'XSRF-TOKEN'`.
8551
+ *
8552
+ * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the
8553
+ * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.
8554
+ *
8555
+ * - **`defaults.headers`** - {Object} - Default headers for all $http requests.
8556
+ * Refer to {@link ng.$http#setting-http-headers $http} for documentation on
8557
+ * setting default headers.
8558
+ * - **`defaults.headers.common`**
8559
+ * - **`defaults.headers.post`**
8560
+ * - **`defaults.headers.put`**
8561
+ * - **`defaults.headers.patch`**
8562
+ **/
8563
+ var defaults = this.defaults = {
8564
+ // transform incoming response data
8565
+ transformResponse: [function defaultHttpResponseTransform(data, headers) {
8566
+ if (isString(data)) {
8567
+ // strip json vulnerability protection prefix
8568
+ data = data.replace(PROTECTION_PREFIX, '');
8569
+ var contentType = headers('Content-Type');
8570
+ if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0) ||
8571
+ (JSON_START.test(data) && JSON_END.test(data))) {
8572
+ data = fromJson(data);
8573
+ }
8574
+ }
8575
+ return data;
8576
+ }],
8577
+
8578
+ // transform outgoing request data
8579
+ transformRequest: [function(d) {
8580
+ return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
8581
+ }],
8582
+
8583
+ // default headers
8584
+ headers: {
8585
+ common: {
8586
+ 'Accept': 'application/json, text/plain, */*'
8587
+ },
8588
+ post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),
8589
+ put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),
8590
+ patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON)
8591
+ },
8592
+
8593
+ xsrfCookieName: 'XSRF-TOKEN',
8594
+ xsrfHeaderName: 'X-XSRF-TOKEN'
8595
+ };
8596
+
8597
+ var useApplyAsync = false;
8598
+ /**
8599
+ * @ngdoc method
8600
+ * @name $httpProvider#useApplyAsync
8601
+ * @description
8602
+ *
8603
+ * Configure $http service to combine processing of multiple http responses received at around
8604
+ * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in
8605
+ * significant performance improvement for bigger applications that make many HTTP requests
8606
+ * concurrently (common during application bootstrap).
8607
+ *
8608
+ * Defaults to false. If no value is specifed, returns the current configured value.
8609
+ *
8610
+ * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred
8611
+ * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window
8612
+ * to load and share the same digest cycle.
8613
+ *
8614
+ * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.
8615
+ * otherwise, returns the current configured value.
8616
+ **/
8617
+ this.useApplyAsync = function(value) {
8618
+ if (isDefined(value)) {
8619
+ useApplyAsync = !!value;
8620
+ return this;
8621
+ }
8622
+ return useApplyAsync;
8623
+ };
8624
+
8625
+ /**
8626
+ * Are ordered by request, i.e. they are applied in the same order as the
8627
+ * array, on request, but reverse order, on response.
8628
+ */
8629
+ var interceptorFactories = this.interceptors = [];
8630
+
8631
+ this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',
8632
+ function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
8633
+
8634
+ var defaultCache = $cacheFactory('$http');
8635
+
8636
+ /**
8637
+ * Interceptors stored in reverse order. Inner interceptors before outer interceptors.
8638
+ * The reversal is needed so that we can build up the interception chain around the
8639
+ * server request.
8640
+ */
8641
+ var reversedInterceptors = [];
8642
+
8643
+ forEach(interceptorFactories, function(interceptorFactory) {
8644
+ reversedInterceptors.unshift(isString(interceptorFactory)
8645
+ ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));
8646
+ });
8647
+
8648
+ /**
8649
+ * @ngdoc service
8650
+ * @kind function
8651
+ * @name $http
8652
+ * @requires ng.$httpBackend
8653
+ * @requires $cacheFactory
8654
+ * @requires $rootScope
8655
+ * @requires $q
8656
+ * @requires $injector
8657
+ *
8658
+ * @description
8659
+ * The `$http` service is a core Angular service that facilitates communication with the remote
8660
+ * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)
8661
+ * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).
8662
+ *
8663
+ * For unit testing applications that use `$http` service, see
8664
+ * {@link ngMock.$httpBackend $httpBackend mock}.
8665
+ *
8666
+ * For a higher level of abstraction, please check out the {@link ngResource.$resource
8667
+ * $resource} service.
8668
+ *
8669
+ * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by
8670
+ * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage
8671
+ * it is important to familiarize yourself with these APIs and the guarantees they provide.
8672
+ *
8673
+ *
8674
+ * ## General usage
8675
+ * The `$http` service is a function which takes a single argument — a configuration object —
8676
+ * that is used to generate an HTTP request and returns a {@link ng.$q promise}
8677
+ * with two $http specific methods: `success` and `error`.
8678
+ *
8679
+ * ```js
8680
+ * // Simple GET request example :
8681
+ * $http.get('/someUrl').
8682
+ * success(function(data, status, headers, config) {
8683
+ * // this callback will be called asynchronously
8684
+ * // when the response is available
8685
+ * }).
8686
+ * error(function(data, status, headers, config) {
8687
+ * // called asynchronously if an error occurs
8688
+ * // or server returns response with an error status.
8689
+ * });
8690
+ * ```
8691
+ *
8692
+ * ```js
8693
+ * // Simple POST request example (passing data) :
8694
+ * $http.post('/someUrl', {msg:'hello word!'}).
8695
+ * success(function(data, status, headers, config) {
8696
+ * // this callback will be called asynchronously
8697
+ * // when the response is available
8698
+ * }).
8699
+ * error(function(data, status, headers, config) {
8700
+ * // called asynchronously if an error occurs
8701
+ * // or server returns response with an error status.
8702
+ * });
8703
+ * ```
8704
+ *
8705
+ *
8706
+ * Since the returned value of calling the $http function is a `promise`, you can also use
8707
+ * the `then` method to register callbacks, and these callbacks will receive a single argument –
8708
+ * an object representing the response. See the API signature and type info below for more
8709
+ * details.
8710
+ *
8711
+ * A response status code between 200 and 299 is considered a success status and
8712
+ * will result in the success callback being called. Note that if the response is a redirect,
8713
+ * XMLHttpRequest will transparently follow it, meaning that the error callback will not be
8714
+ * called for such responses.
8715
+ *
8716
+ * ## Writing Unit Tests that use $http
8717
+ * When unit testing (using {@link ngMock ngMock}), it is necessary to call
8718
+ * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending
8719
+ * request using trained responses.
8720
+ *
8721
+ * ```
8722
+ * $httpBackend.expectGET(...);
8723
+ * $http.get(...);
8724
+ * $httpBackend.flush();
8725
+ * ```
8726
+ *
8727
+ * ## Shortcut methods
8728
+ *
8729
+ * Shortcut methods are also available. All shortcut methods require passing in the URL, and
8730
+ * request data must be passed in for POST/PUT requests.
8731
+ *
8732
+ * ```js
8733
+ * $http.get('/someUrl').success(successCallback);
8734
+ * $http.post('/someUrl', data).success(successCallback);
8735
+ * ```
8736
+ *
8737
+ * Complete list of shortcut methods:
8738
+ *
8739
+ * - {@link ng.$http#get $http.get}
8740
+ * - {@link ng.$http#head $http.head}
8741
+ * - {@link ng.$http#post $http.post}
8742
+ * - {@link ng.$http#put $http.put}
8743
+ * - {@link ng.$http#delete $http.delete}
8744
+ * - {@link ng.$http#jsonp $http.jsonp}
8745
+ * - {@link ng.$http#patch $http.patch}
8746
+ *
8747
+ *
8748
+ * ## Setting HTTP Headers
8749
+ *
8750
+ * The $http service will automatically add certain HTTP headers to all requests. These defaults
8751
+ * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration
8752
+ * object, which currently contains this default configuration:
8753
+ *
8754
+ * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):
8755
+ * - `Accept: application/json, text/plain, * / *`
8756
+ * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)
8757
+ * - `Content-Type: application/json`
8758
+ * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)
8759
+ * - `Content-Type: application/json`
8760
+ *
8761
+ * To add or overwrite these defaults, simply add or remove a property from these configuration
8762
+ * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object
8763
+ * with the lowercased HTTP method name as the key, e.g.
8764
+ * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.
8765
+ *
8766
+ * The defaults can also be set at runtime via the `$http.defaults` object in the same
8767
+ * fashion. For example:
8768
+ *
8769
+ * ```
8770
+ * module.run(function($http) {
8771
+ * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'
8772
+ * });
8773
+ * ```
8774
+ *
8775
+ * In addition, you can supply a `headers` property in the config object passed when
8776
+ * calling `$http(config)`, which overrides the defaults without changing them globally.
8777
+ *
8778
+ *
8779
+ * ## Transforming Requests and Responses
8780
+ *
8781
+ * Both requests and responses can be transformed using transformation functions: `transformRequest`
8782
+ * and `transformResponse`. These properties can be a single function that returns
8783
+ * the transformed value (`{function(data, headersGetter)`) or an array of such transformation functions,
8784
+ * which allows you to `push` or `unshift` a new transformation function into the transformation chain.
8785
+ *
8786
+ * ### Default Transformations
8787
+ *
8788
+ * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and
8789
+ * `defaults.transformResponse` properties. If a request does not provide its own transformations
8790
+ * then these will be applied.
8791
+ *
8792
+ * You can augment or replace the default transformations by modifying these properties by adding to or
8793
+ * replacing the array.
8794
+ *
8795
+ * Angular provides the following default transformations:
8796
+ *
8797
+ * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`):
8798
+ *
8799
+ * - If the `data` property of the request configuration object contains an object, serialize it
8800
+ * into JSON format.
8801
+ *
8802
+ * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`):
8803
+ *
8804
+ * - If XSRF prefix is detected, strip it (see Security Considerations section below).
8805
+ * - If JSON response is detected, deserialize it using a JSON parser.
8806
+ *
8807
+ *
8808
+ * ### Overriding the Default Transformations Per Request
8809
+ *
8810
+ * If you wish override the request/response transformations only for a single request then provide
8811
+ * `transformRequest` and/or `transformResponse` properties on the configuration object passed
8812
+ * into `$http`.
8813
+ *
8814
+ * Note that if you provide these properties on the config object the default transformations will be
8815
+ * overwritten. If you wish to augment the default transformations then you must include them in your
8816
+ * local transformation array.
8817
+ *
8818
+ * The following code demonstrates adding a new response transformation to be run after the default response
8819
+ * transformations have been run.
8820
+ *
8821
+ * ```js
8822
+ * function appendTransform(defaults, transform) {
8823
+ *
8824
+ * // We can't guarantee that the default transformation is an array
8825
+ * defaults = angular.isArray(defaults) ? defaults : [defaults];
8826
+ *
8827
+ * // Append the new transformation to the defaults
8828
+ * return defaults.concat(transform);
8829
+ * }
8830
+ *
8831
+ * $http({
8832
+ * url: '...',
8833
+ * method: 'GET',
8834
+ * transformResponse: appendTransform($http.defaults.transformResponse, function(value) {
8835
+ * return doTransform(value);
8836
+ * })
8837
+ * });
8838
+ * ```
8839
+ *
8840
+ *
8841
+ * ## Caching
8842
+ *
8843
+ * To enable caching, set the request configuration `cache` property to `true` (to use default
8844
+ * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}).
8845
+ * When the cache is enabled, `$http` stores the response from the server in the specified
8846
+ * cache. The next time the same request is made, the response is served from the cache without
8847
+ * sending a request to the server.
8848
+ *
8849
+ * Note that even if the response is served from cache, delivery of the data is asynchronous in
8850
+ * the same way that real requests are.
8851
+ *
8852
+ * If there are multiple GET requests for the same URL that should be cached using the same
8853
+ * cache, but the cache is not populated yet, only one request to the server will be made and
8854
+ * the remaining requests will be fulfilled using the response from the first request.
8855
+ *
8856
+ * You can change the default cache to a new object (built with
8857
+ * {@link ng.$cacheFactory `$cacheFactory`}) by updating the
8858
+ * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set
8859
+ * their `cache` property to `true` will now use this cache object.
8860
+ *
8861
+ * If you set the default cache to `false` then only requests that specify their own custom
8862
+ * cache object will be cached.
8863
+ *
8864
+ * ## Interceptors
8865
+ *
8866
+ * Before you start creating interceptors, be sure to understand the
8867
+ * {@link ng.$q $q and deferred/promise APIs}.
8868
+ *
8869
+ * For purposes of global error handling, authentication, or any kind of synchronous or
8870
+ * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be
8871
+ * able to intercept requests before they are handed to the server and
8872
+ * responses before they are handed over to the application code that
8873
+ * initiated these requests. The interceptors leverage the {@link ng.$q
8874
+ * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.
8875
+ *
8876
+ * The interceptors are service factories that are registered with the `$httpProvider` by
8877
+ * adding them to the `$httpProvider.interceptors` array. The factory is called and
8878
+ * injected with dependencies (if specified) and returns the interceptor.
8879
+ *
8880
+ * There are two kinds of interceptors (and two kinds of rejection interceptors):
8881
+ *
8882
+ * * `request`: interceptors get called with a http `config` object. The function is free to
8883
+ * modify the `config` object or create a new one. The function needs to return the `config`
8884
+ * object directly, or a promise containing the `config` or a new `config` object.
8885
+ * * `requestError`: interceptor gets called when a previous interceptor threw an error or
8886
+ * resolved with a rejection.
8887
+ * * `response`: interceptors get called with http `response` object. The function is free to
8888
+ * modify the `response` object or create a new one. The function needs to return the `response`
8889
+ * object directly, or as a promise containing the `response` or a new `response` object.
8890
+ * * `responseError`: interceptor gets called when a previous interceptor threw an error or
8891
+ * resolved with a rejection.
8892
+ *
8893
+ *
8894
+ * ```js
8895
+ * // register the interceptor as a service
8896
+ * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
8897
+ * return {
8898
+ * // optional method
8899
+ * 'request': function(config) {
8900
+ * // do something on success
8901
+ * return config;
8902
+ * },
8903
+ *
8904
+ * // optional method
8905
+ * 'requestError': function(rejection) {
8906
+ * // do something on error
8907
+ * if (canRecover(rejection)) {
8908
+ * return responseOrNewPromise
8909
+ * }
8910
+ * return $q.reject(rejection);
8911
+ * },
8912
+ *
8913
+ *
8914
+ *
8915
+ * // optional method
8916
+ * 'response': function(response) {
8917
+ * // do something on success
8918
+ * return response;
8919
+ * },
8920
+ *
8921
+ * // optional method
8922
+ * 'responseError': function(rejection) {
8923
+ * // do something on error
8924
+ * if (canRecover(rejection)) {
8925
+ * return responseOrNewPromise
8926
+ * }
8927
+ * return $q.reject(rejection);
8928
+ * }
8929
+ * };
8930
+ * });
8931
+ *
8932
+ * $httpProvider.interceptors.push('myHttpInterceptor');
8933
+ *
8934
+ *
8935
+ * // alternatively, register the interceptor via an anonymous factory
8936
+ * $httpProvider.interceptors.push(function($q, dependency1, dependency2) {
8937
+ * return {
8938
+ * 'request': function(config) {
8939
+ * // same as above
8940
+ * },
8941
+ *
8942
+ * 'response': function(response) {
8943
+ * // same as above
8944
+ * }
8945
+ * };
8946
+ * });
8947
+ * ```
8948
+ *
8949
+ * ## Security Considerations
8950
+ *
8951
+ * When designing web applications, consider security threats from:
8952
+ *
8953
+ * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)
8954
+ * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)
8955
+ *
8956
+ * Both server and the client must cooperate in order to eliminate these threats. Angular comes
8957
+ * pre-configured with strategies that address these issues, but for this to work backend server
8958
+ * cooperation is required.
8959
+ *
8960
+ * ### JSON Vulnerability Protection
8961
+ *
8962
+ * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)
8963
+ * allows third party website to turn your JSON resource URL into
8964
+ * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To
8965
+ * counter this your server can prefix all JSON requests with following string `")]}',\n"`.
8966
+ * Angular will automatically strip the prefix before processing it as JSON.
8967
+ *
8968
+ * For example if your server needs to return:
8969
+ * ```js
8970
+ * ['one','two']
8971
+ * ```
8972
+ *
8973
+ * which is vulnerable to attack, your server can return:
8974
+ * ```js
8975
+ * )]}',
8976
+ * ['one','two']
8977
+ * ```
8978
+ *
8979
+ * Angular will strip the prefix, before processing the JSON.
8980
+ *
8981
+ *
8982
+ * ### Cross Site Request Forgery (XSRF) Protection
8983
+ *
8984
+ * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which
8985
+ * an unauthorized site can gain your user's private data. Angular provides a mechanism
8986
+ * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie
8987
+ * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only
8988
+ * JavaScript that runs on your domain could read the cookie, your server can be assured that
8989
+ * the XHR came from JavaScript running on your domain. The header will not be set for
8990
+ * cross-domain requests.
8991
+ *
8992
+ * To take advantage of this, your server needs to set a token in a JavaScript readable session
8993
+ * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the
8994
+ * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure
8995
+ * that only JavaScript running on your domain could have sent the request. The token must be
8996
+ * unique for each user and must be verifiable by the server (to prevent the JavaScript from
8997
+ * making up its own tokens). We recommend that the token is a digest of your site's
8998
+ * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)
8999
+ * for added security.
9000
+ *
9001
+ * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
9002
+ * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,
9003
+ * or the per-request config object.
9004
+ *
9005
+ *
9006
+ * @param {object} config Object describing the request to be made and how it should be
9007
+ * processed. The object has following properties:
9008
+ *
9009
+ * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)
9010
+ * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.
9011
+ * - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned
9012
+ * to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be
9013
+ * JSONified.
9014
+ * - **data** – `{string|Object}` – Data to be sent as the request message data.
9015
+ * - **headers** – `{Object}` – Map of strings or functions which return strings representing
9016
+ * HTTP headers to send to the server. If the return value of a function is null, the
9017
+ * header will not be sent.
9018
+ * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.
9019
+ * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.
9020
+ * - **transformRequest** –
9021
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
9022
+ * transform function or an array of such functions. The transform function takes the http
9023
+ * request body and headers and returns its transformed (typically serialized) version.
9024
+ * See {@link #overriding-the-default-transformations-per-request Overriding the Default Transformations}
9025
+ * - **transformResponse** –
9026
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
9027
+ * transform function or an array of such functions. The transform function takes the http
9028
+ * response body and headers and returns its transformed (typically deserialized) version.
9029
+ * See {@link #overriding-the-default-transformations-per-request Overriding the Default Transformations}
9030
+ * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
9031
+ * GET request, otherwise if a cache instance built with
9032
+ * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
9033
+ * caching.
9034
+ * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
9035
+ * that should abort the request when resolved.
9036
+ * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the
9037
+ * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)
9038
+ * for more information.
9039
+ * - **responseType** - `{string}` - see
9040
+ * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).
9041
+ *
9042
+ * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the
9043
+ * standard `then` method and two http specific methods: `success` and `error`. The `then`
9044
+ * method takes two arguments a success and an error callback which will be called with a
9045
+ * response object. The `success` and `error` methods take a single argument - a function that
9046
+ * will be called when the request succeeds or fails respectively. The arguments passed into
9047
+ * these functions are destructured representation of the response object passed into the
9048
+ * `then` method. The response object has these properties:
9049
+ *
9050
+ * - **data** – `{string|Object}` – The response body transformed with the transform
9051
+ * functions.
9052
+ * - **status** – `{number}` – HTTP status code of the response.
9053
+ * - **headers** – `{function([headerName])}` – Header getter function.
9054
+ * - **config** – `{Object}` – The configuration object that was used to generate the request.
9055
+ * - **statusText** – `{string}` – HTTP status text of the response.
9056
+ *
9057
+ * @property {Array.<Object>} pendingRequests Array of config objects for currently pending
9058
+ * requests. This is primarily meant to be used for debugging purposes.
9059
+ *
9060
+ *
9061
+ * @example
9062
+<example module="httpExample">
9063
+<file name="index.html">
9064
+ <div ng-controller="FetchController">
9065
+ <select ng-model="method">
9066
+ <option>GET</option>
9067
+ <option>JSONP</option>
9068
+ </select>
9069
+ <input type="text" ng-model="url" size="80"/>
9070
+ <button id="fetchbtn" ng-click="fetch()">fetch</button><br>
9071
+ <button id="samplegetbtn" ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
9072
+ <button id="samplejsonpbtn"
9073
+ ng-click="updateModel('JSONP',
9074
+ 'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')">
9075
+ Sample JSONP
9076
+ </button>
9077
+ <button id="invalidjsonpbtn"
9078
+ ng-click="updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')">
9079
+ Invalid JSONP
9080
+ </button>
9081
+ <pre>http status code: {{status}}</pre>
9082
+ <pre>http response data: {{data}}</pre>
9083
+ </div>
9084
+</file>
9085
+<file name="script.js">
9086
+ angular.module('httpExample', [])
9087
+ .controller('FetchController', ['$scope', '$http', '$templateCache',
9088
+ function($scope, $http, $templateCache) {
9089
+ $scope.method = 'GET';
9090
+ $scope.url = 'http-hello.html';
9091
+
9092
+ $scope.fetch = function() {
9093
+ $scope.code = null;
9094
+ $scope.response = null;
9095
+
9096
+ $http({method: $scope.method, url: $scope.url, cache: $templateCache}).
9097
+ success(function(data, status) {
9098
+ $scope.status = status;
9099
+ $scope.data = data;
9100
+ }).
9101
+ error(function(data, status) {
9102
+ $scope.data = data || "Request failed";
9103
+ $scope.status = status;
9104
+ });
9105
+ };
9106
+
9107
+ $scope.updateModel = function(method, url) {
9108
+ $scope.method = method;
9109
+ $scope.url = url;
9110
+ };
9111
+ }]);
9112
+</file>
9113
+<file name="http-hello.html">
9114
+ Hello, $http!
9115
+</file>
9116
+<file name="protractor.js" type="protractor">
9117
+ var status = element(by.binding('status'));
9118
+ var data = element(by.binding('data'));
9119
+ var fetchBtn = element(by.id('fetchbtn'));
9120
+ var sampleGetBtn = element(by.id('samplegetbtn'));
9121
+ var sampleJsonpBtn = element(by.id('samplejsonpbtn'));
9122
+ var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));
9123
+
9124
+ it('should make an xhr GET request', function() {
9125
+ sampleGetBtn.click();
9126
+ fetchBtn.click();
9127
+ expect(status.getText()).toMatch('200');
9128
+ expect(data.getText()).toMatch(/Hello, \$http!/);
9129
+ });
9130
+
9131
+// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185
9132
+// it('should make a JSONP request to angularjs.org', function() {
9133
+// sampleJsonpBtn.click();
9134
+// fetchBtn.click();
9135
+// expect(status.getText()).toMatch('200');
9136
+// expect(data.getText()).toMatch(/Super Hero!/);
9137
+// });
9138
+
9139
+ it('should make JSONP request to invalid URL and invoke the error handler',
9140
+ function() {
9141
+ invalidJsonpBtn.click();
9142
+ fetchBtn.click();
9143
+ expect(status.getText()).toMatch('0');
9144
+ expect(data.getText()).toMatch('Request failed');
9145
+ });
9146
+</file>
9147
+</example>
9148
+ */
9149
+ function $http(requestConfig) {
9150
+ var config = {
9151
+ method: 'get',
9152
+ transformRequest: defaults.transformRequest,
9153
+ transformResponse: defaults.transformResponse
9154
+ };
9155
+ var headers = mergeHeaders(requestConfig);
9156
+
9157
+ extend(config, requestConfig);
9158
+ config.headers = headers;
9159
+ config.method = uppercase(config.method);
9160
+
9161
+ var serverRequest = function(config) {
9162
+ headers = config.headers;
9163
+ var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
9164
+
9165
+ // strip content-type if data is undefined
9166
+ if (isUndefined(reqData)) {
9167
+ forEach(headers, function(value, header) {
9168
+ if (lowercase(header) === 'content-type') {
9169
+ delete headers[header];
9170
+ }
9171
+ });
9172
+ }
9173
+
9174
+ if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {
9175
+ config.withCredentials = defaults.withCredentials;
9176
+ }
9177
+
9178
+ // send request
9179
+ return sendReq(config, reqData, headers).then(transformResponse, transformResponse);
9180
+ };
9181
+
9182
+ var chain = [serverRequest, undefined];
9183
+ var promise = $q.when(config);
9184
+
9185
+ // apply interceptors
9186
+ forEach(reversedInterceptors, function(interceptor) {
9187
+ if (interceptor.request || interceptor.requestError) {
9188
+ chain.unshift(interceptor.request, interceptor.requestError);
9189
+ }
9190
+ if (interceptor.response || interceptor.responseError) {
9191
+ chain.push(interceptor.response, interceptor.responseError);
9192
+ }
9193
+ });
9194
+
9195
+ while(chain.length) {
9196
+ var thenFn = chain.shift();
9197
+ var rejectFn = chain.shift();
9198
+
9199
+ promise = promise.then(thenFn, rejectFn);
9200
+ }
9201
+
9202
+ promise.success = function(fn) {
9203
+ promise.then(function(response) {
9204
+ fn(response.data, response.status, response.headers, config);
9205
+ });
9206
+ return promise;
9207
+ };
9208
+
9209
+ promise.error = function(fn) {
9210
+ promise.then(null, function(response) {
9211
+ fn(response.data, response.status, response.headers, config);
9212
+ });
9213
+ return promise;
9214
+ };
9215
+
9216
+ return promise;
9217
+
9218
+ function transformResponse(response) {
9219
+ // make a copy since the response must be cacheable
9220
+ var resp = extend({}, response);
9221
+ if (!response.data) {
9222
+ resp.data = response.data;
9223
+ } else {
9224
+ resp.data = transformData(response.data, response.headers, config.transformResponse);
9225
+ }
9226
+ return (isSuccess(response.status))
9227
+ ? resp
9228
+ : $q.reject(resp);
9229
+ }
9230
+
9231
+ function mergeHeaders(config) {
9232
+ var defHeaders = defaults.headers,
9233
+ reqHeaders = extend({}, config.headers),
9234
+ defHeaderName, lowercaseDefHeaderName, reqHeaderName;
9235
+
9236
+ defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);
9237
+
9238
+ // using for-in instead of forEach to avoid unecessary iteration after header has been found
9239
+ defaultHeadersIteration:
9240
+ for (defHeaderName in defHeaders) {
9241
+ lowercaseDefHeaderName = lowercase(defHeaderName);
9242
+
9243
+ for (reqHeaderName in reqHeaders) {
9244
+ if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {
9245
+ continue defaultHeadersIteration;
9246
+ }
9247
+ }
9248
+
9249
+ reqHeaders[defHeaderName] = defHeaders[defHeaderName];
9250
+ }
9251
+
9252
+ // execute if header value is a function for merged headers
9253
+ execHeaders(reqHeaders);
9254
+ return reqHeaders;
9255
+
9256
+ function execHeaders(headers) {
9257
+ var headerContent;
9258
+
9259
+ forEach(headers, function(headerFn, header) {
9260
+ if (isFunction(headerFn)) {
9261
+ headerContent = headerFn();
9262
+ if (headerContent != null) {
9263
+ headers[header] = headerContent;
9264
+ } else {
9265
+ delete headers[header];
9266
+ }
9267
+ }
9268
+ });
9269
+ }
9270
+ }
9271
+ }
9272
+
9273
+ $http.pendingRequests = [];
9274
+
9275
+ /**
9276
+ * @ngdoc method
9277
+ * @name $http#get
9278
+ *
9279
+ * @description
9280
+ * Shortcut method to perform `GET` request.
9281
+ *
9282
+ * @param {string} url Relative or absolute URL specifying the destination of the request
9283
+ * @param {Object=} config Optional configuration object
9284
+ * @returns {HttpPromise} Future object
9285
+ */
9286
+
9287
+ /**
9288
+ * @ngdoc method
9289
+ * @name $http#delete
9290
+ *
9291
+ * @description
9292
+ * Shortcut method to perform `DELETE` request.
9293
+ *
9294
+ * @param {string} url Relative or absolute URL specifying the destination of the request
9295
+ * @param {Object=} config Optional configuration object
9296
+ * @returns {HttpPromise} Future object
9297
+ */
9298
+
9299
+ /**
9300
+ * @ngdoc method
9301
+ * @name $http#head
9302
+ *
9303
+ * @description
9304
+ * Shortcut method to perform `HEAD` request.
9305
+ *
9306
+ * @param {string} url Relative or absolute URL specifying the destination of the request
9307
+ * @param {Object=} config Optional configuration object
9308
+ * @returns {HttpPromise} Future object
9309
+ */
9310
+
9311
+ /**
9312
+ * @ngdoc method
9313
+ * @name $http#jsonp
9314
+ *
9315
+ * @description
9316
+ * Shortcut method to perform `JSONP` request.
9317
+ *
9318
+ * @param {string} url Relative or absolute URL specifying the destination of the request.
9319
+ * The name of the callback should be the string `JSON_CALLBACK`.
9320
+ * @param {Object=} config Optional configuration object
9321
+ * @returns {HttpPromise} Future object
9322
+ */
9323
+ createShortMethods('get', 'delete', 'head', 'jsonp');
9324
+
9325
+ /**
9326
+ * @ngdoc method
9327
+ * @name $http#post
9328
+ *
9329
+ * @description
9330
+ * Shortcut method to perform `POST` request.
9331
+ *
9332
+ * @param {string} url Relative or absolute URL specifying the destination of the request
9333
+ * @param {*} data Request content
9334
+ * @param {Object=} config Optional configuration object
9335
+ * @returns {HttpPromise} Future object
9336
+ */
9337
+
9338
+ /**
9339
+ * @ngdoc method
9340
+ * @name $http#put
9341
+ *
9342
+ * @description
9343
+ * Shortcut method to perform `PUT` request.
9344
+ *
9345
+ * @param {string} url Relative or absolute URL specifying the destination of the request
9346
+ * @param {*} data Request content
9347
+ * @param {Object=} config Optional configuration object
9348
+ * @returns {HttpPromise} Future object
9349
+ */
9350
+
9351
+ /**
9352
+ * @ngdoc method
9353
+ * @name $http#patch
9354
+ *
9355
+ * @description
9356
+ * Shortcut method to perform `PATCH` request.
9357
+ *
9358
+ * @param {string} url Relative or absolute URL specifying the destination of the request
9359
+ * @param {*} data Request content
9360
+ * @param {Object=} config Optional configuration object
9361
+ * @returns {HttpPromise} Future object
9362
+ */
9363
+ createShortMethodsWithData('post', 'put', 'patch');
9364
+
9365
+ /**
9366
+ * @ngdoc property
9367
+ * @name $http#defaults
9368
+ *
9369
+ * @description
9370
+ * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of
9371
+ * default headers, withCredentials as well as request and response transformations.
9372
+ *
9373
+ * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above.
9374
+ */
9375
+ $http.defaults = defaults;
9376
+
9377
+
9378
+ return $http;
9379
+
9380
+
9381
+ function createShortMethods(names) {
9382
+ forEach(arguments, function(name) {
9383
+ $http[name] = function(url, config) {
9384
+ return $http(extend(config || {}, {
9385
+ method: name,
9386
+ url: url
9387
+ }));
9388
+ };
9389
+ });
9390
+ }
9391
+
9392
+
9393
+ function createShortMethodsWithData(name) {
9394
+ forEach(arguments, function(name) {
9395
+ $http[name] = function(url, data, config) {
9396
+ return $http(extend(config || {}, {
9397
+ method: name,
9398
+ url: url,
9399
+ data: data
9400
+ }));
9401
+ };
9402
+ });
9403
+ }
9404
+
9405
+
9406
+ /**
9407
+ * Makes the request.
9408
+ *
9409
+ * !!! ACCESSES CLOSURE VARS:
9410
+ * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests
9411
+ */
9412
+ function sendReq(config, reqData, reqHeaders) {
9413
+ var deferred = $q.defer(),
9414
+ promise = deferred.promise,
9415
+ cache,
9416
+ cachedResp,
9417
+ url = buildUrl(config.url, config.params);
9418
+
9419
+ $http.pendingRequests.push(config);
9420
+ promise.then(removePendingReq, removePendingReq);
9421
+
9422
+
9423
+ if ((config.cache || defaults.cache) && config.cache !== false &&
9424
+ (config.method === 'GET' || config.method === 'JSONP')) {
9425
+ cache = isObject(config.cache) ? config.cache
9426
+ : isObject(defaults.cache) ? defaults.cache
9427
+ : defaultCache;
9428
+ }
9429
+
9430
+ if (cache) {
9431
+ cachedResp = cache.get(url);
9432
+ if (isDefined(cachedResp)) {
9433
+ if (isPromiseLike(cachedResp)) {
9434
+ // cached request has already been sent, but there is no response yet
9435
+ cachedResp.then(removePendingReq, removePendingReq);
9436
+ return cachedResp;
9437
+ } else {
9438
+ // serving from cache
9439
+ if (isArray(cachedResp)) {
9440
+ resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);
9441
+ } else {
9442
+ resolvePromise(cachedResp, 200, {}, 'OK');
9443
+ }
9444
+ }
9445
+ } else {
9446
+ // put the promise for the non-transformed response into cache as a placeholder
9447
+ cache.put(url, promise);
9448
+ }
9449
+ }
9450
+
9451
+
9452
+ // if we won't have the response in cache, set the xsrf headers and
9453
+ // send the request to the backend
9454
+ if (isUndefined(cachedResp)) {
9455
+ var xsrfValue = urlIsSameOrigin(config.url)
9456
+ ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
9457
+ : undefined;
9458
+ if (xsrfValue) {
9459
+ reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
9460
+ }
9461
+
9462
+ $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,
9463
+ config.withCredentials, config.responseType);
9464
+ }
9465
+
9466
+ return promise;
9467
+
9468
+
9469
+ /**
9470
+ * Callback registered to $httpBackend():
9471
+ * - caches the response if desired
9472
+ * - resolves the raw $http promise
9473
+ * - calls $apply
9474
+ */
9475
+ function done(status, response, headersString, statusText) {
9476
+ if (cache) {
9477
+ if (isSuccess(status)) {
9478
+ cache.put(url, [status, response, parseHeaders(headersString), statusText]);
9479
+ } else {
9480
+ // remove promise from the cache
9481
+ cache.remove(url);
9482
+ }
9483
+ }
9484
+
9485
+ function resolveHttpPromise() {
9486
+ resolvePromise(response, status, headersString, statusText);
9487
+ }
9488
+
9489
+ if (useApplyAsync) {
9490
+ $rootScope.$applyAsync(resolveHttpPromise);
9491
+ } else {
9492
+ resolveHttpPromise();
9493
+ if (!$rootScope.$$phase) $rootScope.$apply();
9494
+ }
9495
+ }
9496
+
9497
+
9498
+ /**
9499
+ * Resolves the raw $http promise.
9500
+ */
9501
+ function resolvePromise(response, status, headers, statusText) {
9502
+ // normalize internal statuses to 0
9503
+ status = Math.max(status, 0);
9504
+
9505
+ (isSuccess(status) ? deferred.resolve : deferred.reject)({
9506
+ data: response,
9507
+ status: status,
9508
+ headers: headersGetter(headers),
9509
+ config: config,
9510
+ statusText : statusText
9511
+ });
9512
+ }
9513
+
9514
+
9515
+ function removePendingReq() {
9516
+ var idx = $http.pendingRequests.indexOf(config);
9517
+ if (idx !== -1) $http.pendingRequests.splice(idx, 1);
9518
+ }
9519
+ }
9520
+
9521
+
9522
+ function buildUrl(url, params) {
9523
+ if (!params) return url;
9524
+ var parts = [];
9525
+ forEachSorted(params, function(value, key) {
9526
+ if (value === null || isUndefined(value)) return;
9527
+ if (!isArray(value)) value = [value];
9528
+
9529
+ forEach(value, function(v) {
9530
+ if (isObject(v)) {
9531
+ if (isDate(v)){
9532
+ v = v.toISOString();
9533
+ } else {
9534
+ v = toJson(v);
9535
+ }
9536
+ }
9537
+ parts.push(encodeUriQuery(key) + '=' +
9538
+ encodeUriQuery(v));
9539
+ });
9540
+ });
9541
+ if(parts.length > 0) {
9542
+ url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
9543
+ }
9544
+ return url;
9545
+ }
9546
+ }];
9547
+}
9548
+
9549
+function createXhr() {
9550
+ return new window.XMLHttpRequest();
9551
+}
9552
+
9553
+/**
9554
+ * @ngdoc service
9555
+ * @name $httpBackend
9556
+ * @requires $window
9557
+ * @requires $document
9558
+ *
9559
+ * @description
9560
+ * HTTP backend used by the {@link ng.$http service} that delegates to
9561
+ * XMLHttpRequest object or JSONP and deals with browser incompatibilities.
9562
+ *
9563
+ * You should never need to use this service directly, instead use the higher-level abstractions:
9564
+ * {@link ng.$http $http} or {@link ngResource.$resource $resource}.
9565
+ *
9566
+ * During testing this implementation is swapped with {@link ngMock.$httpBackend mock
9567
+ * $httpBackend} which can be trained with responses.
9568
+ */
9569
+function $HttpBackendProvider() {
9570
+ this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {
9571
+ return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]);
9572
+ }];
9573
+}
9574
+
9575
+function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {
9576
+ // TODO(vojta): fix the signature
9577
+ return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {
9578
+ $browser.$$incOutstandingRequestCount();
9579
+ url = url || $browser.url();
9580
+
9581
+ if (lowercase(method) == 'jsonp') {
9582
+ var callbackId = '_' + (callbacks.counter++).toString(36);
9583
+ callbacks[callbackId] = function(data) {
9584
+ callbacks[callbackId].data = data;
9585
+ callbacks[callbackId].called = true;
9586
+ };
9587
+
9588
+ var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),
9589
+ callbackId, function(status, text) {
9590
+ completeRequest(callback, status, callbacks[callbackId].data, "", text);
9591
+ callbacks[callbackId] = noop;
9592
+ });
9593
+ } else {
9594
+
9595
+ var xhr = createXhr();
9596
+
9597
+ xhr.open(method, url, true);
9598
+ forEach(headers, function(value, key) {
9599
+ if (isDefined(value)) {
9600
+ xhr.setRequestHeader(key, value);
9601
+ }
9602
+ });
9603
+
9604
+ xhr.onload = function requestLoaded() {
9605
+ var statusText = xhr.statusText || '';
9606
+
9607
+ // responseText is the old-school way of retrieving response (supported by IE8 & 9)
9608
+ // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
9609
+ var response = ('response' in xhr) ? xhr.response : xhr.responseText;
9610
+
9611
+ // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
9612
+ var status = xhr.status === 1223 ? 204 : xhr.status;
9613
+
9614
+ // fix status code when it is 0 (0 status is undocumented).
9615
+ // Occurs when accessing file resources or on Android 4.1 stock browser
9616
+ // while retrieving files from application cache.
9617
+ if (status === 0) {
9618
+ status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;
9619
+ }
9620
+
9621
+ completeRequest(callback,
9622
+ status,
9623
+ response,
9624
+ xhr.getAllResponseHeaders(),
9625
+ statusText);
9626
+ };
9627
+
9628
+ var requestError = function () {
9629
+ // The response is always empty
9630
+ // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error
9631
+ completeRequest(callback, -1, null, null, '');
9632
+ };
9633
+
9634
+ xhr.onerror = requestError;
9635
+ xhr.onabort = requestError;
9636
+
9637
+ if (withCredentials) {
9638
+ xhr.withCredentials = true;
9639
+ }
9640
+
9641
+ if (responseType) {
9642
+ try {
9643
+ xhr.responseType = responseType;
9644
+ } catch (e) {
9645
+ // WebKit added support for the json responseType value on 09/03/2013
9646
+ // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are
9647
+ // known to throw when setting the value "json" as the response type. Other older
9648
+ // browsers implementing the responseType
9649
+ //
9650
+ // The json response type can be ignored if not supported, because JSON payloads are
9651
+ // parsed on the client-side regardless.
9652
+ if (responseType !== 'json') {
9653
+ throw e;
9654
+ }
9655
+ }
9656
+ }
9657
+
9658
+ xhr.send(post || null);
9659
+ }
9660
+
9661
+ if (timeout > 0) {
9662
+ var timeoutId = $browserDefer(timeoutRequest, timeout);
9663
+ } else if (isPromiseLike(timeout)) {
9664
+ timeout.then(timeoutRequest);
9665
+ }
9666
+
9667
+
9668
+ function timeoutRequest() {
9669
+ jsonpDone && jsonpDone();
9670
+ xhr && xhr.abort();
9671
+ }
9672
+
9673
+ function completeRequest(callback, status, response, headersString, statusText) {
9674
+ // cancel timeout and subsequent timeout promise resolution
9675
+ timeoutId && $browserDefer.cancel(timeoutId);
9676
+ jsonpDone = xhr = null;
9677
+
9678
+ callback(status, response, headersString, statusText);
9679
+ $browser.$$completeOutstandingRequest(noop);
9680
+ }
9681
+ };
9682
+
9683
+ function jsonpReq(url, callbackId, done) {
9684
+ // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:
9685
+ // - fetches local scripts via XHR and evals them
9686
+ // - adds and immediately removes script elements from the document
9687
+ var script = rawDocument.createElement('script'), callback = null;
9688
+ script.type = "text/javascript";
9689
+ script.src = url;
9690
+ script.async = true;
9691
+
9692
+ callback = function(event) {
9693
+ removeEventListenerFn(script, "load", callback);
9694
+ removeEventListenerFn(script, "error", callback);
9695
+ rawDocument.body.removeChild(script);
9696
+ script = null;
9697
+ var status = -1;
9698
+ var text = "unknown";
9699
+
9700
+ if (event) {
9701
+ if (event.type === "load" && !callbacks[callbackId].called) {
9702
+ event = { type: "error" };
9703
+ }
9704
+ text = event.type;
9705
+ status = event.type === "error" ? 404 : 200;
9706
+ }
9707
+
9708
+ if (done) {
9709
+ done(status, text);
9710
+ }
9711
+ };
9712
+
9713
+ addEventListenerFn(script, "load", callback);
9714
+ addEventListenerFn(script, "error", callback);
9715
+ rawDocument.body.appendChild(script);
9716
+ return callback;
9717
+ }
9718
+}
9719
+
9720
+var $interpolateMinErr = minErr('$interpolate');
9721
+
9722
+/**
9723
+ * @ngdoc provider
9724
+ * @name $interpolateProvider
9725
+ *
9726
+ * @description
9727
+ *
9728
+ * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.
9729
+ *
9730
+ * @example
9731
+<example module="customInterpolationApp">
9732
+<file name="index.html">
9733
+<script>
9734
+ var customInterpolationApp = angular.module('customInterpolationApp', []);
9735
+
9736
+ customInterpolationApp.config(function($interpolateProvider) {
9737
+ $interpolateProvider.startSymbol('//');
9738
+ $interpolateProvider.endSymbol('//');
9739
+ });
9740
+
9741
+
9742
+ customInterpolationApp.controller('DemoController', function() {
9743
+ this.label = "This binding is brought you by // interpolation symbols.";
9744
+ });
9745
+</script>
9746
+<div ng-app="App" ng-controller="DemoController as demo">
9747
+ //demo.label//
9748
+</div>
9749
+</file>
9750
+<file name="protractor.js" type="protractor">
9751
+ it('should interpolate binding with custom symbols', function() {
9752
+ expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');
9753
+ });
9754
+</file>
9755
+</example>
9756
+ */
9757
+function $InterpolateProvider() {
9758
+ var startSymbol = '{{';
9759
+ var endSymbol = '}}';
9760
+
9761
+ /**
9762
+ * @ngdoc method
9763
+ * @name $interpolateProvider#startSymbol
9764
+ * @description
9765
+ * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.
9766
+ *
9767
+ * @param {string=} value new value to set the starting symbol to.
9768
+ * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
9769
+ */
9770
+ this.startSymbol = function(value){
9771
+ if (value) {
9772
+ startSymbol = value;
9773
+ return this;
9774
+ } else {
9775
+ return startSymbol;
9776
+ }
9777
+ };
9778
+
9779
+ /**
9780
+ * @ngdoc method
9781
+ * @name $interpolateProvider#endSymbol
9782
+ * @description
9783
+ * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
9784
+ *
9785
+ * @param {string=} value new value to set the ending symbol to.
9786
+ * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
9787
+ */
9788
+ this.endSymbol = function(value){
9789
+ if (value) {
9790
+ endSymbol = value;
9791
+ return this;
9792
+ } else {
9793
+ return endSymbol;
9794
+ }
9795
+ };
9796
+
9797
+
9798
+ this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {
9799
+ var startSymbolLength = startSymbol.length,
9800
+ endSymbolLength = endSymbol.length,
9801
+ escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),
9802
+ escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');
9803
+
9804
+ function escape(ch) {
9805
+ return '\\\\\\' + ch;
9806
+ }
9807
+
9808
+ /**
9809
+ * @ngdoc service
9810
+ * @name $interpolate
9811
+ * @kind function
9812
+ *
9813
+ * @requires $parse
9814
+ * @requires $sce
9815
+ *
9816
+ * @description
9817
+ *
9818
+ * Compiles a string with markup into an interpolation function. This service is used by the
9819
+ * HTML {@link ng.$compile $compile} service for data binding. See
9820
+ * {@link ng.$interpolateProvider $interpolateProvider} for configuring the
9821
+ * interpolation markup.
9822
+ *
9823
+ *
9824
+ * ```js
9825
+ * var $interpolate = ...; // injected
9826
+ * var exp = $interpolate('Hello {{name | uppercase}}!');
9827
+ * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');
9828
+ * ```
9829
+ *
9830
+ * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is
9831
+ * `true`, the interpolation function will return `undefined` unless all embedded expressions
9832
+ * evaluate to a value other than `undefined`.
9833
+ *
9834
+ * ```js
9835
+ * var $interpolate = ...; // injected
9836
+ * var context = {greeting: 'Hello', name: undefined };
9837
+ *
9838
+ * // default "forgiving" mode
9839
+ * var exp = $interpolate('{{greeting}} {{name}}!');
9840
+ * expect(exp(context)).toEqual('Hello !');
9841
+ *
9842
+ * // "allOrNothing" mode
9843
+ * exp = $interpolate('{{greeting}} {{name}}!', false, null, true);
9844
+ * expect(exp(context)).toBeUndefined();
9845
+ * context.name = 'Angular';
9846
+ * expect(exp(context)).toEqual('Hello Angular!');
9847
+ * ```
9848
+ *
9849
+ * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.
9850
+ *
9851
+ * ####Escaped Interpolation
9852
+ * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers
9853
+ * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).
9854
+ * It will be rendered as a regular start/end marker, and will not be interpreted as an expression
9855
+ * or binding.
9856
+ *
9857
+ * This enables web-servers to prevent script injection attacks and defacing attacks, to some
9858
+ * degree, while also enabling code examples to work without relying on the
9859
+ * {@link ng.directive:ngNonBindable ngNonBindable} directive.
9860
+ *
9861
+ * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,
9862
+ * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all
9863
+ * interpolation start/end markers with their escaped counterparts.**
9864
+ *
9865
+ * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered
9866
+ * output when the $interpolate service processes the text. So, for HTML elements interpolated
9867
+ * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter
9868
+ * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,
9869
+ * this is typically useful only when user-data is used in rendering a template from the server, or
9870
+ * when otherwise untrusted data is used by a directive.
9871
+ *
9872
+ * <example>
9873
+ * <file name="index.html">
9874
+ * <div ng-init="username='A user'">
9875
+ * <p ng-init="apptitle='Escaping demo'">{{apptitle}}: \{\{ username = "defaced value"; \}\}
9876
+ * </p>
9877
+ * <p><strong>{{username}}</strong> attempts to inject code which will deface the
9878
+ * application, but fails to accomplish their task, because the server has correctly
9879
+ * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)
9880
+ * characters.</p>
9881
+ * <p>Instead, the result of the attempted script injection is visible, and can be removed
9882
+ * from the database by an administrator.</p>
9883
+ * </div>
9884
+ * </file>
9885
+ * </example>
9886
+ *
9887
+ * @param {string} text The text with markup to interpolate.
9888
+ * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have
9889
+ * embedded expression in order to return an interpolation function. Strings with no
9890
+ * embedded expression will return null for the interpolation function.
9891
+ * @param {string=} trustedContext when provided, the returned function passes the interpolated
9892
+ * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,
9893
+ * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that
9894
+ * provides Strict Contextual Escaping for details.
9895
+ * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined
9896
+ * unless all embedded expressions evaluate to a value other than `undefined`.
9897
+ * @returns {function(context)} an interpolation function which is used to compute the
9898
+ * interpolated string. The function has these parameters:
9899
+ *
9900
+ * - `context`: evaluation context for all expressions embedded in the interpolated text
9901
+ */
9902
+ function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {
9903
+ allOrNothing = !!allOrNothing;
9904
+ var startIndex,
9905
+ endIndex,
9906
+ index = 0,
9907
+ expressions = [],
9908
+ parseFns = [],
9909
+ textLength = text.length,
9910
+ exp,
9911
+ concat = [],
9912
+ expressionPositions = [];
9913
+
9914
+ while(index < textLength) {
9915
+ if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&
9916
+ ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) {
9917
+ if (index !== startIndex) {
9918
+ concat.push(unescapeText(text.substring(index, startIndex)));
9919
+ }
9920
+ exp = text.substring(startIndex + startSymbolLength, endIndex);
9921
+ expressions.push(exp);
9922
+ parseFns.push($parse(exp, parseStringifyInterceptor));
9923
+ index = endIndex + endSymbolLength;
9924
+ expressionPositions.push(concat.length);
9925
+ concat.push('');
9926
+ } else {
9927
+ // we did not find an interpolation, so we have to add the remainder to the separators array
9928
+ if (index !== textLength) {
9929
+ concat.push(unescapeText(text.substring(index)));
9930
+ }
9931
+ break;
9932
+ }
9933
+ }
9934
+
9935
+ // Concatenating expressions makes it hard to reason about whether some combination of
9936
+ // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a
9937
+ // single expression be used for iframe[src], object[src], etc., we ensure that the value
9938
+ // that's used is assigned or constructed by some JS code somewhere that is more testable or
9939
+ // make it obvious that you bound the value to some user controlled value. This helps reduce
9940
+ // the load when auditing for XSS issues.
9941
+ if (trustedContext && concat.length > 1) {
9942
+ throw $interpolateMinErr('noconcat',
9943
+ "Error while interpolating: {0}\nStrict Contextual Escaping disallows " +
9944
+ "interpolations that concatenate multiple expressions when a trusted value is " +
9945
+ "required. See http://docs.angularjs.org/api/ng.$sce", text);
9946
+ }
9947
+
9948
+ if (!mustHaveExpression || expressions.length) {
9949
+ var compute = function(values) {
9950
+ for(var i = 0, ii = expressions.length; i < ii; i++) {
9951
+ if (allOrNothing && isUndefined(values[i])) return;
9952
+ concat[expressionPositions[i]] = values[i];
9953
+ }
9954
+ return concat.join('');
9955
+ };
9956
+
9957
+ var getValue = function (value) {
9958
+ return trustedContext ?
9959
+ $sce.getTrusted(trustedContext, value) :
9960
+ $sce.valueOf(value);
9961
+ };
9962
+
9963
+ var stringify = function (value) {
9964
+ if (value == null) { // null || undefined
9965
+ return '';
9966
+ }
9967
+ switch (typeof value) {
9968
+ case 'string':
9969
+ break;
9970
+ case 'number':
9971
+ value = '' + value;
9972
+ break;
9973
+ default:
9974
+ value = toJson(value);
9975
+ }
9976
+
9977
+ return value;
9978
+ };
9979
+
9980
+ return extend(function interpolationFn(context) {
9981
+ var i = 0;
9982
+ var ii = expressions.length;
9983
+ var values = new Array(ii);
9984
+
9985
+ try {
9986
+ for (; i < ii; i++) {
9987
+ values[i] = parseFns[i](context);
9988
+ }
9989
+
9990
+ return compute(values);
9991
+ } catch(err) {
9992
+ var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
9993
+ err.toString());
9994
+ $exceptionHandler(newErr);
9995
+ }
9996
+
9997
+ }, {
9998
+ // all of these properties are undocumented for now
9999
+ exp: text, //just for compatibility with regular watchers created via $watch
10000
+ expressions: expressions,
10001
+ $$watchDelegate: function (scope, listener, objectEquality) {
10002
+ var lastValue;
10003
+ return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) {
10004
+ var currValue = compute(values);
10005
+ if (isFunction(listener)) {
10006
+ listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);
10007
+ }
10008
+ lastValue = currValue;
10009
+ }, objectEquality);
10010
+ }
10011
+ });
10012
+ }
10013
+
10014
+ function unescapeText(text) {
10015
+ return text.replace(escapedStartRegexp, startSymbol).
10016
+ replace(escapedEndRegexp, endSymbol);
10017
+ }
10018
+
10019
+ function parseStringifyInterceptor(value) {
10020
+ try {
10021
+ return stringify(getValue(value));
10022
+ } catch(err) {
10023
+ var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
10024
+ err.toString());
10025
+ $exceptionHandler(newErr);
10026
+ }
10027
+ }
10028
+ }
10029
+
10030
+
10031
+ /**
10032
+ * @ngdoc method
10033
+ * @name $interpolate#startSymbol
10034
+ * @description
10035
+ * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.
10036
+ *
10037
+ * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change
10038
+ * the symbol.
10039
+ *
10040
+ * @returns {string} start symbol.
10041
+ */
10042
+ $interpolate.startSymbol = function() {
10043
+ return startSymbol;
10044
+ };
10045
+
10046
+
10047
+ /**
10048
+ * @ngdoc method
10049
+ * @name $interpolate#endSymbol
10050
+ * @description
10051
+ * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
10052
+ *
10053
+ * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change
10054
+ * the symbol.
10055
+ *
10056
+ * @returns {string} end symbol.
10057
+ */
10058
+ $interpolate.endSymbol = function() {
10059
+ return endSymbol;
10060
+ };
10061
+
10062
+ return $interpolate;
10063
+ }];
10064
+}
10065
+
10066
+function $IntervalProvider() {
10067
+ this.$get = ['$rootScope', '$window', '$q', '$$q',
10068
+ function($rootScope, $window, $q, $$q) {
10069
+ var intervals = {};
10070
+
10071
+
10072
+ /**
10073
+ * @ngdoc service
10074
+ * @name $interval
10075
+ *
10076
+ * @description
10077
+ * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`
10078
+ * milliseconds.
10079
+ *
10080
+ * The return value of registering an interval function is a promise. This promise will be
10081
+ * notified upon each tick of the interval, and will be resolved after `count` iterations, or
10082
+ * run indefinitely if `count` is not defined. The value of the notification will be the
10083
+ * number of iterations that have run.
10084
+ * To cancel an interval, call `$interval.cancel(promise)`.
10085
+ *
10086
+ * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to
10087
+ * move forward by `millis` milliseconds and trigger any functions scheduled to run in that
10088
+ * time.
10089
+ *
10090
+ * <div class="alert alert-warning">
10091
+ * **Note**: Intervals created by this service must be explicitly destroyed when you are finished
10092
+ * with them. In particular they are not automatically destroyed when a controller's scope or a
10093
+ * directive's element are destroyed.
10094
+ * You should take this into consideration and make sure to always cancel the interval at the
10095
+ * appropriate moment. See the example below for more details on how and when to do this.
10096
+ * </div>
10097
+ *
10098
+ * @param {function()} fn A function that should be called repeatedly.
10099
+ * @param {number} delay Number of milliseconds between each function call.
10100
+ * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat
10101
+ * indefinitely.
10102
+ * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
10103
+ * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
10104
+ * @returns {promise} A promise which will be notified on each iteration.
10105
+ *
10106
+ * @example
10107
+ * <example module="intervalExample">
10108
+ * <file name="index.html">
10109
+ * <script>
10110
+ * angular.module('intervalExample', [])
10111
+ * .controller('ExampleController', ['$scope', '$interval',
10112
+ * function($scope, $interval) {
10113
+ * $scope.format = 'M/d/yy h:mm:ss a';
10114
+ * $scope.blood_1 = 100;
10115
+ * $scope.blood_2 = 120;
10116
+ *
10117
+ * var stop;
10118
+ * $scope.fight = function() {
10119
+ * // Don't start a new fight if we are already fighting
10120
+ * if ( angular.isDefined(stop) ) return;
10121
+ *
10122
+ * stop = $interval(function() {
10123
+ * if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
10124
+ * $scope.blood_1 = $scope.blood_1 - 3;
10125
+ * $scope.blood_2 = $scope.blood_2 - 4;
10126
+ * } else {
10127
+ * $scope.stopFight();
10128
+ * }
10129
+ * }, 100);
10130
+ * };
10131
+ *
10132
+ * $scope.stopFight = function() {
10133
+ * if (angular.isDefined(stop)) {
10134
+ * $interval.cancel(stop);
10135
+ * stop = undefined;
10136
+ * }
10137
+ * };
10138
+ *
10139
+ * $scope.resetFight = function() {
10140
+ * $scope.blood_1 = 100;
10141
+ * $scope.blood_2 = 120;
10142
+ * };
10143
+ *
10144
+ * $scope.$on('$destroy', function() {
10145
+ * // Make sure that the interval is destroyed too
10146
+ * $scope.stopFight();
10147
+ * });
10148
+ * }])
10149
+ * // Register the 'myCurrentTime' directive factory method.
10150
+ * // We inject $interval and dateFilter service since the factory method is DI.
10151
+ * .directive('myCurrentTime', ['$interval', 'dateFilter',
10152
+ * function($interval, dateFilter) {
10153
+ * // return the directive link function. (compile function not needed)
10154
+ * return function(scope, element, attrs) {
10155
+ * var format, // date format
10156
+ * stopTime; // so that we can cancel the time updates
10157
+ *
10158
+ * // used to update the UI
10159
+ * function updateTime() {
10160
+ * element.text(dateFilter(new Date(), format));
10161
+ * }
10162
+ *
10163
+ * // watch the expression, and update the UI on change.
10164
+ * scope.$watch(attrs.myCurrentTime, function(value) {
10165
+ * format = value;
10166
+ * updateTime();
10167
+ * });
10168
+ *
10169
+ * stopTime = $interval(updateTime, 1000);
10170
+ *
10171
+ * // listen on DOM destroy (removal) event, and cancel the next UI update
10172
+ * // to prevent updating time after the DOM element was removed.
10173
+ * element.on('$destroy', function() {
10174
+ * $interval.cancel(stopTime);
10175
+ * });
10176
+ * }
10177
+ * }]);
10178
+ * </script>
10179
+ *
10180
+ * <div>
10181
+ * <div ng-controller="ExampleController">
10182
+ * Date format: <input ng-model="format"> <hr/>
10183
+ * Current time is: <span my-current-time="format"></span>
10184
+ * <hr/>
10185
+ * Blood 1 : <font color='red'>{{blood_1}}</font>
10186
+ * Blood 2 : <font color='red'>{{blood_2}}</font>
10187
+ * <button type="button" data-ng-click="fight()">Fight</button>
10188
+ * <button type="button" data-ng-click="stopFight()">StopFight</button>
10189
+ * <button type="button" data-ng-click="resetFight()">resetFight</button>
10190
+ * </div>
10191
+ * </div>
10192
+ *
10193
+ * </file>
10194
+ * </example>
10195
+ */
10196
+ function interval(fn, delay, count, invokeApply) {
10197
+ var setInterval = $window.setInterval,
10198
+ clearInterval = $window.clearInterval,
10199
+ iteration = 0,
10200
+ skipApply = (isDefined(invokeApply) && !invokeApply),
10201
+ deferred = (skipApply ? $$q : $q).defer(),
10202
+ promise = deferred.promise;
10203
+
10204
+ count = isDefined(count) ? count : 0;
10205
+
10206
+ promise.then(null, null, fn);
10207
+
10208
+ promise.$$intervalId = setInterval(function tick() {
10209
+ deferred.notify(iteration++);
10210
+
10211
+ if (count > 0 && iteration >= count) {
10212
+ deferred.resolve(iteration);
10213
+ clearInterval(promise.$$intervalId);
10214
+ delete intervals[promise.$$intervalId];
10215
+ }
10216
+
10217
+ if (!skipApply) $rootScope.$apply();
10218
+
10219
+ }, delay);
10220
+
10221
+ intervals[promise.$$intervalId] = deferred;
10222
+
10223
+ return promise;
10224
+ }
10225
+
10226
+
10227
+ /**
10228
+ * @ngdoc method
10229
+ * @name $interval#cancel
10230
+ *
10231
+ * @description
10232
+ * Cancels a task associated with the `promise`.
10233
+ *
10234
+ * @param {promise} promise returned by the `$interval` function.
10235
+ * @returns {boolean} Returns `true` if the task was successfully canceled.
10236
+ */
10237
+ interval.cancel = function(promise) {
10238
+ if (promise && promise.$$intervalId in intervals) {
10239
+ intervals[promise.$$intervalId].reject('canceled');
10240
+ $window.clearInterval(promise.$$intervalId);
10241
+ delete intervals[promise.$$intervalId];
10242
+ return true;
10243
+ }
10244
+ return false;
10245
+ };
10246
+
10247
+ return interval;
10248
+ }];
10249
+}
10250
+
10251
+/**
10252
+ * @ngdoc service
10253
+ * @name $locale
10254
+ *
10255
+ * @description
10256
+ * $locale service provides localization rules for various Angular components. As of right now the
10257
+ * only public api is:
10258
+ *
10259
+ * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)
10260
+ */
10261
+function $LocaleProvider(){
10262
+ this.$get = function() {
10263
+ return {
10264
+ id: 'en-us',
10265
+
10266
+ NUMBER_FORMATS: {
10267
+ DECIMAL_SEP: '.',
10268
+ GROUP_SEP: ',',
10269
+ PATTERNS: [
10270
+ { // Decimal Pattern
10271
+ minInt: 1,
10272
+ minFrac: 0,
10273
+ maxFrac: 3,
10274
+ posPre: '',
10275
+ posSuf: '',
10276
+ negPre: '-',
10277
+ negSuf: '',
10278
+ gSize: 3,
10279
+ lgSize: 3
10280
+ },{ //Currency Pattern
10281
+ minInt: 1,
10282
+ minFrac: 2,
10283
+ maxFrac: 2,
10284
+ posPre: '\u00A4',
10285
+ posSuf: '',
10286
+ negPre: '(\u00A4',
10287
+ negSuf: ')',
10288
+ gSize: 3,
10289
+ lgSize: 3
10290
+ }
10291
+ ],
10292
+ CURRENCY_SYM: '$'
10293
+ },
10294
+
10295
+ DATETIME_FORMATS: {
10296
+ MONTH:
10297
+ 'January,February,March,April,May,June,July,August,September,October,November,December'
10298
+ .split(','),
10299
+ SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),
10300
+ DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),
10301
+ SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),
10302
+ AMPMS: ['AM','PM'],
10303
+ medium: 'MMM d, y h:mm:ss a',
10304
+ short: 'M/d/yy h:mm a',
10305
+ fullDate: 'EEEE, MMMM d, y',
10306
+ longDate: 'MMMM d, y',
10307
+ mediumDate: 'MMM d, y',
10308
+ shortDate: 'M/d/yy',
10309
+ mediumTime: 'h:mm:ss a',
10310
+ shortTime: 'h:mm a'
10311
+ },
10312
+
10313
+ pluralCat: function(num) {
10314
+ if (num === 1) {
10315
+ return 'one';
10316
+ }
10317
+ return 'other';
10318
+ }
10319
+ };
10320
+ };
10321
+}
10322
+
10323
+var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/,
10324
+ DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};
10325
+var $locationMinErr = minErr('$location');
10326
+
10327
+
10328
+/**
10329
+ * Encode path using encodeUriSegment, ignoring forward slashes
10330
+ *
10331
+ * @param {string} path Path to encode
10332
+ * @returns {string}
10333
+ */
10334
+function encodePath(path) {
10335
+ var segments = path.split('/'),
10336
+ i = segments.length;
10337
+
10338
+ while (i--) {
10339
+ segments[i] = encodeUriSegment(segments[i]);
10340
+ }
10341
+
10342
+ return segments.join('/');
10343
+}
10344
+
10345
+function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
10346
+ var parsedUrl = urlResolve(absoluteUrl, appBase);
10347
+
10348
+ locationObj.$$protocol = parsedUrl.protocol;
10349
+ locationObj.$$host = parsedUrl.hostname;
10350
+ locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;
10351
+}
10352
+
10353
+
10354
+function parseAppUrl(relativeUrl, locationObj, appBase) {
10355
+ var prefixed = (relativeUrl.charAt(0) !== '/');
10356
+ if (prefixed) {
10357
+ relativeUrl = '/' + relativeUrl;
10358
+ }
10359
+ var match = urlResolve(relativeUrl, appBase);
10360
+ locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?
10361
+ match.pathname.substring(1) : match.pathname);
10362
+ locationObj.$$search = parseKeyValue(match.search);
10363
+ locationObj.$$hash = decodeURIComponent(match.hash);
10364
+
10365
+ // make sure path starts with '/';
10366
+ if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {
10367
+ locationObj.$$path = '/' + locationObj.$$path;
10368
+ }
10369
+}
10370
+
10371
+
10372
+/**
10373
+ *
10374
+ * @param {string} begin
10375
+ * @param {string} whole
10376
+ * @returns {string} returns text from whole after begin or undefined if it does not begin with
10377
+ * expected string.
10378
+ */
10379
+function beginsWith(begin, whole) {
10380
+ if (whole.indexOf(begin) === 0) {
10381
+ return whole.substr(begin.length);
10382
+ }
10383
+}
10384
+
10385
+
10386
+function stripHash(url) {
10387
+ var index = url.indexOf('#');
10388
+ return index == -1 ? url : url.substr(0, index);
10389
+}
10390
+
10391
+
10392
+function stripFile(url) {
10393
+ return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
10394
+}
10395
+
10396
+/* return the server only (scheme://host:port) */
10397
+function serverBase(url) {
10398
+ return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));
10399
+}
10400
+
10401
+
10402
+/**
10403
+ * LocationHtml5Url represents an url
10404
+ * This object is exposed as $location service when HTML5 mode is enabled and supported
10405
+ *
10406
+ * @constructor
10407
+ * @param {string} appBase application base URL
10408
+ * @param {string} basePrefix url path prefix
10409
+ */
10410
+function LocationHtml5Url(appBase, basePrefix) {
10411
+ this.$$html5 = true;
10412
+ basePrefix = basePrefix || '';
10413
+ var appBaseNoFile = stripFile(appBase);
10414
+ parseAbsoluteUrl(appBase, this, appBase);
10415
+
10416
+
10417
+ /**
10418
+ * Parse given html5 (regular) url string into properties
10419
+ * @param {string} newAbsoluteUrl HTML5 url
10420
+ * @private
10421
+ */
10422
+ this.$$parse = function(url) {
10423
+ var pathUrl = beginsWith(appBaseNoFile, url);
10424
+ if (!isString(pathUrl)) {
10425
+ throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url,
10426
+ appBaseNoFile);
10427
+ }
10428
+
10429
+ parseAppUrl(pathUrl, this, appBase);
10430
+
10431
+ if (!this.$$path) {
10432
+ this.$$path = '/';
10433
+ }
10434
+
10435
+ this.$$compose();
10436
+ };
10437
+
10438
+ /**
10439
+ * Compose url and update `absUrl` property
10440
+ * @private
10441
+ */
10442
+ this.$$compose = function() {
10443
+ var search = toKeyValue(this.$$search),
10444
+ hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
10445
+
10446
+ this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
10447
+ this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'
10448
+ };
10449
+
10450
+ this.$$parseLinkUrl = function(url, relHref) {
10451
+ if (relHref && relHref[0] === '#') {
10452
+ // special case for links to hash fragments:
10453
+ // keep the old url and only replace the hash fragment
10454
+ this.hash(relHref.slice(1));
10455
+ return true;
10456
+ }
10457
+ var appUrl, prevAppUrl;
10458
+ var rewrittenUrl;
10459
+
10460
+ if ( (appUrl = beginsWith(appBase, url)) !== undefined ) {
10461
+ prevAppUrl = appUrl;
10462
+ if ( (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ) {
10463
+ rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl);
10464
+ } else {
10465
+ rewrittenUrl = appBase + prevAppUrl;
10466
+ }
10467
+ } else if ( (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ) {
10468
+ rewrittenUrl = appBaseNoFile + appUrl;
10469
+ } else if (appBaseNoFile == url + '/') {
10470
+ rewrittenUrl = appBaseNoFile;
10471
+ }
10472
+ if (rewrittenUrl) {
10473
+ this.$$parse(rewrittenUrl);
10474
+ }
10475
+ return !!rewrittenUrl;
10476
+ };
10477
+}
10478
+
10479
+
10480
+/**
10481
+ * LocationHashbangUrl represents url
10482
+ * This object is exposed as $location service when developer doesn't opt into html5 mode.
10483
+ * It also serves as the base class for html5 mode fallback on legacy browsers.
10484
+ *
10485
+ * @constructor
10486
+ * @param {string} appBase application base URL
10487
+ * @param {string} hashPrefix hashbang prefix
10488
+ */
10489
+function LocationHashbangUrl(appBase, hashPrefix) {
10490
+ var appBaseNoFile = stripFile(appBase);
10491
+
10492
+ parseAbsoluteUrl(appBase, this, appBase);
10493
+
10494
+
10495
+ /**
10496
+ * Parse given hashbang url into properties
10497
+ * @param {string} url Hashbang url
10498
+ * @private
10499
+ */
10500
+ this.$$parse = function(url) {
10501
+ var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);
10502
+ var withoutHashUrl = withoutBaseUrl.charAt(0) == '#'
10503
+ ? beginsWith(hashPrefix, withoutBaseUrl)
10504
+ : (this.$$html5)
10505
+ ? withoutBaseUrl
10506
+ : '';
10507
+
10508
+ if (!isString(withoutHashUrl)) {
10509
+ throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url,
10510
+ hashPrefix);
10511
+ }
10512
+ parseAppUrl(withoutHashUrl, this, appBase);
10513
+
10514
+ this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
10515
+
10516
+ this.$$compose();
10517
+
10518
+ /*
10519
+ * In Windows, on an anchor node on documents loaded from
10520
+ * the filesystem, the browser will return a pathname
10521
+ * prefixed with the drive name ('/C:/path') when a
10522
+ * pathname without a drive is set:
10523
+ * * a.setAttribute('href', '/foo')
10524
+ * * a.pathname === '/C:/foo' //true
10525
+ *
10526
+ * Inside of Angular, we're always using pathnames that
10527
+ * do not include drive names for routing.
10528
+ */
10529
+ function removeWindowsDriveName (path, url, base) {
10530
+ /*
10531
+ Matches paths for file protocol on windows,
10532
+ such as /C:/foo/bar, and captures only /foo/bar.
10533
+ */
10534
+ var windowsFilePathExp = /^\/[A-Z]:(\/.*)/;
10535
+
10536
+ var firstPathSegmentMatch;
10537
+
10538
+ //Get the relative path from the input URL.
10539
+ if (url.indexOf(base) === 0) {
10540
+ url = url.replace(base, '');
10541
+ }
10542
+
10543
+ // The input URL intentionally contains a first path segment that ends with a colon.
10544
+ if (windowsFilePathExp.exec(url)) {
10545
+ return path;
10546
+ }
10547
+
10548
+ firstPathSegmentMatch = windowsFilePathExp.exec(path);
10549
+ return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;
10550
+ }
10551
+ };
10552
+
10553
+ /**
10554
+ * Compose hashbang url and update `absUrl` property
10555
+ * @private
10556
+ */
10557
+ this.$$compose = function() {
10558
+ var search = toKeyValue(this.$$search),
10559
+ hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
10560
+
10561
+ this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
10562
+ this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');
10563
+ };
10564
+
10565
+ this.$$parseLinkUrl = function(url, relHref) {
10566
+ if(stripHash(appBase) == stripHash(url)) {
10567
+ this.$$parse(url);
10568
+ return true;
10569
+ }
10570
+ return false;
10571
+ };
10572
+}
10573
+
10574
+
10575
+/**
10576
+ * LocationHashbangUrl represents url
10577
+ * This object is exposed as $location service when html5 history api is enabled but the browser
10578
+ * does not support it.
10579
+ *
10580
+ * @constructor
10581
+ * @param {string} appBase application base URL
10582
+ * @param {string} hashPrefix hashbang prefix
10583
+ */
10584
+function LocationHashbangInHtml5Url(appBase, hashPrefix) {
10585
+ this.$$html5 = true;
10586
+ LocationHashbangUrl.apply(this, arguments);
10587
+
10588
+ var appBaseNoFile = stripFile(appBase);
10589
+
10590
+ this.$$parseLinkUrl = function(url, relHref) {
10591
+ if (relHref && relHref[0] === '#') {
10592
+ // special case for links to hash fragments:
10593
+ // keep the old url and only replace the hash fragment
10594
+ this.hash(relHref.slice(1));
10595
+ return true;
10596
+ }
10597
+
10598
+ var rewrittenUrl;
10599
+ var appUrl;
10600
+
10601
+ if ( appBase == stripHash(url) ) {
10602
+ rewrittenUrl = url;
10603
+ } else if ( (appUrl = beginsWith(appBaseNoFile, url)) ) {
10604
+ rewrittenUrl = appBase + hashPrefix + appUrl;
10605
+ } else if ( appBaseNoFile === url + '/') {
10606
+ rewrittenUrl = appBaseNoFile;
10607
+ }
10608
+ if (rewrittenUrl) {
10609
+ this.$$parse(rewrittenUrl);
10610
+ }
10611
+ return !!rewrittenUrl;
10612
+ };
10613
+
10614
+ this.$$compose = function() {
10615
+ var search = toKeyValue(this.$$search),
10616
+ hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
10617
+
10618
+ this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
10619
+ // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'
10620
+ this.$$absUrl = appBase + hashPrefix + this.$$url;
10621
+ };
10622
+
10623
+}
10624
+
10625
+
10626
+var locationPrototype = {
10627
+
10628
+ /**
10629
+ * Are we in html5 mode?
10630
+ * @private
10631
+ */
10632
+ $$html5: false,
10633
+
10634
+ /**
10635
+ * Has any change been replacing?
10636
+ * @private
10637
+ */
10638
+ $$replace: false,
10639
+
10640
+ /**
10641
+ * @ngdoc method
10642
+ * @name $location#absUrl
10643
+ *
10644
+ * @description
10645
+ * This method is getter only.
10646
+ *
10647
+ * Return full url representation with all segments encoded according to rules specified in
10648
+ * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).
10649
+ *
10650
+ * @return {string} full url
10651
+ */
10652
+ absUrl: locationGetter('$$absUrl'),
10653
+
10654
+ /**
10655
+ * @ngdoc method
10656
+ * @name $location#url
10657
+ *
10658
+ * @description
10659
+ * This method is getter / setter.
10660
+ *
10661
+ * Return url (e.g. `/path?a=b#hash`) when called without any parameter.
10662
+ *
10663
+ * Change path, search and hash, when called with parameter and return `$location`.
10664
+ *
10665
+ * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)
10666
+ * @return {string} url
10667
+ */
10668
+ url: function(url) {
10669
+ if (isUndefined(url))
10670
+ return this.$$url;
10671
+
10672
+ var match = PATH_MATCH.exec(url);
10673
+ if (match[1]) this.path(decodeURIComponent(match[1]));
10674
+ if (match[2] || match[1]) this.search(match[3] || '');
10675
+ this.hash(match[5] || '');
10676
+
10677
+ return this;
10678
+ },
10679
+
10680
+ /**
10681
+ * @ngdoc method
10682
+ * @name $location#protocol
10683
+ *
10684
+ * @description
10685
+ * This method is getter only.
10686
+ *
10687
+ * Return protocol of current url.
10688
+ *
10689
+ * @return {string} protocol of current url
10690
+ */
10691
+ protocol: locationGetter('$$protocol'),
10692
+
10693
+ /**
10694
+ * @ngdoc method
10695
+ * @name $location#host
10696
+ *
10697
+ * @description
10698
+ * This method is getter only.
10699
+ *
10700
+ * Return host of current url.
10701
+ *
10702
+ * @return {string} host of current url.
10703
+ */
10704
+ host: locationGetter('$$host'),
10705
+
10706
+ /**
10707
+ * @ngdoc method
10708
+ * @name $location#port
10709
+ *
10710
+ * @description
10711
+ * This method is getter only.
10712
+ *
10713
+ * Return port of current url.
10714
+ *
10715
+ * @return {Number} port
10716
+ */
10717
+ port: locationGetter('$$port'),
10718
+
10719
+ /**
10720
+ * @ngdoc method
10721
+ * @name $location#path
10722
+ *
10723
+ * @description
10724
+ * This method is getter / setter.
10725
+ *
10726
+ * Return path of current url when called without any parameter.
10727
+ *
10728
+ * Change path when called with parameter and return `$location`.
10729
+ *
10730
+ * Note: Path should always begin with forward slash (/), this method will add the forward slash
10731
+ * if it is missing.
10732
+ *
10733
+ * @param {(string|number)=} path New path
10734
+ * @return {string} path
10735
+ */
10736
+ path: locationGetterSetter('$$path', function(path) {
10737
+ path = path !== null ? path.toString() : '';
10738
+ return path.charAt(0) == '/' ? path : '/' + path;
10739
+ }),
10740
+
10741
+ /**
10742
+ * @ngdoc method
10743
+ * @name $location#search
10744
+ *
10745
+ * @description
10746
+ * This method is getter / setter.
10747
+ *
10748
+ * Return search part (as object) of current url when called without any parameter.
10749
+ *
10750
+ * Change search part when called with parameter and return `$location`.
10751
+ *
10752
+ *
10753
+ * ```js
10754
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
10755
+ * var searchObject = $location.search();
10756
+ * // => {foo: 'bar', baz: 'xoxo'}
10757
+ *
10758
+ *
10759
+ * // set foo to 'yipee'
10760
+ * $location.search('foo', 'yipee');
10761
+ * // => $location
10762
+ * ```
10763
+ *
10764
+ * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or
10765
+ * hash object.
10766
+ *
10767
+ * When called with a single argument the method acts as a setter, setting the `search` component
10768
+ * of `$location` to the specified value.
10769
+ *
10770
+ * If the argument is a hash object containing an array of values, these values will be encoded
10771
+ * as duplicate search parameters in the url.
10772
+ *
10773
+ * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number, then `paramValue`
10774
+ * will override only a single search property.
10775
+ *
10776
+ * If `paramValue` is an array, it will override the property of the `search` component of
10777
+ * `$location` specified via the first argument.
10778
+ *
10779
+ * If `paramValue` is `null`, the property specified via the first argument will be deleted.
10780
+ *
10781
+ * If `paramValue` is `true`, the property specified via the first argument will be added with no
10782
+ * value nor trailing equal sign.
10783
+ *
10784
+ * @return {Object} If called with no arguments returns the parsed `search` object. If called with
10785
+ * one or more arguments returns `$location` object itself.
10786
+ */
10787
+ search: function(search, paramValue) {
10788
+ switch (arguments.length) {
10789
+ case 0:
10790
+ return this.$$search;
10791
+ case 1:
10792
+ if (isString(search) || isNumber(search)) {
10793
+ search = search.toString();
10794
+ this.$$search = parseKeyValue(search);
10795
+ } else if (isObject(search)) {
10796
+ search = copy(search, {});
10797
+ // remove object undefined or null properties
10798
+ forEach(search, function(value, key) {
10799
+ if (value == null) delete search[key];
10800
+ });
10801
+
10802
+ this.$$search = search;
10803
+ } else {
10804
+ throw $locationMinErr('isrcharg',
10805
+ 'The first argument of the `$location#search()` call must be a string or an object.');
10806
+ }
10807
+ break;
10808
+ default:
10809
+ if (isUndefined(paramValue) || paramValue === null) {
10810
+ delete this.$$search[search];
10811
+ } else {
10812
+ this.$$search[search] = paramValue;
10813
+ }
10814
+ }
10815
+
10816
+ this.$$compose();
10817
+ return this;
10818
+ },
10819
+
10820
+ /**
10821
+ * @ngdoc method
10822
+ * @name $location#hash
10823
+ *
10824
+ * @description
10825
+ * This method is getter / setter.
10826
+ *
10827
+ * Return hash fragment when called without any parameter.
10828
+ *
10829
+ * Change hash fragment when called with parameter and return `$location`.
10830
+ *
10831
+ * @param {(string|number)=} hash New hash fragment
10832
+ * @return {string} hash
10833
+ */
10834
+ hash: locationGetterSetter('$$hash', function(hash) {
10835
+ return hash !== null ? hash.toString() : '';
10836
+ }),
10837
+
10838
+ /**
10839
+ * @ngdoc method
10840
+ * @name $location#replace
10841
+ *
10842
+ * @description
10843
+ * If called, all changes to $location during current `$digest` will be replacing current history
10844
+ * record, instead of adding new one.
10845
+ */
10846
+ replace: function() {
10847
+ this.$$replace = true;
10848
+ return this;
10849
+ }
10850
+};
10851
+
10852
+forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function (Location) {
10853
+ Location.prototype = Object.create(locationPrototype);
10854
+
10855
+ /**
10856
+ * @ngdoc method
10857
+ * @name $location#state
10858
+ *
10859
+ * @description
10860
+ * This method is getter / setter.
10861
+ *
10862
+ * Return the history state object when called without any parameter.
10863
+ *
10864
+ * Change the history state object when called with one parameter and return `$location`.
10865
+ * The state object is later passed to `pushState` or `replaceState`.
10866
+ *
10867
+ * NOTE: This method is supported only in HTML5 mode and only in browsers supporting
10868
+ * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support
10869
+ * older browsers (like IE9 or Android < 4.0), don't use this method.
10870
+ *
10871
+ * @param {object=} state State object for pushState or replaceState
10872
+ * @return {object} state
10873
+ */
10874
+ Location.prototype.state = function(state) {
10875
+ if (!arguments.length)
10876
+ return this.$$state;
10877
+
10878
+ if (Location !== LocationHtml5Url || !this.$$html5) {
10879
+ throw $locationMinErr('nostate', 'History API state support is available only ' +
10880
+ 'in HTML5 mode and only in browsers supporting HTML5 History API');
10881
+ }
10882
+ // The user might modify `stateObject` after invoking `$location.state(stateObject)`
10883
+ // but we're changing the $$state reference to $browser.state() during the $digest
10884
+ // so the modification window is narrow.
10885
+ this.$$state = isUndefined(state) ? null : state;
10886
+
10887
+ return this;
10888
+ };
10889
+});
10890
+
10891
+
10892
+function locationGetter(property) {
10893
+ return function() {
10894
+ return this[property];
10895
+ };
10896
+}
10897
+
10898
+
10899
+function locationGetterSetter(property, preprocess) {
10900
+ return function(value) {
10901
+ if (isUndefined(value))
10902
+ return this[property];
10903
+
10904
+ this[property] = preprocess(value);
10905
+ this.$$compose();
10906
+
10907
+ return this;
10908
+ };
10909
+}
10910
+
10911
+
10912
+/**
10913
+ * @ngdoc service
10914
+ * @name $location
10915
+ *
10916
+ * @requires $rootElement
10917
+ *
10918
+ * @description
10919
+ * The $location service parses the URL in the browser address bar (based on the
10920
+ * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL
10921
+ * available to your application. Changes to the URL in the address bar are reflected into
10922
+ * $location service and changes to $location are reflected into the browser address bar.
10923
+ *
10924
+ * **The $location service:**
10925
+ *
10926
+ * - Exposes the current URL in the browser address bar, so you can
10927
+ * - Watch and observe the URL.
10928
+ * - Change the URL.
10929
+ * - Synchronizes the URL with the browser when the user
10930
+ * - Changes the address bar.
10931
+ * - Clicks the back or forward button (or clicks a History link).
10932
+ * - Clicks on a link.
10933
+ * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).
10934
+ *
10935
+ * For more information see {@link guide/$location Developer Guide: Using $location}
10936
+ */
10937
+
10938
+/**
10939
+ * @ngdoc provider
10940
+ * @name $locationProvider
10941
+ * @description
10942
+ * Use the `$locationProvider` to configure how the application deep linking paths are stored.
10943
+ */
10944
+function $LocationProvider(){
10945
+ var hashPrefix = '',
10946
+ html5Mode = {
10947
+ enabled: false,
10948
+ requireBase: true,
10949
+ rewriteLinks: true
10950
+ };
10951
+
10952
+ /**
10953
+ * @ngdoc method
10954
+ * @name $locationProvider#hashPrefix
10955
+ * @description
10956
+ * @param {string=} prefix Prefix for hash part (containing path and search)
10957
+ * @returns {*} current value if used as getter or itself (chaining) if used as setter
10958
+ */
10959
+ this.hashPrefix = function(prefix) {
10960
+ if (isDefined(prefix)) {
10961
+ hashPrefix = prefix;
10962
+ return this;
10963
+ } else {
10964
+ return hashPrefix;
10965
+ }
10966
+ };
10967
+
10968
+ /**
10969
+ * @ngdoc method
10970
+ * @name $locationProvider#html5Mode
10971
+ * @description
10972
+ * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value.
10973
+ * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported
10974
+ * properties:
10975
+ * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to
10976
+ * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not
10977
+ * support `pushState`.
10978
+ * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies
10979
+ * whether or not a <base> tag is required to be present. If `enabled` and `requireBase` are
10980
+ * true, and a base tag is not present, an error will be thrown when `$location` is injected.
10981
+ * See the {@link guide/$location $location guide for more information}
10982
+ * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled,
10983
+ * enables/disables url rewriting for relative links.
10984
+ *
10985
+ * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter
10986
+ */
10987
+ this.html5Mode = function(mode) {
10988
+ if (isBoolean(mode)) {
10989
+ html5Mode.enabled = mode;
10990
+ return this;
10991
+ } else if (isObject(mode)) {
10992
+
10993
+ if (isBoolean(mode.enabled)) {
10994
+ html5Mode.enabled = mode.enabled;
10995
+ }
10996
+
10997
+ if (isBoolean(mode.requireBase)) {
10998
+ html5Mode.requireBase = mode.requireBase;
10999
+ }
11000
+
11001
+ if (isBoolean(mode.rewriteLinks)) {
11002
+ html5Mode.rewriteLinks = mode.rewriteLinks;
11003
+ }
11004
+
11005
+ return this;
11006
+ } else {
11007
+ return html5Mode;
11008
+ }
11009
+ };
11010
+
11011
+ /**
11012
+ * @ngdoc event
11013
+ * @name $location#$locationChangeStart
11014
+ * @eventType broadcast on root scope
11015
+ * @description
11016
+ * Broadcasted before a URL will change.
11017
+ *
11018
+ * This change can be prevented by calling
11019
+ * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more
11020
+ * details about event object. Upon successful change
11021
+ * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.
11022
+ *
11023
+ * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when
11024
+ * the browser supports the HTML5 History API.
11025
+ *
11026
+ * @param {Object} angularEvent Synthetic event object.
11027
+ * @param {string} newUrl New URL
11028
+ * @param {string=} oldUrl URL that was before it was changed.
11029
+ * @param {string=} newState New history state object
11030
+ * @param {string=} oldState History state object that was before it was changed.
11031
+ */
11032
+
11033
+ /**
11034
+ * @ngdoc event
11035
+ * @name $location#$locationChangeSuccess
11036
+ * @eventType broadcast on root scope
11037
+ * @description
11038
+ * Broadcasted after a URL was changed.
11039
+ *
11040
+ * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when
11041
+ * the browser supports the HTML5 History API.
11042
+ *
11043
+ * @param {Object} angularEvent Synthetic event object.
11044
+ * @param {string} newUrl New URL
11045
+ * @param {string=} oldUrl URL that was before it was changed.
11046
+ * @param {string=} newState New history state object
11047
+ * @param {string=} oldState History state object that was before it was changed.
11048
+ */
11049
+
11050
+ this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',
11051
+ function( $rootScope, $browser, $sniffer, $rootElement) {
11052
+ var $location,
11053
+ LocationMode,
11054
+ baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''
11055
+ initialUrl = $browser.url(),
11056
+ appBase;
11057
+
11058
+ if (html5Mode.enabled) {
11059
+ if (!baseHref && html5Mode.requireBase) {
11060
+ throw $locationMinErr('nobase',
11061
+ "$location in HTML5 mode requires a <base> tag to be present!");
11062
+ }
11063
+ appBase = serverBase(initialUrl) + (baseHref || '/');
11064
+ LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;
11065
+ } else {
11066
+ appBase = stripHash(initialUrl);
11067
+ LocationMode = LocationHashbangUrl;
11068
+ }
11069
+ $location = new LocationMode(appBase, '#' + hashPrefix);
11070
+ $location.$$parseLinkUrl(initialUrl, initialUrl);
11071
+
11072
+ $location.$$state = $browser.state();
11073
+
11074
+ var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
11075
+
11076
+ function setBrowserUrlWithFallback(url, replace, state) {
11077
+ var oldUrl = $location.url();
11078
+ var oldState = $location.$$state;
11079
+ try {
11080
+ $browser.url(url, replace, state);
11081
+
11082
+ // Make sure $location.state() returns referentially identical (not just deeply equal)
11083
+ // state object; this makes possible quick checking if the state changed in the digest
11084
+ // loop. Checking deep equality would be too expensive.
11085
+ $location.$$state = $browser.state();
11086
+ } catch (e) {
11087
+ // Restore old values if pushState fails
11088
+ $location.url(oldUrl);
11089
+ $location.$$state = oldState;
11090
+
11091
+ throw e;
11092
+ }
11093
+ }
11094
+
11095
+ $rootElement.on('click', function(event) {
11096
+ // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
11097
+ // currently we open nice url link and redirect then
11098
+
11099
+ if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.which == 2) return;
11100
+
11101
+ var elm = jqLite(event.target);
11102
+
11103
+ // traverse the DOM up to find first A tag
11104
+ while (nodeName_(elm[0]) !== 'a') {
11105
+ // ignore rewriting if no A tag (reached root element, or no parent - removed from document)
11106
+ if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
11107
+ }
11108
+
11109
+ var absHref = elm.prop('href');
11110
+ // get the actual href attribute - see
11111
+ // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
11112
+ var relHref = elm.attr('href') || elm.attr('xlink:href');
11113
+
11114
+ if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {
11115
+ // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during
11116
+ // an animation.
11117
+ absHref = urlResolve(absHref.animVal).href;
11118
+ }
11119
+
11120
+ // Ignore when url is started with javascript: or mailto:
11121
+ if (IGNORE_URI_REGEXP.test(absHref)) return;
11122
+
11123
+ if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {
11124
+ if ($location.$$parseLinkUrl(absHref, relHref)) {
11125
+ // We do a preventDefault for all urls that are part of the angular application,
11126
+ // in html5mode and also without, so that we are able to abort navigation without
11127
+ // getting double entries in the location history.
11128
+ event.preventDefault();
11129
+ // update location manually
11130
+ if ($location.absUrl() != $browser.url()) {
11131
+ $rootScope.$apply();
11132
+ // hack to work around FF6 bug 684208 when scenario runner clicks on links
11133
+ window.angular['ff-684208-preventDefault'] = true;
11134
+ }
11135
+ }
11136
+ }
11137
+ });
11138
+
11139
+
11140
+ // rewrite hashbang url <> html5 url
11141
+ if ($location.absUrl() != initialUrl) {
11142
+ $browser.url($location.absUrl(), true);
11143
+ }
11144
+
11145
+ var initializing = true;
11146
+
11147
+ // update $location when $browser url changes
11148
+ $browser.onUrlChange(function(newUrl, newState) {
11149
+ $rootScope.$evalAsync(function() {
11150
+ var oldUrl = $location.absUrl();
11151
+ var oldState = $location.$$state;
11152
+
11153
+ $location.$$parse(newUrl);
11154
+ $location.$$state = newState;
11155
+ if ($rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
11156
+ newState, oldState).defaultPrevented) {
11157
+ $location.$$parse(oldUrl);
11158
+ $location.$$state = oldState;
11159
+ setBrowserUrlWithFallback(oldUrl, false, oldState);
11160
+ } else {
11161
+ initializing = false;
11162
+ afterLocationChange(oldUrl, oldState);
11163
+ }
11164
+ });
11165
+ if (!$rootScope.$$phase) $rootScope.$digest();
11166
+ });
11167
+
11168
+ // update browser
11169
+ $rootScope.$watch(function $locationWatch() {
11170
+ var oldUrl = $browser.url();
11171
+ var oldState = $browser.state();
11172
+ var currentReplace = $location.$$replace;
11173
+ var urlOrStateChanged = oldUrl !== $location.absUrl() ||
11174
+ ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
11175
+
11176
+ if (initializing || urlOrStateChanged) {
11177
+ initializing = false;
11178
+
11179
+ $rootScope.$evalAsync(function() {
11180
+ if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl,
11181
+ $location.$$state, oldState).defaultPrevented) {
11182
+ $location.$$parse(oldUrl);
11183
+ $location.$$state = oldState;
11184
+ } else {
11185
+ if (urlOrStateChanged) {
11186
+ setBrowserUrlWithFallback($location.absUrl(), currentReplace,
11187
+ oldState === $location.$$state ? null : $location.$$state);
11188
+ }
11189
+ afterLocationChange(oldUrl, oldState);
11190
+ }
11191
+ });
11192
+ }
11193
+
11194
+ $location.$$replace = false;
11195
+
11196
+ // we don't need to return anything because $evalAsync will make the digest loop dirty when
11197
+ // there is a change
11198
+ });
11199
+
11200
+ return $location;
11201
+
11202
+ function afterLocationChange(oldUrl, oldState) {
11203
+ $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl,
11204
+ $location.$$state, oldState);
11205
+ }
11206
+}];
11207
+}
11208
+
11209
+/**
11210
+ * @ngdoc service
11211
+ * @name $log
11212
+ * @requires $window
11213
+ *
11214
+ * @description
11215
+ * Simple service for logging. Default implementation safely writes the message
11216
+ * into the browser's console (if present).
11217
+ *
11218
+ * The main purpose of this service is to simplify debugging and troubleshooting.
11219
+ *
11220
+ * The default is to log `debug` messages. You can use
11221
+ * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.
11222
+ *
11223
+ * @example
11224
+ <example module="logExample">
11225
+ <file name="script.js">
11226
+ angular.module('logExample', [])
11227
+ .controller('LogController', ['$scope', '$log', function($scope, $log) {
11228
+ $scope.$log = $log;
11229
+ $scope.message = 'Hello World!';
11230
+ }]);
11231
+ </file>
11232
+ <file name="index.html">
11233
+ <div ng-controller="LogController">
11234
+ <p>Reload this page with open console, enter text and hit the log button...</p>
11235
+ Message:
11236
+ <input type="text" ng-model="message"/>
11237
+ <button ng-click="$log.log(message)">log</button>
11238
+ <button ng-click="$log.warn(message)">warn</button>
11239
+ <button ng-click="$log.info(message)">info</button>
11240
+ <button ng-click="$log.error(message)">error</button>
11241
+ </div>
11242
+ </file>
11243
+ </example>
11244
+ */
11245
+
11246
+/**
11247
+ * @ngdoc provider
11248
+ * @name $logProvider
11249
+ * @description
11250
+ * Use the `$logProvider` to configure how the application logs messages
11251
+ */
11252
+function $LogProvider(){
11253
+ var debug = true,
11254
+ self = this;
11255
+
11256
+ /**
11257
+ * @ngdoc method
11258
+ * @name $logProvider#debugEnabled
11259
+ * @description
11260
+ * @param {boolean=} flag enable or disable debug level messages
11261
+ * @returns {*} current value if used as getter or itself (chaining) if used as setter
11262
+ */
11263
+ this.debugEnabled = function(flag) {
11264
+ if (isDefined(flag)) {
11265
+ debug = flag;
11266
+ return this;
11267
+ } else {
11268
+ return debug;
11269
+ }
11270
+ };
11271
+
11272
+ this.$get = ['$window', function($window){
11273
+ return {
11274
+ /**
11275
+ * @ngdoc method
11276
+ * @name $log#log
11277
+ *
11278
+ * @description
11279
+ * Write a log message
11280
+ */
11281
+ log: consoleLog('log'),
11282
+
11283
+ /**
11284
+ * @ngdoc method
11285
+ * @name $log#info
11286
+ *
11287
+ * @description
11288
+ * Write an information message
11289
+ */
11290
+ info: consoleLog('info'),
11291
+
11292
+ /**
11293
+ * @ngdoc method
11294
+ * @name $log#warn
11295
+ *
11296
+ * @description
11297
+ * Write a warning message
11298
+ */
11299
+ warn: consoleLog('warn'),
11300
+
11301
+ /**
11302
+ * @ngdoc method
11303
+ * @name $log#error
11304
+ *
11305
+ * @description
11306
+ * Write an error message
11307
+ */
11308
+ error: consoleLog('error'),
11309
+
11310
+ /**
11311
+ * @ngdoc method
11312
+ * @name $log#debug
11313
+ *
11314
+ * @description
11315
+ * Write a debug message
11316
+ */
11317
+ debug: (function () {
11318
+ var fn = consoleLog('debug');
11319
+
11320
+ return function() {
11321
+ if (debug) {
11322
+ fn.apply(self, arguments);
11323
+ }
11324
+ };
11325
+ }())
11326
+ };
11327
+
11328
+ function formatError(arg) {
11329
+ if (arg instanceof Error) {
11330
+ if (arg.stack) {
11331
+ arg = (arg.message && arg.stack.indexOf(arg.message) === -1)
11332
+ ? 'Error: ' + arg.message + '\n' + arg.stack
11333
+ : arg.stack;
11334
+ } else if (arg.sourceURL) {
11335
+ arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line;
11336
+ }
11337
+ }
11338
+ return arg;
11339
+ }
11340
+
11341
+ function consoleLog(type) {
11342
+ var console = $window.console || {},
11343
+ logFn = console[type] || console.log || noop,
11344
+ hasApply = false;
11345
+
11346
+ // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.
11347
+ // The reason behind this is that console.log has type "object" in IE8...
11348
+ try {
11349
+ hasApply = !!logFn.apply;
11350
+ } catch (e) {}
11351
+
11352
+ if (hasApply) {
11353
+ return function() {
11354
+ var args = [];
11355
+ forEach(arguments, function(arg) {
11356
+ args.push(formatError(arg));
11357
+ });
11358
+ return logFn.apply(console, args);
11359
+ };
11360
+ }
11361
+
11362
+ // we are IE which either doesn't have window.console => this is noop and we do nothing,
11363
+ // or we are IE where console.log doesn't have apply so we log at least first 2 args
11364
+ return function(arg1, arg2) {
11365
+ logFn(arg1, arg2 == null ? '' : arg2);
11366
+ };
11367
+ }
11368
+ }];
11369
+}
11370
+
11371
+var $parseMinErr = minErr('$parse');
11372
+
11373
+// Sandboxing Angular Expressions
11374
+// ------------------------------
11375
+// Angular expressions are generally considered safe because these expressions only have direct
11376
+// access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by
11377
+// obtaining a reference to native JS functions such as the Function constructor.
11378
+//
11379
+// As an example, consider the following Angular expression:
11380
+//
11381
+// {}.toString.constructor('alert("evil JS code")')
11382
+//
11383
+// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
11384
+// against the expression language, but not to prevent exploits that were enabled by exposing
11385
+// sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good
11386
+// practice and therefore we are not even trying to protect against interaction with an object
11387
+// explicitly exposed in this way.
11388
+//
11389
+// In general, it is not possible to access a Window object from an angular expression unless a
11390
+// window or some DOM object that has a reference to window is published onto a Scope.
11391
+// Similarly we prevent invocations of function known to be dangerous, as well as assignments to
11392
+// native objects.
11393
+
11394
+
11395
+function ensureSafeMemberName(name, fullExpression) {
11396
+ if (name === "__defineGetter__" || name === "__defineSetter__"
11397
+ || name === "__lookupGetter__" || name === "__lookupSetter__"
11398
+ || name === "__proto__") {
11399
+ throw $parseMinErr('isecfld',
11400
+ 'Attempting to access a disallowed field in Angular expressions! '
11401
+ +'Expression: {0}', fullExpression);
11402
+ }
11403
+ return name;
11404
+}
11405
+
11406
+function ensureSafeObject(obj, fullExpression) {
11407
+ // nifty check if obj is Function that is fast and works across iframes and other contexts
11408
+ if (obj) {
11409
+ if (obj.constructor === obj) {
11410
+ throw $parseMinErr('isecfn',
11411
+ 'Referencing Function in Angular expressions is disallowed! Expression: {0}',
11412
+ fullExpression);
11413
+ } else if (// isWindow(obj)
11414
+ obj.window === obj) {
11415
+ throw $parseMinErr('isecwindow',
11416
+ 'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
11417
+ fullExpression);
11418
+ } else if (// isElement(obj)
11419
+ obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {
11420
+ throw $parseMinErr('isecdom',
11421
+ 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
11422
+ fullExpression);
11423
+ } else if (// block Object so that we can't get hold of dangerous Object.* methods
11424
+ obj === Object) {
11425
+ throw $parseMinErr('isecobj',
11426
+ 'Referencing Object in Angular expressions is disallowed! Expression: {0}',
11427
+ fullExpression);
11428
+ }
11429
+ }
11430
+ return obj;
11431
+}
11432
+
11433
+var CALL = Function.prototype.call;
11434
+var APPLY = Function.prototype.apply;
11435
+var BIND = Function.prototype.bind;
11436
+
11437
+function ensureSafeFunction(obj, fullExpression) {
11438
+ if (obj) {
11439
+ if (obj.constructor === obj) {
11440
+ throw $parseMinErr('isecfn',
11441
+ 'Referencing Function in Angular expressions is disallowed! Expression: {0}',
11442
+ fullExpression);
11443
+ } else if (obj === CALL || obj === APPLY || obj === BIND) {
11444
+ throw $parseMinErr('isecff',
11445
+ 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',
11446
+ fullExpression);
11447
+ }
11448
+ }
11449
+}
11450
+
11451
+//Keyword constants
11452
+var CONSTANTS = createMap();
11453
+forEach({
11454
+ 'null': function() { return null; },
11455
+ 'true': function() { return true; },
11456
+ 'false': function() { return false; },
11457
+ 'undefined': function() {}
11458
+}, function(constantGetter, name) {
11459
+ constantGetter.constant = constantGetter.literal = constantGetter.sharedGetter = true;
11460
+ CONSTANTS[name] = constantGetter;
11461
+});
11462
+
11463
+//Not quite a constant, but can be lex/parsed the same
11464
+CONSTANTS['this'] = function(self) { return self; };
11465
+CONSTANTS['this'].sharedGetter = true;
11466
+
11467
+
11468
+//Operators - will be wrapped by binaryFn/unaryFn/assignment/filter
11469
+var OPERATORS = extend(createMap(), {
11470
+ '+':function(self, locals, a,b){
11471
+ a=a(self, locals); b=b(self, locals);
11472
+ if (isDefined(a)) {
11473
+ if (isDefined(b)) {
11474
+ return a + b;
11475
+ }
11476
+ return a;
11477
+ }
11478
+ return isDefined(b)?b:undefined;},
11479
+ '-':function(self, locals, a,b){
11480
+ a=a(self, locals); b=b(self, locals);
11481
+ return (isDefined(a)?a:0)-(isDefined(b)?b:0);
11482
+ },
11483
+ '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);},
11484
+ '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);},
11485
+ '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},
11486
+ '===':function(self, locals, a, b){return a(self, locals)===b(self, locals);},
11487
+ '!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);},
11488
+ '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},
11489
+ '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},
11490
+ '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},
11491
+ '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);},
11492
+ '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);},
11493
+ '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);},
11494
+ '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);},
11495
+ '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);},
11496
+ '!':function(self, locals, a){return !a(self, locals);},
11497
+
11498
+ //Tokenized as operators but parsed as assignment/filters
11499
+ '=':true,
11500
+ '|':true
11501
+});
11502
+var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'};
11503
+
11504
+
11505
+/////////////////////////////////////////
11506
+
11507
+
11508
+/**
11509
+ * @constructor
11510
+ */
11511
+var Lexer = function (options) {
11512
+ this.options = options;
11513
+};
11514
+
11515
+Lexer.prototype = {
11516
+ constructor: Lexer,
11517
+
11518
+ lex: function (text) {
11519
+ this.text = text;
11520
+ this.index = 0;
11521
+ this.ch = undefined;
11522
+ this.tokens = [];
11523
+
11524
+ while (this.index < this.text.length) {
11525
+ this.ch = this.text.charAt(this.index);
11526
+ if (this.is('"\'')) {
11527
+ this.readString(this.ch);
11528
+ } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) {
11529
+ this.readNumber();
11530
+ } else if (this.isIdent(this.ch)) {
11531
+ this.readIdent();
11532
+ } else if (this.is('(){}[].,;:?')) {
11533
+ this.tokens.push({
11534
+ index: this.index,
11535
+ text: this.ch
11536
+ });
11537
+ this.index++;
11538
+ } else if (this.isWhitespace(this.ch)) {
11539
+ this.index++;
11540
+ } else {
11541
+ var ch2 = this.ch + this.peek();
11542
+ var ch3 = ch2 + this.peek(2);
11543
+ var fn = OPERATORS[this.ch];
11544
+ var fn2 = OPERATORS[ch2];
11545
+ var fn3 = OPERATORS[ch3];
11546
+ if (fn3) {
11547
+ this.tokens.push({index: this.index, text: ch3, fn: fn3});
11548
+ this.index += 3;
11549
+ } else if (fn2) {
11550
+ this.tokens.push({index: this.index, text: ch2, fn: fn2});
11551
+ this.index += 2;
11552
+ } else if (fn) {
11553
+ this.tokens.push({
11554
+ index: this.index,
11555
+ text: this.ch,
11556
+ fn: fn
11557
+ });
11558
+ this.index += 1;
11559
+ } else {
11560
+ this.throwError('Unexpected next character ', this.index, this.index + 1);
11561
+ }
11562
+ }
11563
+ }
11564
+ return this.tokens;
11565
+ },
11566
+
11567
+ is: function(chars) {
11568
+ return chars.indexOf(this.ch) !== -1;
11569
+ },
11570
+
11571
+ peek: function(i) {
11572
+ var num = i || 1;
11573
+ return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;
11574
+ },
11575
+
11576
+ isNumber: function(ch) {
11577
+ return ('0' <= ch && ch <= '9');
11578
+ },
11579
+
11580
+ isWhitespace: function(ch) {
11581
+ // IE treats non-breaking space as \u00A0
11582
+ return (ch === ' ' || ch === '\r' || ch === '\t' ||
11583
+ ch === '\n' || ch === '\v' || ch === '\u00A0');
11584
+ },
11585
+
11586
+ isIdent: function(ch) {
11587
+ return ('a' <= ch && ch <= 'z' ||
11588
+ 'A' <= ch && ch <= 'Z' ||
11589
+ '_' === ch || ch === '$');
11590
+ },
11591
+
11592
+ isExpOperator: function(ch) {
11593
+ return (ch === '-' || ch === '+' || this.isNumber(ch));
11594
+ },
11595
+
11596
+ throwError: function(error, start, end) {
11597
+ end = end || this.index;
11598
+ var colStr = (isDefined(start)
11599
+ ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']'
11600
+ : ' ' + end);
11601
+ throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',
11602
+ error, colStr, this.text);
11603
+ },
11604
+
11605
+ readNumber: function() {
11606
+ var number = '';
11607
+ var start = this.index;
11608
+ while (this.index < this.text.length) {
11609
+ var ch = lowercase(this.text.charAt(this.index));
11610
+ if (ch == '.' || this.isNumber(ch)) {
11611
+ number += ch;
11612
+ } else {
11613
+ var peekCh = this.peek();
11614
+ if (ch == 'e' && this.isExpOperator(peekCh)) {
11615
+ number += ch;
11616
+ } else if (this.isExpOperator(ch) &&
11617
+ peekCh && this.isNumber(peekCh) &&
11618
+ number.charAt(number.length - 1) == 'e') {
11619
+ number += ch;
11620
+ } else if (this.isExpOperator(ch) &&
11621
+ (!peekCh || !this.isNumber(peekCh)) &&
11622
+ number.charAt(number.length - 1) == 'e') {
11623
+ this.throwError('Invalid exponent');
11624
+ } else {
11625
+ break;
11626
+ }
11627
+ }
11628
+ this.index++;
11629
+ }
11630
+ number = 1 * number;
11631
+ this.tokens.push({
11632
+ index: start,
11633
+ text: number,
11634
+ constant: true,
11635
+ fn: function() { return number; }
11636
+ });
11637
+ },
11638
+
11639
+ readIdent: function() {
11640
+ var expression = this.text;
11641
+
11642
+ var ident = '';
11643
+ var start = this.index;
11644
+
11645
+ var lastDot, peekIndex, methodName, ch;
11646
+
11647
+ while (this.index < this.text.length) {
11648
+ ch = this.text.charAt(this.index);
11649
+ if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) {
11650
+ if (ch === '.') lastDot = this.index;
11651
+ ident += ch;
11652
+ } else {
11653
+ break;
11654
+ }
11655
+ this.index++;
11656
+ }
11657
+
11658
+ //check if the identifier ends with . and if so move back one char
11659
+ if (lastDot && ident[ident.length - 1] === '.') {
11660
+ this.index--;
11661
+ ident = ident.slice(0, -1);
11662
+ lastDot = ident.lastIndexOf('.');
11663
+ if (lastDot === -1) {
11664
+ lastDot = undefined;
11665
+ }
11666
+ }
11667
+
11668
+ //check if this is not a method invocation and if it is back out to last dot
11669
+ if (lastDot) {
11670
+ peekIndex = this.index;
11671
+ while (peekIndex < this.text.length) {
11672
+ ch = this.text.charAt(peekIndex);
11673
+ if (ch === '(') {
11674
+ methodName = ident.substr(lastDot - start + 1);
11675
+ ident = ident.substr(0, lastDot - start);
11676
+ this.index = peekIndex;
11677
+ break;
11678
+ }
11679
+ if (this.isWhitespace(ch)) {
11680
+ peekIndex++;
11681
+ } else {
11682
+ break;
11683
+ }
11684
+ }
11685
+ }
11686
+
11687
+ this.tokens.push({
11688
+ index: start,
11689
+ text: ident,
11690
+ fn: CONSTANTS[ident] || getterFn(ident, this.options, expression)
11691
+ });
11692
+
11693
+ if (methodName) {
11694
+ this.tokens.push({
11695
+ index: lastDot,
11696
+ text: '.'
11697
+ });
11698
+ this.tokens.push({
11699
+ index: lastDot + 1,
11700
+ text: methodName
11701
+ });
11702
+ }
11703
+ },
11704
+
11705
+ readString: function(quote) {
11706
+ var start = this.index;
11707
+ this.index++;
11708
+ var string = '';
11709
+ var rawString = quote;
11710
+ var escape = false;
11711
+ while (this.index < this.text.length) {
11712
+ var ch = this.text.charAt(this.index);
11713
+ rawString += ch;
11714
+ if (escape) {
11715
+ if (ch === 'u') {
11716
+ var hex = this.text.substring(this.index + 1, this.index + 5);
11717
+ if (!hex.match(/[\da-f]{4}/i))
11718
+ this.throwError('Invalid unicode escape [\\u' + hex + ']');
11719
+ this.index += 4;
11720
+ string += String.fromCharCode(parseInt(hex, 16));
11721
+ } else {
11722
+ var rep = ESCAPE[ch];
11723
+ string = string + (rep || ch);
11724
+ }
11725
+ escape = false;
11726
+ } else if (ch === '\\') {
11727
+ escape = true;
11728
+ } else if (ch === quote) {
11729
+ this.index++;
11730
+ this.tokens.push({
11731
+ index: start,
11732
+ text: rawString,
11733
+ string: string,
11734
+ constant: true,
11735
+ fn: function() { return string; }
11736
+ });
11737
+ return;
11738
+ } else {
11739
+ string += ch;
11740
+ }
11741
+ this.index++;
11742
+ }
11743
+ this.throwError('Unterminated quote', start);
11744
+ }
11745
+};
11746
+
11747
+
11748
+function isConstant(exp) {
11749
+ return exp.constant;
11750
+}
11751
+
11752
+/**
11753
+ * @constructor
11754
+ */
11755
+var Parser = function (lexer, $filter, options) {
11756
+ this.lexer = lexer;
11757
+ this.$filter = $filter;
11758
+ this.options = options;
11759
+};
11760
+
11761
+Parser.ZERO = extend(function () {
11762
+ return 0;
11763
+}, {
11764
+ sharedGetter: true,
11765
+ constant: true
11766
+});
11767
+
11768
+Parser.prototype = {
11769
+ constructor: Parser,
11770
+
11771
+ parse: function (text) {
11772
+ this.text = text;
11773
+ this.tokens = this.lexer.lex(text);
11774
+
11775
+ var value = this.statements();
11776
+
11777
+ if (this.tokens.length !== 0) {
11778
+ this.throwError('is an unexpected token', this.tokens[0]);
11779
+ }
11780
+
11781
+ value.literal = !!value.literal;
11782
+ value.constant = !!value.constant;
11783
+
11784
+ return value;
11785
+ },
11786
+
11787
+ primary: function () {
11788
+ var primary;
11789
+ if (this.expect('(')) {
11790
+ primary = this.filterChain();
11791
+ this.consume(')');
11792
+ } else if (this.expect('[')) {
11793
+ primary = this.arrayDeclaration();
11794
+ } else if (this.expect('{')) {
11795
+ primary = this.object();
11796
+ } else {
11797
+ var token = this.expect();
11798
+ primary = token.fn;
11799
+ if (!primary) {
11800
+ this.throwError('not a primary expression', token);
11801
+ }
11802
+ if (token.constant) {
11803
+ primary.constant = true;
11804
+ primary.literal = true;
11805
+ }
11806
+ }
11807
+
11808
+ var next, context;
11809
+ while ((next = this.expect('(', '[', '.'))) {
11810
+ if (next.text === '(') {
11811
+ primary = this.functionCall(primary, context);
11812
+ context = null;
11813
+ } else if (next.text === '[') {
11814
+ context = primary;
11815
+ primary = this.objectIndex(primary);
11816
+ } else if (next.text === '.') {
11817
+ context = primary;
11818
+ primary = this.fieldAccess(primary);
11819
+ } else {
11820
+ this.throwError('IMPOSSIBLE');
11821
+ }
11822
+ }
11823
+ return primary;
11824
+ },
11825
+
11826
+ throwError: function(msg, token) {
11827
+ throw $parseMinErr('syntax',
11828
+ 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].',
11829
+ token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));
11830
+ },
11831
+
11832
+ peekToken: function() {
11833
+ if (this.tokens.length === 0)
11834
+ throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);
11835
+ return this.tokens[0];
11836
+ },
11837
+
11838
+ peek: function(e1, e2, e3, e4) {
11839
+ if (this.tokens.length > 0) {
11840
+ var token = this.tokens[0];
11841
+ var t = token.text;
11842
+ if (t === e1 || t === e2 || t === e3 || t === e4 ||
11843
+ (!e1 && !e2 && !e3 && !e4)) {
11844
+ return token;
11845
+ }
11846
+ }
11847
+ return false;
11848
+ },
11849
+
11850
+ expect: function(e1, e2, e3, e4){
11851
+ var token = this.peek(e1, e2, e3, e4);
11852
+ if (token) {
11853
+ this.tokens.shift();
11854
+ return token;
11855
+ }
11856
+ return false;
11857
+ },
11858
+
11859
+ consume: function(e1){
11860
+ if (!this.expect(e1)) {
11861
+ this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());
11862
+ }
11863
+ },
11864
+
11865
+ unaryFn: function(fn, right) {
11866
+ return extend(function $parseUnaryFn(self, locals) {
11867
+ return fn(self, locals, right);
11868
+ }, {
11869
+ constant:right.constant,
11870
+ inputs: [right]
11871
+ });
11872
+ },
11873
+
11874
+ binaryFn: function(left, fn, right, isBranching) {
11875
+ return extend(function $parseBinaryFn(self, locals) {
11876
+ return fn(self, locals, left, right);
11877
+ }, {
11878
+ constant: left.constant && right.constant,
11879
+ inputs: !isBranching && [left, right]
11880
+ });
11881
+ },
11882
+
11883
+ statements: function() {
11884
+ var statements = [];
11885
+ while (true) {
11886
+ if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))
11887
+ statements.push(this.filterChain());
11888
+ if (!this.expect(';')) {
11889
+ // optimize for the common case where there is only one statement.
11890
+ // TODO(size): maybe we should not support multiple statements?
11891
+ return (statements.length === 1)
11892
+ ? statements[0]
11893
+ : function $parseStatements(self, locals) {
11894
+ var value;
11895
+ for (var i = 0, ii = statements.length; i < ii; i++) {
11896
+ value = statements[i](self, locals);
11897
+ }
11898
+ return value;
11899
+ };
11900
+ }
11901
+ }
11902
+ },
11903
+
11904
+ filterChain: function() {
11905
+ var left = this.expression();
11906
+ var token;
11907
+ while ((token = this.expect('|'))) {
11908
+ left = this.filter(left);
11909
+ }
11910
+ return left;
11911
+ },
11912
+
11913
+ filter: function(inputFn) {
11914
+ var token = this.expect();
11915
+ var fn = this.$filter(token.text);
11916
+ var argsFn;
11917
+ var args;
11918
+
11919
+ if (this.peek(':')) {
11920
+ argsFn = [];
11921
+ args = []; // we can safely reuse the array
11922
+ while (this.expect(':')) {
11923
+ argsFn.push(this.expression());
11924
+ }
11925
+ }
11926
+
11927
+ var inputs = [inputFn].concat(argsFn || []);
11928
+
11929
+ return extend(function $parseFilter(self, locals) {
11930
+ var input = inputFn(self, locals);
11931
+ if (args) {
11932
+ args[0] = input;
11933
+
11934
+ var i = argsFn.length;
11935
+ while (i--) {
11936
+ args[i + 1] = argsFn[i](self, locals);
11937
+ }
11938
+
11939
+ return fn.apply(undefined, args);
11940
+ }
11941
+
11942
+ return fn(input);
11943
+ }, {
11944
+ constant: !fn.$stateful && inputs.every(isConstant),
11945
+ inputs: !fn.$stateful && inputs
11946
+ });
11947
+ },
11948
+
11949
+ expression: function() {
11950
+ return this.assignment();
11951
+ },
11952
+
11953
+ assignment: function() {
11954
+ var left = this.ternary();
11955
+ var right;
11956
+ var token;
11957
+ if ((token = this.expect('='))) {
11958
+ if (!left.assign) {
11959
+ this.throwError('implies assignment but [' +
11960
+ this.text.substring(0, token.index) + '] can not be assigned to', token);
11961
+ }
11962
+ right = this.ternary();
11963
+ return extend(function $parseAssignment(scope, locals) {
11964
+ return left.assign(scope, right(scope, locals), locals);
11965
+ }, {
11966
+ inputs: [left, right]
11967
+ });
11968
+ }
11969
+ return left;
11970
+ },
11971
+
11972
+ ternary: function() {
11973
+ var left = this.logicalOR();
11974
+ var middle;
11975
+ var token;
11976
+ if ((token = this.expect('?'))) {
11977
+ middle = this.assignment();
11978
+ if ((token = this.expect(':'))) {
11979
+ var right = this.assignment();
11980
+
11981
+ return extend(function $parseTernary(self, locals){
11982
+ return left(self, locals) ? middle(self, locals) : right(self, locals);
11983
+ }, {
11984
+ constant: left.constant && middle.constant && right.constant
11985
+ });
11986
+
11987
+ } else {
11988
+ this.throwError('expected :', token);
11989
+ }
11990
+ }
11991
+
11992
+ return left;
11993
+ },
11994
+
11995
+ logicalOR: function() {
11996
+ var left = this.logicalAND();
11997
+ var token;
11998
+ while ((token = this.expect('||'))) {
11999
+ left = this.binaryFn(left, token.fn, this.logicalAND(), true);
12000
+ }
12001
+ return left;
12002
+ },
12003
+
12004
+ logicalAND: function() {
12005
+ var left = this.equality();
12006
+ var token;
12007
+ if ((token = this.expect('&&'))) {
12008
+ left = this.binaryFn(left, token.fn, this.logicalAND(), true);
12009
+ }
12010
+ return left;
12011
+ },
12012
+
12013
+ equality: function() {
12014
+ var left = this.relational();
12015
+ var token;
12016
+ if ((token = this.expect('==','!=','===','!=='))) {
12017
+ left = this.binaryFn(left, token.fn, this.equality());
12018
+ }
12019
+ return left;
12020
+ },
12021
+
12022
+ relational: function() {
12023
+ var left = this.additive();
12024
+ var token;
12025
+ if ((token = this.expect('<', '>', '<=', '>='))) {
12026
+ left = this.binaryFn(left, token.fn, this.relational());
12027
+ }
12028
+ return left;
12029
+ },
12030
+
12031
+ additive: function() {
12032
+ var left = this.multiplicative();
12033
+ var token;
12034
+ while ((token = this.expect('+','-'))) {
12035
+ left = this.binaryFn(left, token.fn, this.multiplicative());
12036
+ }
12037
+ return left;
12038
+ },
12039
+
12040
+ multiplicative: function() {
12041
+ var left = this.unary();
12042
+ var token;
12043
+ while ((token = this.expect('*','/','%'))) {
12044
+ left = this.binaryFn(left, token.fn, this.unary());
12045
+ }
12046
+ return left;
12047
+ },
12048
+
12049
+ unary: function() {
12050
+ var token;
12051
+ if (this.expect('+')) {
12052
+ return this.primary();
12053
+ } else if ((token = this.expect('-'))) {
12054
+ return this.binaryFn(Parser.ZERO, token.fn, this.unary());
12055
+ } else if ((token = this.expect('!'))) {
12056
+ return this.unaryFn(token.fn, this.unary());
12057
+ } else {
12058
+ return this.primary();
12059
+ }
12060
+ },
12061
+
12062
+ fieldAccess: function(object) {
12063
+ var expression = this.text;
12064
+ var field = this.expect().text;
12065
+ var getter = getterFn(field, this.options, expression);
12066
+
12067
+ return extend(function $parseFieldAccess(scope, locals, self) {
12068
+ return getter(self || object(scope, locals));
12069
+ }, {
12070
+ assign: function(scope, value, locals) {
12071
+ var o = object(scope, locals);
12072
+ if (!o) object.assign(scope, o = {});
12073
+ return setter(o, field, value, expression);
12074
+ }
12075
+ });
12076
+ },
12077
+
12078
+ objectIndex: function(obj) {
12079
+ var expression = this.text;
12080
+
12081
+ var indexFn = this.expression();
12082
+ this.consume(']');
12083
+
12084
+ return extend(function $parseObjectIndex(self, locals) {
12085
+ var o = obj(self, locals),
12086
+ i = indexFn(self, locals),
12087
+ v;
12088
+
12089
+ ensureSafeMemberName(i, expression);
12090
+ if (!o) return undefined;
12091
+ v = ensureSafeObject(o[i], expression);
12092
+ return v;
12093
+ }, {
12094
+ assign: function(self, value, locals) {
12095
+ var key = ensureSafeMemberName(indexFn(self, locals), expression);
12096
+ // prevent overwriting of Function.constructor which would break ensureSafeObject check
12097
+ var o = ensureSafeObject(obj(self, locals), expression);
12098
+ if (!o) obj.assign(self, o = {});
12099
+ return o[key] = value;
12100
+ }
12101
+ });
12102
+ },
12103
+
12104
+ functionCall: function(fnGetter, contextGetter) {
12105
+ var argsFn = [];
12106
+ if (this.peekToken().text !== ')') {
12107
+ do {
12108
+ argsFn.push(this.expression());
12109
+ } while (this.expect(','));
12110
+ }
12111
+ this.consume(')');
12112
+
12113
+ var expressionText = this.text;
12114
+ // we can safely reuse the array across invocations
12115
+ var args = argsFn.length ? [] : null;
12116
+
12117
+ return function $parseFunctionCall(scope, locals) {
12118
+ var context = contextGetter ? contextGetter(scope, locals) : scope;
12119
+ var fn = fnGetter(scope, locals, context) || noop;
12120
+
12121
+ if (args) {
12122
+ var i = argsFn.length;
12123
+ while (i--) {
12124
+ args[i] = ensureSafeObject(argsFn[i](scope, locals), expressionText);
12125
+ }
12126
+ }
12127
+
12128
+ ensureSafeObject(context, expressionText);
12129
+ ensureSafeFunction(fn, expressionText);
12130
+
12131
+ // IE stupidity! (IE doesn't have apply for some native functions)
12132
+ var v = fn.apply
12133
+ ? fn.apply(context, args)
12134
+ : fn(args[0], args[1], args[2], args[3], args[4]);
12135
+
12136
+ return ensureSafeObject(v, expressionText);
12137
+ };
12138
+ },
12139
+
12140
+ // This is used with json array declaration
12141
+ arrayDeclaration: function () {
12142
+ var elementFns = [];
12143
+ if (this.peekToken().text !== ']') {
12144
+ do {
12145
+ if (this.peek(']')) {
12146
+ // Support trailing commas per ES5.1.
12147
+ break;
12148
+ }
12149
+ var elementFn = this.expression();
12150
+ elementFns.push(elementFn);
12151
+ } while (this.expect(','));
12152
+ }
12153
+ this.consume(']');
12154
+
12155
+ return extend(function $parseArrayLiteral(self, locals) {
12156
+ var array = [];
12157
+ for (var i = 0, ii = elementFns.length; i < ii; i++) {
12158
+ array.push(elementFns[i](self, locals));
12159
+ }
12160
+ return array;
12161
+ }, {
12162
+ literal: true,
12163
+ constant: elementFns.every(isConstant),
12164
+ inputs: elementFns
12165
+ });
12166
+ },
12167
+
12168
+ object: function () {
12169
+ var keys = [], valueFns = [];
12170
+ if (this.peekToken().text !== '}') {
12171
+ do {
12172
+ if (this.peek('}')) {
12173
+ // Support trailing commas per ES5.1.
12174
+ break;
12175
+ }
12176
+ var token = this.expect();
12177
+ keys.push(token.string || token.text);
12178
+ this.consume(':');
12179
+ var value = this.expression();
12180
+ valueFns.push(value);
12181
+ } while (this.expect(','));
12182
+ }
12183
+ this.consume('}');
12184
+
12185
+ return extend(function $parseObjectLiteral(self, locals) {
12186
+ var object = {};
12187
+ for (var i = 0, ii = valueFns.length; i < ii; i++) {
12188
+ object[keys[i]] = valueFns[i](self, locals);
12189
+ }
12190
+ return object;
12191
+ }, {
12192
+ literal: true,
12193
+ constant: valueFns.every(isConstant),
12194
+ inputs: valueFns
12195
+ });
12196
+ }
12197
+};
12198
+
12199
+
12200
+//////////////////////////////////////////////////
12201
+// Parser helper functions
12202
+//////////////////////////////////////////////////
12203
+
12204
+function setter(obj, path, setValue, fullExp) {
12205
+ ensureSafeObject(obj, fullExp);
12206
+
12207
+ var element = path.split('.'), key;
12208
+ for (var i = 0; element.length > 1; i++) {
12209
+ key = ensureSafeMemberName(element.shift(), fullExp);
12210
+ var propertyObj = ensureSafeObject(obj[key], fullExp);
12211
+ if (!propertyObj) {
12212
+ propertyObj = {};
12213
+ obj[key] = propertyObj;
12214
+ }
12215
+ obj = propertyObj;
12216
+ }
12217
+ key = ensureSafeMemberName(element.shift(), fullExp);
12218
+ ensureSafeObject(obj[key], fullExp);
12219
+ obj[key] = setValue;
12220
+ return setValue;
12221
+}
12222
+
12223
+var getterFnCache = createMap();
12224
+
12225
+/**
12226
+ * Implementation of the "Black Hole" variant from:
12227
+ * - http://jsperf.com/angularjs-parse-getter/4
12228
+ * - http://jsperf.com/path-evaluation-simplified/7
12229
+ */
12230
+function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp) {
12231
+ ensureSafeMemberName(key0, fullExp);
12232
+ ensureSafeMemberName(key1, fullExp);
12233
+ ensureSafeMemberName(key2, fullExp);
12234
+ ensureSafeMemberName(key3, fullExp);
12235
+ ensureSafeMemberName(key4, fullExp);
12236
+
12237
+ return function cspSafeGetter(scope, locals) {
12238
+ var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope;
12239
+
12240
+ if (pathVal == null) return pathVal;
12241
+ pathVal = pathVal[key0];
12242
+
12243
+ if (!key1) return pathVal;
12244
+ if (pathVal == null) return undefined;
12245
+ pathVal = pathVal[key1];
12246
+
12247
+ if (!key2) return pathVal;
12248
+ if (pathVal == null) return undefined;
12249
+ pathVal = pathVal[key2];
12250
+
12251
+ if (!key3) return pathVal;
12252
+ if (pathVal == null) return undefined;
12253
+ pathVal = pathVal[key3];
12254
+
12255
+ if (!key4) return pathVal;
12256
+ if (pathVal == null) return undefined;
12257
+ pathVal = pathVal[key4];
12258
+
12259
+ return pathVal;
12260
+ };
12261
+}
12262
+
12263
+function getterFn(path, options, fullExp) {
12264
+ var fn = getterFnCache[path];
12265
+
12266
+ if (fn) return fn;
12267
+
12268
+ var pathKeys = path.split('.'),
12269
+ pathKeysLength = pathKeys.length;
12270
+
12271
+ // http://jsperf.com/angularjs-parse-getter/6
12272
+ if (options.csp) {
12273
+ if (pathKeysLength < 6) {
12274
+ fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp);
12275
+ } else {
12276
+ fn = function cspSafeGetter(scope, locals) {
12277
+ var i = 0, val;
12278
+ do {
12279
+ val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++],
12280
+ pathKeys[i++], fullExp)(scope, locals);
12281
+
12282
+ locals = undefined; // clear after first iteration
12283
+ scope = val;
12284
+ } while (i < pathKeysLength);
12285
+ return val;
12286
+ };
12287
+ }
12288
+ } else {
12289
+ var code = '';
12290
+ forEach(pathKeys, function(key, index) {
12291
+ ensureSafeMemberName(key, fullExp);
12292
+ code += 'if(s == null) return undefined;\n' +
12293
+ 's='+ (index
12294
+ // we simply dereference 's' on any .dot notation
12295
+ ? 's'
12296
+ // but if we are first then we check locals first, and if so read it first
12297
+ : '((l&&l.hasOwnProperty("' + key + '"))?l:s)') + '.' + key + ';\n';
12298
+ });
12299
+ code += 'return s;';
12300
+
12301
+ /* jshint -W054 */
12302
+ var evaledFnGetter = new Function('s', 'l', code); // s=scope, l=locals
12303
+ /* jshint +W054 */
12304
+ evaledFnGetter.toString = valueFn(code);
12305
+
12306
+ fn = evaledFnGetter;
12307
+ }
12308
+
12309
+ fn.sharedGetter = true;
12310
+ fn.assign = function(self, value) {
12311
+ return setter(self, path, value, path);
12312
+ };
12313
+ getterFnCache[path] = fn;
12314
+ return fn;
12315
+}
12316
+
12317
+///////////////////////////////////
12318
+
12319
+/**
12320
+ * @ngdoc service
12321
+ * @name $parse
12322
+ * @kind function
12323
+ *
12324
+ * @description
12325
+ *
12326
+ * Converts Angular {@link guide/expression expression} into a function.
12327
+ *
12328
+ * ```js
12329
+ * var getter = $parse('user.name');
12330
+ * var setter = getter.assign;
12331
+ * var context = {user:{name:'angular'}};
12332
+ * var locals = {user:{name:'local'}};
12333
+ *
12334
+ * expect(getter(context)).toEqual('angular');
12335
+ * setter(context, 'newValue');
12336
+ * expect(context.user.name).toEqual('newValue');
12337
+ * expect(getter(context, locals)).toEqual('local');
12338
+ * ```
12339
+ *
12340
+ *
12341
+ * @param {string} expression String expression to compile.
12342
+ * @returns {function(context, locals)} a function which represents the compiled expression:
12343
+ *
12344
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
12345
+ * are evaluated against (typically a scope object).
12346
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
12347
+ * `context`.
12348
+ *
12349
+ * The returned function also has the following properties:
12350
+ * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript
12351
+ * literal.
12352
+ * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript
12353
+ * constant literals.
12354
+ * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be
12355
+ * set to a function to change its value on the given context.
12356
+ *
12357
+ */
12358
+
12359
+
12360
+/**
12361
+ * @ngdoc provider
12362
+ * @name $parseProvider
12363
+ *
12364
+ * @description
12365
+ * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}
12366
+ * service.
12367
+ */
12368
+function $ParseProvider() {
12369
+ var cache = createMap();
12370
+
12371
+ var $parseOptions = {
12372
+ csp: false
12373
+ };
12374
+
12375
+
12376
+ this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {
12377
+ $parseOptions.csp = $sniffer.csp;
12378
+
12379
+ function wrapSharedExpression(exp) {
12380
+ var wrapped = exp;
12381
+
12382
+ if (exp.sharedGetter) {
12383
+ wrapped = function $parseWrapper(self, locals) {
12384
+ return exp(self, locals);
12385
+ };
12386
+ wrapped.literal = exp.literal;
12387
+ wrapped.constant = exp.constant;
12388
+ wrapped.assign = exp.assign;
12389
+ }
12390
+
12391
+ return wrapped;
12392
+ }
12393
+
12394
+ return function $parse(exp, interceptorFn) {
12395
+ var parsedExpression, oneTime, cacheKey;
12396
+
12397
+ switch (typeof exp) {
12398
+ case 'string':
12399
+ cacheKey = exp = exp.trim();
12400
+
12401
+ parsedExpression = cache[cacheKey];
12402
+
12403
+ if (!parsedExpression) {
12404
+ if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {
12405
+ oneTime = true;
12406
+ exp = exp.substring(2);
12407
+ }
12408
+
12409
+ var lexer = new Lexer($parseOptions);
12410
+ var parser = new Parser(lexer, $filter, $parseOptions);
12411
+ parsedExpression = parser.parse(exp);
12412
+
12413
+ if (parsedExpression.constant) {
12414
+ parsedExpression.$$watchDelegate = constantWatchDelegate;
12415
+ } else if (oneTime) {
12416
+ //oneTime is not part of the exp passed to the Parser so we may have to
12417
+ //wrap the parsedExpression before adding a $$watchDelegate
12418
+ parsedExpression = wrapSharedExpression(parsedExpression);
12419
+ parsedExpression.$$watchDelegate = parsedExpression.literal ?
12420
+ oneTimeLiteralWatchDelegate : oneTimeWatchDelegate;
12421
+ } else if (parsedExpression.inputs) {
12422
+ parsedExpression.$$watchDelegate = inputsWatchDelegate;
12423
+ }
12424
+
12425
+ cache[cacheKey] = parsedExpression;
12426
+ }
12427
+ return addInterceptor(parsedExpression, interceptorFn);
12428
+
12429
+ case 'function':
12430
+ return addInterceptor(exp, interceptorFn);
12431
+
12432
+ default:
12433
+ return addInterceptor(noop, interceptorFn);
12434
+ }
12435
+ };
12436
+
12437
+ function collectExpressionInputs(inputs, list) {
12438
+ for (var i = 0, ii = inputs.length; i < ii; i++) {
12439
+ var input = inputs[i];
12440
+ if (!input.constant) {
12441
+ if (input.inputs) {
12442
+ collectExpressionInputs(input.inputs, list);
12443
+ } else if (list.indexOf(input) === -1) { // TODO(perf) can we do better?
12444
+ list.push(input);
12445
+ }
12446
+ }
12447
+ }
12448
+
12449
+ return list;
12450
+ }
12451
+
12452
+ function expressionInputDirtyCheck(newValue, oldValueOfValue) {
12453
+
12454
+ if (newValue == null || oldValueOfValue == null) { // null/undefined
12455
+ return newValue === oldValueOfValue;
12456
+ }
12457
+
12458
+ if (typeof newValue === 'object') {
12459
+
12460
+ // attempt to convert the value to a primitive type
12461
+ // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can
12462
+ // be cheaply dirty-checked
12463
+ newValue = newValue.valueOf();
12464
+
12465
+ if (typeof newValue === 'object') {
12466
+ // objects/arrays are not supported - deep-watching them would be too expensive
12467
+ return false;
12468
+ }
12469
+
12470
+ // fall-through to the primitive equality check
12471
+ }
12472
+
12473
+ //Primitive or NaN
12474
+ return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue);
12475
+ }
12476
+
12477
+ function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression) {
12478
+ var inputExpressions = parsedExpression.$$inputs ||
12479
+ (parsedExpression.$$inputs = collectExpressionInputs(parsedExpression.inputs, []));
12480
+
12481
+ var lastResult;
12482
+
12483
+ if (inputExpressions.length === 1) {
12484
+ var oldInputValue = expressionInputDirtyCheck; // init to something unique so that equals check fails
12485
+ inputExpressions = inputExpressions[0];
12486
+ return scope.$watch(function expressionInputWatch(scope) {
12487
+ var newInputValue = inputExpressions(scope);
12488
+ if (!expressionInputDirtyCheck(newInputValue, oldInputValue)) {
12489
+ lastResult = parsedExpression(scope);
12490
+ oldInputValue = newInputValue && newInputValue.valueOf();
12491
+ }
12492
+ return lastResult;
12493
+ }, listener, objectEquality);
12494
+ }
12495
+
12496
+ var oldInputValueOfValues = [];
12497
+ for (var i = 0, ii = inputExpressions.length; i < ii; i++) {
12498
+ oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails
12499
+ }
12500
+
12501
+ return scope.$watch(function expressionInputsWatch(scope) {
12502
+ var changed = false;
12503
+
12504
+ for (var i = 0, ii = inputExpressions.length; i < ii; i++) {
12505
+ var newInputValue = inputExpressions[i](scope);
12506
+ if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) {
12507
+ oldInputValueOfValues[i] = newInputValue && newInputValue.valueOf();
12508
+ }
12509
+ }
12510
+
12511
+ if (changed) {
12512
+ lastResult = parsedExpression(scope);
12513
+ }
12514
+
12515
+ return lastResult;
12516
+ }, listener, objectEquality);
12517
+ }
12518
+
12519
+ function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) {
12520
+ var unwatch, lastValue;
12521
+ return unwatch = scope.$watch(function oneTimeWatch(scope) {
12522
+ return parsedExpression(scope);
12523
+ }, function oneTimeListener(value, old, scope) {
12524
+ lastValue = value;
12525
+ if (isFunction(listener)) {
12526
+ listener.apply(this, arguments);
12527
+ }
12528
+ if (isDefined(value)) {
12529
+ scope.$$postDigest(function () {
12530
+ if (isDefined(lastValue)) {
12531
+ unwatch();
12532
+ }
12533
+ });
12534
+ }
12535
+ }, objectEquality);
12536
+ }
12537
+
12538
+ function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) {
12539
+ var unwatch, lastValue;
12540
+ return unwatch = scope.$watch(function oneTimeWatch(scope) {
12541
+ return parsedExpression(scope);
12542
+ }, function oneTimeListener(value, old, scope) {
12543
+ lastValue = value;
12544
+ if (isFunction(listener)) {
12545
+ listener.call(this, value, old, scope);
12546
+ }
12547
+ if (isAllDefined(value)) {
12548
+ scope.$$postDigest(function () {
12549
+ if(isAllDefined(lastValue)) unwatch();
12550
+ });
12551
+ }
12552
+ }, objectEquality);
12553
+
12554
+ function isAllDefined(value) {
12555
+ var allDefined = true;
12556
+ forEach(value, function (val) {
12557
+ if (!isDefined(val)) allDefined = false;
12558
+ });
12559
+ return allDefined;
12560
+ }
12561
+ }
12562
+
12563
+ function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) {
12564
+ var unwatch;
12565
+ return unwatch = scope.$watch(function constantWatch(scope) {
12566
+ return parsedExpression(scope);
12567
+ }, function constantListener(value, old, scope) {
12568
+ if (isFunction(listener)) {
12569
+ listener.apply(this, arguments);
12570
+ }
12571
+ unwatch();
12572
+ }, objectEquality);
12573
+ }
12574
+
12575
+ function addInterceptor(parsedExpression, interceptorFn) {
12576
+ if (!interceptorFn) return parsedExpression;
12577
+
12578
+ var fn = function interceptedExpression(scope, locals) {
12579
+ var value = parsedExpression(scope, locals);
12580
+ var result = interceptorFn(value, scope, locals);
12581
+ // we only return the interceptor's result if the
12582
+ // initial value is defined (for bind-once)
12583
+ return isDefined(value) ? result : value;
12584
+ };
12585
+
12586
+ // Propagate $$watchDelegates other then inputsWatchDelegate
12587
+ if (parsedExpression.$$watchDelegate &&
12588
+ parsedExpression.$$watchDelegate !== inputsWatchDelegate) {
12589
+ fn.$$watchDelegate = parsedExpression.$$watchDelegate;
12590
+ } else if (!interceptorFn.$stateful) {
12591
+ // If there is an interceptor, but no watchDelegate then treat the interceptor like
12592
+ // we treat filters - it is assumed to be a pure function unless flagged with $stateful
12593
+ fn.$$watchDelegate = inputsWatchDelegate;
12594
+ fn.inputs = [parsedExpression];
12595
+ }
12596
+
12597
+ return fn;
12598
+ }
12599
+ }];
12600
+}
12601
+
12602
+/**
12603
+ * @ngdoc service
12604
+ * @name $q
12605
+ * @requires $rootScope
12606
+ *
12607
+ * @description
12608
+ * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).
12609
+ *
12610
+ * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred
12611
+ * implementations, and the other which resembles ES6 promises to some degree.
12612
+ *
12613
+ * # $q constructor
12614
+ *
12615
+ * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`
12616
+ * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony,
12617
+ * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).
12618
+ *
12619
+ * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are
12620
+ * available yet.
12621
+ *
12622
+ * It can be used like so:
12623
+ *
12624
+ * ```js
12625
+ * // for the purpose of this example let's assume that variables `$q` and `okToGreet`
12626
+ * // are available in the current lexical scope (they could have been injected or passed in).
12627
+ *
12628
+ * function asyncGreet(name) {
12629
+ * // perform some asynchronous operation, resolve or reject the promise when appropriate.
12630
+ * return $q(function(resolve, reject) {
12631
+ * setTimeout(function() {
12632
+ * if (okToGreet(name)) {
12633
+ * resolve('Hello, ' + name + '!');
12634
+ * } else {
12635
+ * reject('Greeting ' + name + ' is not allowed.');
12636
+ * }
12637
+ * }, 1000);
12638
+ * });
12639
+ * }
12640
+ *
12641
+ * var promise = asyncGreet('Robin Hood');
12642
+ * promise.then(function(greeting) {
12643
+ * alert('Success: ' + greeting);
12644
+ * }, function(reason) {
12645
+ * alert('Failed: ' + reason);
12646
+ * });
12647
+ * ```
12648
+ *
12649
+ * Note: progress/notify callbacks are not currently supported via the ES6-style interface.
12650
+ *
12651
+ * However, the more traditional CommonJS-style usage is still available, and documented below.
12652
+ *
12653
+ * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an
12654
+ * interface for interacting with an object that represents the result of an action that is
12655
+ * performed asynchronously, and may or may not be finished at any given point in time.
12656
+ *
12657
+ * From the perspective of dealing with error handling, deferred and promise APIs are to
12658
+ * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.
12659
+ *
12660
+ * ```js
12661
+ * // for the purpose of this example let's assume that variables `$q` and `okToGreet`
12662
+ * // are available in the current lexical scope (they could have been injected or passed in).
12663
+ *
12664
+ * function asyncGreet(name) {
12665
+ * var deferred = $q.defer();
12666
+ *
12667
+ * setTimeout(function() {
12668
+ * deferred.notify('About to greet ' + name + '.');
12669
+ *
12670
+ * if (okToGreet(name)) {
12671
+ * deferred.resolve('Hello, ' + name + '!');
12672
+ * } else {
12673
+ * deferred.reject('Greeting ' + name + ' is not allowed.');
12674
+ * }
12675
+ * }, 1000);
12676
+ *
12677
+ * return deferred.promise;
12678
+ * }
12679
+ *
12680
+ * var promise = asyncGreet('Robin Hood');
12681
+ * promise.then(function(greeting) {
12682
+ * alert('Success: ' + greeting);
12683
+ * }, function(reason) {
12684
+ * alert('Failed: ' + reason);
12685
+ * }, function(update) {
12686
+ * alert('Got notification: ' + update);
12687
+ * });
12688
+ * ```
12689
+ *
12690
+ * At first it might not be obvious why this extra complexity is worth the trouble. The payoff
12691
+ * comes in the way of guarantees that promise and deferred APIs make, see
12692
+ * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.
12693
+ *
12694
+ * Additionally the promise api allows for composition that is very hard to do with the
12695
+ * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.
12696
+ * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the
12697
+ * section on serial or parallel joining of promises.
12698
+ *
12699
+ * # The Deferred API
12700
+ *
12701
+ * A new instance of deferred is constructed by calling `$q.defer()`.
12702
+ *
12703
+ * The purpose of the deferred object is to expose the associated Promise instance as well as APIs
12704
+ * that can be used for signaling the successful or unsuccessful completion, as well as the status
12705
+ * of the task.
12706
+ *
12707
+ * **Methods**
12708
+ *
12709
+ * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection
12710
+ * constructed via `$q.reject`, the promise will be rejected instead.
12711
+ * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to
12712
+ * resolving it with a rejection constructed via `$q.reject`.
12713
+ * - `notify(value)` - provides updates on the status of the promise's execution. This may be called
12714
+ * multiple times before the promise is either resolved or rejected.
12715
+ *
12716
+ * **Properties**
12717
+ *
12718
+ * - promise – `{Promise}` – promise object associated with this deferred.
12719
+ *
12720
+ *
12721
+ * # The Promise API
12722
+ *
12723
+ * A new promise instance is created when a deferred instance is created and can be retrieved by
12724
+ * calling `deferred.promise`.
12725
+ *
12726
+ * The purpose of the promise object is to allow for interested parties to get access to the result
12727
+ * of the deferred task when it completes.
12728
+ *
12729
+ * **Methods**
12730
+ *
12731
+ * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or
12732
+ * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously
12733
+ * as soon as the result is available. The callbacks are called with a single argument: the result
12734
+ * or rejection reason. Additionally, the notify callback may be called zero or more times to
12735
+ * provide a progress indication, before the promise is resolved or rejected.
12736
+ *
12737
+ * This method *returns a new promise* which is resolved or rejected via the return value of the
12738
+ * `successCallback`, `errorCallback`. It also notifies via the return value of the
12739
+ * `notifyCallback` method. The promise cannot be resolved or rejected from the notifyCallback
12740
+ * method.
12741
+ *
12742
+ * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`
12743
+ *
12744
+ * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,
12745
+ * but to do so without modifying the final value. This is useful to release resources or do some
12746
+ * clean-up that needs to be done whether the promise was rejected or resolved. See the [full
12747
+ * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
12748
+ * more information.
12749
+ *
12750
+ * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as
12751
+ * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to
12752
+ * make your code IE8 and Android 2.x compatible.
12753
+ *
12754
+ * # Chaining promises
12755
+ *
12756
+ * Because calling the `then` method of a promise returns a new derived promise, it is easily
12757
+ * possible to create a chain of promises:
12758
+ *
12759
+ * ```js
12760
+ * promiseB = promiseA.then(function(result) {
12761
+ * return result + 1;
12762
+ * });
12763
+ *
12764
+ * // promiseB will be resolved immediately after promiseA is resolved and its value
12765
+ * // will be the result of promiseA incremented by 1
12766
+ * ```
12767
+ *
12768
+ * It is possible to create chains of any length and since a promise can be resolved with another
12769
+ * promise (which will defer its resolution further), it is possible to pause/defer resolution of
12770
+ * the promises at any point in the chain. This makes it possible to implement powerful APIs like
12771
+ * $http's response interceptors.
12772
+ *
12773
+ *
12774
+ * # Differences between Kris Kowal's Q and $q
12775
+ *
12776
+ * There are two main differences:
12777
+ *
12778
+ * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation
12779
+ * mechanism in angular, which means faster propagation of resolution or rejection into your
12780
+ * models and avoiding unnecessary browser repaints, which would result in flickering UI.
12781
+ * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains
12782
+ * all the important functionality needed for common async tasks.
12783
+ *
12784
+ * # Testing
12785
+ *
12786
+ * ```js
12787
+ * it('should simulate promise', inject(function($q, $rootScope) {
12788
+ * var deferred = $q.defer();
12789
+ * var promise = deferred.promise;
12790
+ * var resolvedValue;
12791
+ *
12792
+ * promise.then(function(value) { resolvedValue = value; });
12793
+ * expect(resolvedValue).toBeUndefined();
12794
+ *
12795
+ * // Simulate resolving of promise
12796
+ * deferred.resolve(123);
12797
+ * // Note that the 'then' function does not get called synchronously.
12798
+ * // This is because we want the promise API to always be async, whether or not
12799
+ * // it got called synchronously or asynchronously.
12800
+ * expect(resolvedValue).toBeUndefined();
12801
+ *
12802
+ * // Propagate promise resolution to 'then' functions using $apply().
12803
+ * $rootScope.$apply();
12804
+ * expect(resolvedValue).toEqual(123);
12805
+ * }));
12806
+ * ```
12807
+ *
12808
+ * @param {function(function, function)} resolver Function which is responsible for resolving or
12809
+ * rejecting the newly created promise. The first parameter is a function which resolves the
12810
+ * promise, the second parameter is a function which rejects the promise.
12811
+ *
12812
+ * @returns {Promise} The newly created promise.
12813
+ */
12814
+function $QProvider() {
12815
+
12816
+ this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {
12817
+ return qFactory(function(callback) {
12818
+ $rootScope.$evalAsync(callback);
12819
+ }, $exceptionHandler);
12820
+ }];
12821
+}
12822
+
12823
+function $$QProvider() {
12824
+ this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {
12825
+ return qFactory(function(callback) {
12826
+ $browser.defer(callback);
12827
+ }, $exceptionHandler);
12828
+ }];
12829
+}
12830
+
12831
+/**
12832
+ * Constructs a promise manager.
12833
+ *
12834
+ * @param {function(function)} nextTick Function for executing functions in the next turn.
12835
+ * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for
12836
+ * debugging purposes.
12837
+ * @returns {object} Promise manager.
12838
+ */
12839
+function qFactory(nextTick, exceptionHandler) {
12840
+ var $qMinErr = minErr('$q', TypeError);
12841
+ function callOnce(self, resolveFn, rejectFn) {
12842
+ var called = false;
12843
+ function wrap(fn) {
12844
+ return function(value) {
12845
+ if (called) return;
12846
+ called = true;
12847
+ fn.call(self, value);
12848
+ };
12849
+ }
12850
+
12851
+ return [wrap(resolveFn), wrap(rejectFn)];
12852
+ }
12853
+
12854
+ /**
12855
+ * @ngdoc method
12856
+ * @name ng.$q#defer
12857
+ * @kind function
12858
+ *
12859
+ * @description
12860
+ * Creates a `Deferred` object which represents a task which will finish in the future.
12861
+ *
12862
+ * @returns {Deferred} Returns a new instance of deferred.
12863
+ */
12864
+ var defer = function() {
12865
+ return new Deferred();
12866
+ };
12867
+
12868
+ function Promise() {
12869
+ this.$$state = { status: 0 };
12870
+ }
12871
+
12872
+ Promise.prototype = {
12873
+ then: function(onFulfilled, onRejected, progressBack) {
12874
+ var result = new Deferred();
12875
+
12876
+ this.$$state.pending = this.$$state.pending || [];
12877
+ this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);
12878
+ if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);
12879
+
12880
+ return result.promise;
12881
+ },
12882
+
12883
+ "catch": function(callback) {
12884
+ return this.then(null, callback);
12885
+ },
12886
+
12887
+ "finally": function(callback, progressBack) {
12888
+ return this.then(function(value) {
12889
+ return handleCallback(value, true, callback);
12890
+ }, function(error) {
12891
+ return handleCallback(error, false, callback);
12892
+ }, progressBack);
12893
+ }
12894
+ };
12895
+
12896
+ //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native
12897
+ function simpleBind(context, fn) {
12898
+ return function(value) {
12899
+ fn.call(context, value);
12900
+ };
12901
+ }
12902
+
12903
+ function processQueue(state) {
12904
+ var fn, promise, pending;
12905
+
12906
+ pending = state.pending;
12907
+ state.processScheduled = false;
12908
+ state.pending = undefined;
12909
+ for (var i = 0, ii = pending.length; i < ii; ++i) {
12910
+ promise = pending[i][0];
12911
+ fn = pending[i][state.status];
12912
+ try {
12913
+ if (isFunction(fn)) {
12914
+ promise.resolve(fn(state.value));
12915
+ } else if (state.status === 1) {
12916
+ promise.resolve(state.value);
12917
+ } else {
12918
+ promise.reject(state.value);
12919
+ }
12920
+ } catch(e) {
12921
+ promise.reject(e);
12922
+ exceptionHandler(e);
12923
+ }
12924
+ }
12925
+ }
12926
+
12927
+ function scheduleProcessQueue(state) {
12928
+ if (state.processScheduled || !state.pending) return;
12929
+ state.processScheduled = true;
12930
+ nextTick(function() { processQueue(state); });
12931
+ }
12932
+
12933
+ function Deferred() {
12934
+ this.promise = new Promise();
12935
+ //Necessary to support unbound execution :/
12936
+ this.resolve = simpleBind(this, this.resolve);
12937
+ this.reject = simpleBind(this, this.reject);
12938
+ this.notify = simpleBind(this, this.notify);
12939
+ }
12940
+
12941
+ Deferred.prototype = {
12942
+ resolve: function(val) {
12943
+ if (this.promise.$$state.status) return;
12944
+ if (val === this.promise) {
12945
+ this.$$reject($qMinErr(
12946
+ 'qcycle',
12947
+ "Expected promise to be resolved with value other than itself '{0}'",
12948
+ val));
12949
+ }
12950
+ else {
12951
+ this.$$resolve(val);
12952
+ }
12953
+
12954
+ },
12955
+
12956
+ $$resolve: function(val) {
12957
+ var then, fns;
12958
+
12959
+ fns = callOnce(this, this.$$resolve, this.$$reject);
12960
+ try {
12961
+ if ((isObject(val) || isFunction(val))) then = val && val.then;
12962
+ if (isFunction(then)) {
12963
+ this.promise.$$state.status = -1;
12964
+ then.call(val, fns[0], fns[1], this.notify);
12965
+ } else {
12966
+ this.promise.$$state.value = val;
12967
+ this.promise.$$state.status = 1;
12968
+ scheduleProcessQueue(this.promise.$$state);
12969
+ }
12970
+ } catch(e) {
12971
+ fns[1](e);
12972
+ exceptionHandler(e);
12973
+ }
12974
+ },
12975
+
12976
+ reject: function(reason) {
12977
+ if (this.promise.$$state.status) return;
12978
+ this.$$reject(reason);
12979
+ },
12980
+
12981
+ $$reject: function(reason) {
12982
+ this.promise.$$state.value = reason;
12983
+ this.promise.$$state.status = 2;
12984
+ scheduleProcessQueue(this.promise.$$state);
12985
+ },
12986
+
12987
+ notify: function(progress) {
12988
+ var callbacks = this.promise.$$state.pending;
12989
+
12990
+ if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) {
12991
+ nextTick(function() {
12992
+ var callback, result;
12993
+ for (var i = 0, ii = callbacks.length; i < ii; i++) {
12994
+ result = callbacks[i][0];
12995
+ callback = callbacks[i][3];
12996
+ try {
12997
+ result.notify(isFunction(callback) ? callback(progress) : progress);
12998
+ } catch(e) {
12999
+ exceptionHandler(e);
13000
+ }
13001
+ }
13002
+ });
13003
+ }
13004
+ }
13005
+ };
13006
+
13007
+ /**
13008
+ * @ngdoc method
13009
+ * @name $q#reject
13010
+ * @kind function
13011
+ *
13012
+ * @description
13013
+ * Creates a promise that is resolved as rejected with the specified `reason`. This api should be
13014
+ * used to forward rejection in a chain of promises. If you are dealing with the last promise in
13015
+ * a promise chain, you don't need to worry about it.
13016
+ *
13017
+ * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of
13018
+ * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via
13019
+ * a promise error callback and you want to forward the error to the promise derived from the
13020
+ * current promise, you have to "rethrow" the error by returning a rejection constructed via
13021
+ * `reject`.
13022
+ *
13023
+ * ```js
13024
+ * promiseB = promiseA.then(function(result) {
13025
+ * // success: do something and resolve promiseB
13026
+ * // with the old or a new result
13027
+ * return result;
13028
+ * }, function(reason) {
13029
+ * // error: handle the error if possible and
13030
+ * // resolve promiseB with newPromiseOrValue,
13031
+ * // otherwise forward the rejection to promiseB
13032
+ * if (canHandle(reason)) {
13033
+ * // handle the error and recover
13034
+ * return newPromiseOrValue;
13035
+ * }
13036
+ * return $q.reject(reason);
13037
+ * });
13038
+ * ```
13039
+ *
13040
+ * @param {*} reason Constant, message, exception or an object representing the rejection reason.
13041
+ * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.
13042
+ */
13043
+ var reject = function(reason) {
13044
+ var result = new Deferred();
13045
+ result.reject(reason);
13046
+ return result.promise;
13047
+ };
13048
+
13049
+ var makePromise = function makePromise(value, resolved) {
13050
+ var result = new Deferred();
13051
+ if (resolved) {
13052
+ result.resolve(value);
13053
+ } else {
13054
+ result.reject(value);
13055
+ }
13056
+ return result.promise;
13057
+ };
13058
+
13059
+ var handleCallback = function handleCallback(value, isResolved, callback) {
13060
+ var callbackOutput = null;
13061
+ try {
13062
+ if (isFunction(callback)) callbackOutput = callback();
13063
+ } catch(e) {
13064
+ return makePromise(e, false);
13065
+ }
13066
+ if (isPromiseLike(callbackOutput)) {
13067
+ return callbackOutput.then(function() {
13068
+ return makePromise(value, isResolved);
13069
+ }, function(error) {
13070
+ return makePromise(error, false);
13071
+ });
13072
+ } else {
13073
+ return makePromise(value, isResolved);
13074
+ }
13075
+ };
13076
+
13077
+ /**
13078
+ * @ngdoc method
13079
+ * @name $q#when
13080
+ * @kind function
13081
+ *
13082
+ * @description
13083
+ * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.
13084
+ * This is useful when you are dealing with an object that might or might not be a promise, or if
13085
+ * the promise comes from a source that can't be trusted.
13086
+ *
13087
+ * @param {*} value Value or a promise
13088
+ * @returns {Promise} Returns a promise of the passed value or promise
13089
+ */
13090
+
13091
+
13092
+ var when = function(value, callback, errback, progressBack) {
13093
+ var result = new Deferred();
13094
+ result.resolve(value);
13095
+ return result.promise.then(callback, errback, progressBack);
13096
+ };
13097
+
13098
+ /**
13099
+ * @ngdoc method
13100
+ * @name $q#all
13101
+ * @kind function
13102
+ *
13103
+ * @description
13104
+ * Combines multiple promises into a single promise that is resolved when all of the input
13105
+ * promises are resolved.
13106
+ *
13107
+ * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.
13108
+ * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,
13109
+ * each value corresponding to the promise at the same index/key in the `promises` array/hash.
13110
+ * If any of the promises is resolved with a rejection, this resulting promise will be rejected
13111
+ * with the same rejection value.
13112
+ */
13113
+
13114
+ function all(promises) {
13115
+ var deferred = new Deferred(),
13116
+ counter = 0,
13117
+ results = isArray(promises) ? [] : {};
13118
+
13119
+ forEach(promises, function(promise, key) {
13120
+ counter++;
13121
+ when(promise).then(function(value) {
13122
+ if (results.hasOwnProperty(key)) return;
13123
+ results[key] = value;
13124
+ if (!(--counter)) deferred.resolve(results);
13125
+ }, function(reason) {
13126
+ if (results.hasOwnProperty(key)) return;
13127
+ deferred.reject(reason);
13128
+ });
13129
+ });
13130
+
13131
+ if (counter === 0) {
13132
+ deferred.resolve(results);
13133
+ }
13134
+
13135
+ return deferred.promise;
13136
+ }
13137
+
13138
+ var $Q = function Q(resolver) {
13139
+ if (!isFunction(resolver)) {
13140
+ throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver);
13141
+ }
13142
+
13143
+ if (!(this instanceof Q)) {
13144
+ // More useful when $Q is the Promise itself.
13145
+ return new Q(resolver);
13146
+ }
13147
+
13148
+ var deferred = new Deferred();
13149
+
13150
+ function resolveFn(value) {
13151
+ deferred.resolve(value);
13152
+ }
13153
+
13154
+ function rejectFn(reason) {
13155
+ deferred.reject(reason);
13156
+ }
13157
+
13158
+ resolver(resolveFn, rejectFn);
13159
+
13160
+ return deferred.promise;
13161
+ };
13162
+
13163
+ $Q.defer = defer;
13164
+ $Q.reject = reject;
13165
+ $Q.when = when;
13166
+ $Q.all = all;
13167
+
13168
+ return $Q;
13169
+}
13170
+
13171
+function $$RAFProvider(){ //rAF
13172
+ this.$get = ['$window', '$timeout', function($window, $timeout) {
13173
+ var requestAnimationFrame = $window.requestAnimationFrame ||
13174
+ $window.webkitRequestAnimationFrame ||
13175
+ $window.mozRequestAnimationFrame;
13176
+
13177
+ var cancelAnimationFrame = $window.cancelAnimationFrame ||
13178
+ $window.webkitCancelAnimationFrame ||
13179
+ $window.mozCancelAnimationFrame ||
13180
+ $window.webkitCancelRequestAnimationFrame;
13181
+
13182
+ var rafSupported = !!requestAnimationFrame;
13183
+ var raf = rafSupported
13184
+ ? function(fn) {
13185
+ var id = requestAnimationFrame(fn);
13186
+ return function() {
13187
+ cancelAnimationFrame(id);
13188
+ };
13189
+ }
13190
+ : function(fn) {
13191
+ var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666
13192
+ return function() {
13193
+ $timeout.cancel(timer);
13194
+ };
13195
+ };
13196
+
13197
+ raf.supported = rafSupported;
13198
+
13199
+ return raf;
13200
+ }];
13201
+}
13202
+
13203
+/**
13204
+ * DESIGN NOTES
13205
+ *
13206
+ * The design decisions behind the scope are heavily favored for speed and memory consumption.
13207
+ *
13208
+ * The typical use of scope is to watch the expressions, which most of the time return the same
13209
+ * value as last time so we optimize the operation.
13210
+ *
13211
+ * Closures construction is expensive in terms of speed as well as memory:
13212
+ * - No closures, instead use prototypical inheritance for API
13213
+ * - Internal state needs to be stored on scope directly, which means that private state is
13214
+ * exposed as $$____ properties
13215
+ *
13216
+ * Loop operations are optimized by using while(count--) { ... }
13217
+ * - this means that in order to keep the same order of execution as addition we have to add
13218
+ * items to the array at the beginning (unshift) instead of at the end (push)
13219
+ *
13220
+ * Child scopes are created and removed often
13221
+ * - Using an array would be slow since inserts in middle are expensive so we use linked list
13222
+ *
13223
+ * There are few watches then a lot of observers. This is why you don't want the observer to be
13224
+ * implemented in the same way as watch. Watch requires return of initialization function which
13225
+ * are expensive to construct.
13226
+ */
13227
+
13228
+
13229
+/**
13230
+ * @ngdoc provider
13231
+ * @name $rootScopeProvider
13232
+ * @description
13233
+ *
13234
+ * Provider for the $rootScope service.
13235
+ */
13236
+
13237
+/**
13238
+ * @ngdoc method
13239
+ * @name $rootScopeProvider#digestTtl
13240
+ * @description
13241
+ *
13242
+ * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and
13243
+ * assuming that the model is unstable.
13244
+ *
13245
+ * The current default is 10 iterations.
13246
+ *
13247
+ * In complex applications it's possible that the dependencies between `$watch`s will result in
13248
+ * several digest iterations. However if an application needs more than the default 10 digest
13249
+ * iterations for its model to stabilize then you should investigate what is causing the model to
13250
+ * continuously change during the digest.
13251
+ *
13252
+ * Increasing the TTL could have performance implications, so you should not change it without
13253
+ * proper justification.
13254
+ *
13255
+ * @param {number} limit The number of digest iterations.
13256
+ */
13257
+
13258
+
13259
+/**
13260
+ * @ngdoc service
13261
+ * @name $rootScope
13262
+ * @description
13263
+ *
13264
+ * Every application has a single root {@link ng.$rootScope.Scope scope}.
13265
+ * All other scopes are descendant scopes of the root scope. Scopes provide separation
13266
+ * between the model and the view, via a mechanism for watching the model for changes.
13267
+ * They also provide an event emission/broadcast and subscription facility. See the
13268
+ * {@link guide/scope developer guide on scopes}.
13269
+ */
13270
+function $RootScopeProvider(){
13271
+ var TTL = 10;
13272
+ var $rootScopeMinErr = minErr('$rootScope');
13273
+ var lastDirtyWatch = null;
13274
+ var applyAsyncId = null;
13275
+
13276
+ this.digestTtl = function(value) {
13277
+ if (arguments.length) {
13278
+ TTL = value;
13279
+ }
13280
+ return TTL;
13281
+ };
13282
+
13283
+ this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',
13284
+ function( $injector, $exceptionHandler, $parse, $browser) {
13285
+
13286
+ /**
13287
+ * @ngdoc type
13288
+ * @name $rootScope.Scope
13289
+ *
13290
+ * @description
13291
+ * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the
13292
+ * {@link auto.$injector $injector}. Child scopes are created using the
13293
+ * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when
13294
+ * compiled HTML template is executed.)
13295
+ *
13296
+ * Here is a simple scope snippet to show how you can interact with the scope.
13297
+ * ```html
13298
+ * <file src="./test/ng/rootScopeSpec.js" tag="docs1" />
13299
+ * ```
13300
+ *
13301
+ * # Inheritance
13302
+ * A scope can inherit from a parent scope, as in this example:
13303
+ * ```js
13304
+ var parent = $rootScope;
13305
+ var child = parent.$new();
13306
+
13307
+ parent.salutation = "Hello";
13308
+ child.name = "World";
13309
+ expect(child.salutation).toEqual('Hello');
13310
+
13311
+ child.salutation = "Welcome";
13312
+ expect(child.salutation).toEqual('Welcome');
13313
+ expect(parent.salutation).toEqual('Hello');
13314
+ * ```
13315
+ *
13316
+ *
13317
+ * @param {Object.<string, function()>=} providers Map of service factory which need to be
13318
+ * provided for the current scope. Defaults to {@link ng}.
13319
+ * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should
13320
+ * append/override services provided by `providers`. This is handy
13321
+ * when unit-testing and having the need to override a default
13322
+ * service.
13323
+ * @returns {Object} Newly created scope.
13324
+ *
13325
+ */
13326
+ function Scope() {
13327
+ this.$id = nextUid();
13328
+ this.$$phase = this.$parent = this.$$watchers =
13329
+ this.$$nextSibling = this.$$prevSibling =
13330
+ this.$$childHead = this.$$childTail = null;
13331
+ this.$root = this;
13332
+ this.$$destroyed = false;
13333
+ this.$$listeners = {};
13334
+ this.$$listenerCount = {};
13335
+ this.$$isolateBindings = null;
13336
+ }
13337
+
13338
+ /**
13339
+ * @ngdoc property
13340
+ * @name $rootScope.Scope#$id
13341
+ *
13342
+ * @description
13343
+ * Unique scope ID (monotonically increasing) useful for debugging.
13344
+ */
13345
+
13346
+ /**
13347
+ * @ngdoc property
13348
+ * @name $rootScope.Scope#$parent
13349
+ *
13350
+ * @description
13351
+ * Reference to the parent scope.
13352
+ */
13353
+
13354
+ /**
13355
+ * @ngdoc property
13356
+ * @name $rootScope.Scope#$root
13357
+ *
13358
+ * @description
13359
+ * Reference to the root scope.
13360
+ */
13361
+
13362
+ Scope.prototype = {
13363
+ constructor: Scope,
13364
+ /**
13365
+ * @ngdoc method
13366
+ * @name $rootScope.Scope#$new
13367
+ * @kind function
13368
+ *
13369
+ * @description
13370
+ * Creates a new child {@link ng.$rootScope.Scope scope}.
13371
+ *
13372
+ * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event.
13373
+ * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.
13374
+ *
13375
+ * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is
13376
+ * desired for the scope and its child scopes to be permanently detached from the parent and
13377
+ * thus stop participating in model change detection and listener notification by invoking.
13378
+ *
13379
+ * @param {boolean} isolate If true, then the scope does not prototypically inherit from the
13380
+ * parent scope. The scope is isolated, as it can not see parent scope properties.
13381
+ * When creating widgets, it is useful for the widget to not accidentally read parent
13382
+ * state.
13383
+ *
13384
+ * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent`
13385
+ * of the newly created scope. Defaults to `this` scope if not provided.
13386
+ * This is used when creating a transclude scope to correctly place it
13387
+ * in the scope hierarchy while maintaining the correct prototypical
13388
+ * inheritance.
13389
+ *
13390
+ * @returns {Object} The newly created child scope.
13391
+ *
13392
+ */
13393
+ $new: function(isolate, parent) {
13394
+ var child;
13395
+
13396
+ parent = parent || this;
13397
+
13398
+ if (isolate) {
13399
+ child = new Scope();
13400
+ child.$root = this.$root;
13401
+ } else {
13402
+ // Only create a child scope class if somebody asks for one,
13403
+ // but cache it to allow the VM to optimize lookups.
13404
+ if (!this.$$ChildScope) {
13405
+ this.$$ChildScope = function ChildScope() {
13406
+ this.$$watchers = this.$$nextSibling =
13407
+ this.$$childHead = this.$$childTail = null;
13408
+ this.$$listeners = {};
13409
+ this.$$listenerCount = {};
13410
+ this.$id = nextUid();
13411
+ this.$$ChildScope = null;
13412
+ };
13413
+ this.$$ChildScope.prototype = this;
13414
+ }
13415
+ child = new this.$$ChildScope();
13416
+ }
13417
+ child.$parent = parent;
13418
+ child.$$prevSibling = parent.$$childTail;
13419
+ if (parent.$$childHead) {
13420
+ parent.$$childTail.$$nextSibling = child;
13421
+ parent.$$childTail = child;
13422
+ } else {
13423
+ parent.$$childHead = parent.$$childTail = child;
13424
+ }
13425
+
13426
+ // When the new scope is not isolated or we inherit from `this`, and
13427
+ // the parent scope is destroyed, the property `$$destroyed` is inherited
13428
+ // prototypically. In all other cases, this property needs to be set
13429
+ // when the parent scope is destroyed.
13430
+ // The listener needs to be added after the parent is set
13431
+ if (isolate || parent != this) child.$on('$destroy', destroyChild);
13432
+
13433
+ return child;
13434
+
13435
+ function destroyChild() {
13436
+ child.$$destroyed = true;
13437
+ }
13438
+ },
13439
+
13440
+ /**
13441
+ * @ngdoc method
13442
+ * @name $rootScope.Scope#$watch
13443
+ * @kind function
13444
+ *
13445
+ * @description
13446
+ * Registers a `listener` callback to be executed whenever the `watchExpression` changes.
13447
+ *
13448
+ * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest
13449
+ * $digest()} and should return the value that will be watched. (Since
13450
+ * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the
13451
+ * `watchExpression` can execute multiple times per
13452
+ * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)
13453
+ * - The `listener` is called only when the value from the current `watchExpression` and the
13454
+ * previous call to `watchExpression` are not equal (with the exception of the initial run,
13455
+ * see below). Inequality is determined according to reference inequality,
13456
+ * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)
13457
+ * via the `!==` Javascript operator, unless `objectEquality == true`
13458
+ * (see next point)
13459
+ * - When `objectEquality == true`, inequality of the `watchExpression` is determined
13460
+ * according to the {@link angular.equals} function. To save the value of the object for
13461
+ * later comparison, the {@link angular.copy} function is used. This therefore means that
13462
+ * watching complex objects will have adverse memory and performance implications.
13463
+ * - The watch `listener` may change the model, which may trigger other `listener`s to fire.
13464
+ * This is achieved by rerunning the watchers until no changes are detected. The rerun
13465
+ * iteration limit is 10 to prevent an infinite loop deadlock.
13466
+ *
13467
+ *
13468
+ * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,
13469
+ * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`
13470
+ * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a
13471
+ * change is detected, be prepared for multiple calls to your listener.)
13472
+ *
13473
+ * After a watcher is registered with the scope, the `listener` fn is called asynchronously
13474
+ * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the
13475
+ * watcher. In rare cases, this is undesirable because the listener is called when the result
13476
+ * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you
13477
+ * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the
13478
+ * listener was called due to initialization.
13479
+ *
13480
+ *
13481
+ *
13482
+ * # Example
13483
+ * ```js
13484
+ // let's assume that scope was dependency injected as the $rootScope
13485
+ var scope = $rootScope;
13486
+ scope.name = 'misko';
13487
+ scope.counter = 0;
13488
+
13489
+ expect(scope.counter).toEqual(0);
13490
+ scope.$watch('name', function(newValue, oldValue) {
13491
+ scope.counter = scope.counter + 1;
13492
+ });
13493
+ expect(scope.counter).toEqual(0);
13494
+
13495
+ scope.$digest();
13496
+ // the listener is always called during the first $digest loop after it was registered
13497
+ expect(scope.counter).toEqual(1);
13498
+
13499
+ scope.$digest();
13500
+ // but now it will not be called unless the value changes
13501
+ expect(scope.counter).toEqual(1);
13502
+
13503
+ scope.name = 'adam';
13504
+ scope.$digest();
13505
+ expect(scope.counter).toEqual(2);
13506
+
13507
+
13508
+
13509
+ // Using a function as a watchExpression
13510
+ var food;
13511
+ scope.foodCounter = 0;
13512
+ expect(scope.foodCounter).toEqual(0);
13513
+ scope.$watch(
13514
+ // This function returns the value being watched. It is called for each turn of the $digest loop
13515
+ function() { return food; },
13516
+ // This is the change listener, called when the value returned from the above function changes
13517
+ function(newValue, oldValue) {
13518
+ if ( newValue !== oldValue ) {
13519
+ // Only increment the counter if the value changed
13520
+ scope.foodCounter = scope.foodCounter + 1;
13521
+ }
13522
+ }
13523
+ );
13524
+ // No digest has been run so the counter will be zero
13525
+ expect(scope.foodCounter).toEqual(0);
13526
+
13527
+ // Run the digest but since food has not changed count will still be zero
13528
+ scope.$digest();
13529
+ expect(scope.foodCounter).toEqual(0);
13530
+
13531
+ // Update food and run digest. Now the counter will increment
13532
+ food = 'cheeseburger';
13533
+ scope.$digest();
13534
+ expect(scope.foodCounter).toEqual(1);
13535
+
13536
+ * ```
13537
+ *
13538
+ *
13539
+ *
13540
+ * @param {(function()|string)} watchExpression Expression that is evaluated on each
13541
+ * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers
13542
+ * a call to the `listener`.
13543
+ *
13544
+ * - `string`: Evaluated as {@link guide/expression expression}
13545
+ * - `function(scope)`: called with current `scope` as a parameter.
13546
+ * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value
13547
+ * of `watchExpression` changes.
13548
+ *
13549
+ * - `newVal` contains the current value of the `watchExpression`
13550
+ * - `oldVal` contains the previous value of the `watchExpression`
13551
+ * - `scope` refers to the current scope
13552
+ * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of
13553
+ * comparing for reference equality.
13554
+ * @returns {function()} Returns a deregistration function for this listener.
13555
+ */
13556
+ $watch: function(watchExp, listener, objectEquality) {
13557
+ var get = $parse(watchExp);
13558
+
13559
+ if (get.$$watchDelegate) {
13560
+ return get.$$watchDelegate(this, listener, objectEquality, get);
13561
+ }
13562
+ var scope = this,
13563
+ array = scope.$$watchers,
13564
+ watcher = {
13565
+ fn: listener,
13566
+ last: initWatchVal,
13567
+ get: get,
13568
+ exp: watchExp,
13569
+ eq: !!objectEquality
13570
+ };
13571
+
13572
+ lastDirtyWatch = null;
13573
+
13574
+ if (!isFunction(listener)) {
13575
+ watcher.fn = noop;
13576
+ }
13577
+
13578
+ if (!array) {
13579
+ array = scope.$$watchers = [];
13580
+ }
13581
+ // we use unshift since we use a while loop in $digest for speed.
13582
+ // the while loop reads in reverse order.
13583
+ array.unshift(watcher);
13584
+
13585
+ return function deregisterWatch() {
13586
+ arrayRemove(array, watcher);
13587
+ lastDirtyWatch = null;
13588
+ };
13589
+ },
13590
+
13591
+ /**
13592
+ * @ngdoc method
13593
+ * @name $rootScope.Scope#$watchGroup
13594
+ * @kind function
13595
+ *
13596
+ * @description
13597
+ * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.
13598
+ * If any one expression in the collection changes the `listener` is executed.
13599
+ *
13600
+ * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every
13601
+ * call to $digest() to see if any items changes.
13602
+ * - The `listener` is called whenever any expression in the `watchExpressions` array changes.
13603
+ *
13604
+ * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually
13605
+ * watched using {@link ng.$rootScope.Scope#$watch $watch()}
13606
+ *
13607
+ * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any
13608
+ * expression in `watchExpressions` changes
13609
+ * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching
13610
+ * those of `watchExpression`
13611
+ * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching
13612
+ * those of `watchExpression`
13613
+ * The `scope` refers to the current scope.
13614
+ * @returns {function()} Returns a de-registration function for all listeners.
13615
+ */
13616
+ $watchGroup: function(watchExpressions, listener) {
13617
+ var oldValues = new Array(watchExpressions.length);
13618
+ var newValues = new Array(watchExpressions.length);
13619
+ var deregisterFns = [];
13620
+ var self = this;
13621
+ var changeReactionScheduled = false;
13622
+ var firstRun = true;
13623
+
13624
+ if (!watchExpressions.length) {
13625
+ // No expressions means we call the listener ASAP
13626
+ var shouldCall = true;
13627
+ self.$evalAsync(function () {
13628
+ if (shouldCall) listener(newValues, newValues, self);
13629
+ });
13630
+ return function deregisterWatchGroup() {
13631
+ shouldCall = false;
13632
+ };
13633
+ }
13634
+
13635
+ if (watchExpressions.length === 1) {
13636
+ // Special case size of one
13637
+ return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) {
13638
+ newValues[0] = value;
13639
+ oldValues[0] = oldValue;
13640
+ listener(newValues, (value === oldValue) ? newValues : oldValues, scope);
13641
+ });
13642
+ }
13643
+
13644
+ forEach(watchExpressions, function (expr, i) {
13645
+ var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) {
13646
+ newValues[i] = value;
13647
+ oldValues[i] = oldValue;
13648
+ if (!changeReactionScheduled) {
13649
+ changeReactionScheduled = true;
13650
+ self.$evalAsync(watchGroupAction);
13651
+ }
13652
+ });
13653
+ deregisterFns.push(unwatchFn);
13654
+ });
13655
+
13656
+ function watchGroupAction() {
13657
+ changeReactionScheduled = false;
13658
+
13659
+ if (firstRun) {
13660
+ firstRun = false;
13661
+ listener(newValues, newValues, self);
13662
+ } else {
13663
+ listener(newValues, oldValues, self);
13664
+ }
13665
+ }
13666
+
13667
+ return function deregisterWatchGroup() {
13668
+ while (deregisterFns.length) {
13669
+ deregisterFns.shift()();
13670
+ }
13671
+ };
13672
+ },
13673
+
13674
+
13675
+ /**
13676
+ * @ngdoc method
13677
+ * @name $rootScope.Scope#$watchCollection
13678
+ * @kind function
13679
+ *
13680
+ * @description
13681
+ * Shallow watches the properties of an object and fires whenever any of the properties change
13682
+ * (for arrays, this implies watching the array items; for object maps, this implies watching
13683
+ * the properties). If a change is detected, the `listener` callback is fired.
13684
+ *
13685
+ * - The `obj` collection is observed via standard $watch operation and is examined on every
13686
+ * call to $digest() to see if any items have been added, removed, or moved.
13687
+ * - The `listener` is called whenever anything within the `obj` has changed. Examples include
13688
+ * adding, removing, and moving items belonging to an object or array.
13689
+ *
13690
+ *
13691
+ * # Example
13692
+ * ```js
13693
+ $scope.names = ['igor', 'matias', 'misko', 'james'];
13694
+ $scope.dataCount = 4;
13695
+
13696
+ $scope.$watchCollection('names', function(newNames, oldNames) {
13697
+ $scope.dataCount = newNames.length;
13698
+ });
13699
+
13700
+ expect($scope.dataCount).toEqual(4);
13701
+ $scope.$digest();
13702
+
13703
+ //still at 4 ... no changes
13704
+ expect($scope.dataCount).toEqual(4);
13705
+
13706
+ $scope.names.pop();
13707
+ $scope.$digest();
13708
+
13709
+ //now there's been a change
13710
+ expect($scope.dataCount).toEqual(3);
13711
+ * ```
13712
+ *
13713
+ *
13714
+ * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The
13715
+ * expression value should evaluate to an object or an array which is observed on each
13716
+ * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the
13717
+ * collection will trigger a call to the `listener`.
13718
+ *
13719
+ * @param {function(newCollection, oldCollection, scope)} listener a callback function called
13720
+ * when a change is detected.
13721
+ * - The `newCollection` object is the newly modified data obtained from the `obj` expression
13722
+ * - The `oldCollection` object is a copy of the former collection data.
13723
+ * Due to performance considerations, the`oldCollection` value is computed only if the
13724
+ * `listener` function declares two or more arguments.
13725
+ * - The `scope` argument refers to the current scope.
13726
+ *
13727
+ * @returns {function()} Returns a de-registration function for this listener. When the
13728
+ * de-registration function is executed, the internal watch operation is terminated.
13729
+ */
13730
+ $watchCollection: function(obj, listener) {
13731
+ $watchCollectionInterceptor.$stateful = true;
13732
+
13733
+ var self = this;
13734
+ // the current value, updated on each dirty-check run
13735
+ var newValue;
13736
+ // a shallow copy of the newValue from the last dirty-check run,
13737
+ // updated to match newValue during dirty-check run
13738
+ var oldValue;
13739
+ // a shallow copy of the newValue from when the last change happened
13740
+ var veryOldValue;
13741
+ // only track veryOldValue if the listener is asking for it
13742
+ var trackVeryOldValue = (listener.length > 1);
13743
+ var changeDetected = 0;
13744
+ var changeDetector = $parse(obj, $watchCollectionInterceptor);
13745
+ var internalArray = [];
13746
+ var internalObject = {};
13747
+ var initRun = true;
13748
+ var oldLength = 0;
13749
+
13750
+ function $watchCollectionInterceptor(_value) {
13751
+ newValue = _value;
13752
+ var newLength, key, bothNaN, newItem, oldItem;
13753
+
13754
+ if (!isObject(newValue)) { // if primitive
13755
+ if (oldValue !== newValue) {
13756
+ oldValue = newValue;
13757
+ changeDetected++;
13758
+ }
13759
+ } else if (isArrayLike(newValue)) {
13760
+ if (oldValue !== internalArray) {
13761
+ // we are transitioning from something which was not an array into array.
13762
+ oldValue = internalArray;
13763
+ oldLength = oldValue.length = 0;
13764
+ changeDetected++;
13765
+ }
13766
+
13767
+ newLength = newValue.length;
13768
+
13769
+ if (oldLength !== newLength) {
13770
+ // if lengths do not match we need to trigger change notification
13771
+ changeDetected++;
13772
+ oldValue.length = oldLength = newLength;
13773
+ }
13774
+ // copy the items to oldValue and look for changes.
13775
+ for (var i = 0; i < newLength; i++) {
13776
+ oldItem = oldValue[i];
13777
+ newItem = newValue[i];
13778
+
13779
+ bothNaN = (oldItem !== oldItem) && (newItem !== newItem);
13780
+ if (!bothNaN && (oldItem !== newItem)) {
13781
+ changeDetected++;
13782
+ oldValue[i] = newItem;
13783
+ }
13784
+ }
13785
+ } else {
13786
+ if (oldValue !== internalObject) {
13787
+ // we are transitioning from something which was not an object into object.
13788
+ oldValue = internalObject = {};
13789
+ oldLength = 0;
13790
+ changeDetected++;
13791
+ }
13792
+ // copy the items to oldValue and look for changes.
13793
+ newLength = 0;
13794
+ for (key in newValue) {
13795
+ if (newValue.hasOwnProperty(key)) {
13796
+ newLength++;
13797
+ newItem = newValue[key];
13798
+ oldItem = oldValue[key];
13799
+
13800
+ if (key in oldValue) {
13801
+ bothNaN = (oldItem !== oldItem) && (newItem !== newItem);
13802
+ if (!bothNaN && (oldItem !== newItem)) {
13803
+ changeDetected++;
13804
+ oldValue[key] = newItem;
13805
+ }
13806
+ } else {
13807
+ oldLength++;
13808
+ oldValue[key] = newItem;
13809
+ changeDetected++;
13810
+ }
13811
+ }
13812
+ }
13813
+ if (oldLength > newLength) {
13814
+ // we used to have more keys, need to find them and destroy them.
13815
+ changeDetected++;
13816
+ for(key in oldValue) {
13817
+ if (!newValue.hasOwnProperty(key)) {
13818
+ oldLength--;
13819
+ delete oldValue[key];
13820
+ }
13821
+ }
13822
+ }
13823
+ }
13824
+ return changeDetected;
13825
+ }
13826
+
13827
+ function $watchCollectionAction() {
13828
+ if (initRun) {
13829
+ initRun = false;
13830
+ listener(newValue, newValue, self);
13831
+ } else {
13832
+ listener(newValue, veryOldValue, self);
13833
+ }
13834
+
13835
+ // make a copy for the next time a collection is changed
13836
+ if (trackVeryOldValue) {
13837
+ if (!isObject(newValue)) {
13838
+ //primitive
13839
+ veryOldValue = newValue;
13840
+ } else if (isArrayLike(newValue)) {
13841
+ veryOldValue = new Array(newValue.length);
13842
+ for (var i = 0; i < newValue.length; i++) {
13843
+ veryOldValue[i] = newValue[i];
13844
+ }
13845
+ } else { // if object
13846
+ veryOldValue = {};
13847
+ for (var key in newValue) {
13848
+ if (hasOwnProperty.call(newValue, key)) {
13849
+ veryOldValue[key] = newValue[key];
13850
+ }
13851
+ }
13852
+ }
13853
+ }
13854
+ }
13855
+
13856
+ return this.$watch(changeDetector, $watchCollectionAction);
13857
+ },
13858
+
13859
+ /**
13860
+ * @ngdoc method
13861
+ * @name $rootScope.Scope#$digest
13862
+ * @kind function
13863
+ *
13864
+ * @description
13865
+ * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and
13866
+ * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change
13867
+ * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}
13868
+ * until no more listeners are firing. This means that it is possible to get into an infinite
13869
+ * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of
13870
+ * iterations exceeds 10.
13871
+ *
13872
+ * Usually, you don't call `$digest()` directly in
13873
+ * {@link ng.directive:ngController controllers} or in
13874
+ * {@link ng.$compileProvider#directive directives}.
13875
+ * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within
13876
+ * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.
13877
+ *
13878
+ * If you want to be notified whenever `$digest()` is called,
13879
+ * you can register a `watchExpression` function with
13880
+ * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.
13881
+ *
13882
+ * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.
13883
+ *
13884
+ * # Example
13885
+ * ```js
13886
+ var scope = ...;
13887
+ scope.name = 'misko';
13888
+ scope.counter = 0;
13889
+
13890
+ expect(scope.counter).toEqual(0);
13891
+ scope.$watch('name', function(newValue, oldValue) {
13892
+ scope.counter = scope.counter + 1;
13893
+ });
13894
+ expect(scope.counter).toEqual(0);
13895
+
13896
+ scope.$digest();
13897
+ // the listener is always called during the first $digest loop after it was registered
13898
+ expect(scope.counter).toEqual(1);
13899
+
13900
+ scope.$digest();
13901
+ // but now it will not be called unless the value changes
13902
+ expect(scope.counter).toEqual(1);
13903
+
13904
+ scope.name = 'adam';
13905
+ scope.$digest();
13906
+ expect(scope.counter).toEqual(2);
13907
+ * ```
13908
+ *
13909
+ */
13910
+ $digest: function() {
13911
+ var watch, value, last,
13912
+ watchers,
13913
+ length,
13914
+ dirty, ttl = TTL,
13915
+ next, current, target = this,
13916
+ watchLog = [],
13917
+ logIdx, logMsg, asyncTask;
13918
+
13919
+ beginPhase('$digest');
13920
+ // Check for changes to browser url that happened in sync before the call to $digest
13921
+ $browser.$$checkUrlChange();
13922
+
13923
+ if (this === $rootScope && applyAsyncId !== null) {
13924
+ // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then
13925
+ // cancel the scheduled $apply and flush the queue of expressions to be evaluated.
13926
+ $browser.defer.cancel(applyAsyncId);
13927
+ flushApplyAsync();
13928
+ }
13929
+
13930
+ lastDirtyWatch = null;
13931
+
13932
+ do { // "while dirty" loop
13933
+ dirty = false;
13934
+ current = target;
13935
+
13936
+ while(asyncQueue.length) {
13937
+ try {
13938
+ asyncTask = asyncQueue.shift();
13939
+ asyncTask.scope.$eval(asyncTask.expression);
13940
+ } catch (e) {
13941
+ $exceptionHandler(e);
13942
+ }
13943
+ lastDirtyWatch = null;
13944
+ }
13945
+
13946
+ traverseScopesLoop:
13947
+ do { // "traverse the scopes" loop
13948
+ if ((watchers = current.$$watchers)) {
13949
+ // process our watches
13950
+ length = watchers.length;
13951
+ while (length--) {
13952
+ try {
13953
+ watch = watchers[length];
13954
+ // Most common watches are on primitives, in which case we can short
13955
+ // circuit it with === operator, only when === fails do we use .equals
13956
+ if (watch) {
13957
+ if ((value = watch.get(current)) !== (last = watch.last) &&
13958
+ !(watch.eq
13959
+ ? equals(value, last)
13960
+ : (typeof value === 'number' && typeof last === 'number'
13961
+ && isNaN(value) && isNaN(last)))) {
13962
+ dirty = true;
13963
+ lastDirtyWatch = watch;
13964
+ watch.last = watch.eq ? copy(value, null) : value;
13965
+ watch.fn(value, ((last === initWatchVal) ? value : last), current);
13966
+ if (ttl < 5) {
13967
+ logIdx = 4 - ttl;
13968
+ if (!watchLog[logIdx]) watchLog[logIdx] = [];
13969
+ logMsg = (isFunction(watch.exp))
13970
+ ? 'fn: ' + (watch.exp.name || watch.exp.toString())
13971
+ : watch.exp;
13972
+ logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
13973
+ watchLog[logIdx].push(logMsg);
13974
+ }
13975
+ } else if (watch === lastDirtyWatch) {
13976
+ // If the most recently dirty watcher is now clean, short circuit since the remaining watchers
13977
+ // have already been tested.
13978
+ dirty = false;
13979
+ break traverseScopesLoop;
13980
+ }
13981
+ }
13982
+ } catch (e) {
13983
+ $exceptionHandler(e);
13984
+ }
13985
+ }
13986
+ }
13987
+
13988
+ // Insanity Warning: scope depth-first traversal
13989
+ // yes, this code is a bit crazy, but it works and we have tests to prove it!
13990
+ // this piece should be kept in sync with the traversal in $broadcast
13991
+ if (!(next = (current.$$childHead ||
13992
+ (current !== target && current.$$nextSibling)))) {
13993
+ while(current !== target && !(next = current.$$nextSibling)) {
13994
+ current = current.$parent;
13995
+ }
13996
+ }
13997
+ } while ((current = next));
13998
+
13999
+ // `break traverseScopesLoop;` takes us to here
14000
+
14001
+ if((dirty || asyncQueue.length) && !(ttl--)) {
14002
+ clearPhase();
14003
+ throw $rootScopeMinErr('infdig',
14004
+ '{0} $digest() iterations reached. Aborting!\n' +
14005
+ 'Watchers fired in the last 5 iterations: {1}',
14006
+ TTL, toJson(watchLog));
14007
+ }
14008
+
14009
+ } while (dirty || asyncQueue.length);
14010
+
14011
+ clearPhase();
14012
+
14013
+ while(postDigestQueue.length) {
14014
+ try {
14015
+ postDigestQueue.shift()();
14016
+ } catch (e) {
14017
+ $exceptionHandler(e);
14018
+ }
14019
+ }
14020
+ },
14021
+
14022
+
14023
+ /**
14024
+ * @ngdoc event
14025
+ * @name $rootScope.Scope#$destroy
14026
+ * @eventType broadcast on scope being destroyed
14027
+ *
14028
+ * @description
14029
+ * Broadcasted when a scope and its children are being destroyed.
14030
+ *
14031
+ * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
14032
+ * clean up DOM bindings before an element is removed from the DOM.
14033
+ */
14034
+
14035
+ /**
14036
+ * @ngdoc method
14037
+ * @name $rootScope.Scope#$destroy
14038
+ * @kind function
14039
+ *
14040
+ * @description
14041
+ * Removes the current scope (and all of its children) from the parent scope. Removal implies
14042
+ * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer
14043
+ * propagate to the current scope and its children. Removal also implies that the current
14044
+ * scope is eligible for garbage collection.
14045
+ *
14046
+ * The `$destroy()` is usually used by directives such as
14047
+ * {@link ng.directive:ngRepeat ngRepeat} for managing the
14048
+ * unrolling of the loop.
14049
+ *
14050
+ * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.
14051
+ * Application code can register a `$destroy` event handler that will give it a chance to
14052
+ * perform any necessary cleanup.
14053
+ *
14054
+ * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
14055
+ * clean up DOM bindings before an element is removed from the DOM.
14056
+ */
14057
+ $destroy: function() {
14058
+ // we can't destroy the root scope or a scope that has been already destroyed
14059
+ if (this.$$destroyed) return;
14060
+ var parent = this.$parent;
14061
+
14062
+ this.$broadcast('$destroy');
14063
+ this.$$destroyed = true;
14064
+ if (this === $rootScope) return;
14065
+
14066
+ for (var eventName in this.$$listenerCount) {
14067
+ decrementListenerCount(this, this.$$listenerCount[eventName], eventName);
14068
+ }
14069
+
14070
+ // sever all the references to parent scopes (after this cleanup, the current scope should
14071
+ // not be retained by any of our references and should be eligible for garbage collection)
14072
+ if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;
14073
+ if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;
14074
+ if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;
14075
+ if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;
14076
+
14077
+ // Disable listeners, watchers and apply/digest methods
14078
+ this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;
14079
+ this.$on = this.$watch = this.$watchGroup = function() { return noop; };
14080
+ this.$$listeners = {};
14081
+
14082
+ // All of the code below is bogus code that works around V8's memory leak via optimized code
14083
+ // and inline caches.
14084
+ //
14085
+ // see:
14086
+ // - https://code.google.com/p/v8/issues/detail?id=2073#c26
14087
+ // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909
14088
+ // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451
14089
+
14090
+ this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =
14091
+ this.$$childTail = this.$root = this.$$watchers = null;
14092
+ },
14093
+
14094
+ /**
14095
+ * @ngdoc method
14096
+ * @name $rootScope.Scope#$eval
14097
+ * @kind function
14098
+ *
14099
+ * @description
14100
+ * Executes the `expression` on the current scope and returns the result. Any exceptions in
14101
+ * the expression are propagated (uncaught). This is useful when evaluating Angular
14102
+ * expressions.
14103
+ *
14104
+ * # Example
14105
+ * ```js
14106
+ var scope = ng.$rootScope.Scope();
14107
+ scope.a = 1;
14108
+ scope.b = 2;
14109
+
14110
+ expect(scope.$eval('a+b')).toEqual(3);
14111
+ expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
14112
+ * ```
14113
+ *
14114
+ * @param {(string|function())=} expression An angular expression to be executed.
14115
+ *
14116
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
14117
+ * - `function(scope)`: execute the function with the current `scope` parameter.
14118
+ *
14119
+ * @param {(object)=} locals Local variables object, useful for overriding values in scope.
14120
+ * @returns {*} The result of evaluating the expression.
14121
+ */
14122
+ $eval: function(expr, locals) {
14123
+ return $parse(expr)(this, locals);
14124
+ },
14125
+
14126
+ /**
14127
+ * @ngdoc method
14128
+ * @name $rootScope.Scope#$evalAsync
14129
+ * @kind function
14130
+ *
14131
+ * @description
14132
+ * Executes the expression on the current scope at a later point in time.
14133
+ *
14134
+ * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only
14135
+ * that:
14136
+ *
14137
+ * - it will execute after the function that scheduled the evaluation (preferably before DOM
14138
+ * rendering).
14139
+ * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after
14140
+ * `expression` execution.
14141
+ *
14142
+ * Any exceptions from the execution of the expression are forwarded to the
14143
+ * {@link ng.$exceptionHandler $exceptionHandler} service.
14144
+ *
14145
+ * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle
14146
+ * will be scheduled. However, it is encouraged to always call code that changes the model
14147
+ * from within an `$apply` call. That includes code evaluated via `$evalAsync`.
14148
+ *
14149
+ * @param {(string|function())=} expression An angular expression to be executed.
14150
+ *
14151
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
14152
+ * - `function(scope)`: execute the function with the current `scope` parameter.
14153
+ *
14154
+ */
14155
+ $evalAsync: function(expr) {
14156
+ // if we are outside of an $digest loop and this is the first time we are scheduling async
14157
+ // task also schedule async auto-flush
14158
+ if (!$rootScope.$$phase && !asyncQueue.length) {
14159
+ $browser.defer(function() {
14160
+ if (asyncQueue.length) {
14161
+ $rootScope.$digest();
14162
+ }
14163
+ });
14164
+ }
14165
+
14166
+ asyncQueue.push({scope: this, expression: expr});
14167
+ },
14168
+
14169
+ $$postDigest : function(fn) {
14170
+ postDigestQueue.push(fn);
14171
+ },
14172
+
14173
+ /**
14174
+ * @ngdoc method
14175
+ * @name $rootScope.Scope#$apply
14176
+ * @kind function
14177
+ *
14178
+ * @description
14179
+ * `$apply()` is used to execute an expression in angular from outside of the angular
14180
+ * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).
14181
+ * Because we are calling into the angular framework we need to perform proper scope life
14182
+ * cycle of {@link ng.$exceptionHandler exception handling},
14183
+ * {@link ng.$rootScope.Scope#$digest executing watches}.
14184
+ *
14185
+ * ## Life cycle
14186
+ *
14187
+ * # Pseudo-Code of `$apply()`
14188
+ * ```js
14189
+ function $apply(expr) {
14190
+ try {
14191
+ return $eval(expr);
14192
+ } catch (e) {
14193
+ $exceptionHandler(e);
14194
+ } finally {
14195
+ $root.$digest();
14196
+ }
14197
+ }
14198
+ * ```
14199
+ *
14200
+ *
14201
+ * Scope's `$apply()` method transitions through the following stages:
14202
+ *
14203
+ * 1. The {@link guide/expression expression} is executed using the
14204
+ * {@link ng.$rootScope.Scope#$eval $eval()} method.
14205
+ * 2. Any exceptions from the execution of the expression are forwarded to the
14206
+ * {@link ng.$exceptionHandler $exceptionHandler} service.
14207
+ * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the
14208
+ * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.
14209
+ *
14210
+ *
14211
+ * @param {(string|function())=} exp An angular expression to be executed.
14212
+ *
14213
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
14214
+ * - `function(scope)`: execute the function with current `scope` parameter.
14215
+ *
14216
+ * @returns {*} The result of evaluating the expression.
14217
+ */
14218
+ $apply: function(expr) {
14219
+ try {
14220
+ beginPhase('$apply');
14221
+ return this.$eval(expr);
14222
+ } catch (e) {
14223
+ $exceptionHandler(e);
14224
+ } finally {
14225
+ clearPhase();
14226
+ try {
14227
+ $rootScope.$digest();
14228
+ } catch (e) {
14229
+ $exceptionHandler(e);
14230
+ throw e;
14231
+ }
14232
+ }
14233
+ },
14234
+
14235
+ /**
14236
+ * @ngdoc method
14237
+ * @name $rootScope.Scope#$applyAsync
14238
+ * @kind function
14239
+ *
14240
+ * @description
14241
+ * Schedule the invokation of $apply to occur at a later time. The actual time difference
14242
+ * varies across browsers, but is typically around ~10 milliseconds.
14243
+ *
14244
+ * This can be used to queue up multiple expressions which need to be evaluated in the same
14245
+ * digest.
14246
+ *
14247
+ * @param {(string|function())=} exp An angular expression to be executed.
14248
+ *
14249
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
14250
+ * - `function(scope)`: execute the function with current `scope` parameter.
14251
+ */
14252
+ $applyAsync: function(expr) {
14253
+ var scope = this;
14254
+ expr && applyAsyncQueue.push($applyAsyncExpression);
14255
+ scheduleApplyAsync();
14256
+
14257
+ function $applyAsyncExpression() {
14258
+ scope.$eval(expr);
14259
+ }
14260
+ },
14261
+
14262
+ /**
14263
+ * @ngdoc method
14264
+ * @name $rootScope.Scope#$on
14265
+ * @kind function
14266
+ *
14267
+ * @description
14268
+ * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for
14269
+ * discussion of event life cycle.
14270
+ *
14271
+ * The event listener function format is: `function(event, args...)`. The `event` object
14272
+ * passed into the listener has the following attributes:
14273
+ *
14274
+ * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or
14275
+ * `$broadcast`-ed.
14276
+ * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the
14277
+ * event propagates through the scope hierarchy, this property is set to null.
14278
+ * - `name` - `{string}`: name of the event.
14279
+ * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel
14280
+ * further event propagation (available only for events that were `$emit`-ed).
14281
+ * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag
14282
+ * to true.
14283
+ * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.
14284
+ *
14285
+ * @param {string} name Event name to listen on.
14286
+ * @param {function(event, ...args)} listener Function to call when the event is emitted.
14287
+ * @returns {function()} Returns a deregistration function for this listener.
14288
+ */
14289
+ $on: function(name, listener) {
14290
+ var namedListeners = this.$$listeners[name];
14291
+ if (!namedListeners) {
14292
+ this.$$listeners[name] = namedListeners = [];
14293
+ }
14294
+ namedListeners.push(listener);
14295
+
14296
+ var current = this;
14297
+ do {
14298
+ if (!current.$$listenerCount[name]) {
14299
+ current.$$listenerCount[name] = 0;
14300
+ }
14301
+ current.$$listenerCount[name]++;
14302
+ } while ((current = current.$parent));
14303
+
14304
+ var self = this;
14305
+ return function() {
14306
+ namedListeners[namedListeners.indexOf(listener)] = null;
14307
+ decrementListenerCount(self, 1, name);
14308
+ };
14309
+ },
14310
+
14311
+
14312
+ /**
14313
+ * @ngdoc method
14314
+ * @name $rootScope.Scope#$emit
14315
+ * @kind function
14316
+ *
14317
+ * @description
14318
+ * Dispatches an event `name` upwards through the scope hierarchy notifying the
14319
+ * registered {@link ng.$rootScope.Scope#$on} listeners.
14320
+ *
14321
+ * The event life cycle starts at the scope on which `$emit` was called. All
14322
+ * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get
14323
+ * notified. Afterwards, the event traverses upwards toward the root scope and calls all
14324
+ * registered listeners along the way. The event will stop propagating if one of the listeners
14325
+ * cancels it.
14326
+ *
14327
+ * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed
14328
+ * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
14329
+ *
14330
+ * @param {string} name Event name to emit.
14331
+ * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.
14332
+ * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).
14333
+ */
14334
+ $emit: function(name, args) {
14335
+ var empty = [],
14336
+ namedListeners,
14337
+ scope = this,
14338
+ stopPropagation = false,
14339
+ event = {
14340
+ name: name,
14341
+ targetScope: scope,
14342
+ stopPropagation: function() {stopPropagation = true;},
14343
+ preventDefault: function() {
14344
+ event.defaultPrevented = true;
14345
+ },
14346
+ defaultPrevented: false
14347
+ },
14348
+ listenerArgs = concat([event], arguments, 1),
14349
+ i, length;
14350
+
14351
+ do {
14352
+ namedListeners = scope.$$listeners[name] || empty;
14353
+ event.currentScope = scope;
14354
+ for (i=0, length=namedListeners.length; i<length; i++) {
14355
+
14356
+ // if listeners were deregistered, defragment the array
14357
+ if (!namedListeners[i]) {
14358
+ namedListeners.splice(i, 1);
14359
+ i--;
14360
+ length--;
14361
+ continue;
14362
+ }
14363
+ try {
14364
+ //allow all listeners attached to the current scope to run
14365
+ namedListeners[i].apply(null, listenerArgs);
14366
+ } catch (e) {
14367
+ $exceptionHandler(e);
14368
+ }
14369
+ }
14370
+ //if any listener on the current scope stops propagation, prevent bubbling
14371
+ if (stopPropagation) {
14372
+ event.currentScope = null;
14373
+ return event;
14374
+ }
14375
+ //traverse upwards
14376
+ scope = scope.$parent;
14377
+ } while (scope);
14378
+
14379
+ event.currentScope = null;
14380
+
14381
+ return event;
14382
+ },
14383
+
14384
+
14385
+ /**
14386
+ * @ngdoc method
14387
+ * @name $rootScope.Scope#$broadcast
14388
+ * @kind function
14389
+ *
14390
+ * @description
14391
+ * Dispatches an event `name` downwards to all child scopes (and their children) notifying the
14392
+ * registered {@link ng.$rootScope.Scope#$on} listeners.
14393
+ *
14394
+ * The event life cycle starts at the scope on which `$broadcast` was called. All
14395
+ * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get
14396
+ * notified. Afterwards, the event propagates to all direct and indirect scopes of the current
14397
+ * scope and calls all registered listeners along the way. The event cannot be canceled.
14398
+ *
14399
+ * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed
14400
+ * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
14401
+ *
14402
+ * @param {string} name Event name to broadcast.
14403
+ * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.
14404
+ * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}
14405
+ */
14406
+ $broadcast: function(name, args) {
14407
+ var target = this,
14408
+ current = target,
14409
+ next = target,
14410
+ event = {
14411
+ name: name,
14412
+ targetScope: target,
14413
+ preventDefault: function() {
14414
+ event.defaultPrevented = true;
14415
+ },
14416
+ defaultPrevented: false
14417
+ };
14418
+
14419
+ if (!target.$$listenerCount[name]) return event;
14420
+
14421
+ var listenerArgs = concat([event], arguments, 1),
14422
+ listeners, i, length;
14423
+
14424
+ //down while you can, then up and next sibling or up and next sibling until back at root
14425
+ while ((current = next)) {
14426
+ event.currentScope = current;
14427
+ listeners = current.$$listeners[name] || [];
14428
+ for (i=0, length = listeners.length; i<length; i++) {
14429
+ // if listeners were deregistered, defragment the array
14430
+ if (!listeners[i]) {
14431
+ listeners.splice(i, 1);
14432
+ i--;
14433
+ length--;
14434
+ continue;
14435
+ }
14436
+
14437
+ try {
14438
+ listeners[i].apply(null, listenerArgs);
14439
+ } catch(e) {
14440
+ $exceptionHandler(e);
14441
+ }
14442
+ }
14443
+
14444
+ // Insanity Warning: scope depth-first traversal
14445
+ // yes, this code is a bit crazy, but it works and we have tests to prove it!
14446
+ // this piece should be kept in sync with the traversal in $digest
14447
+ // (though it differs due to having the extra check for $$listenerCount)
14448
+ if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||
14449
+ (current !== target && current.$$nextSibling)))) {
14450
+ while(current !== target && !(next = current.$$nextSibling)) {
14451
+ current = current.$parent;
14452
+ }
14453
+ }
14454
+ }
14455
+
14456
+ event.currentScope = null;
14457
+ return event;
14458
+ }
14459
+ };
14460
+
14461
+ var $rootScope = new Scope();
14462
+
14463
+ //The internal queues. Expose them on the $rootScope for debugging/testing purposes.
14464
+ var asyncQueue = $rootScope.$$asyncQueue = [];
14465
+ var postDigestQueue = $rootScope.$$postDigestQueue = [];
14466
+ var applyAsyncQueue = $rootScope.$$applyAsyncQueue = [];
14467
+
14468
+ return $rootScope;
14469
+
14470
+
14471
+ function beginPhase(phase) {
14472
+ if ($rootScope.$$phase) {
14473
+ throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);
14474
+ }
14475
+
14476
+ $rootScope.$$phase = phase;
14477
+ }
14478
+
14479
+ function clearPhase() {
14480
+ $rootScope.$$phase = null;
14481
+ }
14482
+
14483
+
14484
+ function decrementListenerCount(current, count, name) {
14485
+ do {
14486
+ current.$$listenerCount[name] -= count;
14487
+
14488
+ if (current.$$listenerCount[name] === 0) {
14489
+ delete current.$$listenerCount[name];
14490
+ }
14491
+ } while ((current = current.$parent));
14492
+ }
14493
+
14494
+ /**
14495
+ * function used as an initial value for watchers.
14496
+ * because it's unique we can easily tell it apart from other values
14497
+ */
14498
+ function initWatchVal() {}
14499
+
14500
+ function flushApplyAsync() {
14501
+ while (applyAsyncQueue.length) {
14502
+ try {
14503
+ applyAsyncQueue.shift()();
14504
+ } catch(e) {
14505
+ $exceptionHandler(e);
14506
+ }
14507
+ }
14508
+ applyAsyncId = null;
14509
+ }
14510
+
14511
+ function scheduleApplyAsync() {
14512
+ if (applyAsyncId === null) {
14513
+ applyAsyncId = $browser.defer(function() {
14514
+ $rootScope.$apply(flushApplyAsync);
14515
+ });
14516
+ }
14517
+ }
14518
+ }];
14519
+}
14520
+
14521
+/**
14522
+ * @description
14523
+ * Private service to sanitize uris for links and images. Used by $compile and $sanitize.
14524
+ */
14525
+function $$SanitizeUriProvider() {
14526
+ var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/,
14527
+ imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/;
14528
+
14529
+ /**
14530
+ * @description
14531
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
14532
+ * urls during a[href] sanitization.
14533
+ *
14534
+ * The sanitization is a security measure aimed at prevent XSS attacks via html links.
14535
+ *
14536
+ * Any url about to be assigned to a[href] via data-binding is first normalized and turned into
14537
+ * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
14538
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
14539
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
14540
+ *
14541
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
14542
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
14543
+ * chaining otherwise.
14544
+ */
14545
+ this.aHrefSanitizationWhitelist = function(regexp) {
14546
+ if (isDefined(regexp)) {
14547
+ aHrefSanitizationWhitelist = regexp;
14548
+ return this;
14549
+ }
14550
+ return aHrefSanitizationWhitelist;
14551
+ };
14552
+
14553
+
14554
+ /**
14555
+ * @description
14556
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
14557
+ * urls during img[src] sanitization.
14558
+ *
14559
+ * The sanitization is a security measure aimed at prevent XSS attacks via html links.
14560
+ *
14561
+ * Any url about to be assigned to img[src] via data-binding is first normalized and turned into
14562
+ * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`
14563
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
14564
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
14565
+ *
14566
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
14567
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
14568
+ * chaining otherwise.
14569
+ */
14570
+ this.imgSrcSanitizationWhitelist = function(regexp) {
14571
+ if (isDefined(regexp)) {
14572
+ imgSrcSanitizationWhitelist = regexp;
14573
+ return this;
14574
+ }
14575
+ return imgSrcSanitizationWhitelist;
14576
+ };
14577
+
14578
+ this.$get = function() {
14579
+ return function sanitizeUri(uri, isImage) {
14580
+ var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;
14581
+ var normalizedVal;
14582
+ normalizedVal = urlResolve(uri).href;
14583
+ if (normalizedVal !== '' && !normalizedVal.match(regex)) {
14584
+ return 'unsafe:'+normalizedVal;
14585
+ }
14586
+ return uri;
14587
+ };
14588
+ };
14589
+}
14590
+
14591
+var $sceMinErr = minErr('$sce');
14592
+
14593
+var SCE_CONTEXTS = {
14594
+ HTML: 'html',
14595
+ CSS: 'css',
14596
+ URL: 'url',
14597
+ // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a
14598
+ // url. (e.g. ng-include, script src, templateUrl)
14599
+ RESOURCE_URL: 'resourceUrl',
14600
+ JS: 'js'
14601
+};
14602
+
14603
+// Helper functions follow.
14604
+
14605
+// Copied from:
14606
+// http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962
14607
+// Prereq: s is a string.
14608
+function escapeForRegexp(s) {
14609
+ return s.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').
14610
+ replace(/\x08/g, '\\x08');
14611
+}
14612
+
14613
+
14614
+function adjustMatcher(matcher) {
14615
+ if (matcher === 'self') {
14616
+ return matcher;
14617
+ } else if (isString(matcher)) {
14618
+ // Strings match exactly except for 2 wildcards - '*' and '**'.
14619
+ // '*' matches any character except those from the set ':/.?&'.
14620
+ // '**' matches any character (like .* in a RegExp).
14621
+ // More than 2 *'s raises an error as it's ill defined.
14622
+ if (matcher.indexOf('***') > -1) {
14623
+ throw $sceMinErr('iwcard',
14624
+ 'Illegal sequence *** in string matcher. String: {0}', matcher);
14625
+ }
14626
+ matcher = escapeForRegexp(matcher).
14627
+ replace('\\*\\*', '.*').
14628
+ replace('\\*', '[^:/.?&;]*');
14629
+ return new RegExp('^' + matcher + '$');
14630
+ } else if (isRegExp(matcher)) {
14631
+ // The only other type of matcher allowed is a Regexp.
14632
+ // Match entire URL / disallow partial matches.
14633
+ // Flags are reset (i.e. no global, ignoreCase or multiline)
14634
+ return new RegExp('^' + matcher.source + '$');
14635
+ } else {
14636
+ throw $sceMinErr('imatcher',
14637
+ 'Matchers may only be "self", string patterns or RegExp objects');
14638
+ }
14639
+}
14640
+
14641
+
14642
+function adjustMatchers(matchers) {
14643
+ var adjustedMatchers = [];
14644
+ if (isDefined(matchers)) {
14645
+ forEach(matchers, function(matcher) {
14646
+ adjustedMatchers.push(adjustMatcher(matcher));
14647
+ });
14648
+ }
14649
+ return adjustedMatchers;
14650
+}
14651
+
14652
+
14653
+/**
14654
+ * @ngdoc service
14655
+ * @name $sceDelegate
14656
+ * @kind function
14657
+ *
14658
+ * @description
14659
+ *
14660
+ * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict
14661
+ * Contextual Escaping (SCE)} services to AngularJS.
14662
+ *
14663
+ * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of
14664
+ * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is
14665
+ * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to
14666
+ * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things
14667
+ * work because `$sce` delegates to `$sceDelegate` for these operations.
14668
+ *
14669
+ * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.
14670
+ *
14671
+ * The default instance of `$sceDelegate` should work out of the box with little pain. While you
14672
+ * can override it completely to change the behavior of `$sce`, the common case would
14673
+ * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting
14674
+ * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as
14675
+ * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist
14676
+ * $sceDelegateProvider.resourceUrlWhitelist} and {@link
14677
+ * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}
14678
+ */
14679
+
14680
+/**
14681
+ * @ngdoc provider
14682
+ * @name $sceDelegateProvider
14683
+ * @description
14684
+ *
14685
+ * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate
14686
+ * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure
14687
+ * that the URLs used for sourcing Angular templates are safe. Refer {@link
14688
+ * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and
14689
+ * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}
14690
+ *
14691
+ * For the general details about this service in Angular, read the main page for {@link ng.$sce
14692
+ * Strict Contextual Escaping (SCE)}.
14693
+ *
14694
+ * **Example**: Consider the following case. <a name="example"></a>
14695
+ *
14696
+ * - your app is hosted at url `http://myapp.example.com/`
14697
+ * - but some of your templates are hosted on other domains you control such as
14698
+ * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc.
14699
+ * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.
14700
+ *
14701
+ * Here is what a secure configuration for this scenario might look like:
14702
+ *
14703
+ * ```
14704
+ * angular.module('myApp', []).config(function($sceDelegateProvider) {
14705
+ * $sceDelegateProvider.resourceUrlWhitelist([
14706
+ * // Allow same origin resource loads.
14707
+ * 'self',
14708
+ * // Allow loading from our assets domain. Notice the difference between * and **.
14709
+ * 'http://srv*.assets.example.com/**'
14710
+ * ]);
14711
+ *
14712
+ * // The blacklist overrides the whitelist so the open redirect here is blocked.
14713
+ * $sceDelegateProvider.resourceUrlBlacklist([
14714
+ * 'http://myapp.example.com/clickThru**'
14715
+ * ]);
14716
+ * });
14717
+ * ```
14718
+ */
14719
+
14720
+function $SceDelegateProvider() {
14721
+ this.SCE_CONTEXTS = SCE_CONTEXTS;
14722
+
14723
+ // Resource URLs can also be trusted by policy.
14724
+ var resourceUrlWhitelist = ['self'],
14725
+ resourceUrlBlacklist = [];
14726
+
14727
+ /**
14728
+ * @ngdoc method
14729
+ * @name $sceDelegateProvider#resourceUrlWhitelist
14730
+ * @kind function
14731
+ *
14732
+ * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value
14733
+ * provided. This must be an array or null. A snapshot of this array is used so further
14734
+ * changes to the array are ignored.
14735
+ *
14736
+ * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
14737
+ * allowed in this array.
14738
+ *
14739
+ * Note: **an empty whitelist array will block all URLs**!
14740
+ *
14741
+ * @return {Array} the currently set whitelist array.
14742
+ *
14743
+ * The **default value** when no whitelist has been explicitly set is `['self']` allowing only
14744
+ * same origin resource requests.
14745
+ *
14746
+ * @description
14747
+ * Sets/Gets the whitelist of trusted resource URLs.
14748
+ */
14749
+ this.resourceUrlWhitelist = function (value) {
14750
+ if (arguments.length) {
14751
+ resourceUrlWhitelist = adjustMatchers(value);
14752
+ }
14753
+ return resourceUrlWhitelist;
14754
+ };
14755
+
14756
+ /**
14757
+ * @ngdoc method
14758
+ * @name $sceDelegateProvider#resourceUrlBlacklist
14759
+ * @kind function
14760
+ *
14761
+ * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value
14762
+ * provided. This must be an array or null. A snapshot of this array is used so further
14763
+ * changes to the array are ignored.
14764
+ *
14765
+ * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
14766
+ * allowed in this array.
14767
+ *
14768
+ * The typical usage for the blacklist is to **block
14769
+ * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as
14770
+ * these would otherwise be trusted but actually return content from the redirected domain.
14771
+ *
14772
+ * Finally, **the blacklist overrides the whitelist** and has the final say.
14773
+ *
14774
+ * @return {Array} the currently set blacklist array.
14775
+ *
14776
+ * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there
14777
+ * is no blacklist.)
14778
+ *
14779
+ * @description
14780
+ * Sets/Gets the blacklist of trusted resource URLs.
14781
+ */
14782
+
14783
+ this.resourceUrlBlacklist = function (value) {
14784
+ if (arguments.length) {
14785
+ resourceUrlBlacklist = adjustMatchers(value);
14786
+ }
14787
+ return resourceUrlBlacklist;
14788
+ };
14789
+
14790
+ this.$get = ['$injector', function($injector) {
14791
+
14792
+ var htmlSanitizer = function htmlSanitizer(html) {
14793
+ throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
14794
+ };
14795
+
14796
+ if ($injector.has('$sanitize')) {
14797
+ htmlSanitizer = $injector.get('$sanitize');
14798
+ }
14799
+
14800
+
14801
+ function matchUrl(matcher, parsedUrl) {
14802
+ if (matcher === 'self') {
14803
+ return urlIsSameOrigin(parsedUrl);
14804
+ } else {
14805
+ // definitely a regex. See adjustMatchers()
14806
+ return !!matcher.exec(parsedUrl.href);
14807
+ }
14808
+ }
14809
+
14810
+ function isResourceUrlAllowedByPolicy(url) {
14811
+ var parsedUrl = urlResolve(url.toString());
14812
+ var i, n, allowed = false;
14813
+ // Ensure that at least one item from the whitelist allows this url.
14814
+ for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {
14815
+ if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {
14816
+ allowed = true;
14817
+ break;
14818
+ }
14819
+ }
14820
+ if (allowed) {
14821
+ // Ensure that no item from the blacklist blocked this url.
14822
+ for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {
14823
+ if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {
14824
+ allowed = false;
14825
+ break;
14826
+ }
14827
+ }
14828
+ }
14829
+ return allowed;
14830
+ }
14831
+
14832
+ function generateHolderType(Base) {
14833
+ var holderType = function TrustedValueHolderType(trustedValue) {
14834
+ this.$$unwrapTrustedValue = function() {
14835
+ return trustedValue;
14836
+ };
14837
+ };
14838
+ if (Base) {
14839
+ holderType.prototype = new Base();
14840
+ }
14841
+ holderType.prototype.valueOf = function sceValueOf() {
14842
+ return this.$$unwrapTrustedValue();
14843
+ };
14844
+ holderType.prototype.toString = function sceToString() {
14845
+ return this.$$unwrapTrustedValue().toString();
14846
+ };
14847
+ return holderType;
14848
+ }
14849
+
14850
+ var trustedValueHolderBase = generateHolderType(),
14851
+ byType = {};
14852
+
14853
+ byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);
14854
+ byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);
14855
+ byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);
14856
+ byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);
14857
+ byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);
14858
+
14859
+ /**
14860
+ * @ngdoc method
14861
+ * @name $sceDelegate#trustAs
14862
+ *
14863
+ * @description
14864
+ * Returns an object that is trusted by angular for use in specified strict
14865
+ * contextual escaping contexts (such as ng-bind-html, ng-include, any src
14866
+ * attribute interpolation, any dom event binding attribute interpolation
14867
+ * such as for onclick, etc.) that uses the provided value.
14868
+ * See {@link ng.$sce $sce} for enabling strict contextual escaping.
14869
+ *
14870
+ * @param {string} type The kind of context in which this value is safe for use. e.g. url,
14871
+ * resourceUrl, html, js and css.
14872
+ * @param {*} value The value that that should be considered trusted/safe.
14873
+ * @returns {*} A value that can be used to stand in for the provided `value` in places
14874
+ * where Angular expects a $sce.trustAs() return value.
14875
+ */
14876
+ function trustAs(type, trustedValue) {
14877
+ var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
14878
+ if (!Constructor) {
14879
+ throw $sceMinErr('icontext',
14880
+ 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',
14881
+ type, trustedValue);
14882
+ }
14883
+ if (trustedValue === null || trustedValue === undefined || trustedValue === '') {
14884
+ return trustedValue;
14885
+ }
14886
+ // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting
14887
+ // mutable objects, we ensure here that the value passed in is actually a string.
14888
+ if (typeof trustedValue !== 'string') {
14889
+ throw $sceMinErr('itype',
14890
+ 'Attempted to trust a non-string value in a content requiring a string: Context: {0}',
14891
+ type);
14892
+ }
14893
+ return new Constructor(trustedValue);
14894
+ }
14895
+
14896
+ /**
14897
+ * @ngdoc method
14898
+ * @name $sceDelegate#valueOf
14899
+ *
14900
+ * @description
14901
+ * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs
14902
+ * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link
14903
+ * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.
14904
+ *
14905
+ * If the passed parameter is not a value that had been returned by {@link
14906
+ * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.
14907
+ *
14908
+ * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}
14909
+ * call or anything else.
14910
+ * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs
14911
+ * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns
14912
+ * `value` unchanged.
14913
+ */
14914
+ function valueOf(maybeTrusted) {
14915
+ if (maybeTrusted instanceof trustedValueHolderBase) {
14916
+ return maybeTrusted.$$unwrapTrustedValue();
14917
+ } else {
14918
+ return maybeTrusted;
14919
+ }
14920
+ }
14921
+
14922
+ /**
14923
+ * @ngdoc method
14924
+ * @name $sceDelegate#getTrusted
14925
+ *
14926
+ * @description
14927
+ * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and
14928
+ * returns the originally supplied value if the queried context type is a supertype of the
14929
+ * created type. If this condition isn't satisfied, throws an exception.
14930
+ *
14931
+ * @param {string} type The kind of context in which this value is to be used.
14932
+ * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs
14933
+ * `$sceDelegate.trustAs`} call.
14934
+ * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs
14935
+ * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception.
14936
+ */
14937
+ function getTrusted(type, maybeTrusted) {
14938
+ if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') {
14939
+ return maybeTrusted;
14940
+ }
14941
+ var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
14942
+ if (constructor && maybeTrusted instanceof constructor) {
14943
+ return maybeTrusted.$$unwrapTrustedValue();
14944
+ }
14945
+ // If we get here, then we may only take one of two actions.
14946
+ // 1. sanitize the value for the requested type, or
14947
+ // 2. throw an exception.
14948
+ if (type === SCE_CONTEXTS.RESOURCE_URL) {
14949
+ if (isResourceUrlAllowedByPolicy(maybeTrusted)) {
14950
+ return maybeTrusted;
14951
+ } else {
14952
+ throw $sceMinErr('insecurl',
14953
+ 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}',
14954
+ maybeTrusted.toString());
14955
+ }
14956
+ } else if (type === SCE_CONTEXTS.HTML) {
14957
+ return htmlSanitizer(maybeTrusted);
14958
+ }
14959
+ throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
14960
+ }
14961
+
14962
+ return { trustAs: trustAs,
14963
+ getTrusted: getTrusted,
14964
+ valueOf: valueOf };
14965
+ }];
14966
+}
14967
+
14968
+
14969
+/**
14970
+ * @ngdoc provider
14971
+ * @name $sceProvider
14972
+ * @description
14973
+ *
14974
+ * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.
14975
+ * - enable/disable Strict Contextual Escaping (SCE) in a module
14976
+ * - override the default implementation with a custom delegate
14977
+ *
14978
+ * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.
14979
+ */
14980
+
14981
+/* jshint maxlen: false*/
14982
+
14983
+/**
14984
+ * @ngdoc service
14985
+ * @name $sce
14986
+ * @kind function
14987
+ *
14988
+ * @description
14989
+ *
14990
+ * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.
14991
+ *
14992
+ * # Strict Contextual Escaping
14993
+ *
14994
+ * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain
14995
+ * contexts to result in a value that is marked as safe to use for that context. One example of
14996
+ * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer
14997
+ * to these contexts as privileged or SCE contexts.
14998
+ *
14999
+ * As of version 1.2, Angular ships with SCE enabled by default.
15000
+ *
15001
+ * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow
15002
+ * one to execute arbitrary javascript by the use of the expression() syntax. Refer
15003
+ * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.
15004
+ * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`
15005
+ * to the top of your HTML document.
15006
+ *
15007
+ * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for
15008
+ * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.
15009
+ *
15010
+ * Here's an example of a binding in a privileged context:
15011
+ *
15012
+ * ```
15013
+ * <input ng-model="userHtml">
15014
+ * <div ng-bind-html="userHtml"></div>
15015
+ * ```
15016
+ *
15017
+ * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE
15018
+ * disabled, this application allows the user to render arbitrary HTML into the DIV.
15019
+ * In a more realistic example, one may be rendering user comments, blog articles, etc. via
15020
+ * bindings. (HTML is just one example of a context where rendering user controlled input creates
15021
+ * security vulnerabilities.)
15022
+ *
15023
+ * For the case of HTML, you might use a library, either on the client side, or on the server side,
15024
+ * to sanitize unsafe HTML before binding to the value and rendering it in the document.
15025
+ *
15026
+ * How would you ensure that every place that used these types of bindings was bound to a value that
15027
+ * was sanitized by your library (or returned as safe for rendering by your server?) How can you
15028
+ * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some
15029
+ * properties/fields and forgot to update the binding to the sanitized value?
15030
+ *
15031
+ * To be secure by default, you want to ensure that any such bindings are disallowed unless you can
15032
+ * determine that something explicitly says it's safe to use a value for binding in that
15033
+ * context. You can then audit your code (a simple grep would do) to ensure that this is only done
15034
+ * for those values that you can easily tell are safe - because they were received from your server,
15035
+ * sanitized by your library, etc. You can organize your codebase to help with this - perhaps
15036
+ * allowing only the files in a specific directory to do this. Ensuring that the internal API
15037
+ * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.
15038
+ *
15039
+ * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}
15040
+ * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to
15041
+ * obtain values that will be accepted by SCE / privileged contexts.
15042
+ *
15043
+ *
15044
+ * ## How does it work?
15045
+ *
15046
+ * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted
15047
+ * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link
15048
+ * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the
15049
+ * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.
15050
+ *
15051
+ * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link
15052
+ * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly
15053
+ * simplified):
15054
+ *
15055
+ * ```
15056
+ * var ngBindHtmlDirective = ['$sce', function($sce) {
15057
+ * return function(scope, element, attr) {
15058
+ * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
15059
+ * element.html(value || '');
15060
+ * });
15061
+ * };
15062
+ * }];
15063
+ * ```
15064
+ *
15065
+ * ## Impact on loading templates
15066
+ *
15067
+ * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as
15068
+ * `templateUrl`'s specified by {@link guide/directive directives}.
15069
+ *
15070
+ * By default, Angular only loads templates from the same domain and protocol as the application
15071
+ * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl
15072
+ * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or
15073
+ * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist
15074
+ * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.
15075
+ *
15076
+ * *Please note*:
15077
+ * The browser's
15078
+ * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)
15079
+ * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)
15080
+ * policy apply in addition to this and may further restrict whether the template is successfully
15081
+ * loaded. This means that without the right CORS policy, loading templates from a different domain
15082
+ * won't work on all browsers. Also, loading templates from `file://` URL does not work on some
15083
+ * browsers.
15084
+ *
15085
+ * ## This feels like too much overhead
15086
+ *
15087
+ * It's important to remember that SCE only applies to interpolation expressions.
15088
+ *
15089
+ * If your expressions are constant literals, they're automatically trusted and you don't need to
15090
+ * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.
15091
+ * `<div ng-bind-html="'<b>implicitly trusted</b>'"></div>`) just works.
15092
+ *
15093
+ * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them
15094
+ * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here.
15095
+ *
15096
+ * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load
15097
+ * templates in `ng-include` from your application's domain without having to even know about SCE.
15098
+ * It blocks loading templates from other domains or loading templates over http from an https
15099
+ * served document. You can change these by setting your own custom {@link
15100
+ * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link
15101
+ * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.
15102
+ *
15103
+ * This significantly reduces the overhead. It is far easier to pay the small overhead and have an
15104
+ * application that's secure and can be audited to verify that with much more ease than bolting
15105
+ * security onto an application later.
15106
+ *
15107
+ * <a name="contexts"></a>
15108
+ * ## What trusted context types are supported?
15109
+ *
15110
+ * | Context | Notes |
15111
+ * |---------------------|----------------|
15112
+ * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |
15113
+ * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. |
15114
+ * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |
15115
+ * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.) <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |
15116
+ * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. |
15117
+ *
15118
+ * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name="resourceUrlPatternItem"></a>
15119
+ *
15120
+ * Each element in these arrays must be one of the following:
15121
+ *
15122
+ * - **'self'**
15123
+ * - The special **string**, `'self'`, can be used to match against all URLs of the **same
15124
+ * domain** as the application document using the **same protocol**.
15125
+ * - **String** (except the special value `'self'`)
15126
+ * - The string is matched against the full *normalized / absolute URL* of the resource
15127
+ * being tested (substring matches are not good enough.)
15128
+ * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters
15129
+ * match themselves.
15130
+ * - `*`: matches zero or more occurrences of any character other than one of the following 6
15131
+ * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use
15132
+ * in a whitelist.
15133
+ * - `**`: matches zero or more occurrences of *any* character. As such, it's not
15134
+ * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g.
15135
+ * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might
15136
+ * not have been the intention.) Its usage at the very end of the path is ok. (e.g.
15137
+ * http://foo.example.com/templates/**).
15138
+ * - **RegExp** (*see caveat below*)
15139
+ * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax
15140
+ * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to
15141
+ * accidentally introduce a bug when one updates a complex expression (imho, all regexes should
15142
+ * have good test coverage.). For instance, the use of `.` in the regex is correct only in a
15143
+ * small number of cases. A `.` character in the regex used when matching the scheme or a
15144
+ * subdomain could be matched against a `:` or literal `.` that was likely not intended. It
15145
+ * is highly recommended to use the string patterns and only fall back to regular expressions
15146
+ * if they as a last resort.
15147
+ * - The regular expression must be an instance of RegExp (i.e. not a string.) It is
15148
+ * matched against the **entire** *normalized / absolute URL* of the resource being tested
15149
+ * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags
15150
+ * present on the RegExp (such as multiline, global, ignoreCase) are ignored.
15151
+ * - If you are generating your JavaScript from some other templating engine (not
15152
+ * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),
15153
+ * remember to escape your regular expression (and be aware that you might need more than
15154
+ * one level of escaping depending on your templating engine and the way you interpolated
15155
+ * the value.) Do make use of your platform's escaping mechanism as it might be good
15156
+ * enough before coding your own. e.g. Ruby has
15157
+ * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)
15158
+ * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).
15159
+ * Javascript lacks a similar built in function for escaping. Take a look at Google
15160
+ * Closure library's [goog.string.regExpEscape(s)](
15161
+ * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).
15162
+ *
15163
+ * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.
15164
+ *
15165
+ * ## Show me an example using SCE.
15166
+ *
15167
+ * <example module="mySceApp" deps="angular-sanitize.js">
15168
+ * <file name="index.html">
15169
+ * <div ng-controller="AppController as myCtrl">
15170
+ * <i ng-bind-html="myCtrl.explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i><br><br>
15171
+ * <b>User comments</b><br>
15172
+ * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when
15173
+ * $sanitize is available. If $sanitize isn't available, this results in an error instead of an
15174
+ * exploit.
15175
+ * <div class="well">
15176
+ * <div ng-repeat="userComment in myCtrl.userComments">
15177
+ * <b>{{userComment.name}}</b>:
15178
+ * <span ng-bind-html="userComment.htmlComment" class="htmlComment"></span>
15179
+ * <br>
15180
+ * </div>
15181
+ * </div>
15182
+ * </div>
15183
+ * </file>
15184
+ *
15185
+ * <file name="script.js">
15186
+ * angular.module('mySceApp', ['ngSanitize'])
15187
+ * .controller('AppController', ['$http', '$templateCache', '$sce',
15188
+ * function($http, $templateCache, $sce) {
15189
+ * var self = this;
15190
+ * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) {
15191
+ * self.userComments = userComments;
15192
+ * });
15193
+ * self.explicitlyTrustedHtml = $sce.trustAsHtml(
15194
+ * '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
15195
+ * 'sanitization.&quot;">Hover over this text.</span>');
15196
+ * }]);
15197
+ * </file>
15198
+ *
15199
+ * <file name="test_data.json">
15200
+ * [
15201
+ * { "name": "Alice",
15202
+ * "htmlComment":
15203
+ * "<span onmouseover='this.textContent=\"PWN3D!\"'>Is <i>anyone</i> reading this?</span>"
15204
+ * },
15205
+ * { "name": "Bob",
15206
+ * "htmlComment": "<i>Yes!</i> Am I the only other one?"
15207
+ * }
15208
+ * ]
15209
+ * </file>
15210
+ *
15211
+ * <file name="protractor.js" type="protractor">
15212
+ * describe('SCE doc demo', function() {
15213
+ * it('should sanitize untrusted values', function() {
15214
+ * expect(element.all(by.css('.htmlComment')).first().getInnerHtml())
15215
+ * .toBe('<span>Is <i>anyone</i> reading this?</span>');
15216
+ * });
15217
+ *
15218
+ * it('should NOT sanitize explicitly trusted values', function() {
15219
+ * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(
15220
+ * '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
15221
+ * 'sanitization.&quot;">Hover over this text.</span>');
15222
+ * });
15223
+ * });
15224
+ * </file>
15225
+ * </example>
15226
+ *
15227
+ *
15228
+ *
15229
+ * ## Can I disable SCE completely?
15230
+ *
15231
+ * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits
15232
+ * for little coding overhead. It will be much harder to take an SCE disabled application and
15233
+ * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE
15234
+ * for cases where you have a lot of existing code that was written before SCE was introduced and
15235
+ * you're migrating them a module at a time.
15236
+ *
15237
+ * That said, here's how you can completely disable SCE:
15238
+ *
15239
+ * ```
15240
+ * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
15241
+ * // Completely disable SCE. For demonstration purposes only!
15242
+ * // Do not use in new projects.
15243
+ * $sceProvider.enabled(false);
15244
+ * });
15245
+ * ```
15246
+ *
15247
+ */
15248
+/* jshint maxlen: 100 */
15249
+
15250
+function $SceProvider() {
15251
+ var enabled = true;
15252
+
15253
+ /**
15254
+ * @ngdoc method
15255
+ * @name $sceProvider#enabled
15256
+ * @kind function
15257
+ *
15258
+ * @param {boolean=} value If provided, then enables/disables SCE.
15259
+ * @return {boolean} true if SCE is enabled, false otherwise.
15260
+ *
15261
+ * @description
15262
+ * Enables/disables SCE and returns the current value.
15263
+ */
15264
+ this.enabled = function (value) {
15265
+ if (arguments.length) {
15266
+ enabled = !!value;
15267
+ }
15268
+ return enabled;
15269
+ };
15270
+
15271
+
15272
+ /* Design notes on the default implementation for SCE.
15273
+ *
15274
+ * The API contract for the SCE delegate
15275
+ * -------------------------------------
15276
+ * The SCE delegate object must provide the following 3 methods:
15277
+ *
15278
+ * - trustAs(contextEnum, value)
15279
+ * This method is used to tell the SCE service that the provided value is OK to use in the
15280
+ * contexts specified by contextEnum. It must return an object that will be accepted by
15281
+ * getTrusted() for a compatible contextEnum and return this value.
15282
+ *
15283
+ * - valueOf(value)
15284
+ * For values that were not produced by trustAs(), return them as is. For values that were
15285
+ * produced by trustAs(), return the corresponding input value to trustAs. Basically, if
15286
+ * trustAs is wrapping the given values into some type, this operation unwraps it when given
15287
+ * such a value.
15288
+ *
15289
+ * - getTrusted(contextEnum, value)
15290
+ * This function should return the a value that is safe to use in the context specified by
15291
+ * contextEnum or throw and exception otherwise.
15292
+ *
15293
+ * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be
15294
+ * opaque or wrapped in some holder object. That happens to be an implementation detail. For
15295
+ * instance, an implementation could maintain a registry of all trusted objects by context. In
15296
+ * such a case, trustAs() would return the same object that was passed in. getTrusted() would
15297
+ * return the same object passed in if it was found in the registry under a compatible context or
15298
+ * throw an exception otherwise. An implementation might only wrap values some of the time based
15299
+ * on some criteria. getTrusted() might return a value and not throw an exception for special
15300
+ * constants or objects even if not wrapped. All such implementations fulfill this contract.
15301
+ *
15302
+ *
15303
+ * A note on the inheritance model for SCE contexts
15304
+ * ------------------------------------------------
15305
+ * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This
15306
+ * is purely an implementation details.
15307
+ *
15308
+ * The contract is simply this:
15309
+ *
15310
+ * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)
15311
+ * will also succeed.
15312
+ *
15313
+ * Inheritance happens to capture this in a natural way. In some future, we
15314
+ * may not use inheritance anymore. That is OK because no code outside of
15315
+ * sce.js and sceSpecs.js would need to be aware of this detail.
15316
+ */
15317
+
15318
+ this.$get = ['$document', '$parse', '$sceDelegate', function(
15319
+ $document, $parse, $sceDelegate) {
15320
+ // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow
15321
+ // the "expression(javascript expression)" syntax which is insecure.
15322
+ if (enabled && $document[0].documentMode < 8) {
15323
+ throw $sceMinErr('iequirks',
15324
+ 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' +
15325
+ 'mode. You can fix this by adding the text <!doctype html> to the top of your HTML ' +
15326
+ 'document. See http://docs.angularjs.org/api/ng.$sce for more information.');
15327
+ }
15328
+
15329
+ var sce = shallowCopy(SCE_CONTEXTS);
15330
+
15331
+ /**
15332
+ * @ngdoc method
15333
+ * @name $sce#isEnabled
15334
+ * @kind function
15335
+ *
15336
+ * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you
15337
+ * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.
15338
+ *
15339
+ * @description
15340
+ * Returns a boolean indicating if SCE is enabled.
15341
+ */
15342
+ sce.isEnabled = function () {
15343
+ return enabled;
15344
+ };
15345
+ sce.trustAs = $sceDelegate.trustAs;
15346
+ sce.getTrusted = $sceDelegate.getTrusted;
15347
+ sce.valueOf = $sceDelegate.valueOf;
15348
+
15349
+ if (!enabled) {
15350
+ sce.trustAs = sce.getTrusted = function(type, value) { return value; };
15351
+ sce.valueOf = identity;
15352
+ }
15353
+
15354
+ /**
15355
+ * @ngdoc method
15356
+ * @name $sce#parseAs
15357
+ *
15358
+ * @description
15359
+ * Converts Angular {@link guide/expression expression} into a function. This is like {@link
15360
+ * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it
15361
+ * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,
15362
+ * *result*)}
15363
+ *
15364
+ * @param {string} type The kind of SCE context in which this result will be used.
15365
+ * @param {string} expression String expression to compile.
15366
+ * @returns {function(context, locals)} a function which represents the compiled expression:
15367
+ *
15368
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
15369
+ * are evaluated against (typically a scope object).
15370
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
15371
+ * `context`.
15372
+ */
15373
+ sce.parseAs = function sceParseAs(type, expr) {
15374
+ var parsed = $parse(expr);
15375
+ if (parsed.literal && parsed.constant) {
15376
+ return parsed;
15377
+ } else {
15378
+ return $parse(expr, function (value) {
15379
+ return sce.getTrusted(type, value);
15380
+ });
15381
+ }
15382
+ };
15383
+
15384
+ /**
15385
+ * @ngdoc method
15386
+ * @name $sce#trustAs
15387
+ *
15388
+ * @description
15389
+ * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such,
15390
+ * returns an object that is trusted by angular for use in specified strict contextual
15391
+ * escaping contexts (such as ng-bind-html, ng-include, any src attribute
15392
+ * interpolation, any dom event binding attribute interpolation such as for onclick, etc.)
15393
+ * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual
15394
+ * escaping.
15395
+ *
15396
+ * @param {string} type The kind of context in which this value is safe for use. e.g. url,
15397
+ * resource_url, html, js and css.
15398
+ * @param {*} value The value that that should be considered trusted/safe.
15399
+ * @returns {*} A value that can be used to stand in for the provided `value` in places
15400
+ * where Angular expects a $sce.trustAs() return value.
15401
+ */
15402
+
15403
+ /**
15404
+ * @ngdoc method
15405
+ * @name $sce#trustAsHtml
15406
+ *
15407
+ * @description
15408
+ * Shorthand method. `$sce.trustAsHtml(value)` →
15409
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}
15410
+ *
15411
+ * @param {*} value The value to trustAs.
15412
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml
15413
+ * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives
15414
+ * only accept expressions that are either literal constants or are the
15415
+ * return value of {@link ng.$sce#trustAs $sce.trustAs}.)
15416
+ */
15417
+
15418
+ /**
15419
+ * @ngdoc method
15420
+ * @name $sce#trustAsUrl
15421
+ *
15422
+ * @description
15423
+ * Shorthand method. `$sce.trustAsUrl(value)` →
15424
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}
15425
+ *
15426
+ * @param {*} value The value to trustAs.
15427
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl
15428
+ * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives
15429
+ * only accept expressions that are either literal constants or are the
15430
+ * return value of {@link ng.$sce#trustAs $sce.trustAs}.)
15431
+ */
15432
+
15433
+ /**
15434
+ * @ngdoc method
15435
+ * @name $sce#trustAsResourceUrl
15436
+ *
15437
+ * @description
15438
+ * Shorthand method. `$sce.trustAsResourceUrl(value)` →
15439
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}
15440
+ *
15441
+ * @param {*} value The value to trustAs.
15442
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl
15443
+ * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives
15444
+ * only accept expressions that are either literal constants or are the return
15445
+ * value of {@link ng.$sce#trustAs $sce.trustAs}.)
15446
+ */
15447
+
15448
+ /**
15449
+ * @ngdoc method
15450
+ * @name $sce#trustAsJs
15451
+ *
15452
+ * @description
15453
+ * Shorthand method. `$sce.trustAsJs(value)` →
15454
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}
15455
+ *
15456
+ * @param {*} value The value to trustAs.
15457
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs
15458
+ * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives
15459
+ * only accept expressions that are either literal constants or are the
15460
+ * return value of {@link ng.$sce#trustAs $sce.trustAs}.)
15461
+ */
15462
+
15463
+ /**
15464
+ * @ngdoc method
15465
+ * @name $sce#getTrusted
15466
+ *
15467
+ * @description
15468
+ * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such,
15469
+ * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the
15470
+ * originally supplied value if the queried context type is a supertype of the created type.
15471
+ * If this condition isn't satisfied, throws an exception.
15472
+ *
15473
+ * @param {string} type The kind of context in which this value is to be used.
15474
+ * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}
15475
+ * call.
15476
+ * @returns {*} The value the was originally provided to
15477
+ * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.
15478
+ * Otherwise, throws an exception.
15479
+ */
15480
+
15481
+ /**
15482
+ * @ngdoc method
15483
+ * @name $sce#getTrustedHtml
15484
+ *
15485
+ * @description
15486
+ * Shorthand method. `$sce.getTrustedHtml(value)` →
15487
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}
15488
+ *
15489
+ * @param {*} value The value to pass to `$sce.getTrusted`.
15490
+ * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`
15491
+ */
15492
+
15493
+ /**
15494
+ * @ngdoc method
15495
+ * @name $sce#getTrustedCss
15496
+ *
15497
+ * @description
15498
+ * Shorthand method. `$sce.getTrustedCss(value)` →
15499
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}
15500
+ *
15501
+ * @param {*} value The value to pass to `$sce.getTrusted`.
15502
+ * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`
15503
+ */
15504
+
15505
+ /**
15506
+ * @ngdoc method
15507
+ * @name $sce#getTrustedUrl
15508
+ *
15509
+ * @description
15510
+ * Shorthand method. `$sce.getTrustedUrl(value)` →
15511
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}
15512
+ *
15513
+ * @param {*} value The value to pass to `$sce.getTrusted`.
15514
+ * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`
15515
+ */
15516
+
15517
+ /**
15518
+ * @ngdoc method
15519
+ * @name $sce#getTrustedResourceUrl
15520
+ *
15521
+ * @description
15522
+ * Shorthand method. `$sce.getTrustedResourceUrl(value)` →
15523
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}
15524
+ *
15525
+ * @param {*} value The value to pass to `$sceDelegate.getTrusted`.
15526
+ * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`
15527
+ */
15528
+
15529
+ /**
15530
+ * @ngdoc method
15531
+ * @name $sce#getTrustedJs
15532
+ *
15533
+ * @description
15534
+ * Shorthand method. `$sce.getTrustedJs(value)` →
15535
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}
15536
+ *
15537
+ * @param {*} value The value to pass to `$sce.getTrusted`.
15538
+ * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`
15539
+ */
15540
+
15541
+ /**
15542
+ * @ngdoc method
15543
+ * @name $sce#parseAsHtml
15544
+ *
15545
+ * @description
15546
+ * Shorthand method. `$sce.parseAsHtml(expression string)` →
15547
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`}
15548
+ *
15549
+ * @param {string} expression String expression to compile.
15550
+ * @returns {function(context, locals)} a function which represents the compiled expression:
15551
+ *
15552
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
15553
+ * are evaluated against (typically a scope object).
15554
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
15555
+ * `context`.
15556
+ */
15557
+
15558
+ /**
15559
+ * @ngdoc method
15560
+ * @name $sce#parseAsCss
15561
+ *
15562
+ * @description
15563
+ * Shorthand method. `$sce.parseAsCss(value)` →
15564
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`}
15565
+ *
15566
+ * @param {string} expression String expression to compile.
15567
+ * @returns {function(context, locals)} a function which represents the compiled expression:
15568
+ *
15569
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
15570
+ * are evaluated against (typically a scope object).
15571
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
15572
+ * `context`.
15573
+ */
15574
+
15575
+ /**
15576
+ * @ngdoc method
15577
+ * @name $sce#parseAsUrl
15578
+ *
15579
+ * @description
15580
+ * Shorthand method. `$sce.parseAsUrl(value)` →
15581
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`}
15582
+ *
15583
+ * @param {string} expression String expression to compile.
15584
+ * @returns {function(context, locals)} a function which represents the compiled expression:
15585
+ *
15586
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
15587
+ * are evaluated against (typically a scope object).
15588
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
15589
+ * `context`.
15590
+ */
15591
+
15592
+ /**
15593
+ * @ngdoc method
15594
+ * @name $sce#parseAsResourceUrl
15595
+ *
15596
+ * @description
15597
+ * Shorthand method. `$sce.parseAsResourceUrl(value)` →
15598
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`}
15599
+ *
15600
+ * @param {string} expression String expression to compile.
15601
+ * @returns {function(context, locals)} a function which represents the compiled expression:
15602
+ *
15603
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
15604
+ * are evaluated against (typically a scope object).
15605
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
15606
+ * `context`.
15607
+ */
15608
+
15609
+ /**
15610
+ * @ngdoc method
15611
+ * @name $sce#parseAsJs
15612
+ *
15613
+ * @description
15614
+ * Shorthand method. `$sce.parseAsJs(value)` →
15615
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`}
15616
+ *
15617
+ * @param {string} expression String expression to compile.
15618
+ * @returns {function(context, locals)} a function which represents the compiled expression:
15619
+ *
15620
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
15621
+ * are evaluated against (typically a scope object).
15622
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
15623
+ * `context`.
15624
+ */
15625
+
15626
+ // Shorthand delegations.
15627
+ var parse = sce.parseAs,
15628
+ getTrusted = sce.getTrusted,
15629
+ trustAs = sce.trustAs;
15630
+
15631
+ forEach(SCE_CONTEXTS, function (enumValue, name) {
15632
+ var lName = lowercase(name);
15633
+ sce[camelCase("parse_as_" + lName)] = function (expr) {
15634
+ return parse(enumValue, expr);
15635
+ };
15636
+ sce[camelCase("get_trusted_" + lName)] = function (value) {
15637
+ return getTrusted(enumValue, value);
15638
+ };
15639
+ sce[camelCase("trust_as_" + lName)] = function (value) {
15640
+ return trustAs(enumValue, value);
15641
+ };
15642
+ });
15643
+
15644
+ return sce;
15645
+ }];
15646
+}
15647
+
15648
+/**
15649
+ * !!! This is an undocumented "private" service !!!
15650
+ *
15651
+ * @name $sniffer
15652
+ * @requires $window
15653
+ * @requires $document
15654
+ *
15655
+ * @property {boolean} history Does the browser support html5 history api ?
15656
+ * @property {boolean} transitions Does the browser support CSS transition events ?
15657
+ * @property {boolean} animations Does the browser support CSS animation events ?
15658
+ *
15659
+ * @description
15660
+ * This is very simple implementation of testing browser's features.
15661
+ */
15662
+function $SnifferProvider() {
15663
+ this.$get = ['$window', '$document', function($window, $document) {
15664
+ var eventSupport = {},
15665
+ android =
15666
+ int((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),
15667
+ boxee = /Boxee/i.test(($window.navigator || {}).userAgent),
15668
+ document = $document[0] || {},
15669
+ vendorPrefix,
15670
+ vendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/,
15671
+ bodyStyle = document.body && document.body.style,
15672
+ transitions = false,
15673
+ animations = false,
15674
+ match;
15675
+
15676
+ if (bodyStyle) {
15677
+ for(var prop in bodyStyle) {
15678
+ if(match = vendorRegex.exec(prop)) {
15679
+ vendorPrefix = match[0];
15680
+ vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);
15681
+ break;
15682
+ }
15683
+ }
15684
+
15685
+ if(!vendorPrefix) {
15686
+ vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';
15687
+ }
15688
+
15689
+ transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));
15690
+ animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));
15691
+
15692
+ if (android && (!transitions||!animations)) {
15693
+ transitions = isString(document.body.style.webkitTransition);
15694
+ animations = isString(document.body.style.webkitAnimation);
15695
+ }
15696
+ }
15697
+
15698
+
15699
+ return {
15700
+ // Android has history.pushState, but it does not update location correctly
15701
+ // so let's not use the history API at all.
15702
+ // http://code.google.com/p/android/issues/detail?id=17471
15703
+ // https://github.com/angular/angular.js/issues/904
15704
+
15705
+ // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has
15706
+ // so let's not use the history API also
15707
+ // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined
15708
+ // jshint -W018
15709
+ history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee),
15710
+ // jshint +W018
15711
+ hasEvent: function(event) {
15712
+ // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
15713
+ // it. In particular the event is not fired when backspace or delete key are pressed or
15714
+ // when cut operation is performed.
15715
+ if (event == 'input' && msie == 9) return false;
15716
+
15717
+ if (isUndefined(eventSupport[event])) {
15718
+ var divElm = document.createElement('div');
15719
+ eventSupport[event] = 'on' + event in divElm;
15720
+ }
15721
+
15722
+ return eventSupport[event];
15723
+ },
15724
+ csp: csp(),
15725
+ vendorPrefix: vendorPrefix,
15726
+ transitions : transitions,
15727
+ animations : animations,
15728
+ android: android
15729
+ };
15730
+ }];
15731
+}
15732
+
15733
+var $compileMinErr = minErr('$compile');
15734
+
15735
+/**
15736
+ * @ngdoc service
15737
+ * @name $templateRequest
15738
+ *
15739
+ * @description
15740
+ * The `$templateRequest` service downloads the provided template using `$http` and, upon success,
15741
+ * stores the contents inside of `$templateCache`. If the HTTP request fails or the response data
15742
+ * of the HTTP request is empty then a `$compile` error will be thrown (the exception can be thwarted
15743
+ * by setting the 2nd parameter of the function to true).
15744
+ *
15745
+ * @param {string} tpl The HTTP request template URL
15746
+ * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty
15747
+ *
15748
+ * @return {Promise} the HTTP Promise for the given.
15749
+ *
15750
+ * @property {number} totalPendingRequests total amount of pending template requests being downloaded.
15751
+ */
15752
+function $TemplateRequestProvider() {
15753
+ this.$get = ['$templateCache', '$http', '$q', function($templateCache, $http, $q) {
15754
+ function handleRequestFn(tpl, ignoreRequestError) {
15755
+ var self = handleRequestFn;
15756
+ self.totalPendingRequests++;
15757
+
15758
+ return $http.get(tpl, { cache : $templateCache })
15759
+ .then(function(response) {
15760
+ var html = response.data;
15761
+ if(!html || html.length === 0) {
15762
+ return handleError();
15763
+ }
15764
+
15765
+ self.totalPendingRequests--;
15766
+ $templateCache.put(tpl, html);
15767
+ return html;
15768
+ }, handleError);
15769
+
15770
+ function handleError() {
15771
+ self.totalPendingRequests--;
15772
+ if (!ignoreRequestError) {
15773
+ throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl);
15774
+ }
15775
+ return $q.reject();
15776
+ }
15777
+ }
15778
+
15779
+ handleRequestFn.totalPendingRequests = 0;
15780
+
15781
+ return handleRequestFn;
15782
+ }];
15783
+}
15784
+
15785
+function $$TestabilityProvider() {
15786
+ this.$get = ['$rootScope', '$browser', '$location',
15787
+ function($rootScope, $browser, $location) {
15788
+
15789
+ /**
15790
+ * @name $testability
15791
+ *
15792
+ * @description
15793
+ * The private $$testability service provides a collection of methods for use when debugging
15794
+ * or by automated test and debugging tools.
15795
+ */
15796
+ var testability = {};
15797
+
15798
+ /**
15799
+ * @name $$testability#findBindings
15800
+ *
15801
+ * @description
15802
+ * Returns an array of elements that are bound (via ng-bind or {{}})
15803
+ * to expressions matching the input.
15804
+ *
15805
+ * @param {Element} element The element root to search from.
15806
+ * @param {string} expression The binding expression to match.
15807
+ * @param {boolean} opt_exactMatch If true, only returns exact matches
15808
+ * for the expression. Filters and whitespace are ignored.
15809
+ */
15810
+ testability.findBindings = function(element, expression, opt_exactMatch) {
15811
+ var bindings = element.getElementsByClassName('ng-binding');
15812
+ var matches = [];
15813
+ forEach(bindings, function(binding) {
15814
+ var dataBinding = angular.element(binding).data('$binding');
15815
+ if (dataBinding) {
15816
+ forEach(dataBinding, function(bindingName) {
15817
+ if (opt_exactMatch) {
15818
+ var matcher = new RegExp('(^|\\s)' + expression + '(\\s|\\||$)');
15819
+ if (matcher.test(bindingName)) {
15820
+ matches.push(binding);
15821
+ }
15822
+ } else {
15823
+ if (bindingName.indexOf(expression) != -1) {
15824
+ matches.push(binding);
15825
+ }
15826
+ }
15827
+ });
15828
+ }
15829
+ });
15830
+ return matches;
15831
+ };
15832
+
15833
+ /**
15834
+ * @name $$testability#findModels
15835
+ *
15836
+ * @description
15837
+ * Returns an array of elements that are two-way found via ng-model to
15838
+ * expressions matching the input.
15839
+ *
15840
+ * @param {Element} element The element root to search from.
15841
+ * @param {string} expression The model expression to match.
15842
+ * @param {boolean} opt_exactMatch If true, only returns exact matches
15843
+ * for the expression.
15844
+ */
15845
+ testability.findModels = function(element, expression, opt_exactMatch) {
15846
+ var prefixes = ['ng-', 'data-ng-', 'ng\\:'];
15847
+ for (var p = 0; p < prefixes.length; ++p) {
15848
+ var attributeEquals = opt_exactMatch ? '=' : '*=';
15849
+ var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]';
15850
+ var elements = element.querySelectorAll(selector);
15851
+ if (elements.length) {
15852
+ return elements;
15853
+ }
15854
+ }
15855
+ };
15856
+
15857
+ /**
15858
+ * @name $$testability#getLocation
15859
+ *
15860
+ * @description
15861
+ * Shortcut for getting the location in a browser agnostic way. Returns
15862
+ * the path, search, and hash. (e.g. /path?a=b#hash)
15863
+ */
15864
+ testability.getLocation = function() {
15865
+ return $location.url();
15866
+ };
15867
+
15868
+ /**
15869
+ * @name $$testability#setLocation
15870
+ *
15871
+ * @description
15872
+ * Shortcut for navigating to a location without doing a full page reload.
15873
+ *
15874
+ * @param {string} url The location url (path, search and hash,
15875
+ * e.g. /path?a=b#hash) to go to.
15876
+ */
15877
+ testability.setLocation = function(url) {
15878
+ if (url !== $location.url()) {
15879
+ $location.url(url);
15880
+ $rootScope.$digest();
15881
+ }
15882
+ };
15883
+
15884
+ /**
15885
+ * @name $$testability#whenStable
15886
+ *
15887
+ * @description
15888
+ * Calls the callback when $timeout and $http requests are completed.
15889
+ *
15890
+ * @param {function} callback
15891
+ */
15892
+ testability.whenStable = function(callback) {
15893
+ $browser.notifyWhenNoOutstandingRequests(callback);
15894
+ };
15895
+
15896
+ return testability;
15897
+ }];
15898
+}
15899
+
15900
+function $TimeoutProvider() {
15901
+ this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',
15902
+ function($rootScope, $browser, $q, $$q, $exceptionHandler) {
15903
+ var deferreds = {};
15904
+
15905
+
15906
+ /**
15907
+ * @ngdoc service
15908
+ * @name $timeout
15909
+ *
15910
+ * @description
15911
+ * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch
15912
+ * block and delegates any exceptions to
15913
+ * {@link ng.$exceptionHandler $exceptionHandler} service.
15914
+ *
15915
+ * The return value of registering a timeout function is a promise, which will be resolved when
15916
+ * the timeout is reached and the timeout function is executed.
15917
+ *
15918
+ * To cancel a timeout request, call `$timeout.cancel(promise)`.
15919
+ *
15920
+ * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to
15921
+ * synchronously flush the queue of deferred functions.
15922
+ *
15923
+ * @param {function()} fn A function, whose execution should be delayed.
15924
+ * @param {number=} [delay=0] Delay in milliseconds.
15925
+ * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
15926
+ * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
15927
+ * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this
15928
+ * promise will be resolved with is the return value of the `fn` function.
15929
+ *
15930
+ */
15931
+ function timeout(fn, delay, invokeApply) {
15932
+ var skipApply = (isDefined(invokeApply) && !invokeApply),
15933
+ deferred = (skipApply ? $$q : $q).defer(),
15934
+ promise = deferred.promise,
15935
+ timeoutId;
15936
+
15937
+ timeoutId = $browser.defer(function() {
15938
+ try {
15939
+ deferred.resolve(fn());
15940
+ } catch(e) {
15941
+ deferred.reject(e);
15942
+ $exceptionHandler(e);
15943
+ }
15944
+ finally {
15945
+ delete deferreds[promise.$$timeoutId];
15946
+ }
15947
+
15948
+ if (!skipApply) $rootScope.$apply();
15949
+ }, delay);
15950
+
15951
+ promise.$$timeoutId = timeoutId;
15952
+ deferreds[timeoutId] = deferred;
15953
+
15954
+ return promise;
15955
+ }
15956
+
15957
+
15958
+ /**
15959
+ * @ngdoc method
15960
+ * @name $timeout#cancel
15961
+ *
15962
+ * @description
15963
+ * Cancels a task associated with the `promise`. As a result of this, the promise will be
15964
+ * resolved with a rejection.
15965
+ *
15966
+ * @param {Promise=} promise Promise returned by the `$timeout` function.
15967
+ * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
15968
+ * canceled.
15969
+ */
15970
+ timeout.cancel = function(promise) {
15971
+ if (promise && promise.$$timeoutId in deferreds) {
15972
+ deferreds[promise.$$timeoutId].reject('canceled');
15973
+ delete deferreds[promise.$$timeoutId];
15974
+ return $browser.defer.cancel(promise.$$timeoutId);
15975
+ }
15976
+ return false;
15977
+ };
15978
+
15979
+ return timeout;
15980
+ }];
15981
+}
15982
+
15983
+// NOTE: The usage of window and document instead of $window and $document here is
15984
+// deliberate. This service depends on the specific behavior of anchor nodes created by the
15985
+// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and
15986
+// cause us to break tests. In addition, when the browser resolves a URL for XHR, it
15987
+// doesn't know about mocked locations and resolves URLs to the real document - which is
15988
+// exactly the behavior needed here. There is little value is mocking these out for this
15989
+// service.
15990
+var urlParsingNode = document.createElement("a");
15991
+var originUrl = urlResolve(window.location.href, true);
15992
+
15993
+
15994
+/**
15995
+ *
15996
+ * Implementation Notes for non-IE browsers
15997
+ * ----------------------------------------
15998
+ * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,
15999
+ * results both in the normalizing and parsing of the URL. Normalizing means that a relative
16000
+ * URL will be resolved into an absolute URL in the context of the application document.
16001
+ * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related
16002
+ * properties are all populated to reflect the normalized URL. This approach has wide
16003
+ * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See
16004
+ * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
16005
+ *
16006
+ * Implementation Notes for IE
16007
+ * ---------------------------
16008
+ * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other
16009
+ * browsers. However, the parsed components will not be set if the URL assigned did not specify
16010
+ * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We
16011
+ * work around that by performing the parsing in a 2nd step by taking a previously normalized
16012
+ * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the
16013
+ * properties such as protocol, hostname, port, etc.
16014
+ *
16015
+ * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one
16016
+ * uses the inner HTML approach to assign the URL as part of an HTML snippet -
16017
+ * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL.
16018
+ * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception.
16019
+ * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that
16020
+ * method and IE < 8 is unsupported.
16021
+ *
16022
+ * References:
16023
+ * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
16024
+ * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
16025
+ * http://url.spec.whatwg.org/#urlutils
16026
+ * https://github.com/angular/angular.js/pull/2902
16027
+ * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
16028
+ *
16029
+ * @kind function
16030
+ * @param {string} url The URL to be parsed.
16031
+ * @description Normalizes and parses a URL.
16032
+ * @returns {object} Returns the normalized URL as a dictionary.
16033
+ *
16034
+ * | member name | Description |
16035
+ * |---------------|----------------|
16036
+ * | href | A normalized version of the provided URL if it was not an absolute URL |
16037
+ * | protocol | The protocol including the trailing colon |
16038
+ * | host | The host and port (if the port is non-default) of the normalizedUrl |
16039
+ * | search | The search params, minus the question mark |
16040
+ * | hash | The hash string, minus the hash symbol
16041
+ * | hostname | The hostname
16042
+ * | port | The port, without ":"
16043
+ * | pathname | The pathname, beginning with "/"
16044
+ *
16045
+ */
16046
+function urlResolve(url, base) {
16047
+ var href = url;
16048
+
16049
+ if (msie) {
16050
+ // Normalize before parse. Refer Implementation Notes on why this is
16051
+ // done in two steps on IE.
16052
+ urlParsingNode.setAttribute("href", href);
16053
+ href = urlParsingNode.href;
16054
+ }
16055
+
16056
+ urlParsingNode.setAttribute('href', href);
16057
+
16058
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
16059
+ return {
16060
+ href: urlParsingNode.href,
16061
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
16062
+ host: urlParsingNode.host,
16063
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
16064
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
16065
+ hostname: urlParsingNode.hostname,
16066
+ port: urlParsingNode.port,
16067
+ pathname: (urlParsingNode.pathname.charAt(0) === '/')
16068
+ ? urlParsingNode.pathname
16069
+ : '/' + urlParsingNode.pathname
16070
+ };
16071
+}
16072
+
16073
+/**
16074
+ * Parse a request URL and determine whether this is a same-origin request as the application document.
16075
+ *
16076
+ * @param {string|object} requestUrl The url of the request as a string that will be resolved
16077
+ * or a parsed URL object.
16078
+ * @returns {boolean} Whether the request is for the same origin as the application document.
16079
+ */
16080
+function urlIsSameOrigin(requestUrl) {
16081
+ var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;
16082
+ return (parsed.protocol === originUrl.protocol &&
16083
+ parsed.host === originUrl.host);
16084
+}
16085
+
16086
+/**
16087
+ * @ngdoc service
16088
+ * @name $window
16089
+ *
16090
+ * @description
16091
+ * A reference to the browser's `window` object. While `window`
16092
+ * is globally available in JavaScript, it causes testability problems, because
16093
+ * it is a global variable. In angular we always refer to it through the
16094
+ * `$window` service, so it may be overridden, removed or mocked for testing.
16095
+ *
16096
+ * Expressions, like the one defined for the `ngClick` directive in the example
16097
+ * below, are evaluated with respect to the current scope. Therefore, there is
16098
+ * no risk of inadvertently coding in a dependency on a global value in such an
16099
+ * expression.
16100
+ *
16101
+ * @example
16102
+ <example module="windowExample">
16103
+ <file name="index.html">
16104
+ <script>
16105
+ angular.module('windowExample', [])
16106
+ .controller('ExampleController', ['$scope', '$window', function ($scope, $window) {
16107
+ $scope.greeting = 'Hello, World!';
16108
+ $scope.doGreeting = function(greeting) {
16109
+ $window.alert(greeting);
16110
+ };
16111
+ }]);
16112
+ </script>
16113
+ <div ng-controller="ExampleController">
16114
+ <input type="text" ng-model="greeting" />
16115
+ <button ng-click="doGreeting(greeting)">ALERT</button>
16116
+ </div>
16117
+ </file>
16118
+ <file name="protractor.js" type="protractor">
16119
+ it('should display the greeting in the input box', function() {
16120
+ element(by.model('greeting')).sendKeys('Hello, E2E Tests');
16121
+ // If we click the button it will block the test runner
16122
+ // element(':button').click();
16123
+ });
16124
+ </file>
16125
+ </example>
16126
+ */
16127
+function $WindowProvider(){
16128
+ this.$get = valueFn(window);
16129
+}
16130
+
16131
+/* global currencyFilter: true,
16132
+ dateFilter: true,
16133
+ filterFilter: true,
16134
+ jsonFilter: true,
16135
+ limitToFilter: true,
16136
+ lowercaseFilter: true,
16137
+ numberFilter: true,
16138
+ orderByFilter: true,
16139
+ uppercaseFilter: true,
16140
+ */
16141
+
16142
+/**
16143
+ * @ngdoc provider
16144
+ * @name $filterProvider
16145
+ * @description
16146
+ *
16147
+ * Filters are just functions which transform input to an output. However filters need to be
16148
+ * Dependency Injected. To achieve this a filter definition consists of a factory function which is
16149
+ * annotated with dependencies and is responsible for creating a filter function.
16150
+ *
16151
+ * ```js
16152
+ * // Filter registration
16153
+ * function MyModule($provide, $filterProvider) {
16154
+ * // create a service to demonstrate injection (not always needed)
16155
+ * $provide.value('greet', function(name){
16156
+ * return 'Hello ' + name + '!';
16157
+ * });
16158
+ *
16159
+ * // register a filter factory which uses the
16160
+ * // greet service to demonstrate DI.
16161
+ * $filterProvider.register('greet', function(greet){
16162
+ * // return the filter function which uses the greet service
16163
+ * // to generate salutation
16164
+ * return function(text) {
16165
+ * // filters need to be forgiving so check input validity
16166
+ * return text && greet(text) || text;
16167
+ * };
16168
+ * });
16169
+ * }
16170
+ * ```
16171
+ *
16172
+ * The filter function is registered with the `$injector` under the filter name suffix with
16173
+ * `Filter`.
16174
+ *
16175
+ * ```js
16176
+ * it('should be the same instance', inject(
16177
+ * function($filterProvider) {
16178
+ * $filterProvider.register('reverse', function(){
16179
+ * return ...;
16180
+ * });
16181
+ * },
16182
+ * function($filter, reverseFilter) {
16183
+ * expect($filter('reverse')).toBe(reverseFilter);
16184
+ * });
16185
+ * ```
16186
+ *
16187
+ *
16188
+ * For more information about how angular filters work, and how to create your own filters, see
16189
+ * {@link guide/filter Filters} in the Angular Developer Guide.
16190
+ */
16191
+
16192
+/**
16193
+ * @ngdoc service
16194
+ * @name $filter
16195
+ * @kind function
16196
+ * @description
16197
+ * Filters are used for formatting data displayed to the user.
16198
+ *
16199
+ * The general syntax in templates is as follows:
16200
+ *
16201
+ * {{ expression [| filter_name[:parameter_value] ... ] }}
16202
+ *
16203
+ * @param {String} name Name of the filter function to retrieve
16204
+ * @return {Function} the filter function
16205
+ * @example
16206
+ <example name="$filter" module="filterExample">
16207
+ <file name="index.html">
16208
+ <div ng-controller="MainCtrl">
16209
+ <h3>{{ originalText }}</h3>
16210
+ <h3>{{ filteredText }}</h3>
16211
+ </div>
16212
+ </file>
16213
+
16214
+ <file name="script.js">
16215
+ angular.module('filterExample', [])
16216
+ .controller('MainCtrl', function($scope, $filter) {
16217
+ $scope.originalText = 'hello';
16218
+ $scope.filteredText = $filter('uppercase')($scope.originalText);
16219
+ });
16220
+ </file>
16221
+ </example>
16222
+ */
16223
+$FilterProvider.$inject = ['$provide'];
16224
+function $FilterProvider($provide) {
16225
+ var suffix = 'Filter';
16226
+
16227
+ /**
16228
+ * @ngdoc method
16229
+ * @name $filterProvider#register
16230
+ * @param {string|Object} name Name of the filter function, or an object map of filters where
16231
+ * the keys are the filter names and the values are the filter factories.
16232
+ * @returns {Object} Registered filter instance, or if a map of filters was provided then a map
16233
+ * of the registered filter instances.
16234
+ */
16235
+ function register(name, factory) {
16236
+ if(isObject(name)) {
16237
+ var filters = {};
16238
+ forEach(name, function(filter, key) {
16239
+ filters[key] = register(key, filter);
16240
+ });
16241
+ return filters;
16242
+ } else {
16243
+ return $provide.factory(name + suffix, factory);
16244
+ }
16245
+ }
16246
+ this.register = register;
16247
+
16248
+ this.$get = ['$injector', function($injector) {
16249
+ return function(name) {
16250
+ return $injector.get(name + suffix);
16251
+ };
16252
+ }];
16253
+
16254
+ ////////////////////////////////////////
16255
+
16256
+ /* global
16257
+ currencyFilter: false,
16258
+ dateFilter: false,
16259
+ filterFilter: false,
16260
+ jsonFilter: false,
16261
+ limitToFilter: false,
16262
+ lowercaseFilter: false,
16263
+ numberFilter: false,
16264
+ orderByFilter: false,
16265
+ uppercaseFilter: false,
16266
+ */
16267
+
16268
+ register('currency', currencyFilter);
16269
+ register('date', dateFilter);
16270
+ register('filter', filterFilter);
16271
+ register('json', jsonFilter);
16272
+ register('limitTo', limitToFilter);
16273
+ register('lowercase', lowercaseFilter);
16274
+ register('number', numberFilter);
16275
+ register('orderBy', orderByFilter);
16276
+ register('uppercase', uppercaseFilter);
16277
+}
16278
+
16279
+/**
16280
+ * @ngdoc filter
16281
+ * @name filter
16282
+ * @kind function
16283
+ *
16284
+ * @description
16285
+ * Selects a subset of items from `array` and returns it as a new array.
16286
+ *
16287
+ * @param {Array} array The source array.
16288
+ * @param {string|Object|function()} expression The predicate to be used for selecting items from
16289
+ * `array`.
16290
+ *
16291
+ * Can be one of:
16292
+ *
16293
+ * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against
16294
+ * the contents of the `array`. All strings or objects with string properties in `array` that contain this string
16295
+ * will be returned. The predicate can be negated by prefixing the string with `!`.
16296
+ *
16297
+ * - `Object`: A pattern object can be used to filter specific properties on objects contained
16298
+ * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
16299
+ * which have property `name` containing "M" and property `phone` containing "1". A special
16300
+ * property name `$` can be used (as in `{$:"text"}`) to accept a match against any
16301
+ * property of the object. That's equivalent to the simple substring match with a `string`
16302
+ * as described above. The predicate can be negated by prefixing the string with `!`.
16303
+ * For Example `{name: "!M"}` predicate will return an array of items which have property `name`
16304
+ * not containing "M".
16305
+ *
16306
+ * - `function(value, index)`: A predicate function can be used to write arbitrary filters. The
16307
+ * function is called for each element of `array`. The final result is an array of those
16308
+ * elements that the predicate returned true for.
16309
+ *
16310
+ * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in
16311
+ * determining if the expected value (from the filter expression) and actual value (from
16312
+ * the object in the array) should be considered a match.
16313
+ *
16314
+ * Can be one of:
16315
+ *
16316
+ * - `function(actual, expected)`:
16317
+ * The function will be given the object value and the predicate value to compare and
16318
+ * should return true if the item should be included in filtered result.
16319
+ *
16320
+ * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`.
16321
+ * this is essentially strict comparison of expected and actual.
16322
+ *
16323
+ * - `false|undefined`: A short hand for a function which will look for a substring match in case
16324
+ * insensitive way.
16325
+ *
16326
+ * @example
16327
+ <example>
16328
+ <file name="index.html">
16329
+ <div ng-init="friends = [{name:'John', phone:'555-1276'},
16330
+ {name:'Mary', phone:'800-BIG-MARY'},
16331
+ {name:'Mike', phone:'555-4321'},
16332
+ {name:'Adam', phone:'555-5678'},
16333
+ {name:'Julie', phone:'555-8765'},
16334
+ {name:'Juliette', phone:'555-5678'}]"></div>
16335
+
16336
+ Search: <input ng-model="searchText">
16337
+ <table id="searchTextResults">
16338
+ <tr><th>Name</th><th>Phone</th></tr>
16339
+ <tr ng-repeat="friend in friends | filter:searchText">
16340
+ <td>{{friend.name}}</td>
16341
+ <td>{{friend.phone}}</td>
16342
+ </tr>
16343
+ </table>
16344
+ <hr>
16345
+ Any: <input ng-model="search.$"> <br>
16346
+ Name only <input ng-model="search.name"><br>
16347
+ Phone only <input ng-model="search.phone"><br>
16348
+ Equality <input type="checkbox" ng-model="strict"><br>
16349
+ <table id="searchObjResults">
16350
+ <tr><th>Name</th><th>Phone</th></tr>
16351
+ <tr ng-repeat="friendObj in friends | filter:search:strict">
16352
+ <td>{{friendObj.name}}</td>
16353
+ <td>{{friendObj.phone}}</td>
16354
+ </tr>
16355
+ </table>
16356
+ </file>
16357
+ <file name="protractor.js" type="protractor">
16358
+ var expectFriendNames = function(expectedNames, key) {
16359
+ element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {
16360
+ arr.forEach(function(wd, i) {
16361
+ expect(wd.getText()).toMatch(expectedNames[i]);
16362
+ });
16363
+ });
16364
+ };
16365
+
16366
+ it('should search across all fields when filtering with a string', function() {
16367
+ var searchText = element(by.model('searchText'));
16368
+ searchText.clear();
16369
+ searchText.sendKeys('m');
16370
+ expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');
16371
+
16372
+ searchText.clear();
16373
+ searchText.sendKeys('76');
16374
+ expectFriendNames(['John', 'Julie'], 'friend');
16375
+ });
16376
+
16377
+ it('should search in specific fields when filtering with a predicate object', function() {
16378
+ var searchAny = element(by.model('search.$'));
16379
+ searchAny.clear();
16380
+ searchAny.sendKeys('i');
16381
+ expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');
16382
+ });
16383
+ it('should use a equal comparison when comparator is true', function() {
16384
+ var searchName = element(by.model('search.name'));
16385
+ var strict = element(by.model('strict'));
16386
+ searchName.clear();
16387
+ searchName.sendKeys('Julie');
16388
+ strict.click();
16389
+ expectFriendNames(['Julie'], 'friendObj');
16390
+ });
16391
+ </file>
16392
+ </example>
16393
+ */
16394
+function filterFilter() {
16395
+ return function(array, expression, comparator) {
16396
+ if (!isArray(array)) return array;
16397
+
16398
+ var comparatorType = typeof(comparator),
16399
+ predicates = [];
16400
+
16401
+ predicates.check = function(value, index) {
16402
+ for (var j = 0; j < predicates.length; j++) {
16403
+ if(!predicates[j](value, index)) {
16404
+ return false;
16405
+ }
16406
+ }
16407
+ return true;
16408
+ };
16409
+
16410
+ if (comparatorType !== 'function') {
16411
+ if (comparatorType === 'boolean' && comparator) {
16412
+ comparator = function(obj, text) {
16413
+ return angular.equals(obj, text);
16414
+ };
16415
+ } else {
16416
+ comparator = function(obj, text) {
16417
+ if (obj && text && typeof obj === 'object' && typeof text === 'object') {
16418
+ for (var objKey in obj) {
16419
+ if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
16420
+ comparator(obj[objKey], text[objKey])) {
16421
+ return true;
16422
+ }
16423
+ }
16424
+ return false;
16425
+ }
16426
+ text = (''+text).toLowerCase();
16427
+ return (''+obj).toLowerCase().indexOf(text) > -1;
16428
+ };
16429
+ }
16430
+ }
16431
+
16432
+ var search = function(obj, text){
16433
+ if (typeof text === 'string' && text.charAt(0) === '!') {
16434
+ return !search(obj, text.substr(1));
16435
+ }
16436
+ switch (typeof obj) {
16437
+ case 'boolean':
16438
+ case 'number':
16439
+ case 'string':
16440
+ return comparator(obj, text);
16441
+ case 'object':
16442
+ switch (typeof text) {
16443
+ case 'object':
16444
+ return comparator(obj, text);
16445
+ default:
16446
+ for ( var objKey in obj) {
16447
+ if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
16448
+ return true;
16449
+ }
16450
+ }
16451
+ break;
16452
+ }
16453
+ return false;
16454
+ case 'array':
16455
+ for ( var i = 0; i < obj.length; i++) {
16456
+ if (search(obj[i], text)) {
16457
+ return true;
16458
+ }
16459
+ }
16460
+ return false;
16461
+ default:
16462
+ return false;
16463
+ }
16464
+ };
16465
+ switch (typeof expression) {
16466
+ case 'boolean':
16467
+ case 'number':
16468
+ case 'string':
16469
+ // Set up expression object and fall through
16470
+ expression = {$:expression};
16471
+ // jshint -W086
16472
+ case 'object':
16473
+ // jshint +W086
16474
+ for (var key in expression) {
16475
+ (function(path) {
16476
+ if (typeof expression[path] === 'undefined') return;
16477
+ predicates.push(function(value) {
16478
+ return search(path == '$' ? value : (value && value[path]), expression[path]);
16479
+ });
16480
+ })(key);
16481
+ }
16482
+ break;
16483
+ case 'function':
16484
+ predicates.push(expression);
16485
+ break;
16486
+ default:
16487
+ return array;
16488
+ }
16489
+ var filtered = [];
16490
+ for ( var j = 0; j < array.length; j++) {
16491
+ var value = array[j];
16492
+ if (predicates.check(value, j)) {
16493
+ filtered.push(value);
16494
+ }
16495
+ }
16496
+ return filtered;
16497
+ };
16498
+}
16499
+
16500
+/**
16501
+ * @ngdoc filter
16502
+ * @name currency
16503
+ * @kind function
16504
+ *
16505
+ * @description
16506
+ * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default
16507
+ * symbol for current locale is used.
16508
+ *
16509
+ * @param {number} amount Input to filter.
16510
+ * @param {string=} symbol Currency symbol or identifier to be displayed.
16511
+ * @param {number=} fractionSize Number of decimal places to round the amount to.
16512
+ * @returns {string} Formatted number.
16513
+ *
16514
+ *
16515
+ * @example
16516
+ <example module="currencyExample">
16517
+ <file name="index.html">
16518
+ <script>
16519
+ angular.module('currencyExample', [])
16520
+ .controller('ExampleController', ['$scope', function($scope) {
16521
+ $scope.amount = 1234.56;
16522
+ }]);
16523
+ </script>
16524
+ <div ng-controller="ExampleController">
16525
+ <input type="number" ng-model="amount"> <br>
16526
+ default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
16527
+ custom currency identifier (USD$): <span id="currency-custom">{{amount | currency:"USD$"}}</span>
16528
+ no fractions (0): <span id="currency-no-fractions">{{amount | currency:"USD$":0}}</span>
16529
+ </div>
16530
+ </file>
16531
+ <file name="protractor.js" type="protractor">
16532
+ it('should init with 1234.56', function() {
16533
+ expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');
16534
+ expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56');
16535
+ expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235');
16536
+ });
16537
+ it('should update', function() {
16538
+ if (browser.params.browser == 'safari') {
16539
+ // Safari does not understand the minus key. See
16540
+ // https://github.com/angular/protractor/issues/481
16541
+ return;
16542
+ }
16543
+ element(by.model('amount')).clear();
16544
+ element(by.model('amount')).sendKeys('-1234');
16545
+ expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');
16546
+ expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)');
16547
+ expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)');
16548
+ });
16549
+ </file>
16550
+ </example>
16551
+ */
16552
+currencyFilter.$inject = ['$locale'];
16553
+function currencyFilter($locale) {
16554
+ var formats = $locale.NUMBER_FORMATS;
16555
+ return function(amount, currencySymbol, fractionSize){
16556
+ if (isUndefined(currencySymbol)) {
16557
+ currencySymbol = formats.CURRENCY_SYM;
16558
+ }
16559
+
16560
+ if (isUndefined(fractionSize)) {
16561
+ // TODO: read the default value from the locale file
16562
+ fractionSize = 2;
16563
+ }
16564
+
16565
+ // if null or undefined pass it through
16566
+ return (amount == null)
16567
+ ? amount
16568
+ : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).
16569
+ replace(/\u00A4/g, currencySymbol);
16570
+ };
16571
+}
16572
+
16573
+/**
16574
+ * @ngdoc filter
16575
+ * @name number
16576
+ * @kind function
16577
+ *
16578
+ * @description
16579
+ * Formats a number as text.
16580
+ *
16581
+ * If the input is not a number an empty string is returned.
16582
+ *
16583
+ * @param {number|string} number Number to format.
16584
+ * @param {(number|string)=} fractionSize Number of decimal places to round the number to.
16585
+ * If this is not provided then the fraction size is computed from the current locale's number
16586
+ * formatting pattern. In the case of the default locale, it will be 3.
16587
+ * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.
16588
+ *
16589
+ * @example
16590
+ <example module="numberFilterExample">
16591
+ <file name="index.html">
16592
+ <script>
16593
+ angular.module('numberFilterExample', [])
16594
+ .controller('ExampleController', ['$scope', function($scope) {
16595
+ $scope.val = 1234.56789;
16596
+ }]);
16597
+ </script>
16598
+ <div ng-controller="ExampleController">
16599
+ Enter number: <input ng-model='val'><br>
16600
+ Default formatting: <span id='number-default'>{{val | number}}</span><br>
16601
+ No fractions: <span>{{val | number:0}}</span><br>
16602
+ Negative number: <span>{{-val | number:4}}</span>
16603
+ </div>
16604
+ </file>
16605
+ <file name="protractor.js" type="protractor">
16606
+ it('should format numbers', function() {
16607
+ expect(element(by.id('number-default')).getText()).toBe('1,234.568');
16608
+ expect(element(by.binding('val | number:0')).getText()).toBe('1,235');
16609
+ expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');
16610
+ });
16611
+
16612
+ it('should update', function() {
16613
+ element(by.model('val')).clear();
16614
+ element(by.model('val')).sendKeys('3374.333');
16615
+ expect(element(by.id('number-default')).getText()).toBe('3,374.333');
16616
+ expect(element(by.binding('val | number:0')).getText()).toBe('3,374');
16617
+ expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');
16618
+ });
16619
+ </file>
16620
+ </example>
16621
+ */
16622
+
16623
+
16624
+numberFilter.$inject = ['$locale'];
16625
+function numberFilter($locale) {
16626
+ var formats = $locale.NUMBER_FORMATS;
16627
+ return function(number, fractionSize) {
16628
+
16629
+ // if null or undefined pass it through
16630
+ return (number == null)
16631
+ ? number
16632
+ : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,
16633
+ fractionSize);
16634
+ };
16635
+}
16636
+
16637
+var DECIMAL_SEP = '.';
16638
+function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
16639
+ if (!isFinite(number) || isObject(number)) return '';
16640
+
16641
+ var isNegative = number < 0;
16642
+ number = Math.abs(number);
16643
+ var numStr = number + '',
16644
+ formatedText = '',
16645
+ parts = [];
16646
+
16647
+ var hasExponent = false;
16648
+ if (numStr.indexOf('e') !== -1) {
16649
+ var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
16650
+ if (match && match[2] == '-' && match[3] > fractionSize + 1) {
16651
+ numStr = '0';
16652
+ number = 0;
16653
+ } else {
16654
+ formatedText = numStr;
16655
+ hasExponent = true;
16656
+ }
16657
+ }
16658
+
16659
+ if (!hasExponent) {
16660
+ var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;
16661
+
16662
+ // determine fractionSize if it is not specified
16663
+ if (isUndefined(fractionSize)) {
16664
+ fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
16665
+ }
16666
+
16667
+ // safely round numbers in JS without hitting imprecisions of floating-point arithmetics
16668
+ // inspired by:
16669
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
16670
+ number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
16671
+
16672
+ if (number === 0) {
16673
+ isNegative = false;
16674
+ }
16675
+
16676
+ var fraction = ('' + number).split(DECIMAL_SEP);
16677
+ var whole = fraction[0];
16678
+ fraction = fraction[1] || '';
16679
+
16680
+ var i, pos = 0,
16681
+ lgroup = pattern.lgSize,
16682
+ group = pattern.gSize;
16683
+
16684
+ if (whole.length >= (lgroup + group)) {
16685
+ pos = whole.length - lgroup;
16686
+ for (i = 0; i < pos; i++) {
16687
+ if ((pos - i)%group === 0 && i !== 0) {
16688
+ formatedText += groupSep;
16689
+ }
16690
+ formatedText += whole.charAt(i);
16691
+ }
16692
+ }
16693
+
16694
+ for (i = pos; i < whole.length; i++) {
16695
+ if ((whole.length - i)%lgroup === 0 && i !== 0) {
16696
+ formatedText += groupSep;
16697
+ }
16698
+ formatedText += whole.charAt(i);
16699
+ }
16700
+
16701
+ // format fraction part.
16702
+ while(fraction.length < fractionSize) {
16703
+ fraction += '0';
16704
+ }
16705
+
16706
+ if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
16707
+ } else {
16708
+
16709
+ if (fractionSize > 0 && number > -1 && number < 1) {
16710
+ formatedText = number.toFixed(fractionSize);
16711
+ }
16712
+ }
16713
+
16714
+ parts.push(isNegative ? pattern.negPre : pattern.posPre);
16715
+ parts.push(formatedText);
16716
+ parts.push(isNegative ? pattern.negSuf : pattern.posSuf);
16717
+ return parts.join('');
16718
+}
16719
+
16720
+function padNumber(num, digits, trim) {
16721
+ var neg = '';
16722
+ if (num < 0) {
16723
+ neg = '-';
16724
+ num = -num;
16725
+ }
16726
+ num = '' + num;
16727
+ while(num.length < digits) num = '0' + num;
16728
+ if (trim)
16729
+ num = num.substr(num.length - digits);
16730
+ return neg + num;
16731
+}
16732
+
16733
+
16734
+function dateGetter(name, size, offset, trim) {
16735
+ offset = offset || 0;
16736
+ return function(date) {
16737
+ var value = date['get' + name]();
16738
+ if (offset > 0 || value > -offset)
16739
+ value += offset;
16740
+ if (value === 0 && offset == -12 ) value = 12;
16741
+ return padNumber(value, size, trim);
16742
+ };
16743
+}
16744
+
16745
+function dateStrGetter(name, shortForm) {
16746
+ return function(date, formats) {
16747
+ var value = date['get' + name]();
16748
+ var get = uppercase(shortForm ? ('SHORT' + name) : name);
16749
+
16750
+ return formats[get][value];
16751
+ };
16752
+}
16753
+
16754
+function timeZoneGetter(date) {
16755
+ var zone = -1 * date.getTimezoneOffset();
16756
+ var paddedZone = (zone >= 0) ? "+" : "";
16757
+
16758
+ paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +
16759
+ padNumber(Math.abs(zone % 60), 2);
16760
+
16761
+ return paddedZone;
16762
+}
16763
+
16764
+function getFirstThursdayOfYear(year) {
16765
+ // 0 = index of January
16766
+ var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();
16767
+ // 4 = index of Thursday (+1 to account for 1st = 5)
16768
+ // 11 = index of *next* Thursday (+1 account for 1st = 12)
16769
+ return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);
16770
+}
16771
+
16772
+function getThursdayThisWeek(datetime) {
16773
+ return new Date(datetime.getFullYear(), datetime.getMonth(),
16774
+ // 4 = index of Thursday
16775
+ datetime.getDate() + (4 - datetime.getDay()));
16776
+}
16777
+
16778
+function weekGetter(size) {
16779
+ return function(date) {
16780
+ var firstThurs = getFirstThursdayOfYear(date.getFullYear()),
16781
+ thisThurs = getThursdayThisWeek(date);
16782
+
16783
+ var diff = +thisThurs - +firstThurs,
16784
+ result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week
16785
+
16786
+ return padNumber(result, size);
16787
+ };
16788
+}
16789
+
16790
+function ampmGetter(date, formats) {
16791
+ return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];
16792
+}
16793
+
16794
+var DATE_FORMATS = {
16795
+ yyyy: dateGetter('FullYear', 4),
16796
+ yy: dateGetter('FullYear', 2, 0, true),
16797
+ y: dateGetter('FullYear', 1),
16798
+ MMMM: dateStrGetter('Month'),
16799
+ MMM: dateStrGetter('Month', true),
16800
+ MM: dateGetter('Month', 2, 1),
16801
+ M: dateGetter('Month', 1, 1),
16802
+ dd: dateGetter('Date', 2),
16803
+ d: dateGetter('Date', 1),
16804
+ HH: dateGetter('Hours', 2),
16805
+ H: dateGetter('Hours', 1),
16806
+ hh: dateGetter('Hours', 2, -12),
16807
+ h: dateGetter('Hours', 1, -12),
16808
+ mm: dateGetter('Minutes', 2),
16809
+ m: dateGetter('Minutes', 1),
16810
+ ss: dateGetter('Seconds', 2),
16811
+ s: dateGetter('Seconds', 1),
16812
+ // while ISO 8601 requires fractions to be prefixed with `.` or `,`
16813
+ // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions
16814
+ sss: dateGetter('Milliseconds', 3),
16815
+ EEEE: dateStrGetter('Day'),
16816
+ EEE: dateStrGetter('Day', true),
16817
+ a: ampmGetter,
16818
+ Z: timeZoneGetter,
16819
+ ww: weekGetter(2),
16820
+ w: weekGetter(1)
16821
+};
16822
+
16823
+var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,
16824
+ NUMBER_STRING = /^\-?\d+$/;
16825
+
16826
+/**
16827
+ * @ngdoc filter
16828
+ * @name date
16829
+ * @kind function
16830
+ *
16831
+ * @description
16832
+ * Formats `date` to a string based on the requested `format`.
16833
+ *
16834
+ * `format` string can be composed of the following elements:
16835
+ *
16836
+ * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)
16837
+ * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
16838
+ * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)
16839
+ * * `'MMMM'`: Month in year (January-December)
16840
+ * * `'MMM'`: Month in year (Jan-Dec)
16841
+ * * `'MM'`: Month in year, padded (01-12)
16842
+ * * `'M'`: Month in year (1-12)
16843
+ * * `'dd'`: Day in month, padded (01-31)
16844
+ * * `'d'`: Day in month (1-31)
16845
+ * * `'EEEE'`: Day in Week,(Sunday-Saturday)
16846
+ * * `'EEE'`: Day in Week, (Sun-Sat)
16847
+ * * `'HH'`: Hour in day, padded (00-23)
16848
+ * * `'H'`: Hour in day (0-23)
16849
+ * * `'hh'`: Hour in AM/PM, padded (01-12)
16850
+ * * `'h'`: Hour in AM/PM, (1-12)
16851
+ * * `'mm'`: Minute in hour, padded (00-59)
16852
+ * * `'m'`: Minute in hour (0-59)
16853
+ * * `'ss'`: Second in minute, padded (00-59)
16854
+ * * `'s'`: Second in minute (0-59)
16855
+ * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)
16856
+ * * `'a'`: AM/PM marker
16857
+ * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
16858
+ * * `'ww'`: ISO-8601 week of year (00-53)
16859
+ * * `'w'`: ISO-8601 week of year (0-53)
16860
+ *
16861
+ * `format` string can also be one of the following predefined
16862
+ * {@link guide/i18n localizable formats}:
16863
+ *
16864
+ * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale
16865
+ * (e.g. Sep 3, 2010 12:05:08 PM)
16866
+ * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM)
16867
+ * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale
16868
+ * (e.g. Friday, September 3, 2010)
16869
+ * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010)
16870
+ * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010)
16871
+ * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)
16872
+ * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM)
16873
+ * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM)
16874
+ *
16875
+ * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g.
16876
+ * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence
16877
+ * (e.g. `"h 'o''clock'"`).
16878
+ *
16879
+ * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
16880
+ * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its
16881
+ * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
16882
+ * specified in the string input, the time is considered to be in the local timezone.
16883
+ * @param {string=} format Formatting rules (see Description). If not specified,
16884
+ * `mediumDate` is used.
16885
+ * @param {string=} timezone Timezone to be used for formatting. Right now, only `'UTC'` is supported.
16886
+ * If not specified, the timezone of the browser will be used.
16887
+ * @returns {string} Formatted string or the input if input is not recognized as date/millis.
16888
+ *
16889
+ * @example
16890
+ <example>
16891
+ <file name="index.html">
16892
+ <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:
16893
+ <span>{{1288323623006 | date:'medium'}}</span><br>
16894
+ <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:
16895
+ <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>
16896
+ <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:
16897
+ <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>
16898
+ <span ng-non-bindable>{{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}</span>:
16899
+ <span>{{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}</span><br>
16900
+ </file>
16901
+ <file name="protractor.js" type="protractor">
16902
+ it('should format date', function() {
16903
+ expect(element(by.binding("1288323623006 | date:'medium'")).getText()).
16904
+ toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/);
16905
+ expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()).
16906
+ toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/);
16907
+ expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()).
16908
+ toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/);
16909
+ expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()).
16910
+ toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/);
16911
+ });
16912
+ </file>
16913
+ </example>
16914
+ */
16915
+dateFilter.$inject = ['$locale'];
16916
+function dateFilter($locale) {
16917
+
16918
+
16919
+ var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
16920
+ // 1 2 3 4 5 6 7 8 9 10 11
16921
+ function jsonStringToDate(string) {
16922
+ var match;
16923
+ if (match = string.match(R_ISO8601_STR)) {
16924
+ var date = new Date(0),
16925
+ tzHour = 0,
16926
+ tzMin = 0,
16927
+ dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
16928
+ timeSetter = match[8] ? date.setUTCHours : date.setHours;
16929
+
16930
+ if (match[9]) {
16931
+ tzHour = int(match[9] + match[10]);
16932
+ tzMin = int(match[9] + match[11]);
16933
+ }
16934
+ dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
16935
+ var h = int(match[4]||0) - tzHour;
16936
+ var m = int(match[5]||0) - tzMin;
16937
+ var s = int(match[6]||0);
16938
+ var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
16939
+ timeSetter.call(date, h, m, s, ms);
16940
+ return date;
16941
+ }
16942
+ return string;
16943
+ }
16944
+
16945
+
16946
+ return function(date, format, timezone) {
16947
+ var text = '',
16948
+ parts = [],
16949
+ fn, match;
16950
+
16951
+ format = format || 'mediumDate';
16952
+ format = $locale.DATETIME_FORMATS[format] || format;
16953
+ if (isString(date)) {
16954
+ date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date);
16955
+ }
16956
+
16957
+ if (isNumber(date)) {
16958
+ date = new Date(date);
16959
+ }
16960
+
16961
+ if (!isDate(date)) {
16962
+ return date;
16963
+ }
16964
+
16965
+ while(format) {
16966
+ match = DATE_FORMATS_SPLIT.exec(format);
16967
+ if (match) {
16968
+ parts = concat(parts, match, 1);
16969
+ format = parts.pop();
16970
+ } else {
16971
+ parts.push(format);
16972
+ format = null;
16973
+ }
16974
+ }
16975
+
16976
+ if (timezone && timezone === 'UTC') {
16977
+ date = new Date(date.getTime());
16978
+ date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
16979
+ }
16980
+ forEach(parts, function(value){
16981
+ fn = DATE_FORMATS[value];
16982
+ text += fn ? fn(date, $locale.DATETIME_FORMATS)
16983
+ : value.replace(/(^'|'$)/g, '').replace(/''/g, "'");
16984
+ });
16985
+
16986
+ return text;
16987
+ };
16988
+}
16989
+
16990
+
16991
+/**
16992
+ * @ngdoc filter
16993
+ * @name json
16994
+ * @kind function
16995
+ *
16996
+ * @description
16997
+ * Allows you to convert a JavaScript object into JSON string.
16998
+ *
16999
+ * This filter is mostly useful for debugging. When using the double curly {{value}} notation
17000
+ * the binding is automatically converted to JSON.
17001
+ *
17002
+ * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.
17003
+ * @returns {string} JSON string.
17004
+ *
17005
+ *
17006
+ * @example
17007
+ <example>
17008
+ <file name="index.html">
17009
+ <pre>{{ {'name':'value'} | json }}</pre>
17010
+ </file>
17011
+ <file name="protractor.js" type="protractor">
17012
+ it('should jsonify filtered objects', function() {
17013
+ expect(element(by.binding("{'name':'value'}")).getText()).toMatch(/\{\n "name": ?"value"\n}/);
17014
+ });
17015
+ </file>
17016
+ </example>
17017
+ *
17018
+ */
17019
+function jsonFilter() {
17020
+ return function(object) {
17021
+ return toJson(object, true);
17022
+ };
17023
+}
17024
+
17025
+
17026
+/**
17027
+ * @ngdoc filter
17028
+ * @name lowercase
17029
+ * @kind function
17030
+ * @description
17031
+ * Converts string to lowercase.
17032
+ * @see angular.lowercase
17033
+ */
17034
+var lowercaseFilter = valueFn(lowercase);
17035
+
17036
+
17037
+/**
17038
+ * @ngdoc filter
17039
+ * @name uppercase
17040
+ * @kind function
17041
+ * @description
17042
+ * Converts string to uppercase.
17043
+ * @see angular.uppercase
17044
+ */
17045
+var uppercaseFilter = valueFn(uppercase);
17046
+
17047
+/**
17048
+ * @ngdoc filter
17049
+ * @name limitTo
17050
+ * @kind function
17051
+ *
17052
+ * @description
17053
+ * Creates a new array or string containing only a specified number of elements. The elements
17054
+ * are taken from either the beginning or the end of the source array, string or number, as specified by
17055
+ * the value and sign (positive or negative) of `limit`. If a number is used as input, it is
17056
+ * converted to a string.
17057
+ *
17058
+ * @param {Array|string|number} input Source array, string or number to be limited.
17059
+ * @param {string|number} limit The length of the returned array or string. If the `limit` number
17060
+ * is positive, `limit` number of items from the beginning of the source array/string are copied.
17061
+ * If the number is negative, `limit` number of items from the end of the source array/string
17062
+ * are copied. The `limit` will be trimmed if it exceeds `array.length`
17063
+ * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array
17064
+ * had less than `limit` elements.
17065
+ *
17066
+ * @example
17067
+ <example module="limitToExample">
17068
+ <file name="index.html">
17069
+ <script>
17070
+ angular.module('limitToExample', [])
17071
+ .controller('ExampleController', ['$scope', function($scope) {
17072
+ $scope.numbers = [1,2,3,4,5,6,7,8,9];
17073
+ $scope.letters = "abcdefghi";
17074
+ $scope.longNumber = 2345432342;
17075
+ $scope.numLimit = 3;
17076
+ $scope.letterLimit = 3;
17077
+ $scope.longNumberLimit = 3;
17078
+ }]);
17079
+ </script>
17080
+ <div ng-controller="ExampleController">
17081
+ Limit {{numbers}} to: <input type="number" step="1" ng-model="numLimit">
17082
+ <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
17083
+ Limit {{letters}} to: <input type="number" step="1" ng-model="letterLimit">
17084
+ <p>Output letters: {{ letters | limitTo:letterLimit }}</p>
17085
+ Limit {{longNumber}} to: <input type="number" step="1" ng-model="longNumberLimit">
17086
+ <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>
17087
+ </div>
17088
+ </file>
17089
+ <file name="protractor.js" type="protractor">
17090
+ var numLimitInput = element(by.model('numLimit'));
17091
+ var letterLimitInput = element(by.model('letterLimit'));
17092
+ var longNumberLimitInput = element(by.model('longNumberLimit'));
17093
+ var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));
17094
+ var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));
17095
+ var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit'));
17096
+
17097
+ it('should limit the number array to first three items', function() {
17098
+ expect(numLimitInput.getAttribute('value')).toBe('3');
17099
+ expect(letterLimitInput.getAttribute('value')).toBe('3');
17100
+ expect(longNumberLimitInput.getAttribute('value')).toBe('3');
17101
+ expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');
17102
+ expect(limitedLetters.getText()).toEqual('Output letters: abc');
17103
+ expect(limitedLongNumber.getText()).toEqual('Output long number: 234');
17104
+ });
17105
+
17106
+ // There is a bug in safari and protractor that doesn't like the minus key
17107
+ // it('should update the output when -3 is entered', function() {
17108
+ // numLimitInput.clear();
17109
+ // numLimitInput.sendKeys('-3');
17110
+ // letterLimitInput.clear();
17111
+ // letterLimitInput.sendKeys('-3');
17112
+ // longNumberLimitInput.clear();
17113
+ // longNumberLimitInput.sendKeys('-3');
17114
+ // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');
17115
+ // expect(limitedLetters.getText()).toEqual('Output letters: ghi');
17116
+ // expect(limitedLongNumber.getText()).toEqual('Output long number: 342');
17117
+ // });
17118
+
17119
+ it('should not exceed the maximum size of input array', function() {
17120
+ numLimitInput.clear();
17121
+ numLimitInput.sendKeys('100');
17122
+ letterLimitInput.clear();
17123
+ letterLimitInput.sendKeys('100');
17124
+ longNumberLimitInput.clear();
17125
+ longNumberLimitInput.sendKeys('100');
17126
+ expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');
17127
+ expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');
17128
+ expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342');
17129
+ });
17130
+ </file>
17131
+ </example>
17132
+*/
17133
+function limitToFilter(){
17134
+ return function(input, limit) {
17135
+ if (isNumber(input)) input = input.toString();
17136
+ if (!isArray(input) && !isString(input)) return input;
17137
+
17138
+ if (Math.abs(Number(limit)) === Infinity) {
17139
+ limit = Number(limit);
17140
+ } else {
17141
+ limit = int(limit);
17142
+ }
17143
+
17144
+ if (isString(input)) {
17145
+ //NaN check on limit
17146
+ if (limit) {
17147
+ return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);
17148
+ } else {
17149
+ return "";
17150
+ }
17151
+ }
17152
+
17153
+ var out = [],
17154
+ i, n;
17155
+
17156
+ // if abs(limit) exceeds maximum length, trim it
17157
+ if (limit > input.length)
17158
+ limit = input.length;
17159
+ else if (limit < -input.length)
17160
+ limit = -input.length;
17161
+
17162
+ if (limit > 0) {
17163
+ i = 0;
17164
+ n = limit;
17165
+ } else {
17166
+ i = input.length + limit;
17167
+ n = input.length;
17168
+ }
17169
+
17170
+ for (; i<n; i++) {
17171
+ out.push(input[i]);
17172
+ }
17173
+
17174
+ return out;
17175
+ };
17176
+}
17177
+
17178
+/**
17179
+ * @ngdoc filter
17180
+ * @name orderBy
17181
+ * @kind function
17182
+ *
17183
+ * @description
17184
+ * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically
17185
+ * for strings and numerically for numbers. Note: if you notice numbers are not being sorted
17186
+ * correctly, make sure they are actually being saved as numbers and not strings.
17187
+ *
17188
+ * @param {Array} array The array to sort.
17189
+ * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be
17190
+ * used by the comparator to determine the order of elements.
17191
+ *
17192
+ * Can be one of:
17193
+ *
17194
+ * - `function`: Getter function. The result of this function will be sorted using the
17195
+ * `<`, `=`, `>` operator.
17196
+ * - `string`: An Angular expression. The result of this expression is used to compare elements
17197
+ * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by
17198
+ * 3 first characters of a property called `name`). The result of a constant expression
17199
+ * is interpreted as a property name to be used in comparisons (for example `"special name"`
17200
+ * to sort object by the value of their `special name` property). An expression can be
17201
+ * optionally prefixed with `+` or `-` to control ascending or descending sort order
17202
+ * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array
17203
+ * element itself is used to compare where sorting.
17204
+ * - `Array`: An array of function or string predicates. The first predicate in the array
17205
+ * is used for sorting, but when two items are equivalent, the next predicate is used.
17206
+ *
17207
+ * If the predicate is missing or empty then it defaults to `'+'`.
17208
+ *
17209
+ * @param {boolean=} reverse Reverse the order of the array.
17210
+ * @returns {Array} Sorted copy of the source array.
17211
+ *
17212
+ * @example
17213
+ <example module="orderByExample">
17214
+ <file name="index.html">
17215
+ <script>
17216
+ angular.module('orderByExample', [])
17217
+ .controller('ExampleController', ['$scope', function($scope) {
17218
+ $scope.friends =
17219
+ [{name:'John', phone:'555-1212', age:10},
17220
+ {name:'Mary', phone:'555-9876', age:19},
17221
+ {name:'Mike', phone:'555-4321', age:21},
17222
+ {name:'Adam', phone:'555-5678', age:35},
17223
+ {name:'Julie', phone:'555-8765', age:29}];
17224
+ $scope.predicate = '-age';
17225
+ }]);
17226
+ </script>
17227
+ <div ng-controller="ExampleController">
17228
+ <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
17229
+ <hr/>
17230
+ [ <a href="" ng-click="predicate=''">unsorted</a> ]
17231
+ <table class="friend">
17232
+ <tr>
17233
+ <th><a href="" ng-click="predicate = 'name'; reverse=false">Name</a>
17234
+ (<a href="" ng-click="predicate = '-name'; reverse=false">^</a>)</th>
17235
+ <th><a href="" ng-click="predicate = 'phone'; reverse=!reverse">Phone Number</a></th>
17236
+ <th><a href="" ng-click="predicate = 'age'; reverse=!reverse">Age</a></th>
17237
+ </tr>
17238
+ <tr ng-repeat="friend in friends | orderBy:predicate:reverse">
17239
+ <td>{{friend.name}}</td>
17240
+ <td>{{friend.phone}}</td>
17241
+ <td>{{friend.age}}</td>
17242
+ </tr>
17243
+ </table>
17244
+ </div>
17245
+ </file>
17246
+ </example>
17247
+ *
17248
+ * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the
17249
+ * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the
17250
+ * desired parameters.
17251
+ *
17252
+ * Example:
17253
+ *
17254
+ * @example
17255
+ <example module="orderByExample">
17256
+ <file name="index.html">
17257
+ <div ng-controller="ExampleController">
17258
+ <table class="friend">
17259
+ <tr>
17260
+ <th><a href="" ng-click="reverse=false;order('name', false)">Name</a>
17261
+ (<a href="" ng-click="order('-name',false)">^</a>)</th>
17262
+ <th><a href="" ng-click="reverse=!reverse;order('phone', reverse)">Phone Number</a></th>
17263
+ <th><a href="" ng-click="reverse=!reverse;order('age',reverse)">Age</a></th>
17264
+ </tr>
17265
+ <tr ng-repeat="friend in friends">
17266
+ <td>{{friend.name}}</td>
17267
+ <td>{{friend.phone}}</td>
17268
+ <td>{{friend.age}}</td>
17269
+ </tr>
17270
+ </table>
17271
+ </div>
17272
+ </file>
17273
+
17274
+ <file name="script.js">
17275
+ angular.module('orderByExample', [])
17276
+ .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) {
17277
+ var orderBy = $filter('orderBy');
17278
+ $scope.friends = [
17279
+ { name: 'John', phone: '555-1212', age: 10 },
17280
+ { name: 'Mary', phone: '555-9876', age: 19 },
17281
+ { name: 'Mike', phone: '555-4321', age: 21 },
17282
+ { name: 'Adam', phone: '555-5678', age: 35 },
17283
+ { name: 'Julie', phone: '555-8765', age: 29 }
17284
+ ];
17285
+ $scope.order = function(predicate, reverse) {
17286
+ $scope.friends = orderBy($scope.friends, predicate, reverse);
17287
+ };
17288
+ $scope.order('-age',false);
17289
+ }]);
17290
+ </file>
17291
+</example>
17292
+ */
17293
+orderByFilter.$inject = ['$parse'];
17294
+function orderByFilter($parse){
17295
+ return function(array, sortPredicate, reverseOrder) {
17296
+ if (!(isArrayLike(array))) return array;
17297
+ sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];
17298
+ if (sortPredicate.length === 0) { sortPredicate = ['+']; }
17299
+ sortPredicate = sortPredicate.map(function(predicate){
17300
+ var descending = false, get = predicate || identity;
17301
+ if (isString(predicate)) {
17302
+ if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {
17303
+ descending = predicate.charAt(0) == '-';
17304
+ predicate = predicate.substring(1);
17305
+ }
17306
+ if ( predicate === '' ) {
17307
+ // Effectively no predicate was passed so we compare identity
17308
+ return reverseComparator(function(a,b) {
17309
+ return compare(a, b);
17310
+ }, descending);
17311
+ }
17312
+ get = $parse(predicate);
17313
+ if (get.constant) {
17314
+ var key = get();
17315
+ return reverseComparator(function(a,b) {
17316
+ return compare(a[key], b[key]);
17317
+ }, descending);
17318
+ }
17319
+ }
17320
+ return reverseComparator(function(a,b){
17321
+ return compare(get(a),get(b));
17322
+ }, descending);
17323
+ });
17324
+ var arrayCopy = [];
17325
+ for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
17326
+ return arrayCopy.sort(reverseComparator(comparator, reverseOrder));
17327
+
17328
+ function comparator(o1, o2){
17329
+ for ( var i = 0; i < sortPredicate.length; i++) {
17330
+ var comp = sortPredicate[i](o1, o2);
17331
+ if (comp !== 0) return comp;
17332
+ }
17333
+ return 0;
17334
+ }
17335
+ function reverseComparator(comp, descending) {
17336
+ return descending
17337
+ ? function(a,b){return comp(b,a);}
17338
+ : comp;
17339
+ }
17340
+ function compare(v1, v2){
17341
+ var t1 = typeof v1;
17342
+ var t2 = typeof v2;
17343
+ if (t1 == t2) {
17344
+ if (isDate(v1) && isDate(v2)) {
17345
+ v1 = v1.valueOf();
17346
+ v2 = v2.valueOf();
17347
+ }
17348
+ if (t1 == "string") {
17349
+ v1 = v1.toLowerCase();
17350
+ v2 = v2.toLowerCase();
17351
+ }
17352
+ if (v1 === v2) return 0;
17353
+ return v1 < v2 ? -1 : 1;
17354
+ } else {
17355
+ return t1 < t2 ? -1 : 1;
17356
+ }
17357
+ }
17358
+ };
17359
+}
17360
+
17361
+function ngDirective(directive) {
17362
+ if (isFunction(directive)) {
17363
+ directive = {
17364
+ link: directive
17365
+ };
17366
+ }
17367
+ directive.restrict = directive.restrict || 'AC';
17368
+ return valueFn(directive);
17369
+}
17370
+
17371
+/**
17372
+ * @ngdoc directive
17373
+ * @name a
17374
+ * @restrict E
17375
+ *
17376
+ * @description
17377
+ * Modifies the default behavior of the html A tag so that the default action is prevented when
17378
+ * the href attribute is empty.
17379
+ *
17380
+ * This change permits the easy creation of action links with the `ngClick` directive
17381
+ * without changing the location or causing page reloads, e.g.:
17382
+ * `<a href="" ng-click="list.addItem()">Add Item</a>`
17383
+ */
17384
+var htmlAnchorDirective = valueFn({
17385
+ restrict: 'E',
17386
+ compile: function(element, attr) {
17387
+ if (!attr.href && !attr.xlinkHref && !attr.name) {
17388
+ return function(scope, element) {
17389
+ // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.
17390
+ var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?
17391
+ 'xlink:href' : 'href';
17392
+ element.on('click', function(event){
17393
+ // if we have no href url, then don't navigate anywhere.
17394
+ if (!element.attr(href)) {
17395
+ event.preventDefault();
17396
+ }
17397
+ });
17398
+ };
17399
+ }
17400
+ }
17401
+});
17402
+
17403
+/**
17404
+ * @ngdoc directive
17405
+ * @name ngHref
17406
+ * @restrict A
17407
+ * @priority 99
17408
+ *
17409
+ * @description
17410
+ * Using Angular markup like `{{hash}}` in an href attribute will
17411
+ * make the link go to the wrong URL if the user clicks it before
17412
+ * Angular has a chance to replace the `{{hash}}` markup with its
17413
+ * value. Until Angular replaces the markup the link will be broken
17414
+ * and will most likely return a 404 error.
17415
+ *
17416
+ * The `ngHref` directive solves this problem.
17417
+ *
17418
+ * The wrong way to write it:
17419
+ * ```html
17420
+ * <a href="http://www.gravatar.com/avatar/{{hash}}">link1</a>
17421
+ * ```
17422
+ *
17423
+ * The correct way to write it:
17424
+ * ```html
17425
+ * <a ng-href="http://www.gravatar.com/avatar/{{hash}}">link1</a>
17426
+ * ```
17427
+ *
17428
+ * @element A
17429
+ * @param {template} ngHref any string which can contain `{{}}` markup.
17430
+ *
17431
+ * @example
17432
+ * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes
17433
+ * in links and their different behaviors:
17434
+ <example>
17435
+ <file name="index.html">
17436
+ <input ng-model="value" /><br />
17437
+ <a id="link-1" href ng-click="value = 1">link 1</a> (link, don't reload)<br />
17438
+ <a id="link-2" href="" ng-click="value = 2">link 2</a> (link, don't reload)<br />
17439
+ <a id="link-3" ng-href="/{{'123'}}">link 3</a> (link, reload!)<br />
17440
+ <a id="link-4" href="" name="xx" ng-click="value = 4">anchor</a> (link, don't reload)<br />
17441
+ <a id="link-5" name="xxx" ng-click="value = 5">anchor</a> (no link)<br />
17442
+ <a id="link-6" ng-href="{{value}}">link</a> (link, change location)
17443
+ </file>
17444
+ <file name="protractor.js" type="protractor">
17445
+ it('should execute ng-click but not reload when href without value', function() {
17446
+ element(by.id('link-1')).click();
17447
+ expect(element(by.model('value')).getAttribute('value')).toEqual('1');
17448
+ expect(element(by.id('link-1')).getAttribute('href')).toBe('');
17449
+ });
17450
+
17451
+ it('should execute ng-click but not reload when href empty string', function() {
17452
+ element(by.id('link-2')).click();
17453
+ expect(element(by.model('value')).getAttribute('value')).toEqual('2');
17454
+ expect(element(by.id('link-2')).getAttribute('href')).toBe('');
17455
+ });
17456
+
17457
+ it('should execute ng-click and change url when ng-href specified', function() {
17458
+ expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/);
17459
+
17460
+ element(by.id('link-3')).click();
17461
+
17462
+ // At this point, we navigate away from an Angular page, so we need
17463
+ // to use browser.driver to get the base webdriver.
17464
+
17465
+ browser.wait(function() {
17466
+ return browser.driver.getCurrentUrl().then(function(url) {
17467
+ return url.match(/\/123$/);
17468
+ });
17469
+ }, 5000, 'page should navigate to /123');
17470
+ });
17471
+
17472
+ xit('should execute ng-click but not reload when href empty string and name specified', function() {
17473
+ element(by.id('link-4')).click();
17474
+ expect(element(by.model('value')).getAttribute('value')).toEqual('4');
17475
+ expect(element(by.id('link-4')).getAttribute('href')).toBe('');
17476
+ });
17477
+
17478
+ it('should execute ng-click but not reload when no href but name specified', function() {
17479
+ element(by.id('link-5')).click();
17480
+ expect(element(by.model('value')).getAttribute('value')).toEqual('5');
17481
+ expect(element(by.id('link-5')).getAttribute('href')).toBe(null);
17482
+ });
17483
+
17484
+ it('should only change url when only ng-href', function() {
17485
+ element(by.model('value')).clear();
17486
+ element(by.model('value')).sendKeys('6');
17487
+ expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/);
17488
+
17489
+ element(by.id('link-6')).click();
17490
+
17491
+ // At this point, we navigate away from an Angular page, so we need
17492
+ // to use browser.driver to get the base webdriver.
17493
+ browser.wait(function() {
17494
+ return browser.driver.getCurrentUrl().then(function(url) {
17495
+ return url.match(/\/6$/);
17496
+ });
17497
+ }, 5000, 'page should navigate to /6');
17498
+ });
17499
+ </file>
17500
+ </example>
17501
+ */
17502
+
17503
+/**
17504
+ * @ngdoc directive
17505
+ * @name ngSrc
17506
+ * @restrict A
17507
+ * @priority 99
17508
+ *
17509
+ * @description
17510
+ * Using Angular markup like `{{hash}}` in a `src` attribute doesn't
17511
+ * work right: The browser will fetch from the URL with the literal
17512
+ * text `{{hash}}` until Angular replaces the expression inside
17513
+ * `{{hash}}`. The `ngSrc` directive solves this problem.
17514
+ *
17515
+ * The buggy way to write it:
17516
+ * ```html
17517
+ * <img src="http://www.gravatar.com/avatar/{{hash}}"/>
17518
+ * ```
17519
+ *
17520
+ * The correct way to write it:
17521
+ * ```html
17522
+ * <img ng-src="http://www.gravatar.com/avatar/{{hash}}"/>
17523
+ * ```
17524
+ *
17525
+ * @element IMG
17526
+ * @param {template} ngSrc any string which can contain `{{}}` markup.
17527
+ */
17528
+
17529
+/**
17530
+ * @ngdoc directive
17531
+ * @name ngSrcset
17532
+ * @restrict A
17533
+ * @priority 99
17534
+ *
17535
+ * @description
17536
+ * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't
17537
+ * work right: The browser will fetch from the URL with the literal
17538
+ * text `{{hash}}` until Angular replaces the expression inside
17539
+ * `{{hash}}`. The `ngSrcset` directive solves this problem.
17540
+ *
17541
+ * The buggy way to write it:
17542
+ * ```html
17543
+ * <img srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/>
17544
+ * ```
17545
+ *
17546
+ * The correct way to write it:
17547
+ * ```html
17548
+ * <img ng-srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/>
17549
+ * ```
17550
+ *
17551
+ * @element IMG
17552
+ * @param {template} ngSrcset any string which can contain `{{}}` markup.
17553
+ */
17554
+
17555
+/**
17556
+ * @ngdoc directive
17557
+ * @name ngDisabled
17558
+ * @restrict A
17559
+ * @priority 100
17560
+ *
17561
+ * @description
17562
+ *
17563
+ * We shouldn't do this, because it will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
17564
+ * ```html
17565
+ * <div ng-init="scope = { isDisabled: false }">
17566
+ * <button disabled="{{scope.isDisabled}}">Disabled</button>
17567
+ * </div>
17568
+ * ```
17569
+ *
17570
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
17571
+ * such as disabled. (Their presence means true and their absence means false.)
17572
+ * If we put an Angular interpolation expression into such an attribute then the
17573
+ * binding information would be lost when the browser removes the attribute.
17574
+ * The `ngDisabled` directive solves this problem for the `disabled` attribute.
17575
+ * This complementary directive is not removed by the browser and so provides
17576
+ * a permanent reliable place to store the binding information.
17577
+ *
17578
+ * @example
17579
+ <example>
17580
+ <file name="index.html">
17581
+ Click me to toggle: <input type="checkbox" ng-model="checked"><br/>
17582
+ <button ng-model="button" ng-disabled="checked">Button</button>
17583
+ </file>
17584
+ <file name="protractor.js" type="protractor">
17585
+ it('should toggle button', function() {
17586
+ expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();
17587
+ element(by.model('checked')).click();
17588
+ expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();
17589
+ });
17590
+ </file>
17591
+ </example>
17592
+ *
17593
+ * @element INPUT
17594
+ * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
17595
+ * then special attribute "disabled" will be set on the element
17596
+ */
17597
+
17598
+
17599
+/**
17600
+ * @ngdoc directive
17601
+ * @name ngChecked
17602
+ * @restrict A
17603
+ * @priority 100
17604
+ *
17605
+ * @description
17606
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
17607
+ * such as checked. (Their presence means true and their absence means false.)
17608
+ * If we put an Angular interpolation expression into such an attribute then the
17609
+ * binding information would be lost when the browser removes the attribute.
17610
+ * The `ngChecked` directive solves this problem for the `checked` attribute.
17611
+ * This complementary directive is not removed by the browser and so provides
17612
+ * a permanent reliable place to store the binding information.
17613
+ * @example
17614
+ <example>
17615
+ <file name="index.html">
17616
+ Check me to check both: <input type="checkbox" ng-model="master"><br/>
17617
+ <input id="checkSlave" type="checkbox" ng-checked="master">
17618
+ </file>
17619
+ <file name="protractor.js" type="protractor">
17620
+ it('should check both checkBoxes', function() {
17621
+ expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();
17622
+ element(by.model('master')).click();
17623
+ expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();
17624
+ });
17625
+ </file>
17626
+ </example>
17627
+ *
17628
+ * @element INPUT
17629
+ * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,
17630
+ * then special attribute "checked" will be set on the element
17631
+ */
17632
+
17633
+
17634
+/**
17635
+ * @ngdoc directive
17636
+ * @name ngReadonly
17637
+ * @restrict A
17638
+ * @priority 100
17639
+ *
17640
+ * @description
17641
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
17642
+ * such as readonly. (Their presence means true and their absence means false.)
17643
+ * If we put an Angular interpolation expression into such an attribute then the
17644
+ * binding information would be lost when the browser removes the attribute.
17645
+ * The `ngReadonly` directive solves this problem for the `readonly` attribute.
17646
+ * This complementary directive is not removed by the browser and so provides
17647
+ * a permanent reliable place to store the binding information.
17648
+ * @example
17649
+ <example>
17650
+ <file name="index.html">
17651
+ Check me to make text readonly: <input type="checkbox" ng-model="checked"><br/>
17652
+ <input type="text" ng-readonly="checked" value="I'm Angular"/>
17653
+ </file>
17654
+ <file name="protractor.js" type="protractor">
17655
+ it('should toggle readonly attr', function() {
17656
+ expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy();
17657
+ element(by.model('checked')).click();
17658
+ expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy();
17659
+ });
17660
+ </file>
17661
+ </example>
17662
+ *
17663
+ * @element INPUT
17664
+ * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,
17665
+ * then special attribute "readonly" will be set on the element
17666
+ */
17667
+
17668
+
17669
+/**
17670
+ * @ngdoc directive
17671
+ * @name ngSelected
17672
+ * @restrict A
17673
+ * @priority 100
17674
+ *
17675
+ * @description
17676
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
17677
+ * such as selected. (Their presence means true and their absence means false.)
17678
+ * If we put an Angular interpolation expression into such an attribute then the
17679
+ * binding information would be lost when the browser removes the attribute.
17680
+ * The `ngSelected` directive solves this problem for the `selected` attribute.
17681
+ * This complementary directive is not removed by the browser and so provides
17682
+ * a permanent reliable place to store the binding information.
17683
+ *
17684
+ * @example
17685
+ <example>
17686
+ <file name="index.html">
17687
+ Check me to select: <input type="checkbox" ng-model="selected"><br/>
17688
+ <select>
17689
+ <option>Hello!</option>
17690
+ <option id="greet" ng-selected="selected">Greetings!</option>
17691
+ </select>
17692
+ </file>
17693
+ <file name="protractor.js" type="protractor">
17694
+ it('should select Greetings!', function() {
17695
+ expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();
17696
+ element(by.model('selected')).click();
17697
+ expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();
17698
+ });
17699
+ </file>
17700
+ </example>
17701
+ *
17702
+ * @element OPTION
17703
+ * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,
17704
+ * then special attribute "selected" will be set on the element
17705
+ */
17706
+
17707
+/**
17708
+ * @ngdoc directive
17709
+ * @name ngOpen
17710
+ * @restrict A
17711
+ * @priority 100
17712
+ *
17713
+ * @description
17714
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
17715
+ * such as open. (Their presence means true and their absence means false.)
17716
+ * If we put an Angular interpolation expression into such an attribute then the
17717
+ * binding information would be lost when the browser removes the attribute.
17718
+ * The `ngOpen` directive solves this problem for the `open` attribute.
17719
+ * This complementary directive is not removed by the browser and so provides
17720
+ * a permanent reliable place to store the binding information.
17721
+ * @example
17722
+ <example>
17723
+ <file name="index.html">
17724
+ Check me check multiple: <input type="checkbox" ng-model="open"><br/>
17725
+ <details id="details" ng-open="open">
17726
+ <summary>Show/Hide me</summary>
17727
+ </details>
17728
+ </file>
17729
+ <file name="protractor.js" type="protractor">
17730
+ it('should toggle open', function() {
17731
+ expect(element(by.id('details')).getAttribute('open')).toBeFalsy();
17732
+ element(by.model('open')).click();
17733
+ expect(element(by.id('details')).getAttribute('open')).toBeTruthy();
17734
+ });
17735
+ </file>
17736
+ </example>
17737
+ *
17738
+ * @element DETAILS
17739
+ * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,
17740
+ * then special attribute "open" will be set on the element
17741
+ */
17742
+
17743
+var ngAttributeAliasDirectives = {};
17744
+
17745
+
17746
+// boolean attrs are evaluated
17747
+forEach(BOOLEAN_ATTR, function(propName, attrName) {
17748
+ // binding to multiple is not supported
17749
+ if (propName == "multiple") return;
17750
+
17751
+ var normalized = directiveNormalize('ng-' + attrName);
17752
+ ngAttributeAliasDirectives[normalized] = function() {
17753
+ return {
17754
+ restrict: 'A',
17755
+ priority: 100,
17756
+ link: function(scope, element, attr) {
17757
+ scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
17758
+ attr.$set(attrName, !!value);
17759
+ });
17760
+ }
17761
+ };
17762
+ };
17763
+});
17764
+
17765
+// aliased input attrs are evaluated
17766
+forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) {
17767
+ ngAttributeAliasDirectives[ngAttr] = function() {
17768
+ return {
17769
+ priority: 100,
17770
+ link: function(scope, element, attr) {
17771
+ //special case ngPattern when a literal regular expression value
17772
+ //is used as the expression (this way we don't have to watch anything).
17773
+ if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") {
17774
+ var match = attr.ngPattern.match(REGEX_STRING_REGEXP);
17775
+ if (match) {
17776
+ attr.$set("ngPattern", new RegExp(match[1], match[2]));
17777
+ return;
17778
+ }
17779
+ }
17780
+
17781
+ scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) {
17782
+ attr.$set(ngAttr, value);
17783
+ });
17784
+ }
17785
+ };
17786
+ };
17787
+});
17788
+
17789
+// ng-src, ng-srcset, ng-href are interpolated
17790
+forEach(['src', 'srcset', 'href'], function(attrName) {
17791
+ var normalized = directiveNormalize('ng-' + attrName);
17792
+ ngAttributeAliasDirectives[normalized] = function() {
17793
+ return {
17794
+ priority: 99, // it needs to run after the attributes are interpolated
17795
+ link: function(scope, element, attr) {
17796
+ var propName = attrName,
17797
+ name = attrName;
17798
+
17799
+ if (attrName === 'href' &&
17800
+ toString.call(element.prop('href')) === '[object SVGAnimatedString]') {
17801
+ name = 'xlinkHref';
17802
+ attr.$attr[name] = 'xlink:href';
17803
+ propName = null;
17804
+ }
17805
+
17806
+ attr.$observe(normalized, function(value) {
17807
+ if (!value) {
17808
+ if (attrName === 'href') {
17809
+ attr.$set(name, null);
17810
+ }
17811
+ return;
17812
+ }
17813
+
17814
+ attr.$set(name, value);
17815
+
17816
+ // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
17817
+ // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need
17818
+ // to set the property as well to achieve the desired effect.
17819
+ // we use attr[attrName] value since $set can sanitize the url.
17820
+ if (msie && propName) element.prop(propName, attr[name]);
17821
+ });
17822
+ }
17823
+ };
17824
+ };
17825
+});
17826
+
17827
+/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true
17828
+ */
17829
+var nullFormCtrl = {
17830
+ $addControl: noop,
17831
+ $$renameControl: nullFormRenameControl,
17832
+ $removeControl: noop,
17833
+ $setValidity: noop,
17834
+ $setDirty: noop,
17835
+ $setPristine: noop,
17836
+ $setSubmitted: noop
17837
+},
17838
+SUBMITTED_CLASS = 'ng-submitted';
17839
+
17840
+function nullFormRenameControl(control, name) {
17841
+ control.$name = name;
17842
+}
17843
+
17844
+/**
17845
+ * @ngdoc type
17846
+ * @name form.FormController
17847
+ *
17848
+ * @property {boolean} $pristine True if user has not interacted with the form yet.
17849
+ * @property {boolean} $dirty True if user has already interacted with the form.
17850
+ * @property {boolean} $valid True if all of the containing forms and controls are valid.
17851
+ * @property {boolean} $invalid True if at least one containing control or form is invalid.
17852
+ * @property {boolean} $submitted True if user has submitted the form even if its invalid.
17853
+ *
17854
+ * @property {Object} $error Is an object hash, containing references to controls or
17855
+ * forms with failing validators, where:
17856
+ *
17857
+ * - keys are validation tokens (error names),
17858
+ * - values are arrays of controls or forms that have a failing validator for given error name.
17859
+ *
17860
+ * Built-in validation tokens:
17861
+ *
17862
+ * - `email`
17863
+ * - `max`
17864
+ * - `maxlength`
17865
+ * - `min`
17866
+ * - `minlength`
17867
+ * - `number`
17868
+ * - `pattern`
17869
+ * - `required`
17870
+ * - `url`
17871
+ *
17872
+ * @description
17873
+ * `FormController` keeps track of all its controls and nested forms as well as the state of them,
17874
+ * such as being valid/invalid or dirty/pristine.
17875
+ *
17876
+ * Each {@link ng.directive:form form} directive creates an instance
17877
+ * of `FormController`.
17878
+ *
17879
+ */
17880
+//asks for $scope to fool the BC controller module
17881
+FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate'];
17882
+function FormController(element, attrs, $scope, $animate, $interpolate) {
17883
+ var form = this,
17884
+ controls = [];
17885
+
17886
+ var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl;
17887
+
17888
+ // init state
17889
+ form.$error = {};
17890
+ form.$$success = {};
17891
+ form.$pending = undefined;
17892
+ form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope);
17893
+ form.$dirty = false;
17894
+ form.$pristine = true;
17895
+ form.$valid = true;
17896
+ form.$invalid = false;
17897
+ form.$submitted = false;
17898
+
17899
+ parentForm.$addControl(form);
17900
+
17901
+ /**
17902
+ * @ngdoc method
17903
+ * @name form.FormController#$rollbackViewValue
17904
+ *
17905
+ * @description
17906
+ * Rollback all form controls pending updates to the `$modelValue`.
17907
+ *
17908
+ * Updates may be pending by a debounced event or because the input is waiting for a some future
17909
+ * event defined in `ng-model-options`. This method is typically needed by the reset button of
17910
+ * a form that uses `ng-model-options` to pend updates.
17911
+ */
17912
+ form.$rollbackViewValue = function() {
17913
+ forEach(controls, function(control) {
17914
+ control.$rollbackViewValue();
17915
+ });
17916
+ };
17917
+
17918
+ /**
17919
+ * @ngdoc method
17920
+ * @name form.FormController#$commitViewValue
17921
+ *
17922
+ * @description
17923
+ * Commit all form controls pending updates to the `$modelValue`.
17924
+ *
17925
+ * Updates may be pending by a debounced event or because the input is waiting for a some future
17926
+ * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`
17927
+ * usually handles calling this in response to input events.
17928
+ */
17929
+ form.$commitViewValue = function() {
17930
+ forEach(controls, function(control) {
17931
+ control.$commitViewValue();
17932
+ });
17933
+ };
17934
+
17935
+ /**
17936
+ * @ngdoc method
17937
+ * @name form.FormController#$addControl
17938
+ *
17939
+ * @description
17940
+ * Register a control with the form.
17941
+ *
17942
+ * Input elements using ngModelController do this automatically when they are linked.
17943
+ */
17944
+ form.$addControl = function(control) {
17945
+ // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
17946
+ // and not added to the scope. Now we throw an error.
17947
+ assertNotHasOwnProperty(control.$name, 'input');
17948
+ controls.push(control);
17949
+
17950
+ if (control.$name) {
17951
+ form[control.$name] = control;
17952
+ }
17953
+ };
17954
+
17955
+ // Private API: rename a form control
17956
+ form.$$renameControl = function(control, newName) {
17957
+ var oldName = control.$name;
17958
+
17959
+ if (form[oldName] === control) {
17960
+ delete form[oldName];
17961
+ }
17962
+ form[newName] = control;
17963
+ control.$name = newName;
17964
+ };
17965
+
17966
+ /**
17967
+ * @ngdoc method
17968
+ * @name form.FormController#$removeControl
17969
+ *
17970
+ * @description
17971
+ * Deregister a control from the form.
17972
+ *
17973
+ * Input elements using ngModelController do this automatically when they are destroyed.
17974
+ */
17975
+ form.$removeControl = function(control) {
17976
+ if (control.$name && form[control.$name] === control) {
17977
+ delete form[control.$name];
17978
+ }
17979
+ forEach(form.$pending, function(value, name) {
17980
+ form.$setValidity(name, null, control);
17981
+ });
17982
+ forEach(form.$error, function(value, name) {
17983
+ form.$setValidity(name, null, control);
17984
+ });
17985
+
17986
+ arrayRemove(controls, control);
17987
+ };
17988
+
17989
+
17990
+ /**
17991
+ * @ngdoc method
17992
+ * @name form.FormController#$setValidity
17993
+ *
17994
+ * @description
17995
+ * Sets the validity of a form control.
17996
+ *
17997
+ * This method will also propagate to parent forms.
17998
+ */
17999
+ addSetValidityMethod({
18000
+ ctrl: this,
18001
+ $element: element,
18002
+ set: function(object, property, control) {
18003
+ var list = object[property];
18004
+ if (!list) {
18005
+ object[property] = [control];
18006
+ } else {
18007
+ var index = list.indexOf(control);
18008
+ if (index === -1) {
18009
+ list.push(control);
18010
+ }
18011
+ }
18012
+ },
18013
+ unset: function(object, property, control) {
18014
+ var list = object[property];
18015
+ if (!list) {
18016
+ return;
18017
+ }
18018
+ arrayRemove(list, control);
18019
+ if (list.length === 0) {
18020
+ delete object[property];
18021
+ }
18022
+ },
18023
+ parentForm: parentForm,
18024
+ $animate: $animate
18025
+ });
18026
+
18027
+ /**
18028
+ * @ngdoc method
18029
+ * @name form.FormController#$setDirty
18030
+ *
18031
+ * @description
18032
+ * Sets the form to a dirty state.
18033
+ *
18034
+ * This method can be called to add the 'ng-dirty' class and set the form to a dirty
18035
+ * state (ng-dirty class). This method will also propagate to parent forms.
18036
+ */
18037
+ form.$setDirty = function() {
18038
+ $animate.removeClass(element, PRISTINE_CLASS);
18039
+ $animate.addClass(element, DIRTY_CLASS);
18040
+ form.$dirty = true;
18041
+ form.$pristine = false;
18042
+ parentForm.$setDirty();
18043
+ };
18044
+
18045
+ /**
18046
+ * @ngdoc method
18047
+ * @name form.FormController#$setPristine
18048
+ *
18049
+ * @description
18050
+ * Sets the form to its pristine state.
18051
+ *
18052
+ * This method can be called to remove the 'ng-dirty' class and set the form to its pristine
18053
+ * state (ng-pristine class). This method will also propagate to all the controls contained
18054
+ * in this form.
18055
+ *
18056
+ * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after
18057
+ * saving or resetting it.
18058
+ */
18059
+ form.$setPristine = function () {
18060
+ $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);
18061
+ form.$dirty = false;
18062
+ form.$pristine = true;
18063
+ form.$submitted = false;
18064
+ forEach(controls, function(control) {
18065
+ control.$setPristine();
18066
+ });
18067
+ };
18068
+
18069
+ /**
18070
+ * @ngdoc method
18071
+ * @name form.FormController#$setUntouched
18072
+ *
18073
+ * @description
18074
+ * Sets the form to its untouched state.
18075
+ *
18076
+ * This method can be called to remove the 'ng-touched' class and set the form controls to their
18077
+ * untouched state (ng-untouched class).
18078
+ *
18079
+ * Setting a form controls back to their untouched state is often useful when setting the form
18080
+ * back to its pristine state.
18081
+ */
18082
+ form.$setUntouched = function () {
18083
+ forEach(controls, function(control) {
18084
+ control.$setUntouched();
18085
+ });
18086
+ };
18087
+
18088
+ /**
18089
+ * @ngdoc method
18090
+ * @name form.FormController#$setSubmitted
18091
+ *
18092
+ * @description
18093
+ * Sets the form to its submitted state.
18094
+ */
18095
+ form.$setSubmitted = function () {
18096
+ $animate.addClass(element, SUBMITTED_CLASS);
18097
+ form.$submitted = true;
18098
+ parentForm.$setSubmitted();
18099
+ };
18100
+}
18101
+
18102
+/**
18103
+ * @ngdoc directive
18104
+ * @name ngForm
18105
+ * @restrict EAC
18106
+ *
18107
+ * @description
18108
+ * Nestable alias of {@link ng.directive:form `form`} directive. HTML
18109
+ * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a
18110
+ * sub-group of controls needs to be determined.
18111
+ *
18112
+ * Note: the purpose of `ngForm` is to group controls,
18113
+ * but not to be a replacement for the `<form>` tag with all of its capabilities
18114
+ * (e.g. posting to the server, ...).
18115
+ *
18116
+ * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into
18117
+ * related scope, under this name.
18118
+ *
18119
+ */
18120
+
18121
+ /**
18122
+ * @ngdoc directive
18123
+ * @name form
18124
+ * @restrict E
18125
+ *
18126
+ * @description
18127
+ * Directive that instantiates
18128
+ * {@link form.FormController FormController}.
18129
+ *
18130
+ * If the `name` attribute is specified, the form controller is published onto the current scope under
18131
+ * this name.
18132
+ *
18133
+ * # Alias: {@link ng.directive:ngForm `ngForm`}
18134
+ *
18135
+ * In Angular forms can be nested. This means that the outer form is valid when all of the child
18136
+ * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so
18137
+ * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to
18138
+ * `<form>` but can be nested. This allows you to have nested forms, which is very useful when
18139
+ * using Angular validation directives in forms that are dynamically generated using the
18140
+ * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name`
18141
+ * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an
18142
+ * `ngForm` directive and nest these in an outer `form` element.
18143
+ *
18144
+ *
18145
+ * # CSS classes
18146
+ * - `ng-valid` is set if the form is valid.
18147
+ * - `ng-invalid` is set if the form is invalid.
18148
+ * - `ng-pristine` is set if the form is pristine.
18149
+ * - `ng-dirty` is set if the form is dirty.
18150
+ * - `ng-submitted` is set if the form was submitted.
18151
+ *
18152
+ * Keep in mind that ngAnimate can detect each of these classes when added and removed.
18153
+ *
18154
+ *
18155
+ * # Submitting a form and preventing the default action
18156
+ *
18157
+ * Since the role of forms in client-side Angular applications is different than in classical
18158
+ * roundtrip apps, it is desirable for the browser not to translate the form submission into a full
18159
+ * page reload that sends the data to the server. Instead some javascript logic should be triggered
18160
+ * to handle the form submission in an application-specific way.
18161
+ *
18162
+ * For this reason, Angular prevents the default action (form submission to the server) unless the
18163
+ * `<form>` element has an `action` attribute specified.
18164
+ *
18165
+ * You can use one of the following two ways to specify what javascript method should be called when
18166
+ * a form is submitted:
18167
+ *
18168
+ * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element
18169
+ * - {@link ng.directive:ngClick ngClick} directive on the first
18170
+ * button or input field of type submit (input[type=submit])
18171
+ *
18172
+ * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}
18173
+ * or {@link ng.directive:ngClick ngClick} directives.
18174
+ * This is because of the following form submission rules in the HTML specification:
18175
+ *
18176
+ * - If a form has only one input field then hitting enter in this field triggers form submit
18177
+ * (`ngSubmit`)
18178
+ * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter
18179
+ * doesn't trigger submit
18180
+ * - if a form has one or more input fields and one or more buttons or input[type=submit] then
18181
+ * hitting enter in any of the input fields will trigger the click handler on the *first* button or
18182
+ * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)
18183
+ *
18184
+ * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is
18185
+ * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`
18186
+ * to have access to the updated model.
18187
+ *
18188
+ * ## Animation Hooks
18189
+ *
18190
+ * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.
18191
+ * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any
18192
+ * other validations that are performed within the form. Animations in ngForm are similar to how
18193
+ * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well
18194
+ * as JS animations.
18195
+ *
18196
+ * The following example shows a simple way to utilize CSS transitions to style a form element
18197
+ * that has been rendered as invalid after it has been validated:
18198
+ *
18199
+ * <pre>
18200
+ * //be sure to include ngAnimate as a module to hook into more
18201
+ * //advanced animations
18202
+ * .my-form {
18203
+ * transition:0.5s linear all;
18204
+ * background: white;
18205
+ * }
18206
+ * .my-form.ng-invalid {
18207
+ * background: red;
18208
+ * color:white;
18209
+ * }
18210
+ * </pre>
18211
+ *
18212
+ * @example
18213
+ <example deps="angular-animate.js" animations="true" fixBase="true" module="formExample">
18214
+ <file name="index.html">
18215
+ <script>
18216
+ angular.module('formExample', [])
18217
+ .controller('FormController', ['$scope', function($scope) {
18218
+ $scope.userType = 'guest';
18219
+ }]);
18220
+ </script>
18221
+ <style>
18222
+ .my-form {
18223
+ -webkit-transition:all linear 0.5s;
18224
+ transition:all linear 0.5s;
18225
+ background: transparent;
18226
+ }
18227
+ .my-form.ng-invalid {
18228
+ background: red;
18229
+ }
18230
+ </style>
18231
+ <form name="myForm" ng-controller="FormController" class="my-form">
18232
+ userType: <input name="input" ng-model="userType" required>
18233
+ <span class="error" ng-show="myForm.input.$error.required">Required!</span><br>
18234
+ <tt>userType = {{userType}}</tt><br>
18235
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>
18236
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>
18237
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
18238
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
18239
+ </form>
18240
+ </file>
18241
+ <file name="protractor.js" type="protractor">
18242
+ it('should initialize to model', function() {
18243
+ var userType = element(by.binding('userType'));
18244
+ var valid = element(by.binding('myForm.input.$valid'));
18245
+
18246
+ expect(userType.getText()).toContain('guest');
18247
+ expect(valid.getText()).toContain('true');
18248
+ });
18249
+
18250
+ it('should be invalid if empty', function() {
18251
+ var userType = element(by.binding('userType'));
18252
+ var valid = element(by.binding('myForm.input.$valid'));
18253
+ var userInput = element(by.model('userType'));
18254
+
18255
+ userInput.clear();
18256
+ userInput.sendKeys('');
18257
+
18258
+ expect(userType.getText()).toEqual('userType =');
18259
+ expect(valid.getText()).toContain('false');
18260
+ });
18261
+ </file>
18262
+ </example>
18263
+ *
18264
+ * @param {string=} name Name of the form. If specified, the form controller will be published into
18265
+ * related scope, under this name.
18266
+ */
18267
+var formDirectiveFactory = function(isNgForm) {
18268
+ return ['$timeout', function($timeout) {
18269
+ var formDirective = {
18270
+ name: 'form',
18271
+ restrict: isNgForm ? 'EAC' : 'E',
18272
+ controller: FormController,
18273
+ compile: function ngFormCompile(formElement) {
18274
+ // Setup initial state of the control
18275
+ formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);
18276
+
18277
+ return {
18278
+ pre: function ngFormPreLink(scope, formElement, attr, controller) {
18279
+ // if `action` attr is not present on the form, prevent the default action (submission)
18280
+ if (!('action' in attr)) {
18281
+ // we can't use jq events because if a form is destroyed during submission the default
18282
+ // action is not prevented. see #1238
18283
+ //
18284
+ // IE 9 is not affected because it doesn't fire a submit event and try to do a full
18285
+ // page reload if the form was destroyed by submission of the form via a click handler
18286
+ // on a button in the form. Looks like an IE9 specific bug.
18287
+ var handleFormSubmission = function(event) {
18288
+ scope.$apply(function() {
18289
+ controller.$commitViewValue();
18290
+ controller.$setSubmitted();
18291
+ });
18292
+
18293
+ event.preventDefault
18294
+ ? event.preventDefault()
18295
+ : event.returnValue = false; // IE
18296
+ };
18297
+
18298
+ addEventListenerFn(formElement[0], 'submit', handleFormSubmission);
18299
+
18300
+ // unregister the preventDefault listener so that we don't not leak memory but in a
18301
+ // way that will achieve the prevention of the default action.
18302
+ formElement.on('$destroy', function() {
18303
+ $timeout(function() {
18304
+ removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);
18305
+ }, 0, false);
18306
+ });
18307
+ }
18308
+
18309
+ var parentFormCtrl = controller.$$parentForm,
18310
+ alias = controller.$name;
18311
+
18312
+ if (alias) {
18313
+ setter(scope, alias, controller, alias);
18314
+ attr.$observe(attr.name ? 'name' : 'ngForm', function(newValue) {
18315
+ if (alias === newValue) return;
18316
+ setter(scope, alias, undefined, alias);
18317
+ alias = newValue;
18318
+ setter(scope, alias, controller, alias);
18319
+ parentFormCtrl.$$renameControl(controller, alias);
18320
+ });
18321
+ }
18322
+ formElement.on('$destroy', function() {
18323
+ parentFormCtrl.$removeControl(controller);
18324
+ if (alias) {
18325
+ setter(scope, alias, undefined, alias);
18326
+ }
18327
+ extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
18328
+ });
18329
+ }
18330
+ };
18331
+ }
18332
+ };
18333
+
18334
+ return formDirective;
18335
+ }];
18336
+};
18337
+
18338
+var formDirective = formDirectiveFactory();
18339
+var ngFormDirective = formDirectiveFactory(true);
18340
+
18341
+/* global VALID_CLASS: true,
18342
+ INVALID_CLASS: true,
18343
+ PRISTINE_CLASS: true,
18344
+ DIRTY_CLASS: true,
18345
+ UNTOUCHED_CLASS: true,
18346
+ TOUCHED_CLASS: true,
18347
+*/
18348
+
18349
+// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231
18350
+var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/;
18351
+var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
18352
+var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
18353
+var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
18354
+var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/;
18355
+var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;
18356
+var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/;
18357
+var MONTH_REGEXP = /^(\d{4})-(\d\d)$/;
18358
+var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;
18359
+var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/;
18360
+
18361
+var $ngModelMinErr = new minErr('ngModel');
18362
+
18363
+var inputType = {
18364
+
18365
+ /**
18366
+ * @ngdoc input
18367
+ * @name input[text]
18368
+ *
18369
+ * @description
18370
+ * Standard HTML text input with angular data binding, inherited by most of the `input` elements.
18371
+ *
18372
+ * *NOTE* Not every feature offered is available for all input types.
18373
+ *
18374
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18375
+ * @param {string=} name Property name of the form under which the control is published.
18376
+ * @param {string=} required Adds `required` validation error key if the value is not entered.
18377
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18378
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18379
+ * `required` when you want to data-bind to the `required` attribute.
18380
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
18381
+ * minlength.
18382
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
18383
+ * maxlength.
18384
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
18385
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
18386
+ * patterns defined as scope expressions.
18387
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18388
+ * interaction with the input element.
18389
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
18390
+ * This parameter is ignored for input[type=password] controls, which will never trim the
18391
+ * input.
18392
+ *
18393
+ * @example
18394
+ <example name="text-input-directive" module="textInputExample">
18395
+ <file name="index.html">
18396
+ <script>
18397
+ angular.module('textInputExample', [])
18398
+ .controller('ExampleController', ['$scope', function($scope) {
18399
+ $scope.text = 'guest';
18400
+ $scope.word = /^\s*\w*\s*$/;
18401
+ }]);
18402
+ </script>
18403
+ <form name="myForm" ng-controller="ExampleController">
18404
+ Single word: <input type="text" name="input" ng-model="text"
18405
+ ng-pattern="word" required ng-trim="false">
18406
+ <span class="error" ng-show="myForm.input.$error.required">
18407
+ Required!</span>
18408
+ <span class="error" ng-show="myForm.input.$error.pattern">
18409
+ Single word only!</span>
18410
+
18411
+ <tt>text = {{text}}</tt><br/>
18412
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18413
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18414
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
18415
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
18416
+ </form>
18417
+ </file>
18418
+ <file name="protractor.js" type="protractor">
18419
+ var text = element(by.binding('text'));
18420
+ var valid = element(by.binding('myForm.input.$valid'));
18421
+ var input = element(by.model('text'));
18422
+
18423
+ it('should initialize to model', function() {
18424
+ expect(text.getText()).toContain('guest');
18425
+ expect(valid.getText()).toContain('true');
18426
+ });
18427
+
18428
+ it('should be invalid if empty', function() {
18429
+ input.clear();
18430
+ input.sendKeys('');
18431
+
18432
+ expect(text.getText()).toEqual('text =');
18433
+ expect(valid.getText()).toContain('false');
18434
+ });
18435
+
18436
+ it('should be invalid if multi word', function() {
18437
+ input.clear();
18438
+ input.sendKeys('hello world');
18439
+
18440
+ expect(valid.getText()).toContain('false');
18441
+ });
18442
+ </file>
18443
+ </example>
18444
+ */
18445
+ 'text': textInputType,
18446
+
18447
+ /**
18448
+ * @ngdoc input
18449
+ * @name input[date]
18450
+ *
18451
+ * @description
18452
+ * Input with date validation and transformation. In browsers that do not yet support
18453
+ * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601
18454
+ * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many
18455
+ * modern browsers do not yet support this input type, it is important to provide cues to users on the
18456
+ * expected input format via a placeholder or label. The model must always be a Date object.
18457
+ *
18458
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
18459
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
18460
+ *
18461
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18462
+ * @param {string=} name Property name of the form under which the control is published.
18463
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
18464
+ * valid ISO date string (yyyy-MM-dd).
18465
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be
18466
+ * a valid ISO date string (yyyy-MM-dd).
18467
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
18468
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18469
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18470
+ * `required` when you want to data-bind to the `required` attribute.
18471
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18472
+ * interaction with the input element.
18473
+ *
18474
+ * @example
18475
+ <example name="date-input-directive" module="dateInputExample">
18476
+ <file name="index.html">
18477
+ <script>
18478
+ angular.module('dateInputExample', [])
18479
+ .controller('DateController', ['$scope', function($scope) {
18480
+ $scope.value = new Date(2013, 9, 22);
18481
+ }]);
18482
+ </script>
18483
+ <form name="myForm" ng-controller="DateController as dateCtrl">
18484
+ Pick a date in 2013:
18485
+ <input type="date" id="exampleInput" name="input" ng-model="value"
18486
+ placeholder="yyyy-MM-dd" min="2013-01-01" max="2013-12-31" required />
18487
+ <span class="error" ng-show="myForm.input.$error.required">
18488
+ Required!</span>
18489
+ <span class="error" ng-show="myForm.input.$error.date">
18490
+ Not a valid date!</span>
18491
+ <tt>value = {{value | date: "yyyy-MM-dd"}}</tt><br/>
18492
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18493
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18494
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
18495
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
18496
+ </form>
18497
+ </file>
18498
+ <file name="protractor.js" type="protractor">
18499
+ var value = element(by.binding('value | date: "yyyy-MM-dd"'));
18500
+ var valid = element(by.binding('myForm.input.$valid'));
18501
+ var input = element(by.model('value'));
18502
+
18503
+ // currently protractor/webdriver does not support
18504
+ // sending keys to all known HTML5 input controls
18505
+ // for various browsers (see https://github.com/angular/protractor/issues/562).
18506
+ function setInput(val) {
18507
+ // set the value of the element and force validation.
18508
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
18509
+ "ipt.value = '" + val + "';" +
18510
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
18511
+ browser.executeScript(scr);
18512
+ }
18513
+
18514
+ it('should initialize to model', function() {
18515
+ expect(value.getText()).toContain('2013-10-22');
18516
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
18517
+ });
18518
+
18519
+ it('should be invalid if empty', function() {
18520
+ setInput('');
18521
+ expect(value.getText()).toEqual('value =');
18522
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18523
+ });
18524
+
18525
+ it('should be invalid if over max', function() {
18526
+ setInput('2015-01-01');
18527
+ expect(value.getText()).toContain('');
18528
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18529
+ });
18530
+ </file>
18531
+ </example>
18532
+ */
18533
+ 'date': createDateInputType('date', DATE_REGEXP,
18534
+ createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),
18535
+ 'yyyy-MM-dd'),
18536
+
18537
+ /**
18538
+ * @ngdoc input
18539
+ * @name input[dateTimeLocal]
18540
+ *
18541
+ * @description
18542
+ * Input with datetime validation and transformation. In browsers that do not yet support
18543
+ * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
18544
+ * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. The model must be a Date object.
18545
+ *
18546
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
18547
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
18548
+ *
18549
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18550
+ * @param {string=} name Property name of the form under which the control is published.
18551
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
18552
+ * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss).
18553
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be
18554
+ * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss).
18555
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
18556
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18557
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18558
+ * `required` when you want to data-bind to the `required` attribute.
18559
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18560
+ * interaction with the input element.
18561
+ *
18562
+ * @example
18563
+ <example name="datetimelocal-input-directive" module="dateExample">
18564
+ <file name="index.html">
18565
+ <script>
18566
+ angular.module('dateExample', [])
18567
+ .controller('DateController', ['$scope', function($scope) {
18568
+ $scope.value = new Date(2010, 11, 28, 14, 57);
18569
+ }]);
18570
+ </script>
18571
+ <form name="myForm" ng-controller="DateController as dateCtrl">
18572
+ Pick a date between in 2013:
18573
+ <input type="datetime-local" id="exampleInput" name="input" ng-model="value"
18574
+ placeholder="yyyy-MM-ddTHH:mm:ss" min="2001-01-01T00:00:00" max="2013-12-31T00:00:00" required />
18575
+ <span class="error" ng-show="myForm.input.$error.required">
18576
+ Required!</span>
18577
+ <span class="error" ng-show="myForm.input.$error.datetimelocal">
18578
+ Not a valid date!</span>
18579
+ <tt>value = {{value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/>
18580
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18581
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18582
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
18583
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
18584
+ </form>
18585
+ </file>
18586
+ <file name="protractor.js" type="protractor">
18587
+ var value = element(by.binding('value | date: "yyyy-MM-ddTHH:mm:ss"'));
18588
+ var valid = element(by.binding('myForm.input.$valid'));
18589
+ var input = element(by.model('value'));
18590
+
18591
+ // currently protractor/webdriver does not support
18592
+ // sending keys to all known HTML5 input controls
18593
+ // for various browsers (https://github.com/angular/protractor/issues/562).
18594
+ function setInput(val) {
18595
+ // set the value of the element and force validation.
18596
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
18597
+ "ipt.value = '" + val + "';" +
18598
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
18599
+ browser.executeScript(scr);
18600
+ }
18601
+
18602
+ it('should initialize to model', function() {
18603
+ expect(value.getText()).toContain('2010-12-28T14:57:00');
18604
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
18605
+ });
18606
+
18607
+ it('should be invalid if empty', function() {
18608
+ setInput('');
18609
+ expect(value.getText()).toEqual('value =');
18610
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18611
+ });
18612
+
18613
+ it('should be invalid if over max', function() {
18614
+ setInput('2015-01-01T23:59:00');
18615
+ expect(value.getText()).toContain('');
18616
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18617
+ });
18618
+ </file>
18619
+ </example>
18620
+ */
18621
+ 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,
18622
+ createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']),
18623
+ 'yyyy-MM-ddTHH:mm:ss.sss'),
18624
+
18625
+ /**
18626
+ * @ngdoc input
18627
+ * @name input[time]
18628
+ *
18629
+ * @description
18630
+ * Input with time validation and transformation. In browsers that do not yet support
18631
+ * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
18632
+ * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a
18633
+ * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`.
18634
+ *
18635
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
18636
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
18637
+ *
18638
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18639
+ * @param {string=} name Property name of the form under which the control is published.
18640
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
18641
+ * valid ISO time format (HH:mm:ss).
18642
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a
18643
+ * valid ISO time format (HH:mm:ss).
18644
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
18645
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18646
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18647
+ * `required` when you want to data-bind to the `required` attribute.
18648
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18649
+ * interaction with the input element.
18650
+ *
18651
+ * @example
18652
+ <example name="time-input-directive" module="timeExample">
18653
+ <file name="index.html">
18654
+ <script>
18655
+ angular.module('timeExample', [])
18656
+ .controller('DateController', ['$scope', function($scope) {
18657
+ $scope.value = new Date(1970, 0, 1, 14, 57, 0);
18658
+ }]);
18659
+ </script>
18660
+ <form name="myForm" ng-controller="DateController as dateCtrl">
18661
+ Pick a between 8am and 5pm:
18662
+ <input type="time" id="exampleInput" name="input" ng-model="value"
18663
+ placeholder="HH:mm:ss" min="08:00:00" max="17:00:00" required />
18664
+ <span class="error" ng-show="myForm.input.$error.required">
18665
+ Required!</span>
18666
+ <span class="error" ng-show="myForm.input.$error.time">
18667
+ Not a valid date!</span>
18668
+ <tt>value = {{value | date: "HH:mm:ss"}}</tt><br/>
18669
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18670
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18671
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
18672
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
18673
+ </form>
18674
+ </file>
18675
+ <file name="protractor.js" type="protractor">
18676
+ var value = element(by.binding('value | date: "HH:mm:ss"'));
18677
+ var valid = element(by.binding('myForm.input.$valid'));
18678
+ var input = element(by.model('value'));
18679
+
18680
+ // currently protractor/webdriver does not support
18681
+ // sending keys to all known HTML5 input controls
18682
+ // for various browsers (https://github.com/angular/protractor/issues/562).
18683
+ function setInput(val) {
18684
+ // set the value of the element and force validation.
18685
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
18686
+ "ipt.value = '" + val + "';" +
18687
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
18688
+ browser.executeScript(scr);
18689
+ }
18690
+
18691
+ it('should initialize to model', function() {
18692
+ expect(value.getText()).toContain('14:57:00');
18693
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
18694
+ });
18695
+
18696
+ it('should be invalid if empty', function() {
18697
+ setInput('');
18698
+ expect(value.getText()).toEqual('value =');
18699
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18700
+ });
18701
+
18702
+ it('should be invalid if over max', function() {
18703
+ setInput('23:59:00');
18704
+ expect(value.getText()).toContain('');
18705
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18706
+ });
18707
+ </file>
18708
+ </example>
18709
+ */
18710
+ 'time': createDateInputType('time', TIME_REGEXP,
18711
+ createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']),
18712
+ 'HH:mm:ss.sss'),
18713
+
18714
+ /**
18715
+ * @ngdoc input
18716
+ * @name input[week]
18717
+ *
18718
+ * @description
18719
+ * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support
18720
+ * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
18721
+ * week format (yyyy-W##), for example: `2013-W02`. The model must always be a Date object.
18722
+ *
18723
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
18724
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
18725
+ *
18726
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18727
+ * @param {string=} name Property name of the form under which the control is published.
18728
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
18729
+ * valid ISO week format (yyyy-W##).
18730
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be
18731
+ * a valid ISO week format (yyyy-W##).
18732
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
18733
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18734
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18735
+ * `required` when you want to data-bind to the `required` attribute.
18736
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18737
+ * interaction with the input element.
18738
+ *
18739
+ * @example
18740
+ <example name="week-input-directive" module="weekExample">
18741
+ <file name="index.html">
18742
+ <script>
18743
+ angular.module('weekExample', [])
18744
+ .controller('DateController', ['$scope', function($scope) {
18745
+ $scope.value = new Date(2013, 0, 3);
18746
+ }]);
18747
+ </script>
18748
+ <form name="myForm" ng-controller="DateController as dateCtrl">
18749
+ Pick a date between in 2013:
18750
+ <input id="exampleInput" type="week" name="input" ng-model="value"
18751
+ placeholder="YYYY-W##" min="2012-W32" max="2013-W52" required />
18752
+ <span class="error" ng-show="myForm.input.$error.required">
18753
+ Required!</span>
18754
+ <span class="error" ng-show="myForm.input.$error.week">
18755
+ Not a valid date!</span>
18756
+ <tt>value = {{value | date: "yyyy-Www"}}</tt><br/>
18757
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18758
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18759
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
18760
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
18761
+ </form>
18762
+ </file>
18763
+ <file name="protractor.js" type="protractor">
18764
+ var value = element(by.binding('value | date: "yyyy-Www"'));
18765
+ var valid = element(by.binding('myForm.input.$valid'));
18766
+ var input = element(by.model('value'));
18767
+
18768
+ // currently protractor/webdriver does not support
18769
+ // sending keys to all known HTML5 input controls
18770
+ // for various browsers (https://github.com/angular/protractor/issues/562).
18771
+ function setInput(val) {
18772
+ // set the value of the element and force validation.
18773
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
18774
+ "ipt.value = '" + val + "';" +
18775
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
18776
+ browser.executeScript(scr);
18777
+ }
18778
+
18779
+ it('should initialize to model', function() {
18780
+ expect(value.getText()).toContain('2013-W01');
18781
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
18782
+ });
18783
+
18784
+ it('should be invalid if empty', function() {
18785
+ setInput('');
18786
+ expect(value.getText()).toEqual('value =');
18787
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18788
+ });
18789
+
18790
+ it('should be invalid if over max', function() {
18791
+ setInput('2015-W01');
18792
+ expect(value.getText()).toContain('');
18793
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18794
+ });
18795
+ </file>
18796
+ </example>
18797
+ */
18798
+ 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),
18799
+
18800
+ /**
18801
+ * @ngdoc input
18802
+ * @name input[month]
18803
+ *
18804
+ * @description
18805
+ * Input with month validation and transformation. In browsers that do not yet support
18806
+ * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
18807
+ * month format (yyyy-MM), for example: `2009-01`. The model must always be a Date object. In the event the model is
18808
+ * not set to the first of the month, the first of that model's month is assumed.
18809
+ *
18810
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
18811
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
18812
+ *
18813
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18814
+ * @param {string=} name Property name of the form under which the control is published.
18815
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be
18816
+ * a valid ISO month format (yyyy-MM).
18817
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must
18818
+ * be a valid ISO month format (yyyy-MM).
18819
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
18820
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18821
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18822
+ * `required` when you want to data-bind to the `required` attribute.
18823
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18824
+ * interaction with the input element.
18825
+ *
18826
+ * @example
18827
+ <example name="month-input-directive" module="monthExample">
18828
+ <file name="index.html">
18829
+ <script>
18830
+ angular.module('monthExample', [])
18831
+ .controller('DateController', ['$scope', function($scope) {
18832
+ $scope.value = new Date(2013, 9, 1);
18833
+ }]);
18834
+ </script>
18835
+ <form name="myForm" ng-controller="DateController as dateCtrl">
18836
+ Pick a month int 2013:
18837
+ <input id="exampleInput" type="month" name="input" ng-model="value"
18838
+ placeholder="yyyy-MM" min="2013-01" max="2013-12" required />
18839
+ <span class="error" ng-show="myForm.input.$error.required">
18840
+ Required!</span>
18841
+ <span class="error" ng-show="myForm.input.$error.month">
18842
+ Not a valid month!</span>
18843
+ <tt>value = {{value | date: "yyyy-MM"}}</tt><br/>
18844
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18845
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18846
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
18847
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
18848
+ </form>
18849
+ </file>
18850
+ <file name="protractor.js" type="protractor">
18851
+ var value = element(by.binding('value | date: "yyyy-MM"'));
18852
+ var valid = element(by.binding('myForm.input.$valid'));
18853
+ var input = element(by.model('value'));
18854
+
18855
+ // currently protractor/webdriver does not support
18856
+ // sending keys to all known HTML5 input controls
18857
+ // for various browsers (https://github.com/angular/protractor/issues/562).
18858
+ function setInput(val) {
18859
+ // set the value of the element and force validation.
18860
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
18861
+ "ipt.value = '" + val + "';" +
18862
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
18863
+ browser.executeScript(scr);
18864
+ }
18865
+
18866
+ it('should initialize to model', function() {
18867
+ expect(value.getText()).toContain('2013-10');
18868
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
18869
+ });
18870
+
18871
+ it('should be invalid if empty', function() {
18872
+ setInput('');
18873
+ expect(value.getText()).toEqual('value =');
18874
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18875
+ });
18876
+
18877
+ it('should be invalid if over max', function() {
18878
+ setInput('2015-01');
18879
+ expect(value.getText()).toContain('');
18880
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
18881
+ });
18882
+ </file>
18883
+ </example>
18884
+ */
18885
+ 'month': createDateInputType('month', MONTH_REGEXP,
18886
+ createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),
18887
+ 'yyyy-MM'),
18888
+
18889
+ /**
18890
+ * @ngdoc input
18891
+ * @name input[number]
18892
+ *
18893
+ * @description
18894
+ * Text input with number validation and transformation. Sets the `number` validation
18895
+ * error if not a valid number.
18896
+ *
18897
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18898
+ * @param {string=} name Property name of the form under which the control is published.
18899
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
18900
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
18901
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
18902
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18903
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18904
+ * `required` when you want to data-bind to the `required` attribute.
18905
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
18906
+ * minlength.
18907
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
18908
+ * maxlength.
18909
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
18910
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
18911
+ * patterns defined as scope expressions.
18912
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18913
+ * interaction with the input element.
18914
+ *
18915
+ * @example
18916
+ <example name="number-input-directive" module="numberExample">
18917
+ <file name="index.html">
18918
+ <script>
18919
+ angular.module('numberExample', [])
18920
+ .controller('ExampleController', ['$scope', function($scope) {
18921
+ $scope.value = 12;
18922
+ }]);
18923
+ </script>
18924
+ <form name="myForm" ng-controller="ExampleController">
18925
+ Number: <input type="number" name="input" ng-model="value"
18926
+ min="0" max="99" required>
18927
+ <span class="error" ng-show="myForm.input.$error.required">
18928
+ Required!</span>
18929
+ <span class="error" ng-show="myForm.input.$error.number">
18930
+ Not valid number!</span>
18931
+ <tt>value = {{value}}</tt><br/>
18932
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18933
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18934
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
18935
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
18936
+ </form>
18937
+ </file>
18938
+ <file name="protractor.js" type="protractor">
18939
+ var value = element(by.binding('value'));
18940
+ var valid = element(by.binding('myForm.input.$valid'));
18941
+ var input = element(by.model('value'));
18942
+
18943
+ it('should initialize to model', function() {
18944
+ expect(value.getText()).toContain('12');
18945
+ expect(valid.getText()).toContain('true');
18946
+ });
18947
+
18948
+ it('should be invalid if empty', function() {
18949
+ input.clear();
18950
+ input.sendKeys('');
18951
+ expect(value.getText()).toEqual('value =');
18952
+ expect(valid.getText()).toContain('false');
18953
+ });
18954
+
18955
+ it('should be invalid if over max', function() {
18956
+ input.clear();
18957
+ input.sendKeys('123');
18958
+ expect(value.getText()).toEqual('value =');
18959
+ expect(valid.getText()).toContain('false');
18960
+ });
18961
+ </file>
18962
+ </example>
18963
+ */
18964
+ 'number': numberInputType,
18965
+
18966
+
18967
+ /**
18968
+ * @ngdoc input
18969
+ * @name input[url]
18970
+ *
18971
+ * @description
18972
+ * Text input with URL validation. Sets the `url` validation error key if the content is not a
18973
+ * valid URL.
18974
+ *
18975
+ * @param {string} ngModel Assignable angular expression to data-bind to.
18976
+ * @param {string=} name Property name of the form under which the control is published.
18977
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
18978
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
18979
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
18980
+ * `required` when you want to data-bind to the `required` attribute.
18981
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
18982
+ * minlength.
18983
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
18984
+ * maxlength.
18985
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
18986
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
18987
+ * patterns defined as scope expressions.
18988
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
18989
+ * interaction with the input element.
18990
+ *
18991
+ * @example
18992
+ <example name="url-input-directive" module="urlExample">
18993
+ <file name="index.html">
18994
+ <script>
18995
+ angular.module('urlExample', [])
18996
+ .controller('ExampleController', ['$scope', function($scope) {
18997
+ $scope.text = 'http://google.com';
18998
+ }]);
18999
+ </script>
19000
+ <form name="myForm" ng-controller="ExampleController">
19001
+ URL: <input type="url" name="input" ng-model="text" required>
19002
+ <span class="error" ng-show="myForm.input.$error.required">
19003
+ Required!</span>
19004
+ <span class="error" ng-show="myForm.input.$error.url">
19005
+ Not valid url!</span>
19006
+ <tt>text = {{text}}</tt><br/>
19007
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
19008
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
19009
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
19010
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
19011
+ <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>
19012
+ </form>
19013
+ </file>
19014
+ <file name="protractor.js" type="protractor">
19015
+ var text = element(by.binding('text'));
19016
+ var valid = element(by.binding('myForm.input.$valid'));
19017
+ var input = element(by.model('text'));
19018
+
19019
+ it('should initialize to model', function() {
19020
+ expect(text.getText()).toContain('http://google.com');
19021
+ expect(valid.getText()).toContain('true');
19022
+ });
19023
+
19024
+ it('should be invalid if empty', function() {
19025
+ input.clear();
19026
+ input.sendKeys('');
19027
+
19028
+ expect(text.getText()).toEqual('text =');
19029
+ expect(valid.getText()).toContain('false');
19030
+ });
19031
+
19032
+ it('should be invalid if not url', function() {
19033
+ input.clear();
19034
+ input.sendKeys('box');
19035
+
19036
+ expect(valid.getText()).toContain('false');
19037
+ });
19038
+ </file>
19039
+ </example>
19040
+ */
19041
+ 'url': urlInputType,
19042
+
19043
+
19044
+ /**
19045
+ * @ngdoc input
19046
+ * @name input[email]
19047
+ *
19048
+ * @description
19049
+ * Text input with email validation. Sets the `email` validation error key if not a valid email
19050
+ * address.
19051
+ *
19052
+ * @param {string} ngModel Assignable angular expression to data-bind to.
19053
+ * @param {string=} name Property name of the form under which the control is published.
19054
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
19055
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
19056
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
19057
+ * `required` when you want to data-bind to the `required` attribute.
19058
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
19059
+ * minlength.
19060
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
19061
+ * maxlength.
19062
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
19063
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
19064
+ * patterns defined as scope expressions.
19065
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
19066
+ * interaction with the input element.
19067
+ *
19068
+ * @example
19069
+ <example name="email-input-directive" module="emailExample">
19070
+ <file name="index.html">
19071
+ <script>
19072
+ angular.module('emailExample', [])
19073
+ .controller('ExampleController', ['$scope', function($scope) {
19074
+ $scope.text = 'me@example.com';
19075
+ }]);
19076
+ </script>
19077
+ <form name="myForm" ng-controller="ExampleController">
19078
+ Email: <input type="email" name="input" ng-model="text" required>
19079
+ <span class="error" ng-show="myForm.input.$error.required">
19080
+ Required!</span>
19081
+ <span class="error" ng-show="myForm.input.$error.email">
19082
+ Not valid email!</span>
19083
+ <tt>text = {{text}}</tt><br/>
19084
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
19085
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
19086
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
19087
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
19088
+ <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>
19089
+ </form>
19090
+ </file>
19091
+ <file name="protractor.js" type="protractor">
19092
+ var text = element(by.binding('text'));
19093
+ var valid = element(by.binding('myForm.input.$valid'));
19094
+ var input = element(by.model('text'));
19095
+
19096
+ it('should initialize to model', function() {
19097
+ expect(text.getText()).toContain('me@example.com');
19098
+ expect(valid.getText()).toContain('true');
19099
+ });
19100
+
19101
+ it('should be invalid if empty', function() {
19102
+ input.clear();
19103
+ input.sendKeys('');
19104
+ expect(text.getText()).toEqual('text =');
19105
+ expect(valid.getText()).toContain('false');
19106
+ });
19107
+
19108
+ it('should be invalid if not email', function() {
19109
+ input.clear();
19110
+ input.sendKeys('xxx');
19111
+
19112
+ expect(valid.getText()).toContain('false');
19113
+ });
19114
+ </file>
19115
+ </example>
19116
+ */
19117
+ 'email': emailInputType,
19118
+
19119
+
19120
+ /**
19121
+ * @ngdoc input
19122
+ * @name input[radio]
19123
+ *
19124
+ * @description
19125
+ * HTML radio button.
19126
+ *
19127
+ * @param {string} ngModel Assignable angular expression to data-bind to.
19128
+ * @param {string} value The value to which the expression should be set when selected.
19129
+ * @param {string=} name Property name of the form under which the control is published.
19130
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
19131
+ * interaction with the input element.
19132
+ * @param {string} ngValue Angular expression which sets the value to which the expression should
19133
+ * be set when selected.
19134
+ *
19135
+ * @example
19136
+ <example name="radio-input-directive" module="radioExample">
19137
+ <file name="index.html">
19138
+ <script>
19139
+ angular.module('radioExample', [])
19140
+ .controller('ExampleController', ['$scope', function($scope) {
19141
+ $scope.color = 'blue';
19142
+ $scope.specialValue = {
19143
+ "id": "12345",
19144
+ "value": "green"
19145
+ };
19146
+ }]);
19147
+ </script>
19148
+ <form name="myForm" ng-controller="ExampleController">
19149
+ <input type="radio" ng-model="color" value="red"> Red <br/>
19150
+ <input type="radio" ng-model="color" ng-value="specialValue"> Green <br/>
19151
+ <input type="radio" ng-model="color" value="blue"> Blue <br/>
19152
+ <tt>color = {{color | json}}</tt><br/>
19153
+ </form>
19154
+ Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`.
19155
+ </file>
19156
+ <file name="protractor.js" type="protractor">
19157
+ it('should change state', function() {
19158
+ var color = element(by.binding('color'));
19159
+
19160
+ expect(color.getText()).toContain('blue');
19161
+
19162
+ element.all(by.model('color')).get(0).click();
19163
+
19164
+ expect(color.getText()).toContain('red');
19165
+ });
19166
+ </file>
19167
+ </example>
19168
+ */
19169
+ 'radio': radioInputType,
19170
+
19171
+
19172
+ /**
19173
+ * @ngdoc input
19174
+ * @name input[checkbox]
19175
+ *
19176
+ * @description
19177
+ * HTML checkbox.
19178
+ *
19179
+ * @param {string} ngModel Assignable angular expression to data-bind to.
19180
+ * @param {string=} name Property name of the form under which the control is published.
19181
+ * @param {expression=} ngTrueValue The value to which the expression should be set when selected.
19182
+ * @param {expression=} ngFalseValue The value to which the expression should be set when not selected.
19183
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
19184
+ * interaction with the input element.
19185
+ *
19186
+ * @example
19187
+ <example name="checkbox-input-directive" module="checkboxExample">
19188
+ <file name="index.html">
19189
+ <script>
19190
+ angular.module('checkboxExample', [])
19191
+ .controller('ExampleController', ['$scope', function($scope) {
19192
+ $scope.value1 = true;
19193
+ $scope.value2 = 'YES'
19194
+ }]);
19195
+ </script>
19196
+ <form name="myForm" ng-controller="ExampleController">
19197
+ Value1: <input type="checkbox" ng-model="value1"> <br/>
19198
+ Value2: <input type="checkbox" ng-model="value2"
19199
+ ng-true-value="'YES'" ng-false-value="'NO'"> <br/>
19200
+ <tt>value1 = {{value1}}</tt><br/>
19201
+ <tt>value2 = {{value2}}</tt><br/>
19202
+ </form>
19203
+ </file>
19204
+ <file name="protractor.js" type="protractor">
19205
+ it('should change state', function() {
19206
+ var value1 = element(by.binding('value1'));
19207
+ var value2 = element(by.binding('value2'));
19208
+
19209
+ expect(value1.getText()).toContain('true');
19210
+ expect(value2.getText()).toContain('YES');
19211
+
19212
+ element(by.model('value1')).click();
19213
+ element(by.model('value2')).click();
19214
+
19215
+ expect(value1.getText()).toContain('false');
19216
+ expect(value2.getText()).toContain('NO');
19217
+ });
19218
+ </file>
19219
+ </example>
19220
+ */
19221
+ 'checkbox': checkboxInputType,
19222
+
19223
+ 'hidden': noop,
19224
+ 'button': noop,
19225
+ 'submit': noop,
19226
+ 'reset': noop,
19227
+ 'file': noop
19228
+};
19229
+
19230
+function testFlags(validity, flags) {
19231
+ var i, flag;
19232
+ if (flags) {
19233
+ for (i=0; i<flags.length; ++i) {
19234
+ flag = flags[i];
19235
+ if (validity[flag]) {
19236
+ return true;
19237
+ }
19238
+ }
19239
+ }
19240
+ return false;
19241
+}
19242
+
19243
+function stringBasedInputType(ctrl) {
19244
+ ctrl.$formatters.push(function(value) {
19245
+ return ctrl.$isEmpty(value) ? value : value.toString();
19246
+ });
19247
+}
19248
+
19249
+function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
19250
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
19251
+ stringBasedInputType(ctrl);
19252
+}
19253
+
19254
+function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
19255
+ var validity = element.prop(VALIDITY_STATE_PROPERTY);
19256
+ var placeholder = element[0].placeholder, noevent = {};
19257
+ var type = lowercase(element[0].type);
19258
+
19259
+ // In composition mode, users are still inputing intermediate text buffer,
19260
+ // hold the listener until composition is done.
19261
+ // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent
19262
+ if (!$sniffer.android) {
19263
+ var composing = false;
19264
+
19265
+ element.on('compositionstart', function(data) {
19266
+ composing = true;
19267
+ });
19268
+
19269
+ element.on('compositionend', function() {
19270
+ composing = false;
19271
+ listener();
19272
+ });
19273
+ }
19274
+
19275
+ var listener = function(ev) {
19276
+ if (composing) return;
19277
+ var value = element.val(),
19278
+ event = ev && ev.type;
19279
+
19280
+ // IE (11 and under) seem to emit an 'input' event if the placeholder value changes.
19281
+ // We don't want to dirty the value when this happens, so we abort here. Unfortunately,
19282
+ // IE also sends input events for other non-input-related things, (such as focusing on a
19283
+ // form control), so this change is not entirely enough to solve this.
19284
+ if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {
19285
+ placeholder = element[0].placeholder;
19286
+ return;
19287
+ }
19288
+
19289
+ // By default we will trim the value
19290
+ // If the attribute ng-trim exists we will avoid trimming
19291
+ // If input type is 'password', the value is never trimmed
19292
+ if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) {
19293
+ value = trim(value);
19294
+ }
19295
+
19296
+ // If a control is suffering from bad input (due to native validators), browsers discard its
19297
+ // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the
19298
+ // control's value is the same empty value twice in a row.
19299
+ if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) {
19300
+ ctrl.$setViewValue(value, event);
19301
+ }
19302
+ };
19303
+
19304
+ // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
19305
+ // input event on backspace, delete or cut
19306
+ if ($sniffer.hasEvent('input')) {
19307
+ element.on('input', listener);
19308
+ } else {
19309
+ var timeout;
19310
+
19311
+ var deferListener = function(ev) {
19312
+ if (!timeout) {
19313
+ timeout = $browser.defer(function() {
19314
+ listener(ev);
19315
+ timeout = null;
19316
+ });
19317
+ }
19318
+ };
19319
+
19320
+ element.on('keydown', function(event) {
19321
+ var key = event.keyCode;
19322
+
19323
+ // ignore
19324
+ // command modifiers arrows
19325
+ if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;
19326
+
19327
+ deferListener(event);
19328
+ });
19329
+
19330
+ // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
19331
+ if ($sniffer.hasEvent('paste')) {
19332
+ element.on('paste cut', deferListener);
19333
+ }
19334
+ }
19335
+
19336
+ // if user paste into input using mouse on older browser
19337
+ // or form autocomplete on newer browser, we need "change" event to catch it
19338
+ element.on('change', listener);
19339
+
19340
+ ctrl.$render = function() {
19341
+ element.val(ctrl.$isEmpty(ctrl.$modelValue) ? '' : ctrl.$viewValue);
19342
+ };
19343
+}
19344
+
19345
+function weekParser(isoWeek, existingDate) {
19346
+ if (isDate(isoWeek)) {
19347
+ return isoWeek;
19348
+ }
19349
+
19350
+ if (isString(isoWeek)) {
19351
+ WEEK_REGEXP.lastIndex = 0;
19352
+ var parts = WEEK_REGEXP.exec(isoWeek);
19353
+ if (parts) {
19354
+ var year = +parts[1],
19355
+ week = +parts[2],
19356
+ hours = 0,
19357
+ minutes = 0,
19358
+ seconds = 0,
19359
+ milliseconds = 0,
19360
+ firstThurs = getFirstThursdayOfYear(year),
19361
+ addDays = (week - 1) * 7;
19362
+
19363
+ if (existingDate) {
19364
+ hours = existingDate.getHours();
19365
+ minutes = existingDate.getMinutes();
19366
+ seconds = existingDate.getSeconds();
19367
+ milliseconds = existingDate.getMilliseconds();
19368
+ }
19369
+
19370
+ return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds);
19371
+ }
19372
+ }
19373
+
19374
+ return NaN;
19375
+}
19376
+
19377
+function createDateParser(regexp, mapping) {
19378
+ return function(iso, date) {
19379
+ var parts, map;
19380
+
19381
+ if (isDate(iso)) {
19382
+ return iso;
19383
+ }
19384
+
19385
+ if (isString(iso)) {
19386
+ // When a date is JSON'ified to wraps itself inside of an extra
19387
+ // set of double quotes. This makes the date parsing code unable
19388
+ // to match the date string and parse it as a date.
19389
+ if (iso.charAt(0) == '"' && iso.charAt(iso.length-1) == '"') {
19390
+ iso = iso.substring(1, iso.length-1);
19391
+ }
19392
+ if (ISO_DATE_REGEXP.test(iso)) {
19393
+ return new Date(iso);
19394
+ }
19395
+ regexp.lastIndex = 0;
19396
+ parts = regexp.exec(iso);
19397
+
19398
+ if (parts) {
19399
+ parts.shift();
19400
+ if (date) {
19401
+ map = {
19402
+ yyyy: date.getFullYear(),
19403
+ MM: date.getMonth() + 1,
19404
+ dd: date.getDate(),
19405
+ HH: date.getHours(),
19406
+ mm: date.getMinutes(),
19407
+ ss: date.getSeconds(),
19408
+ sss: date.getMilliseconds() / 1000
19409
+ };
19410
+ } else {
19411
+ map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 };
19412
+ }
19413
+
19414
+ forEach(parts, function(part, index) {
19415
+ if (index < mapping.length) {
19416
+ map[mapping[index]] = +part;
19417
+ }
19418
+ });
19419
+ return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);
19420
+ }
19421
+ }
19422
+
19423
+ return NaN;
19424
+ };
19425
+}
19426
+
19427
+function createDateInputType(type, regexp, parseDate, format) {
19428
+ return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {
19429
+ badInputChecker(scope, element, attr, ctrl);
19430
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
19431
+ var timezone = ctrl && ctrl.$options && ctrl.$options.timezone;
19432
+ var previousDate;
19433
+
19434
+ ctrl.$$parserName = type;
19435
+ ctrl.$parsers.push(function(value) {
19436
+ if (ctrl.$isEmpty(value)) return null;
19437
+ if (regexp.test(value)) {
19438
+ // Note: We cannot read ctrl.$modelValue, as there might be a different
19439
+ // parser/formatter in the processing chain so that the model
19440
+ // contains some different data format!
19441
+ var parsedDate = parseDate(value, previousDate);
19442
+ if (timezone === 'UTC') {
19443
+ parsedDate.setMinutes(parsedDate.getMinutes() - parsedDate.getTimezoneOffset());
19444
+ }
19445
+ return parsedDate;
19446
+ }
19447
+ return undefined;
19448
+ });
19449
+
19450
+ ctrl.$formatters.push(function(value) {
19451
+ if (!ctrl.$isEmpty(value)) {
19452
+ if (!isDate(value)) {
19453
+ throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);
19454
+ }
19455
+ previousDate = value;
19456
+ if (previousDate && timezone === 'UTC') {
19457
+ var timezoneOffset = 60000 * previousDate.getTimezoneOffset();
19458
+ previousDate = new Date(previousDate.getTime() + timezoneOffset);
19459
+ }
19460
+ return $filter('date')(value, format, timezone);
19461
+ } else {
19462
+ previousDate = null;
19463
+ }
19464
+ return '';
19465
+ });
19466
+
19467
+ if (isDefined(attr.min) || attr.ngMin) {
19468
+ var minVal;
19469
+ ctrl.$validators.min = function(value) {
19470
+ return ctrl.$isEmpty(value) || isUndefined(minVal) || parseDate(value) >= minVal;
19471
+ };
19472
+ attr.$observe('min', function(val) {
19473
+ minVal = parseObservedDateValue(val);
19474
+ ctrl.$validate();
19475
+ });
19476
+ }
19477
+
19478
+ if (isDefined(attr.max) || attr.ngMax) {
19479
+ var maxVal;
19480
+ ctrl.$validators.max = function(value) {
19481
+ return ctrl.$isEmpty(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;
19482
+ };
19483
+ attr.$observe('max', function(val) {
19484
+ maxVal = parseObservedDateValue(val);
19485
+ ctrl.$validate();
19486
+ });
19487
+ }
19488
+ // Override the standard $isEmpty to detect invalid dates as well
19489
+ ctrl.$isEmpty = function(value) {
19490
+ // Invalid Date: getTime() returns NaN
19491
+ return !value || (value.getTime && value.getTime() !== value.getTime());
19492
+ };
19493
+
19494
+ function parseObservedDateValue(val) {
19495
+ return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined;
19496
+ }
19497
+ };
19498
+}
19499
+
19500
+function badInputChecker(scope, element, attr, ctrl) {
19501
+ var node = element[0];
19502
+ var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity);
19503
+ if (nativeValidation) {
19504
+ ctrl.$parsers.push(function(value) {
19505
+ var validity = element.prop(VALIDITY_STATE_PROPERTY) || {};
19506
+ // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430):
19507
+ // - also sets validity.badInput (should only be validity.typeMismatch).
19508
+ // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email)
19509
+ // - can ignore this case as we can still read out the erroneous email...
19510
+ return validity.badInput && !validity.typeMismatch ? undefined : value;
19511
+ });
19512
+ }
19513
+}
19514
+
19515
+function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
19516
+ badInputChecker(scope, element, attr, ctrl);
19517
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
19518
+
19519
+ ctrl.$$parserName = 'number';
19520
+ ctrl.$parsers.push(function(value) {
19521
+ if (ctrl.$isEmpty(value)) return null;
19522
+ if (NUMBER_REGEXP.test(value)) return parseFloat(value);
19523
+ return undefined;
19524
+ });
19525
+
19526
+ ctrl.$formatters.push(function(value) {
19527
+ if (!ctrl.$isEmpty(value)) {
19528
+ if (!isNumber(value)) {
19529
+ throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);
19530
+ }
19531
+ value = value.toString();
19532
+ }
19533
+ return value;
19534
+ });
19535
+
19536
+ if (attr.min || attr.ngMin) {
19537
+ var minVal;
19538
+ ctrl.$validators.min = function(value) {
19539
+ return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;
19540
+ };
19541
+
19542
+ attr.$observe('min', function(val) {
19543
+ if (isDefined(val) && !isNumber(val)) {
19544
+ val = parseFloat(val, 10);
19545
+ }
19546
+ minVal = isNumber(val) && !isNaN(val) ? val : undefined;
19547
+ // TODO(matsko): implement validateLater to reduce number of validations
19548
+ ctrl.$validate();
19549
+ });
19550
+ }
19551
+
19552
+ if (attr.max || attr.ngMax) {
19553
+ var maxVal;
19554
+ ctrl.$validators.max = function(value) {
19555
+ return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;
19556
+ };
19557
+
19558
+ attr.$observe('max', function(val) {
19559
+ if (isDefined(val) && !isNumber(val)) {
19560
+ val = parseFloat(val, 10);
19561
+ }
19562
+ maxVal = isNumber(val) && !isNaN(val) ? val : undefined;
19563
+ // TODO(matsko): implement validateLater to reduce number of validations
19564
+ ctrl.$validate();
19565
+ });
19566
+ }
19567
+}
19568
+
19569
+function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
19570
+ // Note: no badInputChecker here by purpose as `url` is only a validation
19571
+ // in browsers, i.e. we can always read out input.value even if it is not valid!
19572
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
19573
+ stringBasedInputType(ctrl);
19574
+
19575
+ ctrl.$$parserName = 'url';
19576
+ ctrl.$validators.url = function(value) {
19577
+ return ctrl.$isEmpty(value) || URL_REGEXP.test(value);
19578
+ };
19579
+}
19580
+
19581
+function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
19582
+ // Note: no badInputChecker here by purpose as `url` is only a validation
19583
+ // in browsers, i.e. we can always read out input.value even if it is not valid!
19584
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
19585
+ stringBasedInputType(ctrl);
19586
+
19587
+ ctrl.$$parserName = 'email';
19588
+ ctrl.$validators.email = function(value) {
19589
+ return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);
19590
+ };
19591
+}
19592
+
19593
+function radioInputType(scope, element, attr, ctrl) {
19594
+ // make the name unique, if not defined
19595
+ if (isUndefined(attr.name)) {
19596
+ element.attr('name', nextUid());
19597
+ }
19598
+
19599
+ var listener = function(ev) {
19600
+ if (element[0].checked) {
19601
+ ctrl.$setViewValue(attr.value, ev && ev.type);
19602
+ }
19603
+ };
19604
+
19605
+ element.on('click', listener);
19606
+
19607
+ ctrl.$render = function() {
19608
+ var value = attr.value;
19609
+ element[0].checked = (value == ctrl.$viewValue);
19610
+ };
19611
+
19612
+ attr.$observe('value', ctrl.$render);
19613
+}
19614
+
19615
+function parseConstantExpr($parse, context, name, expression, fallback) {
19616
+ var parseFn;
19617
+ if (isDefined(expression)) {
19618
+ parseFn = $parse(expression);
19619
+ if (!parseFn.constant) {
19620
+ throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' +
19621
+ '`{1}`.', name, expression);
19622
+ }
19623
+ return parseFn(context);
19624
+ }
19625
+ return fallback;
19626
+}
19627
+
19628
+function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {
19629
+ var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true);
19630
+ var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false);
19631
+
19632
+ var listener = function(ev) {
19633
+ ctrl.$setViewValue(element[0].checked, ev && ev.type);
19634
+ };
19635
+
19636
+ element.on('click', listener);
19637
+
19638
+ ctrl.$render = function() {
19639
+ element[0].checked = ctrl.$viewValue;
19640
+ };
19641
+
19642
+ // Override the standard `$isEmpty` because an empty checkbox is never equal to the trueValue
19643
+ ctrl.$isEmpty = function(value) {
19644
+ return value !== trueValue;
19645
+ };
19646
+
19647
+ ctrl.$formatters.push(function(value) {
19648
+ return equals(value, trueValue);
19649
+ });
19650
+
19651
+ ctrl.$parsers.push(function(value) {
19652
+ return value ? trueValue : falseValue;
19653
+ });
19654
+}
19655
+
19656
+
19657
+/**
19658
+ * @ngdoc directive
19659
+ * @name textarea
19660
+ * @restrict E
19661
+ *
19662
+ * @description
19663
+ * HTML textarea element control with angular data-binding. The data-binding and validation
19664
+ * properties of this element are exactly the same as those of the
19665
+ * {@link ng.directive:input input element}.
19666
+ *
19667
+ * @param {string} ngModel Assignable angular expression to data-bind to.
19668
+ * @param {string=} name Property name of the form under which the control is published.
19669
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
19670
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
19671
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
19672
+ * `required` when you want to data-bind to the `required` attribute.
19673
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
19674
+ * minlength.
19675
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
19676
+ * maxlength.
19677
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
19678
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
19679
+ * patterns defined as scope expressions.
19680
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
19681
+ * interaction with the input element.
19682
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
19683
+ */
19684
+
19685
+
19686
+/**
19687
+ * @ngdoc directive
19688
+ * @name input
19689
+ * @restrict E
19690
+ *
19691
+ * @description
19692
+ * HTML input element control with angular data-binding. Input control follows HTML5 input types
19693
+ * and polyfills the HTML5 validation behavior for older browsers.
19694
+ *
19695
+ * *NOTE* Not every feature offered is available for all input types.
19696
+ *
19697
+ * @param {string} ngModel Assignable angular expression to data-bind to.
19698
+ * @param {string=} name Property name of the form under which the control is published.
19699
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
19700
+ * @param {boolean=} ngRequired Sets `required` attribute if set to true
19701
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
19702
+ * minlength.
19703
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
19704
+ * maxlength.
19705
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
19706
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
19707
+ * patterns defined as scope expressions.
19708
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
19709
+ * interaction with the input element.
19710
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
19711
+ * This parameter is ignored for input[type=password] controls, which will never trim the
19712
+ * input.
19713
+ *
19714
+ * @example
19715
+ <example name="input-directive" module="inputExample">
19716
+ <file name="index.html">
19717
+ <script>
19718
+ angular.module('inputExample', [])
19719
+ .controller('ExampleController', ['$scope', function($scope) {
19720
+ $scope.user = {name: 'guest', last: 'visitor'};
19721
+ }]);
19722
+ </script>
19723
+ <div ng-controller="ExampleController">
19724
+ <form name="myForm">
19725
+ User name: <input type="text" name="userName" ng-model="user.name" required>
19726
+ <span class="error" ng-show="myForm.userName.$error.required">
19727
+ Required!</span><br>
19728
+ Last name: <input type="text" name="lastName" ng-model="user.last"
19729
+ ng-minlength="3" ng-maxlength="10">
19730
+ <span class="error" ng-show="myForm.lastName.$error.minlength">
19731
+ Too short!</span>
19732
+ <span class="error" ng-show="myForm.lastName.$error.maxlength">
19733
+ Too long!</span><br>
19734
+ </form>
19735
+ <hr>
19736
+ <tt>user = {{user}}</tt><br/>
19737
+ <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>
19738
+ <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>
19739
+ <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>
19740
+ <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>
19741
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
19742
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
19743
+ <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>
19744
+ <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>
19745
+ </div>
19746
+ </file>
19747
+ <file name="protractor.js" type="protractor">
19748
+ var user = element(by.exactBinding('user'));
19749
+ var userNameValid = element(by.binding('myForm.userName.$valid'));
19750
+ var lastNameValid = element(by.binding('myForm.lastName.$valid'));
19751
+ var lastNameError = element(by.binding('myForm.lastName.$error'));
19752
+ var formValid = element(by.binding('myForm.$valid'));
19753
+ var userNameInput = element(by.model('user.name'));
19754
+ var userLastInput = element(by.model('user.last'));
19755
+
19756
+ it('should initialize to model', function() {
19757
+ expect(user.getText()).toContain('{"name":"guest","last":"visitor"}');
19758
+ expect(userNameValid.getText()).toContain('true');
19759
+ expect(formValid.getText()).toContain('true');
19760
+ });
19761
+
19762
+ it('should be invalid if empty when required', function() {
19763
+ userNameInput.clear();
19764
+ userNameInput.sendKeys('');
19765
+
19766
+ expect(user.getText()).toContain('{"last":"visitor"}');
19767
+ expect(userNameValid.getText()).toContain('false');
19768
+ expect(formValid.getText()).toContain('false');
19769
+ });
19770
+
19771
+ it('should be valid if empty when min length is set', function() {
19772
+ userLastInput.clear();
19773
+ userLastInput.sendKeys('');
19774
+
19775
+ expect(user.getText()).toContain('{"name":"guest","last":""}');
19776
+ expect(lastNameValid.getText()).toContain('true');
19777
+ expect(formValid.getText()).toContain('true');
19778
+ });
19779
+
19780
+ it('should be invalid if less than required min length', function() {
19781
+ userLastInput.clear();
19782
+ userLastInput.sendKeys('xx');
19783
+
19784
+ expect(user.getText()).toContain('{"name":"guest"}');
19785
+ expect(lastNameValid.getText()).toContain('false');
19786
+ expect(lastNameError.getText()).toContain('minlength');
19787
+ expect(formValid.getText()).toContain('false');
19788
+ });
19789
+
19790
+ it('should be invalid if longer than max length', function() {
19791
+ userLastInput.clear();
19792
+ userLastInput.sendKeys('some ridiculously long name');
19793
+
19794
+ expect(user.getText()).toContain('{"name":"guest"}');
19795
+ expect(lastNameValid.getText()).toContain('false');
19796
+ expect(lastNameError.getText()).toContain('maxlength');
19797
+ expect(formValid.getText()).toContain('false');
19798
+ });
19799
+ </file>
19800
+ </example>
19801
+ */
19802
+var inputDirective = ['$browser', '$sniffer', '$filter', '$parse',
19803
+ function($browser, $sniffer, $filter, $parse) {
19804
+ return {
19805
+ restrict: 'E',
19806
+ require: ['?ngModel'],
19807
+ link: {
19808
+ pre: function(scope, element, attr, ctrls) {
19809
+ if (ctrls[0]) {
19810
+ (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,
19811
+ $browser, $filter, $parse);
19812
+ }
19813
+ }
19814
+ }
19815
+ };
19816
+}];
19817
+
19818
+var VALID_CLASS = 'ng-valid',
19819
+ INVALID_CLASS = 'ng-invalid',
19820
+ PRISTINE_CLASS = 'ng-pristine',
19821
+ DIRTY_CLASS = 'ng-dirty',
19822
+ UNTOUCHED_CLASS = 'ng-untouched',
19823
+ TOUCHED_CLASS = 'ng-touched',
19824
+ PENDING_CLASS = 'ng-pending';
19825
+
19826
+/**
19827
+ * @ngdoc type
19828
+ * @name ngModel.NgModelController
19829
+ *
19830
+ * @property {string} $viewValue Actual string value in the view.
19831
+ * @property {*} $modelValue The value in the model, that the control is bound to.
19832
+ * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
19833
+ the control reads value from the DOM. Each function is called, in turn, passing the value
19834
+ through to the next. The last return value is used to populate the model.
19835
+ Used to sanitize / convert the value as well as validation. For validation,
19836
+ the parsers should update the validity state using
19837
+ {@link ngModel.NgModelController#$setValidity $setValidity()},
19838
+ and return `undefined` for invalid values.
19839
+
19840
+ *
19841
+ * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
19842
+ the model value changes. Each function is called, in turn, passing the value through to the
19843
+ next. Used to format / convert values for display in the control and validation.
19844
+ * ```js
19845
+ * function formatter(value) {
19846
+ * if (value) {
19847
+ * return value.toUpperCase();
19848
+ * }
19849
+ * }
19850
+ * ngModel.$formatters.push(formatter);
19851
+ * ```
19852
+ *
19853
+ * @property {Object.<string, function>} $validators A collection of validators that are applied
19854
+ * whenever the model value changes. The key value within the object refers to the name of the
19855
+ * validator while the function refers to the validation operation. The validation operation is
19856
+ * provided with the model value as an argument and must return a true or false value depending
19857
+ * on the response of that validation.
19858
+ *
19859
+ * ```js
19860
+ * ngModel.$validators.validCharacters = function(modelValue, viewValue) {
19861
+ * var value = modelValue || viewValue;
19862
+ * return /[0-9]+/.test(value) &&
19863
+ * /[a-z]+/.test(value) &&
19864
+ * /[A-Z]+/.test(value) &&
19865
+ * /\W+/.test(value);
19866
+ * };
19867
+ * ```
19868
+ *
19869
+ * @property {Object.<string, function>} $asyncValidators A collection of validations that are expected to
19870
+ * perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided
19871
+ * is expected to return a promise when it is run during the model validation process. Once the promise
19872
+ * is delivered then the validation status will be set to true when fulfilled and false when rejected.
19873
+ * When the asynchronous validators are triggered, each of the validators will run in parallel and the model
19874
+ * value will only be updated once all validators have been fulfilled. Also, keep in mind that all
19875
+ * asynchronous validators will only run once all synchronous validators have passed.
19876
+ *
19877
+ * Please note that if $http is used then it is important that the server returns a success HTTP response code
19878
+ * in order to fulfill the validation and a status level of `4xx` in order to reject the validation.
19879
+ *
19880
+ * ```js
19881
+ * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {
19882
+ * var value = modelValue || viewValue;
19883
+ *
19884
+ * // Lookup user by username
19885
+ * return $http.get('/api/users/' + value).
19886
+ * then(function resolved() {
19887
+ * //username exists, this means validation fails
19888
+ * return $q.reject('exists');
19889
+ * }, function rejected() {
19890
+ * //username does not exist, therefore this validation passes
19891
+ * return true;
19892
+ * });
19893
+ * };
19894
+ * ```
19895
+ *
19896
+ * @param {string} name The name of the validator.
19897
+ * @param {Function} validationFn The validation function that will be run.
19898
+ *
19899
+ * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the
19900
+ * view value has changed. It is called with no arguments, and its return value is ignored.
19901
+ * This can be used in place of additional $watches against the model value.
19902
+ *
19903
+ * @property {Object} $error An object hash with all failing validator ids as keys.
19904
+ * @property {Object} $pending An object hash with all pending validator ids as keys.
19905
+ *
19906
+ * @property {boolean} $untouched True if control has not lost focus yet.
19907
+ * @property {boolean} $touched True if control has lost focus.
19908
+ * @property {boolean} $pristine True if user has not interacted with the control yet.
19909
+ * @property {boolean} $dirty True if user has already interacted with the control.
19910
+ * @property {boolean} $valid True if there is no error.
19911
+ * @property {boolean} $invalid True if at least one error on the control.
19912
+ *
19913
+ * @description
19914
+ *
19915
+ * `NgModelController` provides API for the `ng-model` directive. The controller contains
19916
+ * services for data-binding, validation, CSS updates, and value formatting and parsing. It
19917
+ * purposefully does not contain any logic which deals with DOM rendering or listening to
19918
+ * DOM events. Such DOM related logic should be provided by other directives which make use of
19919
+ * `NgModelController` for data-binding.
19920
+ *
19921
+ * ## Custom Control Example
19922
+ * This example shows how to use `NgModelController` with a custom control to achieve
19923
+ * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
19924
+ * collaborate together to achieve the desired result.
19925
+ *
19926
+ * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element
19927
+ * contents be edited in place by the user. This will not work on older browsers.
19928
+ *
19929
+ * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}
19930
+ * module to automatically remove "bad" content like inline event listener (e.g. `<span onclick="...">`).
19931
+ * However, as we are using `$sce` the model can still decide to to provide unsafe content if it marks
19932
+ * that content using the `$sce` service.
19933
+ *
19934
+ * <example name="NgModelController" module="customControl" deps="angular-sanitize.js">
19935
+ <file name="style.css">
19936
+ [contenteditable] {
19937
+ border: 1px solid black;
19938
+ background-color: white;
19939
+ min-height: 20px;
19940
+ }
19941
+
19942
+ .ng-invalid {
19943
+ border: 1px solid red;
19944
+ }
19945
+
19946
+ </file>
19947
+ <file name="script.js">
19948
+ angular.module('customControl', ['ngSanitize']).
19949
+ directive('contenteditable', ['$sce', function($sce) {
19950
+ return {
19951
+ restrict: 'A', // only activate on element attribute
19952
+ require: '?ngModel', // get a hold of NgModelController
19953
+ link: function(scope, element, attrs, ngModel) {
19954
+ if (!ngModel) return; // do nothing if no ng-model
19955
+
19956
+ // Specify how UI should be updated
19957
+ ngModel.$render = function() {
19958
+ element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));
19959
+ };
19960
+
19961
+ // Listen for change events to enable binding
19962
+ element.on('blur keyup change', function() {
19963
+ scope.$apply(read);
19964
+ });
19965
+ read(); // initialize
19966
+
19967
+ // Write data to the model
19968
+ function read() {
19969
+ var html = element.html();
19970
+ // When we clear the content editable the browser leaves a <br> behind
19971
+ // If strip-br attribute is provided then we strip this out
19972
+ if ( attrs.stripBr && html == '<br>' ) {
19973
+ html = '';
19974
+ }
19975
+ ngModel.$setViewValue(html);
19976
+ }
19977
+ }
19978
+ };
19979
+ }]);
19980
+ </file>
19981
+ <file name="index.html">
19982
+ <form name="myForm">
19983
+ <div contenteditable
19984
+ name="myWidget" ng-model="userContent"
19985
+ strip-br="true"
19986
+ required>Change me!</div>
19987
+ <span ng-show="myForm.myWidget.$error.required">Required!</span>
19988
+ <hr>
19989
+ <textarea ng-model="userContent"></textarea>
19990
+ </form>
19991
+ </file>
19992
+ <file name="protractor.js" type="protractor">
19993
+ it('should data-bind and become invalid', function() {
19994
+ if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') {
19995
+ // SafariDriver can't handle contenteditable
19996
+ // and Firefox driver can't clear contenteditables very well
19997
+ return;
19998
+ }
19999
+ var contentEditable = element(by.css('[contenteditable]'));
20000
+ var content = 'Change me!';
20001
+
20002
+ expect(contentEditable.getText()).toEqual(content);
20003
+
20004
+ contentEditable.clear();
20005
+ contentEditable.sendKeys(protractor.Key.BACK_SPACE);
20006
+ expect(contentEditable.getText()).toEqual('');
20007
+ expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);
20008
+ });
20009
+ </file>
20010
+ * </example>
20011
+ *
20012
+ *
20013
+ */
20014
+var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate',
20015
+ function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) {
20016
+ this.$viewValue = Number.NaN;
20017
+ this.$modelValue = Number.NaN;
20018
+ this.$validators = {};
20019
+ this.$asyncValidators = {};
20020
+ this.$parsers = [];
20021
+ this.$formatters = [];
20022
+ this.$viewChangeListeners = [];
20023
+ this.$untouched = true;
20024
+ this.$touched = false;
20025
+ this.$pristine = true;
20026
+ this.$dirty = false;
20027
+ this.$valid = true;
20028
+ this.$invalid = false;
20029
+ this.$error = {}; // keep invalid keys here
20030
+ this.$$success = {}; // keep valid keys here
20031
+ this.$pending = undefined; // keep pending keys here
20032
+ this.$name = $interpolate($attr.name || '', false)($scope);
20033
+
20034
+
20035
+ var parsedNgModel = $parse($attr.ngModel),
20036
+ pendingDebounce = null,
20037
+ ctrl = this;
20038
+
20039
+ var ngModelGet = function ngModelGet() {
20040
+ var modelValue = parsedNgModel($scope);
20041
+ if (ctrl.$options && ctrl.$options.getterSetter && isFunction(modelValue)) {
20042
+ modelValue = modelValue();
20043
+ }
20044
+ return modelValue;
20045
+ };
20046
+
20047
+ var ngModelSet = function ngModelSet(newValue) {
20048
+ var getterSetter;
20049
+ if (ctrl.$options && ctrl.$options.getterSetter &&
20050
+ isFunction(getterSetter = parsedNgModel($scope))) {
20051
+
20052
+ getterSetter(ctrl.$modelValue);
20053
+ } else {
20054
+ parsedNgModel.assign($scope, ctrl.$modelValue);
20055
+ }
20056
+ };
20057
+
20058
+ this.$$setOptions = function(options) {
20059
+ ctrl.$options = options;
20060
+
20061
+ if (!parsedNgModel.assign && (!options || !options.getterSetter)) {
20062
+ throw $ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}",
20063
+ $attr.ngModel, startingTag($element));
20064
+ }
20065
+ };
20066
+
20067
+ /**
20068
+ * @ngdoc method
20069
+ * @name ngModel.NgModelController#$render
20070
+ *
20071
+ * @description
20072
+ * Called when the view needs to be updated. It is expected that the user of the ng-model
20073
+ * directive will implement this method.
20074
+ *
20075
+ * The `$render()` method is invoked in the following situations:
20076
+ *
20077
+ * * `$rollbackViewValue()` is called. If we are rolling back the view value to the last
20078
+ * committed value then `$render()` is called to update the input control.
20079
+ * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and
20080
+ * the `$viewValue` are different to last time.
20081
+ *
20082
+ * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of
20083
+ * `$modelValue` and `$viewValue` are actually different to their previous value. If `$modelValue`
20084
+ * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be
20085
+ * invoked if you only change a property on the objects.
20086
+ */
20087
+ this.$render = noop;
20088
+
20089
+ /**
20090
+ * @ngdoc method
20091
+ * @name ngModel.NgModelController#$isEmpty
20092
+ *
20093
+ * @description
20094
+ * This is called when we need to determine if the value of the input is empty.
20095
+ *
20096
+ * For instance, the required directive does this to work out if the input has data or not.
20097
+ * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.
20098
+ *
20099
+ * You can override this for input directives whose concept of being empty is different to the
20100
+ * default. The `checkboxInputType` directive does this because in its case a value of `false`
20101
+ * implies empty.
20102
+ *
20103
+ * @param {*} value Model value to check.
20104
+ * @returns {boolean} True if `value` is empty.
20105
+ */
20106
+ this.$isEmpty = function(value) {
20107
+ return isUndefined(value) || value === '' || value === null || value !== value;
20108
+ };
20109
+
20110
+ var parentForm = $element.inheritedData('$formController') || nullFormCtrl,
20111
+ currentValidationRunId = 0;
20112
+
20113
+ /**
20114
+ * @ngdoc method
20115
+ * @name ngModel.NgModelController#$setValidity
20116
+ *
20117
+ * @description
20118
+ * Change the validity state, and notifies the form.
20119
+ *
20120
+ * This method can be called within $parsers/$formatters. However, if possible, please use the
20121
+ * `ngModel.$validators` pipeline which is designed to call this method automatically.
20122
+ *
20123
+ * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign
20124
+ * to `$error[validationErrorKey]` and `$pending[validationErrorKey]`
20125
+ * so that it is available for data-binding.
20126
+ * The `validationErrorKey` should be in camelCase and will get converted into dash-case
20127
+ * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
20128
+ * class and can be bound to as `{{someForm.someControl.$error.myError}}` .
20129
+ * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),
20130
+ * or skipped (null).
20131
+ */
20132
+ addSetValidityMethod({
20133
+ ctrl: this,
20134
+ $element: $element,
20135
+ set: function(object, property) {
20136
+ object[property] = true;
20137
+ },
20138
+ unset: function(object, property) {
20139
+ delete object[property];
20140
+ },
20141
+ parentForm: parentForm,
20142
+ $animate: $animate
20143
+ });
20144
+
20145
+ /**
20146
+ * @ngdoc method
20147
+ * @name ngModel.NgModelController#$setPristine
20148
+ *
20149
+ * @description
20150
+ * Sets the control to its pristine state.
20151
+ *
20152
+ * This method can be called to remove the 'ng-dirty' class and set the control to its pristine
20153
+ * state (ng-pristine class). A model is considered to be pristine when the model has not been changed
20154
+ * from when first compiled within then form.
20155
+ */
20156
+ this.$setPristine = function () {
20157
+ ctrl.$dirty = false;
20158
+ ctrl.$pristine = true;
20159
+ $animate.removeClass($element, DIRTY_CLASS);
20160
+ $animate.addClass($element, PRISTINE_CLASS);
20161
+ };
20162
+
20163
+ /**
20164
+ * @ngdoc method
20165
+ * @name ngModel.NgModelController#$setUntouched
20166
+ *
20167
+ * @description
20168
+ * Sets the control to its untouched state.
20169
+ *
20170
+ * This method can be called to remove the 'ng-touched' class and set the control to its
20171
+ * untouched state (ng-untouched class). Upon compilation, a model is set as untouched
20172
+ * by default, however this function can be used to restore that state if the model has
20173
+ * already been touched by the user.
20174
+ */
20175
+ this.$setUntouched = function() {
20176
+ ctrl.$touched = false;
20177
+ ctrl.$untouched = true;
20178
+ $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS);
20179
+ };
20180
+
20181
+ /**
20182
+ * @ngdoc method
20183
+ * @name ngModel.NgModelController#$setTouched
20184
+ *
20185
+ * @description
20186
+ * Sets the control to its touched state.
20187
+ *
20188
+ * This method can be called to remove the 'ng-untouched' class and set the control to its
20189
+ * touched state (ng-touched class). A model is considered to be touched when the user has
20190
+ * first interacted (focussed) on the model input element and then shifted focus away (blurred)
20191
+ * from the input element.
20192
+ */
20193
+ this.$setTouched = function() {
20194
+ ctrl.$touched = true;
20195
+ ctrl.$untouched = false;
20196
+ $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS);
20197
+ };
20198
+
20199
+ /**
20200
+ * @ngdoc method
20201
+ * @name ngModel.NgModelController#$rollbackViewValue
20202
+ *
20203
+ * @description
20204
+ * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,
20205
+ * which may be caused by a pending debounced event or because the input is waiting for a some
20206
+ * future event.
20207
+ *
20208
+ * If you have an input that uses `ng-model-options` to set up debounced events or events such
20209
+ * as blur you can have a situation where there is a period when the `$viewValue`
20210
+ * is out of synch with the ngModel's `$modelValue`.
20211
+ *
20212
+ * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue`
20213
+ * programmatically before these debounced/future events have resolved/occurred, because Angular's
20214
+ * dirty checking mechanism is not able to tell whether the model has actually changed or not.
20215
+ *
20216
+ * The `$rollbackViewValue()` method should be called before programmatically changing the model of an
20217
+ * input which may have such events pending. This is important in order to make sure that the
20218
+ * input field will be updated with the new model value and any pending operations are cancelled.
20219
+ *
20220
+ * <example name="ng-model-cancel-update" module="cancel-update-example">
20221
+ * <file name="app.js">
20222
+ * angular.module('cancel-update-example', [])
20223
+ *
20224
+ * .controller('CancelUpdateController', ['$scope', function($scope) {
20225
+ * $scope.resetWithCancel = function (e) {
20226
+ * if (e.keyCode == 27) {
20227
+ * $scope.myForm.myInput1.$rollbackViewValue();
20228
+ * $scope.myValue = '';
20229
+ * }
20230
+ * };
20231
+ * $scope.resetWithoutCancel = function (e) {
20232
+ * if (e.keyCode == 27) {
20233
+ * $scope.myValue = '';
20234
+ * }
20235
+ * };
20236
+ * }]);
20237
+ * </file>
20238
+ * <file name="index.html">
20239
+ * <div ng-controller="CancelUpdateController">
20240
+ * <p>Try typing something in each input. See that the model only updates when you
20241
+ * blur off the input.
20242
+ * </p>
20243
+ * <p>Now see what happens if you start typing then press the Escape key</p>
20244
+ *
20245
+ * <form name="myForm" ng-model-options="{ updateOn: 'blur' }">
20246
+ * <p>With $rollbackViewValue()</p>
20247
+ * <input name="myInput1" ng-model="myValue" ng-keydown="resetWithCancel($event)"><br/>
20248
+ * myValue: "{{ myValue }}"
20249
+ *
20250
+ * <p>Without $rollbackViewValue()</p>
20251
+ * <input name="myInput2" ng-model="myValue" ng-keydown="resetWithoutCancel($event)"><br/>
20252
+ * myValue: "{{ myValue }}"
20253
+ * </form>
20254
+ * </div>
20255
+ * </file>
20256
+ * </example>
20257
+ */
20258
+ this.$rollbackViewValue = function() {
20259
+ $timeout.cancel(pendingDebounce);
20260
+ ctrl.$viewValue = ctrl.$$lastCommittedViewValue;
20261
+ ctrl.$render();
20262
+ };
20263
+
20264
+ /**
20265
+ * @ngdoc method
20266
+ * @name ngModel.NgModelController#$validate
20267
+ *
20268
+ * @description
20269
+ * Runs each of the registered validators (first synchronous validators and then asynchronous validators).
20270
+ */
20271
+ this.$validate = function() {
20272
+ // ignore $validate before model is initialized
20273
+ if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {
20274
+ return;
20275
+ }
20276
+ this.$$parseAndValidate();
20277
+ };
20278
+
20279
+ this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) {
20280
+ currentValidationRunId++;
20281
+ var localValidationRunId = currentValidationRunId;
20282
+
20283
+ // check parser error
20284
+ if (!processParseErrors(parseValid)) {
20285
+ validationDone(false);
20286
+ return;
20287
+ }
20288
+ if (!processSyncValidators()) {
20289
+ validationDone(false);
20290
+ return;
20291
+ }
20292
+ processAsyncValidators();
20293
+
20294
+ function processParseErrors(parseValid) {
20295
+ var errorKey = ctrl.$$parserName || 'parse';
20296
+ if (parseValid === undefined) {
20297
+ setValidity(errorKey, null);
20298
+ } else {
20299
+ setValidity(errorKey, parseValid);
20300
+ if (!parseValid) {
20301
+ forEach(ctrl.$validators, function(v, name) {
20302
+ setValidity(name, null);
20303
+ });
20304
+ forEach(ctrl.$asyncValidators, function(v, name) {
20305
+ setValidity(name, null);
20306
+ });
20307
+ return false;
20308
+ }
20309
+ }
20310
+ return true;
20311
+ }
20312
+
20313
+ function processSyncValidators() {
20314
+ var syncValidatorsValid = true;
20315
+ forEach(ctrl.$validators, function(validator, name) {
20316
+ var result = validator(modelValue, viewValue);
20317
+ syncValidatorsValid = syncValidatorsValid && result;
20318
+ setValidity(name, result);
20319
+ });
20320
+ if (!syncValidatorsValid) {
20321
+ forEach(ctrl.$asyncValidators, function(v, name) {
20322
+ setValidity(name, null);
20323
+ });
20324
+ return false;
20325
+ }
20326
+ return true;
20327
+ }
20328
+
20329
+ function processAsyncValidators() {
20330
+ var validatorPromises = [];
20331
+ var allValid = true;
20332
+ forEach(ctrl.$asyncValidators, function(validator, name) {
20333
+ var promise = validator(modelValue, viewValue);
20334
+ if (!isPromiseLike(promise)) {
20335
+ throw $ngModelMinErr("$asyncValidators",
20336
+ "Expected asynchronous validator to return a promise but got '{0}' instead.", promise);
20337
+ }
20338
+ setValidity(name, undefined);
20339
+ validatorPromises.push(promise.then(function() {
20340
+ setValidity(name, true);
20341
+ }, function(error) {
20342
+ allValid = false;
20343
+ setValidity(name, false);
20344
+ }));
20345
+ });
20346
+ if (!validatorPromises.length) {
20347
+ validationDone(true);
20348
+ } else {
20349
+ $q.all(validatorPromises).then(function() {
20350
+ validationDone(allValid);
20351
+ }, noop);
20352
+ }
20353
+ }
20354
+
20355
+ function setValidity(name, isValid) {
20356
+ if (localValidationRunId === currentValidationRunId) {
20357
+ ctrl.$setValidity(name, isValid);
20358
+ }
20359
+ }
20360
+
20361
+ function validationDone(allValid) {
20362
+ if (localValidationRunId === currentValidationRunId) {
20363
+
20364
+ doneCallback(allValid);
20365
+ }
20366
+ }
20367
+ };
20368
+
20369
+ /**
20370
+ * @ngdoc method
20371
+ * @name ngModel.NgModelController#$commitViewValue
20372
+ *
20373
+ * @description
20374
+ * Commit a pending update to the `$modelValue`.
20375
+ *
20376
+ * Updates may be pending by a debounced event or because the input is waiting for a some future
20377
+ * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`
20378
+ * usually handles calling this in response to input events.
20379
+ */
20380
+ this.$commitViewValue = function() {
20381
+ var viewValue = ctrl.$viewValue;
20382
+
20383
+ $timeout.cancel(pendingDebounce);
20384
+
20385
+ // If the view value has not changed then we should just exit, except in the case where there is
20386
+ // a native validator on the element. In this case the validation state may have changed even though
20387
+ // the viewValue has stayed empty.
20388
+ if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) {
20389
+ return;
20390
+ }
20391
+ ctrl.$$lastCommittedViewValue = viewValue;
20392
+
20393
+ // change to dirty
20394
+ if (ctrl.$pristine) {
20395
+ ctrl.$dirty = true;
20396
+ ctrl.$pristine = false;
20397
+ $animate.removeClass($element, PRISTINE_CLASS);
20398
+ $animate.addClass($element, DIRTY_CLASS);
20399
+ parentForm.$setDirty();
20400
+ }
20401
+ this.$$parseAndValidate();
20402
+ };
20403
+
20404
+ this.$$parseAndValidate = function() {
20405
+ var viewValue = ctrl.$$lastCommittedViewValue;
20406
+ var modelValue = viewValue;
20407
+ var parserValid = isUndefined(modelValue) ? undefined : true;
20408
+
20409
+ if (parserValid) {
20410
+ for(var i = 0; i < ctrl.$parsers.length; i++) {
20411
+ modelValue = ctrl.$parsers[i](modelValue);
20412
+ if (isUndefined(modelValue)) {
20413
+ parserValid = false;
20414
+ break;
20415
+ }
20416
+ }
20417
+ }
20418
+ if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {
20419
+ // ctrl.$modelValue has not been touched yet...
20420
+ ctrl.$modelValue = ngModelGet();
20421
+ }
20422
+ var prevModelValue = ctrl.$modelValue;
20423
+ var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
20424
+ if (allowInvalid) {
20425
+ ctrl.$modelValue = modelValue;
20426
+ writeToModelIfNeeded();
20427
+ }
20428
+ ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) {
20429
+ if (!allowInvalid) {
20430
+ // Note: Don't check ctrl.$valid here, as we could have
20431
+ // external validators (e.g. calculated on the server),
20432
+ // that just call $setValidity and need the model value
20433
+ // to calculate their validity.
20434
+ ctrl.$modelValue = allValid ? modelValue : undefined;
20435
+ writeToModelIfNeeded();
20436
+ }
20437
+ });
20438
+
20439
+ function writeToModelIfNeeded() {
20440
+ if (ctrl.$modelValue !== prevModelValue) {
20441
+ ctrl.$$writeModelToScope();
20442
+ }
20443
+ }
20444
+ };
20445
+
20446
+ this.$$writeModelToScope = function() {
20447
+ ngModelSet(ctrl.$modelValue);
20448
+ forEach(ctrl.$viewChangeListeners, function(listener) {
20449
+ try {
20450
+ listener();
20451
+ } catch(e) {
20452
+ $exceptionHandler(e);
20453
+ }
20454
+ });
20455
+ };
20456
+
20457
+ /**
20458
+ * @ngdoc method
20459
+ * @name ngModel.NgModelController#$setViewValue
20460
+ *
20461
+ * @description
20462
+ * Update the view value.
20463
+ *
20464
+ * This method should be called when an input directive want to change the view value; typically,
20465
+ * this is done from within a DOM event handler.
20466
+ *
20467
+ * For example {@link ng.directive:input input} calls it when the value of the input changes and
20468
+ * {@link ng.directive:select select} calls it when an option is selected.
20469
+ *
20470
+ * If the new `value` is an object (rather than a string or a number), we should make a copy of the
20471
+ * object before passing it to `$setViewValue`. This is because `ngModel` does not perform a deep
20472
+ * watch of objects, it only looks for a change of identity. If you only change the property of
20473
+ * the object then ngModel will not realise that the object has changed and will not invoke the
20474
+ * `$parsers` and `$validators` pipelines.
20475
+ *
20476
+ * For this reason, you should not change properties of the copy once it has been passed to
20477
+ * `$setViewValue`. Otherwise you may cause the model value on the scope to change incorrectly.
20478
+ *
20479
+ * When this method is called, the new `value` will be staged for committing through the `$parsers`
20480
+ * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged
20481
+ * value sent directly for processing, finally to be applied to `$modelValue` and then the
20482
+ * **expression** specified in the `ng-model` attribute.
20483
+ *
20484
+ * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.
20485
+ *
20486
+ * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`
20487
+ * and the `default` trigger is not listed, all those actions will remain pending until one of the
20488
+ * `updateOn` events is triggered on the DOM element.
20489
+ * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}
20490
+ * directive is used with a custom debounce for this particular event.
20491
+ *
20492
+ * Note that calling this function does not trigger a `$digest`.
20493
+ *
20494
+ * @param {string} value Value from the view.
20495
+ * @param {string} trigger Event that triggered the update.
20496
+ */
20497
+ this.$setViewValue = function(value, trigger) {
20498
+ ctrl.$viewValue = value;
20499
+ if (!ctrl.$options || ctrl.$options.updateOnDefault) {
20500
+ ctrl.$$debounceViewValueCommit(trigger);
20501
+ }
20502
+ };
20503
+
20504
+ this.$$debounceViewValueCommit = function(trigger) {
20505
+ var debounceDelay = 0,
20506
+ options = ctrl.$options,
20507
+ debounce;
20508
+
20509
+ if (options && isDefined(options.debounce)) {
20510
+ debounce = options.debounce;
20511
+ if (isNumber(debounce)) {
20512
+ debounceDelay = debounce;
20513
+ } else if (isNumber(debounce[trigger])) {
20514
+ debounceDelay = debounce[trigger];
20515
+ } else if (isNumber(debounce['default'])) {
20516
+ debounceDelay = debounce['default'];
20517
+ }
20518
+ }
20519
+
20520
+ $timeout.cancel(pendingDebounce);
20521
+ if (debounceDelay) {
20522
+ pendingDebounce = $timeout(function() {
20523
+ ctrl.$commitViewValue();
20524
+ }, debounceDelay);
20525
+ } else if ($rootScope.$$phase) {
20526
+ ctrl.$commitViewValue();
20527
+ } else {
20528
+ $scope.$apply(function() {
20529
+ ctrl.$commitViewValue();
20530
+ });
20531
+ }
20532
+ };
20533
+
20534
+ // model -> value
20535
+ // Note: we cannot use a normal scope.$watch as we want to detect the following:
20536
+ // 1. scope value is 'a'
20537
+ // 2. user enters 'b'
20538
+ // 3. ng-change kicks in and reverts scope value to 'a'
20539
+ // -> scope value did not change since the last digest as
20540
+ // ng-change executes in apply phase
20541
+ // 4. view should be changed back to 'a'
20542
+ $scope.$watch(function ngModelWatch() {
20543
+ var modelValue = ngModelGet();
20544
+
20545
+ // if scope model value and ngModel value are out of sync
20546
+ // TODO(perf): why not move this to the action fn?
20547
+ if (modelValue !== ctrl.$modelValue) {
20548
+ ctrl.$modelValue = modelValue;
20549
+
20550
+ var formatters = ctrl.$formatters,
20551
+ idx = formatters.length;
20552
+
20553
+ var viewValue = modelValue;
20554
+ while(idx--) {
20555
+ viewValue = formatters[idx](viewValue);
20556
+ }
20557
+ if (ctrl.$viewValue !== viewValue) {
20558
+ ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
20559
+ ctrl.$render();
20560
+
20561
+ ctrl.$$runValidators(undefined, modelValue, viewValue, noop);
20562
+ }
20563
+ }
20564
+
20565
+ return modelValue;
20566
+ });
20567
+}];
20568
+
20569
+
20570
+/**
20571
+ * @ngdoc directive
20572
+ * @name ngModel
20573
+ *
20574
+ * @element input
20575
+ *
20576
+ * @description
20577
+ * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a
20578
+ * property on the scope using {@link ngModel.NgModelController NgModelController},
20579
+ * which is created and exposed by this directive.
20580
+ *
20581
+ * `ngModel` is responsible for:
20582
+ *
20583
+ * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`
20584
+ * require.
20585
+ * - Providing validation behavior (i.e. required, number, email, url).
20586
+ * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors).
20587
+ * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`, `ng-untouched`) including animations.
20588
+ * - Registering the control with its parent {@link ng.directive:form form}.
20589
+ *
20590
+ * Note: `ngModel` will try to bind to the property given by evaluating the expression on the
20591
+ * current scope. If the property doesn't already exist on this scope, it will be created
20592
+ * implicitly and added to the scope.
20593
+ *
20594
+ * For best practices on using `ngModel`, see:
20595
+ *
20596
+ * - [https://github.com/angular/angular.js/wiki/Understanding-Scopes]
20597
+ *
20598
+ * For basic examples, how to use `ngModel`, see:
20599
+ *
20600
+ * - {@link ng.directive:input input}
20601
+ * - {@link input[text] text}
20602
+ * - {@link input[checkbox] checkbox}
20603
+ * - {@link input[radio] radio}
20604
+ * - {@link input[number] number}
20605
+ * - {@link input[email] email}
20606
+ * - {@link input[url] url}
20607
+ * - {@link input[date] date}
20608
+ * - {@link input[dateTimeLocal] dateTimeLocal}
20609
+ * - {@link input[time] time}
20610
+ * - {@link input[month] month}
20611
+ * - {@link input[week] week}
20612
+ * - {@link ng.directive:select select}
20613
+ * - {@link ng.directive:textarea textarea}
20614
+ *
20615
+ * # CSS classes
20616
+ * The following CSS classes are added and removed on the associated input/select/textarea element
20617
+ * depending on the validity of the model.
20618
+ *
20619
+ * - `ng-valid` is set if the model is valid.
20620
+ * - `ng-invalid` is set if the model is invalid.
20621
+ * - `ng-pristine` is set if the model is pristine.
20622
+ * - `ng-dirty` is set if the model is dirty.
20623
+ *
20624
+ * Keep in mind that ngAnimate can detect each of these classes when added and removed.
20625
+ *
20626
+ * ## Animation Hooks
20627
+ *
20628
+ * Animations within models are triggered when any of the associated CSS classes are added and removed
20629
+ * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`,
20630
+ * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.
20631
+ * The animations that are triggered within ngModel are similar to how they work in ngClass and
20632
+ * animations can be hooked into using CSS transitions, keyframes as well as JS animations.
20633
+ *
20634
+ * The following example shows a simple way to utilize CSS transitions to style an input element
20635
+ * that has been rendered as invalid after it has been validated:
20636
+ *
20637
+ * <pre>
20638
+ * //be sure to include ngAnimate as a module to hook into more
20639
+ * //advanced animations
20640
+ * .my-input {
20641
+ * transition:0.5s linear all;
20642
+ * background: white;
20643
+ * }
20644
+ * .my-input.ng-invalid {
20645
+ * background: red;
20646
+ * color:white;
20647
+ * }
20648
+ * </pre>
20649
+ *
20650
+ * @example
20651
+ * <example deps="angular-animate.js" animations="true" fixBase="true" module="inputExample">
20652
+ <file name="index.html">
20653
+ <script>
20654
+ angular.module('inputExample', [])
20655
+ .controller('ExampleController', ['$scope', function($scope) {
20656
+ $scope.val = '1';
20657
+ }]);
20658
+ </script>
20659
+ <style>
20660
+ .my-input {
20661
+ -webkit-transition:all linear 0.5s;
20662
+ transition:all linear 0.5s;
20663
+ background: transparent;
20664
+ }
20665
+ .my-input.ng-invalid {
20666
+ color:white;
20667
+ background: red;
20668
+ }
20669
+ </style>
20670
+ Update input to see transitions when valid/invalid.
20671
+ Integer is a valid value.
20672
+ <form name="testForm" ng-controller="ExampleController">
20673
+ <input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input" />
20674
+ </form>
20675
+ </file>
20676
+ * </example>
20677
+ *
20678
+ * ## Binding to a getter/setter
20679
+ *
20680
+ * Sometimes it's helpful to bind `ngModel` to a getter/setter function. A getter/setter is a
20681
+ * function that returns a representation of the model when called with zero arguments, and sets
20682
+ * the internal state of a model when called with an argument. It's sometimes useful to use this
20683
+ * for models that have an internal representation that's different than what the model exposes
20684
+ * to the view.
20685
+ *
20686
+ * <div class="alert alert-success">
20687
+ * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more
20688
+ * frequently than other parts of your code.
20689
+ * </div>
20690
+ *
20691
+ * You use this behavior by adding `ng-model-options="{ getterSetter: true }"` to an element that
20692
+ * has `ng-model` attached to it. You can also add `ng-model-options="{ getterSetter: true }"` to
20693
+ * a `<form>`, which will enable this behavior for all `<input>`s within it. See
20694
+ * {@link ng.directive:ngModelOptions `ngModelOptions`} for more.
20695
+ *
20696
+ * The following example shows how to use `ngModel` with a getter/setter:
20697
+ *
20698
+ * @example
20699
+ * <example name="ngModel-getter-setter" module="getterSetterExample">
20700
+ <file name="index.html">
20701
+ <div ng-controller="ExampleController">
20702
+ <form name="userForm">
20703
+ Name:
20704
+ <input type="text" name="userName"
20705
+ ng-model="user.name"
20706
+ ng-model-options="{ getterSetter: true }" />
20707
+ </form>
20708
+ <pre>user.name = <span ng-bind="user.name()"></span></pre>
20709
+ </div>
20710
+ </file>
20711
+ <file name="app.js">
20712
+ angular.module('getterSetterExample', [])
20713
+ .controller('ExampleController', ['$scope', function($scope) {
20714
+ var _name = 'Brian';
20715
+ $scope.user = {
20716
+ name: function (newName) {
20717
+ if (angular.isDefined(newName)) {
20718
+ _name = newName;
20719
+ }
20720
+ return _name;
20721
+ }
20722
+ };
20723
+ }]);
20724
+ </file>
20725
+ * </example>
20726
+ */
20727
+var ngModelDirective = function() {
20728
+ return {
20729
+ restrict: 'A',
20730
+ require: ['ngModel', '^?form', '^?ngModelOptions'],
20731
+ controller: NgModelController,
20732
+ // Prelink needs to run before any input directive
20733
+ // so that we can set the NgModelOptions in NgModelController
20734
+ // before anyone else uses it.
20735
+ priority: 1,
20736
+ compile: function ngModelCompile(element) {
20737
+ // Setup initial state of the control
20738
+ element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS);
20739
+
20740
+ return {
20741
+ pre: function ngModelPreLink(scope, element, attr, ctrls) {
20742
+ var modelCtrl = ctrls[0],
20743
+ formCtrl = ctrls[1] || nullFormCtrl;
20744
+
20745
+ modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options);
20746
+
20747
+ // notify others, especially parent forms
20748
+ formCtrl.$addControl(modelCtrl);
20749
+
20750
+ attr.$observe('name', function(newValue) {
20751
+ if (modelCtrl.$name !== newValue) {
20752
+ formCtrl.$$renameControl(modelCtrl, newValue);
20753
+ }
20754
+ });
20755
+
20756
+ scope.$on('$destroy', function() {
20757
+ formCtrl.$removeControl(modelCtrl);
20758
+ });
20759
+ },
20760
+ post: function ngModelPostLink(scope, element, attr, ctrls) {
20761
+ var modelCtrl = ctrls[0];
20762
+ if (modelCtrl.$options && modelCtrl.$options.updateOn) {
20763
+ element.on(modelCtrl.$options.updateOn, function(ev) {
20764
+ modelCtrl.$$debounceViewValueCommit(ev && ev.type);
20765
+ });
20766
+ }
20767
+
20768
+ element.on('blur', function(ev) {
20769
+ if (modelCtrl.$touched) return;
20770
+
20771
+ scope.$apply(function() {
20772
+ modelCtrl.$setTouched();
20773
+ });
20774
+ });
20775
+ }
20776
+ };
20777
+ }
20778
+ };
20779
+};
20780
+
20781
+
20782
+/**
20783
+ * @ngdoc directive
20784
+ * @name ngChange
20785
+ *
20786
+ * @description
20787
+ * Evaluate the given expression when the user changes the input.
20788
+ * The expression is evaluated immediately, unlike the JavaScript onchange event
20789
+ * which only triggers at the end of a change (usually, when the user leaves the
20790
+ * form element or presses the return key).
20791
+ *
20792
+ * The `ngChange` expression is only evaluated when a change in the input value causes
20793
+ * a new value to be committed to the model.
20794
+ *
20795
+ * It will not be evaluated:
20796
+ * * if the value returned from the `$parsers` transformation pipeline has not changed
20797
+ * * if the input has continued to be invalid since the model will stay `null`
20798
+ * * if the model is changed programmatically and not by a change to the input value
20799
+ *
20800
+ *
20801
+ * Note, this directive requires `ngModel` to be present.
20802
+ *
20803
+ * @element input
20804
+ * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change
20805
+ * in input value.
20806
+ *
20807
+ * @example
20808
+ * <example name="ngChange-directive" module="changeExample">
20809
+ * <file name="index.html">
20810
+ * <script>
20811
+ * angular.module('changeExample', [])
20812
+ * .controller('ExampleController', ['$scope', function($scope) {
20813
+ * $scope.counter = 0;
20814
+ * $scope.change = function() {
20815
+ * $scope.counter++;
20816
+ * };
20817
+ * }]);
20818
+ * </script>
20819
+ * <div ng-controller="ExampleController">
20820
+ * <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" />
20821
+ * <input type="checkbox" ng-model="confirmed" id="ng-change-example2" />
20822
+ * <label for="ng-change-example2">Confirmed</label><br />
20823
+ * <tt>debug = {{confirmed}}</tt><br/>
20824
+ * <tt>counter = {{counter}}</tt><br/>
20825
+ * </div>
20826
+ * </file>
20827
+ * <file name="protractor.js" type="protractor">
20828
+ * var counter = element(by.binding('counter'));
20829
+ * var debug = element(by.binding('confirmed'));
20830
+ *
20831
+ * it('should evaluate the expression if changing from view', function() {
20832
+ * expect(counter.getText()).toContain('0');
20833
+ *
20834
+ * element(by.id('ng-change-example1')).click();
20835
+ *
20836
+ * expect(counter.getText()).toContain('1');
20837
+ * expect(debug.getText()).toContain('true');
20838
+ * });
20839
+ *
20840
+ * it('should not evaluate the expression if changing from model', function() {
20841
+ * element(by.id('ng-change-example2')).click();
20842
+
20843
+ * expect(counter.getText()).toContain('0');
20844
+ * expect(debug.getText()).toContain('true');
20845
+ * });
20846
+ * </file>
20847
+ * </example>
20848
+ */
20849
+var ngChangeDirective = valueFn({
20850
+ restrict: 'A',
20851
+ require: 'ngModel',
20852
+ link: function(scope, element, attr, ctrl) {
20853
+ ctrl.$viewChangeListeners.push(function() {
20854
+ scope.$eval(attr.ngChange);
20855
+ });
20856
+ }
20857
+});
20858
+
20859
+
20860
+var requiredDirective = function() {
20861
+ return {
20862
+ restrict: 'A',
20863
+ require: '?ngModel',
20864
+ link: function(scope, elm, attr, ctrl) {
20865
+ if (!ctrl) return;
20866
+ attr.required = true; // force truthy in case we are on non input element
20867
+
20868
+ ctrl.$validators.required = function(value) {
20869
+ return !attr.required || !ctrl.$isEmpty(value);
20870
+ };
20871
+
20872
+ attr.$observe('required', function() {
20873
+ ctrl.$validate();
20874
+ });
20875
+ }
20876
+ };
20877
+};
20878
+
20879
+
20880
+var patternDirective = function() {
20881
+ return {
20882
+ restrict: 'A',
20883
+ require: '?ngModel',
20884
+ link: function(scope, elm, attr, ctrl) {
20885
+ if (!ctrl) return;
20886
+
20887
+ var regexp, patternExp = attr.ngPattern || attr.pattern;
20888
+ attr.$observe('pattern', function(regex) {
20889
+ if (isString(regex) && regex.length > 0) {
20890
+ regex = new RegExp(regex);
20891
+ }
20892
+
20893
+ if (regex && !regex.test) {
20894
+ throw minErr('ngPattern')('noregexp',
20895
+ 'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,
20896
+ regex, startingTag(elm));
20897
+ }
20898
+
20899
+ regexp = regex || undefined;
20900
+ ctrl.$validate();
20901
+ });
20902
+
20903
+ ctrl.$validators.pattern = function(value) {
20904
+ return ctrl.$isEmpty(value) || isUndefined(regexp) || regexp.test(value);
20905
+ };
20906
+ }
20907
+ };
20908
+};
20909
+
20910
+
20911
+var maxlengthDirective = function() {
20912
+ return {
20913
+ restrict: 'A',
20914
+ require: '?ngModel',
20915
+ link: function(scope, elm, attr, ctrl) {
20916
+ if (!ctrl) return;
20917
+
20918
+ var maxlength = 0;
20919
+ attr.$observe('maxlength', function(value) {
20920
+ maxlength = int(value) || 0;
20921
+ ctrl.$validate();
20922
+ });
20923
+ ctrl.$validators.maxlength = function(modelValue, viewValue) {
20924
+ return ctrl.$isEmpty(modelValue) || viewValue.length <= maxlength;
20925
+ };
20926
+ }
20927
+ };
20928
+};
20929
+
20930
+var minlengthDirective = function() {
20931
+ return {
20932
+ restrict: 'A',
20933
+ require: '?ngModel',
20934
+ link: function(scope, elm, attr, ctrl) {
20935
+ if (!ctrl) return;
20936
+
20937
+ var minlength = 0;
20938
+ attr.$observe('minlength', function(value) {
20939
+ minlength = int(value) || 0;
20940
+ ctrl.$validate();
20941
+ });
20942
+ ctrl.$validators.minlength = function(modelValue, viewValue) {
20943
+ return ctrl.$isEmpty(modelValue) || viewValue.length >= minlength;
20944
+ };
20945
+ }
20946
+ };
20947
+};
20948
+
20949
+
20950
+/**
20951
+ * @ngdoc directive
20952
+ * @name ngList
20953
+ *
20954
+ * @description
20955
+ * Text input that converts between a delimited string and an array of strings. The default
20956
+ * delimiter is a comma followed by a space - equivalent to `ng-list=", "`. You can specify a custom
20957
+ * delimiter as the value of the `ngList` attribute - for example, `ng-list=" | "`.
20958
+ *
20959
+ * The behaviour of the directive is affected by the use of the `ngTrim` attribute.
20960
+ * * If `ngTrim` is set to `"false"` then whitespace around both the separator and each
20961
+ * list item is respected. This implies that the user of the directive is responsible for
20962
+ * dealing with whitespace but also allows you to use whitespace as a delimiter, such as a
20963
+ * tab or newline character.
20964
+ * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected
20965
+ * when joining the list items back together) and whitespace around each list item is stripped
20966
+ * before it is added to the model.
20967
+ *
20968
+ * ### Example with Validation
20969
+ *
20970
+ * <example name="ngList-directive" module="listExample">
20971
+ * <file name="app.js">
20972
+ * angular.module('listExample', [])
20973
+ * .controller('ExampleController', ['$scope', function($scope) {
20974
+ * $scope.names = ['morpheus', 'neo', 'trinity'];
20975
+ * }]);
20976
+ * </file>
20977
+ * <file name="index.html">
20978
+ * <form name="myForm" ng-controller="ExampleController">
20979
+ * List: <input name="namesInput" ng-model="names" ng-list required>
20980
+ * <span class="error" ng-show="myForm.namesInput.$error.required">
20981
+ * Required!</span>
20982
+ * <br>
20983
+ * <tt>names = {{names}}</tt><br/>
20984
+ * <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>
20985
+ * <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>
20986
+ * <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
20987
+ * <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
20988
+ * </form>
20989
+ * </file>
20990
+ * <file name="protractor.js" type="protractor">
20991
+ * var listInput = element(by.model('names'));
20992
+ * var names = element(by.exactBinding('names'));
20993
+ * var valid = element(by.binding('myForm.namesInput.$valid'));
20994
+ * var error = element(by.css('span.error'));
20995
+ *
20996
+ * it('should initialize to model', function() {
20997
+ * expect(names.getText()).toContain('["morpheus","neo","trinity"]');
20998
+ * expect(valid.getText()).toContain('true');
20999
+ * expect(error.getCssValue('display')).toBe('none');
21000
+ * });
21001
+ *
21002
+ * it('should be invalid if empty', function() {
21003
+ * listInput.clear();
21004
+ * listInput.sendKeys('');
21005
+ *
21006
+ * expect(names.getText()).toContain('');
21007
+ * expect(valid.getText()).toContain('false');
21008
+ * expect(error.getCssValue('display')).not.toBe('none');
21009
+ * });
21010
+ * </file>
21011
+ * </example>
21012
+ *
21013
+ * ### Example - splitting on whitespace
21014
+ * <example name="ngList-directive-newlines">
21015
+ * <file name="index.html">
21016
+ * <textarea ng-model="list" ng-list="&#10;" ng-trim="false"></textarea>
21017
+ * <pre>{{ list | json }}</pre>
21018
+ * </file>
21019
+ * <file name="protractor.js" type="protractor">
21020
+ * it("should split the text by newlines", function() {
21021
+ * var listInput = element(by.model('list'));
21022
+ * var output = element(by.binding('list | json'));
21023
+ * listInput.sendKeys('abc\ndef\nghi');
21024
+ * expect(output.getText()).toContain('[\n "abc",\n "def",\n "ghi"\n]');
21025
+ * });
21026
+ * </file>
21027
+ * </example>
21028
+ *
21029
+ * @element input
21030
+ * @param {string=} ngList optional delimiter that should be used to split the value.
21031
+ */
21032
+var ngListDirective = function() {
21033
+ return {
21034
+ restrict: 'A',
21035
+ priority: 100,
21036
+ require: 'ngModel',
21037
+ link: function(scope, element, attr, ctrl) {
21038
+ // We want to control whitespace trimming so we use this convoluted approach
21039
+ // to access the ngList attribute, which doesn't pre-trim the attribute
21040
+ var ngList = element.attr(attr.$attr.ngList) || ', ';
21041
+ var trimValues = attr.ngTrim !== 'false';
21042
+ var separator = trimValues ? trim(ngList) : ngList;
21043
+
21044
+ var parse = function(viewValue) {
21045
+ // If the viewValue is invalid (say required but empty) it will be `undefined`
21046
+ if (isUndefined(viewValue)) return;
21047
+
21048
+ var list = [];
21049
+
21050
+ if (viewValue) {
21051
+ forEach(viewValue.split(separator), function(value) {
21052
+ if (value) list.push(trimValues ? trim(value) : value);
21053
+ });
21054
+ }
21055
+
21056
+ return list;
21057
+ };
21058
+
21059
+ ctrl.$parsers.push(parse);
21060
+ ctrl.$formatters.push(function(value) {
21061
+ if (isArray(value)) {
21062
+ return value.join(ngList);
21063
+ }
21064
+
21065
+ return undefined;
21066
+ });
21067
+
21068
+ // Override the standard $isEmpty because an empty array means the input is empty.
21069
+ ctrl.$isEmpty = function(value) {
21070
+ return !value || !value.length;
21071
+ };
21072
+ }
21073
+ };
21074
+};
21075
+
21076
+
21077
+var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
21078
+/**
21079
+ * @ngdoc directive
21080
+ * @name ngValue
21081
+ *
21082
+ * @description
21083
+ * Binds the given expression to the value of `input[select]` or `input[radio]`, so
21084
+ * that when the element is selected, the `ngModel` of that element is set to the
21085
+ * bound value.
21086
+ *
21087
+ * `ngValue` is useful when dynamically generating lists of radio buttons using `ng-repeat`, as
21088
+ * shown below.
21089
+ *
21090
+ * @element input
21091
+ * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute
21092
+ * of the `input` element
21093
+ *
21094
+ * @example
21095
+ <example name="ngValue-directive" module="valueExample">
21096
+ <file name="index.html">
21097
+ <script>
21098
+ angular.module('valueExample', [])
21099
+ .controller('ExampleController', ['$scope', function($scope) {
21100
+ $scope.names = ['pizza', 'unicorns', 'robots'];
21101
+ $scope.my = { favorite: 'unicorns' };
21102
+ }]);
21103
+ </script>
21104
+ <form ng-controller="ExampleController">
21105
+ <h2>Which is your favorite?</h2>
21106
+ <label ng-repeat="name in names" for="{{name}}">
21107
+ {{name}}
21108
+ <input type="radio"
21109
+ ng-model="my.favorite"
21110
+ ng-value="name"
21111
+ id="{{name}}"
21112
+ name="favorite">
21113
+ </label>
21114
+ <div>You chose {{my.favorite}}</div>
21115
+ </form>
21116
+ </file>
21117
+ <file name="protractor.js" type="protractor">
21118
+ var favorite = element(by.binding('my.favorite'));
21119
+
21120
+ it('should initialize to model', function() {
21121
+ expect(favorite.getText()).toContain('unicorns');
21122
+ });
21123
+ it('should bind the values to the inputs', function() {
21124
+ element.all(by.model('my.favorite')).get(0).click();
21125
+ expect(favorite.getText()).toContain('pizza');
21126
+ });
21127
+ </file>
21128
+ </example>
21129
+ */
21130
+var ngValueDirective = function() {
21131
+ return {
21132
+ restrict: 'A',
21133
+ priority: 100,
21134
+ compile: function(tpl, tplAttr) {
21135
+ if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
21136
+ return function ngValueConstantLink(scope, elm, attr) {
21137
+ attr.$set('value', scope.$eval(attr.ngValue));
21138
+ };
21139
+ } else {
21140
+ return function ngValueLink(scope, elm, attr) {
21141
+ scope.$watch(attr.ngValue, function valueWatchAction(value) {
21142
+ attr.$set('value', value);
21143
+ });
21144
+ };
21145
+ }
21146
+ }
21147
+ };
21148
+};
21149
+
21150
+/**
21151
+ * @ngdoc directive
21152
+ * @name ngModelOptions
21153
+ *
21154
+ * @description
21155
+ * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of
21156
+ * events that will trigger a model update and/or a debouncing delay so that the actual update only
21157
+ * takes place when a timer expires; this timer will be reset after another change takes place.
21158
+ *
21159
+ * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might
21160
+ * be different than the value in the actual model. This means that if you update the model you
21161
+ * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in
21162
+ * order to make sure it is synchronized with the model and that any debounced action is canceled.
21163
+ *
21164
+ * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`}
21165
+ * method is by making sure the input is placed inside a form that has a `name` attribute. This is
21166
+ * important because `form` controllers are published to the related scope under the name in their
21167
+ * `name` attribute.
21168
+ *
21169
+ * Any pending changes will take place immediately when an enclosing form is submitted via the
21170
+ * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`
21171
+ * to have access to the updated model.
21172
+ *
21173
+ * `ngModelOptions` has an effect on the element it's declared on and its descendants.
21174
+ *
21175
+ * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:
21176
+ * - `updateOn`: string specifying which event should be the input bound to. You can set several
21177
+ * events using an space delimited list. There is a special event called `default` that
21178
+ * matches the default events belonging of the control.
21179
+ * - `debounce`: integer value which contains the debounce model update value in milliseconds. A
21180
+ * value of 0 triggers an immediate update. If an object is supplied instead, you can specify a
21181
+ * custom value for each event. For example:
21182
+ * `ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }"`
21183
+ * - `allowInvalid`: boolean value which indicates that the model can be set with values that did
21184
+ * not validate correctly instead of the default behavior of setting the model to undefined.
21185
+ * - `getterSetter`: boolean value which determines whether or not to treat functions bound to
21186
+ `ngModel` as getters/setters.
21187
+ * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for
21188
+ * `<input type="date">`, `<input type="time">`, ... . Right now, the only supported value is `'UTC'`,
21189
+ * otherwise the default timezone of the browser will be used.
21190
+ *
21191
+ * @example
21192
+
21193
+ The following example shows how to override immediate updates. Changes on the inputs within the
21194
+ form will update the model only when the control loses focus (blur event). If `escape` key is
21195
+ pressed while the input field is focused, the value is reset to the value in the current model.
21196
+
21197
+ <example name="ngModelOptions-directive-blur" module="optionsExample">
21198
+ <file name="index.html">
21199
+ <div ng-controller="ExampleController">
21200
+ <form name="userForm">
21201
+ Name:
21202
+ <input type="text" name="userName"
21203
+ ng-model="user.name"
21204
+ ng-model-options="{ updateOn: 'blur' }"
21205
+ ng-keyup="cancel($event)" /><br />
21206
+
21207
+ Other data:
21208
+ <input type="text" ng-model="user.data" /><br />
21209
+ </form>
21210
+ <pre>user.name = <span ng-bind="user.name"></span></pre>
21211
+ </div>
21212
+ </file>
21213
+ <file name="app.js">
21214
+ angular.module('optionsExample', [])
21215
+ .controller('ExampleController', ['$scope', function($scope) {
21216
+ $scope.user = { name: 'say', data: '' };
21217
+
21218
+ $scope.cancel = function (e) {
21219
+ if (e.keyCode == 27) {
21220
+ $scope.userForm.userName.$rollbackViewValue();
21221
+ }
21222
+ };
21223
+ }]);
21224
+ </file>
21225
+ <file name="protractor.js" type="protractor">
21226
+ var model = element(by.binding('user.name'));
21227
+ var input = element(by.model('user.name'));
21228
+ var other = element(by.model('user.data'));
21229
+
21230
+ it('should allow custom events', function() {
21231
+ input.sendKeys(' hello');
21232
+ input.click();
21233
+ expect(model.getText()).toEqual('say');
21234
+ other.click();
21235
+ expect(model.getText()).toEqual('say hello');
21236
+ });
21237
+
21238
+ it('should $rollbackViewValue when model changes', function() {
21239
+ input.sendKeys(' hello');
21240
+ expect(input.getAttribute('value')).toEqual('say hello');
21241
+ input.sendKeys(protractor.Key.ESCAPE);
21242
+ expect(input.getAttribute('value')).toEqual('say');
21243
+ other.click();
21244
+ expect(model.getText()).toEqual('say');
21245
+ });
21246
+ </file>
21247
+ </example>
21248
+
21249
+ This one shows how to debounce model changes. Model will be updated only 1 sec after last change.
21250
+ If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.
21251
+
21252
+ <example name="ngModelOptions-directive-debounce" module="optionsExample">
21253
+ <file name="index.html">
21254
+ <div ng-controller="ExampleController">
21255
+ <form name="userForm">
21256
+ Name:
21257
+ <input type="text" name="userName"
21258
+ ng-model="user.name"
21259
+ ng-model-options="{ debounce: 1000 }" />
21260
+ <button ng-click="userForm.userName.$rollbackViewValue(); user.name=''">Clear</button><br />
21261
+ </form>
21262
+ <pre>user.name = <span ng-bind="user.name"></span></pre>
21263
+ </div>
21264
+ </file>
21265
+ <file name="app.js">
21266
+ angular.module('optionsExample', [])
21267
+ .controller('ExampleController', ['$scope', function($scope) {
21268
+ $scope.user = { name: 'say' };
21269
+ }]);
21270
+ </file>
21271
+ </example>
21272
+
21273
+ This one shows how to bind to getter/setters:
21274
+
21275
+ <example name="ngModelOptions-directive-getter-setter" module="getterSetterExample">
21276
+ <file name="index.html">
21277
+ <div ng-controller="ExampleController">
21278
+ <form name="userForm">
21279
+ Name:
21280
+ <input type="text" name="userName"
21281
+ ng-model="user.name"
21282
+ ng-model-options="{ getterSetter: true }" />
21283
+ </form>
21284
+ <pre>user.name = <span ng-bind="user.name()"></span></pre>
21285
+ </div>
21286
+ </file>
21287
+ <file name="app.js">
21288
+ angular.module('getterSetterExample', [])
21289
+ .controller('ExampleController', ['$scope', function($scope) {
21290
+ var _name = 'Brian';
21291
+ $scope.user = {
21292
+ name: function (newName) {
21293
+ return angular.isDefined(newName) ? (_name = newName) : _name;
21294
+ }
21295
+ };
21296
+ }]);
21297
+ </file>
21298
+ </example>
21299
+ */
21300
+var ngModelOptionsDirective = function() {
21301
+ return {
21302
+ restrict: 'A',
21303
+ controller: ['$scope', '$attrs', function($scope, $attrs) {
21304
+ var that = this;
21305
+ this.$options = $scope.$eval($attrs.ngModelOptions);
21306
+ // Allow adding/overriding bound events
21307
+ if (this.$options.updateOn !== undefined) {
21308
+ this.$options.updateOnDefault = false;
21309
+ // extract "default" pseudo-event from list of events that can trigger a model update
21310
+ this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {
21311
+ that.$options.updateOnDefault = true;
21312
+ return ' ';
21313
+ }));
21314
+ } else {
21315
+ this.$options.updateOnDefault = true;
21316
+ }
21317
+ }]
21318
+ };
21319
+};
21320
+
21321
+// helper methods
21322
+function addSetValidityMethod(context) {
21323
+ var ctrl = context.ctrl,
21324
+ $element = context.$element,
21325
+ classCache = {},
21326
+ set = context.set,
21327
+ unset = context.unset,
21328
+ parentForm = context.parentForm,
21329
+ $animate = context.$animate;
21330
+
21331
+ classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS));
21332
+
21333
+ ctrl.$setValidity = setValidity;
21334
+
21335
+ function setValidity(validationErrorKey, state, options) {
21336
+ if (state === undefined) {
21337
+ createAndSet('$pending', validationErrorKey, options);
21338
+ } else {
21339
+ unsetAndCleanup('$pending', validationErrorKey, options);
21340
+ }
21341
+ if (!isBoolean(state)) {
21342
+ unset(ctrl.$error, validationErrorKey, options);
21343
+ unset(ctrl.$$success, validationErrorKey, options);
21344
+ } else {
21345
+ if (state) {
21346
+ unset(ctrl.$error, validationErrorKey, options);
21347
+ set(ctrl.$$success, validationErrorKey, options);
21348
+ } else {
21349
+ set(ctrl.$error, validationErrorKey, options);
21350
+ unset(ctrl.$$success, validationErrorKey, options);
21351
+ }
21352
+ }
21353
+ if (ctrl.$pending) {
21354
+ cachedToggleClass(PENDING_CLASS, true);
21355
+ ctrl.$valid = ctrl.$invalid = undefined;
21356
+ toggleValidationCss('', null);
21357
+ } else {
21358
+ cachedToggleClass(PENDING_CLASS, false);
21359
+ ctrl.$valid = isObjectEmpty(ctrl.$error);
21360
+ ctrl.$invalid = !ctrl.$valid;
21361
+ toggleValidationCss('', ctrl.$valid);
21362
+ }
21363
+
21364
+ // re-read the state as the set/unset methods could have
21365
+ // combined state in ctrl.$error[validationError] (used for forms),
21366
+ // where setting/unsetting only increments/decrements the value,
21367
+ // and does not replace it.
21368
+ var combinedState;
21369
+ if (ctrl.$pending && ctrl.$pending[validationErrorKey]) {
21370
+ combinedState = undefined;
21371
+ } else if (ctrl.$error[validationErrorKey]) {
21372
+ combinedState = false;
21373
+ } else if (ctrl.$$success[validationErrorKey]) {
21374
+ combinedState = true;
21375
+ } else {
21376
+ combinedState = null;
21377
+ }
21378
+ toggleValidationCss(validationErrorKey, combinedState);
21379
+ parentForm.$setValidity(validationErrorKey, combinedState, ctrl);
21380
+ }
21381
+
21382
+ function createAndSet(name, value, options) {
21383
+ if (!ctrl[name]) {
21384
+ ctrl[name] = {};
21385
+ }
21386
+ set(ctrl[name], value, options);
21387
+ }
21388
+
21389
+ function unsetAndCleanup(name, value, options) {
21390
+ if (ctrl[name]) {
21391
+ unset(ctrl[name], value, options);
21392
+ }
21393
+ if (isObjectEmpty(ctrl[name])) {
21394
+ ctrl[name] = undefined;
21395
+ }
21396
+ }
21397
+
21398
+ function cachedToggleClass(className, switchValue) {
21399
+ if (switchValue && !classCache[className]) {
21400
+ $animate.addClass($element, className);
21401
+ classCache[className] = true;
21402
+ } else if (!switchValue && classCache[className]) {
21403
+ $animate.removeClass($element, className);
21404
+ classCache[className] = false;
21405
+ }
21406
+ }
21407
+
21408
+ function toggleValidationCss(validationErrorKey, isValid) {
21409
+ validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
21410
+
21411
+ cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true);
21412
+ cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false);
21413
+ }
21414
+}
21415
+
21416
+function isObjectEmpty(obj) {
21417
+ if (obj) {
21418
+ for (var prop in obj) {
21419
+ return false;
21420
+ }
21421
+ }
21422
+ return true;
21423
+}
21424
+
21425
+/**
21426
+ * @ngdoc directive
21427
+ * @name ngBind
21428
+ * @restrict AC
21429
+ *
21430
+ * @description
21431
+ * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element
21432
+ * with the value of a given expression, and to update the text content when the value of that
21433
+ * expression changes.
21434
+ *
21435
+ * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
21436
+ * `{{ expression }}` which is similar but less verbose.
21437
+ *
21438
+ * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily
21439
+ * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
21440
+ * element attribute, it makes the bindings invisible to the user while the page is loading.
21441
+ *
21442
+ * An alternative solution to this problem would be using the
21443
+ * {@link ng.directive:ngCloak ngCloak} directive.
21444
+ *
21445
+ *
21446
+ * @element ANY
21447
+ * @param {expression} ngBind {@link guide/expression Expression} to evaluate.
21448
+ *
21449
+ * @example
21450
+ * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.
21451
+ <example module="bindExample">
21452
+ <file name="index.html">
21453
+ <script>
21454
+ angular.module('bindExample', [])
21455
+ .controller('ExampleController', ['$scope', function($scope) {
21456
+ $scope.name = 'Whirled';
21457
+ }]);
21458
+ </script>
21459
+ <div ng-controller="ExampleController">
21460
+ Enter name: <input type="text" ng-model="name"><br>
21461
+ Hello <span ng-bind="name"></span>!
21462
+ </div>
21463
+ </file>
21464
+ <file name="protractor.js" type="protractor">
21465
+ it('should check ng-bind', function() {
21466
+ var nameInput = element(by.model('name'));
21467
+
21468
+ expect(element(by.binding('name')).getText()).toBe('Whirled');
21469
+ nameInput.clear();
21470
+ nameInput.sendKeys('world');
21471
+ expect(element(by.binding('name')).getText()).toBe('world');
21472
+ });
21473
+ </file>
21474
+ </example>
21475
+ */
21476
+var ngBindDirective = ['$compile', function($compile) {
21477
+ return {
21478
+ restrict: 'AC',
21479
+ compile: function ngBindCompile(templateElement) {
21480
+ $compile.$$addBindingClass(templateElement);
21481
+ return function ngBindLink(scope, element, attr) {
21482
+ $compile.$$addBindingInfo(element, attr.ngBind);
21483
+ element = element[0];
21484
+ scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
21485
+ element.textContent = value === undefined ? '' : value;
21486
+ });
21487
+ };
21488
+ }
21489
+ };
21490
+}];
21491
+
21492
+
21493
+/**
21494
+ * @ngdoc directive
21495
+ * @name ngBindTemplate
21496
+ *
21497
+ * @description
21498
+ * The `ngBindTemplate` directive specifies that the element
21499
+ * text content should be replaced with the interpolation of the template
21500
+ * in the `ngBindTemplate` attribute.
21501
+ * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`
21502
+ * expressions. This directive is needed since some HTML elements
21503
+ * (such as TITLE and OPTION) cannot contain SPAN elements.
21504
+ *
21505
+ * @element ANY
21506
+ * @param {string} ngBindTemplate template of form
21507
+ * <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.
21508
+ *
21509
+ * @example
21510
+ * Try it here: enter text in text box and watch the greeting change.
21511
+ <example module="bindExample">
21512
+ <file name="index.html">
21513
+ <script>
21514
+ angular.module('bindExample', [])
21515
+ .controller('ExampleController', ['$scope', function ($scope) {
21516
+ $scope.salutation = 'Hello';
21517
+ $scope.name = 'World';
21518
+ }]);
21519
+ </script>
21520
+ <div ng-controller="ExampleController">
21521
+ Salutation: <input type="text" ng-model="salutation"><br>
21522
+ Name: <input type="text" ng-model="name"><br>
21523
+ <pre ng-bind-template="{{salutation}} {{name}}!"></pre>
21524
+ </div>
21525
+ </file>
21526
+ <file name="protractor.js" type="protractor">
21527
+ it('should check ng-bind', function() {
21528
+ var salutationElem = element(by.binding('salutation'));
21529
+ var salutationInput = element(by.model('salutation'));
21530
+ var nameInput = element(by.model('name'));
21531
+
21532
+ expect(salutationElem.getText()).toBe('Hello World!');
21533
+
21534
+ salutationInput.clear();
21535
+ salutationInput.sendKeys('Greetings');
21536
+ nameInput.clear();
21537
+ nameInput.sendKeys('user');
21538
+
21539
+ expect(salutationElem.getText()).toBe('Greetings user!');
21540
+ });
21541
+ </file>
21542
+ </example>
21543
+ */
21544
+var ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate, $compile) {
21545
+ return {
21546
+ compile: function ngBindTemplateCompile(templateElement) {
21547
+ $compile.$$addBindingClass(templateElement);
21548
+ return function ngBindTemplateLink(scope, element, attr) {
21549
+ var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));
21550
+ $compile.$$addBindingInfo(element, interpolateFn.expressions);
21551
+ element = element[0];
21552
+ attr.$observe('ngBindTemplate', function(value) {
21553
+ element.textContent = value === undefined ? '' : value;
21554
+ });
21555
+ };
21556
+ }
21557
+ };
21558
+}];
21559
+
21560
+
21561
+/**
21562
+ * @ngdoc directive
21563
+ * @name ngBindHtml
21564
+ *
21565
+ * @description
21566
+ * Creates a binding that will innerHTML the result of evaluating the `expression` into the current
21567
+ * element in a secure way. By default, the innerHTML-ed content will be sanitized using the {@link
21568
+ * ngSanitize.$sanitize $sanitize} service. To utilize this functionality, ensure that `$sanitize`
21569
+ * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in
21570
+ * core Angular). In order to use {@link ngSanitize} in your module's dependencies, you need to
21571
+ * include "angular-sanitize.js" in your application.
21572
+ *
21573
+ * You may also bypass sanitization for values you know are safe. To do so, bind to
21574
+ * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}. See the example
21575
+ * under {@link ng.$sce#show-me-an-example-using-sce- Strict Contextual Escaping (SCE)}.
21576
+ *
21577
+ * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you
21578
+ * will have an exception (instead of an exploit.)
21579
+ *
21580
+ * @element ANY
21581
+ * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.
21582
+ *
21583
+ * @example
21584
+
21585
+ <example module="bindHtmlExample" deps="angular-sanitize.js">
21586
+ <file name="index.html">
21587
+ <div ng-controller="ExampleController">
21588
+ <p ng-bind-html="myHTML"></p>
21589
+ </div>
21590
+ </file>
21591
+
21592
+ <file name="script.js">
21593
+ angular.module('bindHtmlExample', ['ngSanitize'])
21594
+ .controller('ExampleController', ['$scope', function($scope) {
21595
+ $scope.myHTML =
21596
+ 'I am an <code>HTML</code>string with ' +
21597
+ '<a href="#">links!</a> and other <em>stuff</em>';
21598
+ }]);
21599
+ </file>
21600
+
21601
+ <file name="protractor.js" type="protractor">
21602
+ it('should check ng-bind-html', function() {
21603
+ expect(element(by.binding('myHTML')).getText()).toBe(
21604
+ 'I am an HTMLstring with links! and other stuff');
21605
+ });
21606
+ </file>
21607
+ </example>
21608
+ */
21609
+var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, $compile) {
21610
+ return {
21611
+ restrict: 'A',
21612
+ compile: function ngBindHtmlCompile(tElement, tAttrs) {
21613
+ var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);
21614
+ var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function getStringValue(value) {
21615
+ return (value || '').toString();
21616
+ });
21617
+ $compile.$$addBindingClass(tElement);
21618
+
21619
+ return function ngBindHtmlLink(scope, element, attr) {
21620
+ $compile.$$addBindingInfo(element, attr.ngBindHtml);
21621
+
21622
+ scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {
21623
+ // we re-evaluate the expr because we want a TrustedValueHolderType
21624
+ // for $sce, not a string
21625
+ element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || '');
21626
+ });
21627
+ };
21628
+ }
21629
+ };
21630
+}];
21631
+
21632
+function classDirective(name, selector) {
21633
+ name = 'ngClass' + name;
21634
+ return ['$animate', function($animate) {
21635
+ return {
21636
+ restrict: 'AC',
21637
+ link: function(scope, element, attr) {
21638
+ var oldVal;
21639
+
21640
+ scope.$watch(attr[name], ngClassWatchAction, true);
21641
+
21642
+ attr.$observe('class', function(value) {
21643
+ ngClassWatchAction(scope.$eval(attr[name]));
21644
+ });
21645
+
21646
+
21647
+ if (name !== 'ngClass') {
21648
+ scope.$watch('$index', function($index, old$index) {
21649
+ // jshint bitwise: false
21650
+ var mod = $index & 1;
21651
+ if (mod !== (old$index & 1)) {
21652
+ var classes = arrayClasses(scope.$eval(attr[name]));
21653
+ mod === selector ?
21654
+ addClasses(classes) :
21655
+ removeClasses(classes);
21656
+ }
21657
+ });
21658
+ }
21659
+
21660
+ function addClasses(classes) {
21661
+ var newClasses = digestClassCounts(classes, 1);
21662
+ attr.$addClass(newClasses);
21663
+ }
21664
+
21665
+ function removeClasses(classes) {
21666
+ var newClasses = digestClassCounts(classes, -1);
21667
+ attr.$removeClass(newClasses);
21668
+ }
21669
+
21670
+ function digestClassCounts (classes, count) {
21671
+ var classCounts = element.data('$classCounts') || {};
21672
+ var classesToUpdate = [];
21673
+ forEach(classes, function (className) {
21674
+ if (count > 0 || classCounts[className]) {
21675
+ classCounts[className] = (classCounts[className] || 0) + count;
21676
+ if (classCounts[className] === +(count > 0)) {
21677
+ classesToUpdate.push(className);
21678
+ }
21679
+ }
21680
+ });
21681
+ element.data('$classCounts', classCounts);
21682
+ return classesToUpdate.join(' ');
21683
+ }
21684
+
21685
+ function updateClasses (oldClasses, newClasses) {
21686
+ var toAdd = arrayDifference(newClasses, oldClasses);
21687
+ var toRemove = arrayDifference(oldClasses, newClasses);
21688
+ toAdd = digestClassCounts(toAdd, 1);
21689
+ toRemove = digestClassCounts(toRemove, -1);
21690
+ if (toAdd && toAdd.length) {
21691
+ $animate.addClass(element, toAdd);
21692
+ }
21693
+ if (toRemove && toRemove.length) {
21694
+ $animate.removeClass(element, toRemove);
21695
+ }
21696
+ }
21697
+
21698
+ function ngClassWatchAction(newVal) {
21699
+ if (selector === true || scope.$index % 2 === selector) {
21700
+ var newClasses = arrayClasses(newVal || []);
21701
+ if (!oldVal) {
21702
+ addClasses(newClasses);
21703
+ } else if (!equals(newVal,oldVal)) {
21704
+ var oldClasses = arrayClasses(oldVal);
21705
+ updateClasses(oldClasses, newClasses);
21706
+ }
21707
+ }
21708
+ oldVal = shallowCopy(newVal);
21709
+ }
21710
+ }
21711
+ };
21712
+
21713
+ function arrayDifference(tokens1, tokens2) {
21714
+ var values = [];
21715
+
21716
+ outer:
21717
+ for(var i = 0; i < tokens1.length; i++) {
21718
+ var token = tokens1[i];
21719
+ for(var j = 0; j < tokens2.length; j++) {
21720
+ if(token == tokens2[j]) continue outer;
21721
+ }
21722
+ values.push(token);
21723
+ }
21724
+ return values;
21725
+ }
21726
+
21727
+ function arrayClasses (classVal) {
21728
+ if (isArray(classVal)) {
21729
+ return classVal;
21730
+ } else if (isString(classVal)) {
21731
+ return classVal.split(' ');
21732
+ } else if (isObject(classVal)) {
21733
+ var classes = [], i = 0;
21734
+ forEach(classVal, function(v, k) {
21735
+ if (v) {
21736
+ classes = classes.concat(k.split(' '));
21737
+ }
21738
+ });
21739
+ return classes;
21740
+ }
21741
+ return classVal;
21742
+ }
21743
+ }];
21744
+}
21745
+
21746
+/**
21747
+ * @ngdoc directive
21748
+ * @name ngClass
21749
+ * @restrict AC
21750
+ *
21751
+ * @description
21752
+ * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding
21753
+ * an expression that represents all classes to be added.
21754
+ *
21755
+ * The directive operates in three different ways, depending on which of three types the expression
21756
+ * evaluates to:
21757
+ *
21758
+ * 1. If the expression evaluates to a string, the string should be one or more space-delimited class
21759
+ * names.
21760
+ *
21761
+ * 2. If the expression evaluates to an array, each element of the array should be a string that is
21762
+ * one or more space-delimited class names.
21763
+ *
21764
+ * 3. If the expression evaluates to an object, then for each key-value pair of the
21765
+ * object with a truthy value the corresponding key is used as a class name.
21766
+ *
21767
+ * The directive won't add duplicate classes if a particular class was already set.
21768
+ *
21769
+ * When the expression changes, the previously added classes are removed and only then the
21770
+ * new classes are added.
21771
+ *
21772
+ * @animations
21773
+ * add - happens just before the class is applied to the element
21774
+ * remove - happens just before the class is removed from the element
21775
+ *
21776
+ * @element ANY
21777
+ * @param {expression} ngClass {@link guide/expression Expression} to eval. The result
21778
+ * of the evaluation can be a string representing space delimited class
21779
+ * names, an array, or a map of class names to boolean values. In the case of a map, the
21780
+ * names of the properties whose values are truthy will be added as css classes to the
21781
+ * element.
21782
+ *
21783
+ * @example Example that demonstrates basic bindings via ngClass directive.
21784
+ <example>
21785
+ <file name="index.html">
21786
+ <p ng-class="{strike: deleted, bold: important, red: error}">Map Syntax Example</p>
21787
+ <input type="checkbox" ng-model="deleted"> deleted (apply "strike" class)<br>
21788
+ <input type="checkbox" ng-model="important"> important (apply "bold" class)<br>
21789
+ <input type="checkbox" ng-model="error"> error (apply "red" class)
21790
+ <hr>
21791
+ <p ng-class="style">Using String Syntax</p>
21792
+ <input type="text" ng-model="style" placeholder="Type: bold strike red">
21793
+ <hr>
21794
+ <p ng-class="[style1, style2, style3]">Using Array Syntax</p>
21795
+ <input ng-model="style1" placeholder="Type: bold, strike or red"><br>
21796
+ <input ng-model="style2" placeholder="Type: bold, strike or red"><br>
21797
+ <input ng-model="style3" placeholder="Type: bold, strike or red"><br>
21798
+ </file>
21799
+ <file name="style.css">
21800
+ .strike {
21801
+ text-decoration: line-through;
21802
+ }
21803
+ .bold {
21804
+ font-weight: bold;
21805
+ }
21806
+ .red {
21807
+ color: red;
21808
+ }
21809
+ </file>
21810
+ <file name="protractor.js" type="protractor">
21811
+ var ps = element.all(by.css('p'));
21812
+
21813
+ it('should let you toggle the class', function() {
21814
+
21815
+ expect(ps.first().getAttribute('class')).not.toMatch(/bold/);
21816
+ expect(ps.first().getAttribute('class')).not.toMatch(/red/);
21817
+
21818
+ element(by.model('important')).click();
21819
+ expect(ps.first().getAttribute('class')).toMatch(/bold/);
21820
+
21821
+ element(by.model('error')).click();
21822
+ expect(ps.first().getAttribute('class')).toMatch(/red/);
21823
+ });
21824
+
21825
+ it('should let you toggle string example', function() {
21826
+ expect(ps.get(1).getAttribute('class')).toBe('');
21827
+ element(by.model('style')).clear();
21828
+ element(by.model('style')).sendKeys('red');
21829
+ expect(ps.get(1).getAttribute('class')).toBe('red');
21830
+ });
21831
+
21832
+ it('array example should have 3 classes', function() {
21833
+ expect(ps.last().getAttribute('class')).toBe('');
21834
+ element(by.model('style1')).sendKeys('bold');
21835
+ element(by.model('style2')).sendKeys('strike');
21836
+ element(by.model('style3')).sendKeys('red');
21837
+ expect(ps.last().getAttribute('class')).toBe('bold strike red');
21838
+ });
21839
+ </file>
21840
+ </example>
21841
+
21842
+ ## Animations
21843
+
21844
+ The example below demonstrates how to perform animations using ngClass.
21845
+
21846
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
21847
+ <file name="index.html">
21848
+ <input id="setbtn" type="button" value="set" ng-click="myVar='my-class'">
21849
+ <input id="clearbtn" type="button" value="clear" ng-click="myVar=''">
21850
+ <br>
21851
+ <span class="base-class" ng-class="myVar">Sample Text</span>
21852
+ </file>
21853
+ <file name="style.css">
21854
+ .base-class {
21855
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
21856
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
21857
+ }
21858
+
21859
+ .base-class.my-class {
21860
+ color: red;
21861
+ font-size:3em;
21862
+ }
21863
+ </file>
21864
+ <file name="protractor.js" type="protractor">
21865
+ it('should check ng-class', function() {
21866
+ expect(element(by.css('.base-class')).getAttribute('class')).not.
21867
+ toMatch(/my-class/);
21868
+
21869
+ element(by.id('setbtn')).click();
21870
+
21871
+ expect(element(by.css('.base-class')).getAttribute('class')).
21872
+ toMatch(/my-class/);
21873
+
21874
+ element(by.id('clearbtn')).click();
21875
+
21876
+ expect(element(by.css('.base-class')).getAttribute('class')).not.
21877
+ toMatch(/my-class/);
21878
+ });
21879
+ </file>
21880
+ </example>
21881
+
21882
+
21883
+ ## ngClass and pre-existing CSS3 Transitions/Animations
21884
+ The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.
21885
+ Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder
21886
+ any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure
21887
+ to view the step by step details of {@link ng.$animate#addClass $animate.addClass} and
21888
+ {@link ng.$animate#removeClass $animate.removeClass}.
21889
+ */
21890
+var ngClassDirective = classDirective('', true);
21891
+
21892
+/**
21893
+ * @ngdoc directive
21894
+ * @name ngClassOdd
21895
+ * @restrict AC
21896
+ *
21897
+ * @description
21898
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
21899
+ * {@link ng.directive:ngClass ngClass}, except they work in
21900
+ * conjunction with `ngRepeat` and take effect only on odd (even) rows.
21901
+ *
21902
+ * This directive can be applied only within the scope of an
21903
+ * {@link ng.directive:ngRepeat ngRepeat}.
21904
+ *
21905
+ * @element ANY
21906
+ * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result
21907
+ * of the evaluation can be a string representing space delimited class names or an array.
21908
+ *
21909
+ * @example
21910
+ <example>
21911
+ <file name="index.html">
21912
+ <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
21913
+ <li ng-repeat="name in names">
21914
+ <span ng-class-odd="'odd'" ng-class-even="'even'">
21915
+ {{name}}
21916
+ </span>
21917
+ </li>
21918
+ </ol>
21919
+ </file>
21920
+ <file name="style.css">
21921
+ .odd {
21922
+ color: red;
21923
+ }
21924
+ .even {
21925
+ color: blue;
21926
+ }
21927
+ </file>
21928
+ <file name="protractor.js" type="protractor">
21929
+ it('should check ng-class-odd and ng-class-even', function() {
21930
+ expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).
21931
+ toMatch(/odd/);
21932
+ expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).
21933
+ toMatch(/even/);
21934
+ });
21935
+ </file>
21936
+ </example>
21937
+ */
21938
+var ngClassOddDirective = classDirective('Odd', 0);
21939
+
21940
+/**
21941
+ * @ngdoc directive
21942
+ * @name ngClassEven
21943
+ * @restrict AC
21944
+ *
21945
+ * @description
21946
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
21947
+ * {@link ng.directive:ngClass ngClass}, except they work in
21948
+ * conjunction with `ngRepeat` and take effect only on odd (even) rows.
21949
+ *
21950
+ * This directive can be applied only within the scope of an
21951
+ * {@link ng.directive:ngRepeat ngRepeat}.
21952
+ *
21953
+ * @element ANY
21954
+ * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The
21955
+ * result of the evaluation can be a string representing space delimited class names or an array.
21956
+ *
21957
+ * @example
21958
+ <example>
21959
+ <file name="index.html">
21960
+ <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
21961
+ <li ng-repeat="name in names">
21962
+ <span ng-class-odd="'odd'" ng-class-even="'even'">
21963
+ {{name}} &nbsp; &nbsp; &nbsp;
21964
+ </span>
21965
+ </li>
21966
+ </ol>
21967
+ </file>
21968
+ <file name="style.css">
21969
+ .odd {
21970
+ color: red;
21971
+ }
21972
+ .even {
21973
+ color: blue;
21974
+ }
21975
+ </file>
21976
+ <file name="protractor.js" type="protractor">
21977
+ it('should check ng-class-odd and ng-class-even', function() {
21978
+ expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).
21979
+ toMatch(/odd/);
21980
+ expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).
21981
+ toMatch(/even/);
21982
+ });
21983
+ </file>
21984
+ </example>
21985
+ */
21986
+var ngClassEvenDirective = classDirective('Even', 1);
21987
+
21988
+/**
21989
+ * @ngdoc directive
21990
+ * @name ngCloak
21991
+ * @restrict AC
21992
+ *
21993
+ * @description
21994
+ * The `ngCloak` directive is used to prevent the Angular html template from being briefly
21995
+ * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this
21996
+ * directive to avoid the undesirable flicker effect caused by the html template display.
21997
+ *
21998
+ * The directive can be applied to the `<body>` element, but the preferred usage is to apply
21999
+ * multiple `ngCloak` directives to small portions of the page to permit progressive rendering
22000
+ * of the browser view.
22001
+ *
22002
+ * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and
22003
+ * `angular.min.js`.
22004
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
22005
+ *
22006
+ * ```css
22007
+ * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
22008
+ * display: none !important;
22009
+ * }
22010
+ * ```
22011
+ *
22012
+ * When this css rule is loaded by the browser, all html elements (including their children) that
22013
+ * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive
22014
+ * during the compilation of the template it deletes the `ngCloak` element attribute, making
22015
+ * the compiled element visible.
22016
+ *
22017
+ * For the best result, the `angular.js` script must be loaded in the head section of the html
22018
+ * document; alternatively, the css rule above must be included in the external stylesheet of the
22019
+ * application.
22020
+ *
22021
+ * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they
22022
+ * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css
22023
+ * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below.
22024
+ *
22025
+ * @element ANY
22026
+ *
22027
+ * @example
22028
+ <example>
22029
+ <file name="index.html">
22030
+ <div id="template1" ng-cloak>{{ 'hello' }}</div>
22031
+ <div id="template2" ng-cloak class="ng-cloak">{{ 'hello IE7' }}</div>
22032
+ </file>
22033
+ <file name="protractor.js" type="protractor">
22034
+ it('should remove the template directive and css class', function() {
22035
+ expect($('#template1').getAttribute('ng-cloak')).
22036
+ toBeNull();
22037
+ expect($('#template2').getAttribute('ng-cloak')).
22038
+ toBeNull();
22039
+ });
22040
+ </file>
22041
+ </example>
22042
+ *
22043
+ */
22044
+var ngCloakDirective = ngDirective({
22045
+ compile: function(element, attr) {
22046
+ attr.$set('ngCloak', undefined);
22047
+ element.removeClass('ng-cloak');
22048
+ }
22049
+});
22050
+
22051
+/**
22052
+ * @ngdoc directive
22053
+ * @name ngController
22054
+ *
22055
+ * @description
22056
+ * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular
22057
+ * supports the principles behind the Model-View-Controller design pattern.
22058
+ *
22059
+ * MVC components in angular:
22060
+ *
22061
+ * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties
22062
+ * are accessed through bindings.
22063
+ * * View — The template (HTML with data bindings) that is rendered into the View.
22064
+ * * Controller — The `ngController` directive specifies a Controller class; the class contains business
22065
+ * logic behind the application to decorate the scope with functions and values
22066
+ *
22067
+ * Note that you can also attach controllers to the DOM by declaring it in a route definition
22068
+ * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller
22069
+ * again using `ng-controller` in the template itself. This will cause the controller to be attached
22070
+ * and executed twice.
22071
+ *
22072
+ * @element ANY
22073
+ * @scope
22074
+ * @priority 500
22075
+ * @param {expression} ngController Name of a constructor function registered with the current
22076
+ * {@link ng.$controllerProvider $controllerProvider} or an {@link guide/expression expression}
22077
+ * that on the current scope evaluates to a constructor function.
22078
+ *
22079
+ * The controller instance can be published into a scope property by specifying
22080
+ * `ng-controller="as propertyName"`.
22081
+ *
22082
+ * If the current `$controllerProvider` is configured to use globals (via
22083
+ * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may
22084
+ * also be the name of a globally accessible constructor function (not recommended).
22085
+ *
22086
+ * @example
22087
+ * Here is a simple form for editing user contact information. Adding, removing, clearing, and
22088
+ * greeting are methods declared on the controller (see source tab). These methods can
22089
+ * easily be called from the angular markup. Any changes to the data are automatically reflected
22090
+ * in the View without the need for a manual update.
22091
+ *
22092
+ * Two different declaration styles are included below:
22093
+ *
22094
+ * * one binds methods and properties directly onto the controller using `this`:
22095
+ * `ng-controller="SettingsController1 as settings"`
22096
+ * * one injects `$scope` into the controller:
22097
+ * `ng-controller="SettingsController2"`
22098
+ *
22099
+ * The second option is more common in the Angular community, and is generally used in boilerplates
22100
+ * and in this guide. However, there are advantages to binding properties directly to the controller
22101
+ * and avoiding scope.
22102
+ *
22103
+ * * Using `controller as` makes it obvious which controller you are accessing in the template when
22104
+ * multiple controllers apply to an element.
22105
+ * * If you are writing your controllers as classes you have easier access to the properties and
22106
+ * methods, which will appear on the scope, from inside the controller code.
22107
+ * * Since there is always a `.` in the bindings, you don't have to worry about prototypal
22108
+ * inheritance masking primitives.
22109
+ *
22110
+ * This example demonstrates the `controller as` syntax.
22111
+ *
22112
+ * <example name="ngControllerAs" module="controllerAsExample">
22113
+ * <file name="index.html">
22114
+ * <div id="ctrl-as-exmpl" ng-controller="SettingsController1 as settings">
22115
+ * Name: <input type="text" ng-model="settings.name"/>
22116
+ * [ <a href="" ng-click="settings.greet()">greet</a> ]<br/>
22117
+ * Contact:
22118
+ * <ul>
22119
+ * <li ng-repeat="contact in settings.contacts">
22120
+ * <select ng-model="contact.type">
22121
+ * <option>phone</option>
22122
+ * <option>email</option>
22123
+ * </select>
22124
+ * <input type="text" ng-model="contact.value"/>
22125
+ * [ <a href="" ng-click="settings.clearContact(contact)">clear</a>
22126
+ * | <a href="" ng-click="settings.removeContact(contact)">X</a> ]
22127
+ * </li>
22128
+ * <li>[ <a href="" ng-click="settings.addContact()">add</a> ]</li>
22129
+ * </ul>
22130
+ * </div>
22131
+ * </file>
22132
+ * <file name="app.js">
22133
+ * angular.module('controllerAsExample', [])
22134
+ * .controller('SettingsController1', SettingsController1);
22135
+ *
22136
+ * function SettingsController1() {
22137
+ * this.name = "John Smith";
22138
+ * this.contacts = [
22139
+ * {type: 'phone', value: '408 555 1212'},
22140
+ * {type: 'email', value: 'john.smith@example.org'} ];
22141
+ * }
22142
+ *
22143
+ * SettingsController1.prototype.greet = function() {
22144
+ * alert(this.name);
22145
+ * };
22146
+ *
22147
+ * SettingsController1.prototype.addContact = function() {
22148
+ * this.contacts.push({type: 'email', value: 'yourname@example.org'});
22149
+ * };
22150
+ *
22151
+ * SettingsController1.prototype.removeContact = function(contactToRemove) {
22152
+ * var index = this.contacts.indexOf(contactToRemove);
22153
+ * this.contacts.splice(index, 1);
22154
+ * };
22155
+ *
22156
+ * SettingsController1.prototype.clearContact = function(contact) {
22157
+ * contact.type = 'phone';
22158
+ * contact.value = '';
22159
+ * };
22160
+ * </file>
22161
+ * <file name="protractor.js" type="protractor">
22162
+ * it('should check controller as', function() {
22163
+ * var container = element(by.id('ctrl-as-exmpl'));
22164
+ * expect(container.element(by.model('settings.name'))
22165
+ * .getAttribute('value')).toBe('John Smith');
22166
+ *
22167
+ * var firstRepeat =
22168
+ * container.element(by.repeater('contact in settings.contacts').row(0));
22169
+ * var secondRepeat =
22170
+ * container.element(by.repeater('contact in settings.contacts').row(1));
22171
+ *
22172
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
22173
+ * .toBe('408 555 1212');
22174
+ *
22175
+ * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
22176
+ * .toBe('john.smith@example.org');
22177
+ *
22178
+ * firstRepeat.element(by.linkText('clear')).click();
22179
+ *
22180
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
22181
+ * .toBe('');
22182
+ *
22183
+ * container.element(by.linkText('add')).click();
22184
+ *
22185
+ * expect(container.element(by.repeater('contact in settings.contacts').row(2))
22186
+ * .element(by.model('contact.value'))
22187
+ * .getAttribute('value'))
22188
+ * .toBe('yourname@example.org');
22189
+ * });
22190
+ * </file>
22191
+ * </example>
22192
+ *
22193
+ * This example demonstrates the "attach to `$scope`" style of controller.
22194
+ *
22195
+ * <example name="ngController" module="controllerExample">
22196
+ * <file name="index.html">
22197
+ * <div id="ctrl-exmpl" ng-controller="SettingsController2">
22198
+ * Name: <input type="text" ng-model="name"/>
22199
+ * [ <a href="" ng-click="greet()">greet</a> ]<br/>
22200
+ * Contact:
22201
+ * <ul>
22202
+ * <li ng-repeat="contact in contacts">
22203
+ * <select ng-model="contact.type">
22204
+ * <option>phone</option>
22205
+ * <option>email</option>
22206
+ * </select>
22207
+ * <input type="text" ng-model="contact.value"/>
22208
+ * [ <a href="" ng-click="clearContact(contact)">clear</a>
22209
+ * | <a href="" ng-click="removeContact(contact)">X</a> ]
22210
+ * </li>
22211
+ * <li>[ <a href="" ng-click="addContact()">add</a> ]</li>
22212
+ * </ul>
22213
+ * </div>
22214
+ * </file>
22215
+ * <file name="app.js">
22216
+ * angular.module('controllerExample', [])
22217
+ * .controller('SettingsController2', ['$scope', SettingsController2]);
22218
+ *
22219
+ * function SettingsController2($scope) {
22220
+ * $scope.name = "John Smith";
22221
+ * $scope.contacts = [
22222
+ * {type:'phone', value:'408 555 1212'},
22223
+ * {type:'email', value:'john.smith@example.org'} ];
22224
+ *
22225
+ * $scope.greet = function() {
22226
+ * alert($scope.name);
22227
+ * };
22228
+ *
22229
+ * $scope.addContact = function() {
22230
+ * $scope.contacts.push({type:'email', value:'yourname@example.org'});
22231
+ * };
22232
+ *
22233
+ * $scope.removeContact = function(contactToRemove) {
22234
+ * var index = $scope.contacts.indexOf(contactToRemove);
22235
+ * $scope.contacts.splice(index, 1);
22236
+ * };
22237
+ *
22238
+ * $scope.clearContact = function(contact) {
22239
+ * contact.type = 'phone';
22240
+ * contact.value = '';
22241
+ * };
22242
+ * }
22243
+ * </file>
22244
+ * <file name="protractor.js" type="protractor">
22245
+ * it('should check controller', function() {
22246
+ * var container = element(by.id('ctrl-exmpl'));
22247
+ *
22248
+ * expect(container.element(by.model('name'))
22249
+ * .getAttribute('value')).toBe('John Smith');
22250
+ *
22251
+ * var firstRepeat =
22252
+ * container.element(by.repeater('contact in contacts').row(0));
22253
+ * var secondRepeat =
22254
+ * container.element(by.repeater('contact in contacts').row(1));
22255
+ *
22256
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
22257
+ * .toBe('408 555 1212');
22258
+ * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
22259
+ * .toBe('john.smith@example.org');
22260
+ *
22261
+ * firstRepeat.element(by.linkText('clear')).click();
22262
+ *
22263
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
22264
+ * .toBe('');
22265
+ *
22266
+ * container.element(by.linkText('add')).click();
22267
+ *
22268
+ * expect(container.element(by.repeater('contact in contacts').row(2))
22269
+ * .element(by.model('contact.value'))
22270
+ * .getAttribute('value'))
22271
+ * .toBe('yourname@example.org');
22272
+ * });
22273
+ * </file>
22274
+ *</example>
22275
+
22276
+ */
22277
+var ngControllerDirective = [function() {
22278
+ return {
22279
+ restrict: 'A',
22280
+ scope: true,
22281
+ controller: '@',
22282
+ priority: 500
22283
+ };
22284
+}];
22285
+
22286
+/**
22287
+ * @ngdoc directive
22288
+ * @name ngCsp
22289
+ *
22290
+ * @element html
22291
+ * @description
22292
+ * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.
22293
+ *
22294
+ * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.
22295
+ *
22296
+ * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).
22297
+ * For Angular to be CSP compatible there are only two things that we need to do differently:
22298
+ *
22299
+ * - don't use `Function` constructor to generate optimized value getters
22300
+ * - don't inject custom stylesheet into the document
22301
+ *
22302
+ * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`
22303
+ * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will
22304
+ * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will
22305
+ * be raised.
22306
+ *
22307
+ * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically
22308
+ * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).
22309
+ * To make those directives work in CSP mode, include the `angular-csp.css` manually.
22310
+ *
22311
+ * Angular tries to autodetect if CSP is active and automatically turn on the CSP-safe mode. This
22312
+ * autodetection however triggers a CSP error to be logged in the console:
22313
+ *
22314
+ * ```
22315
+ * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of
22316
+ * script in the following Content Security Policy directive: "default-src 'self'". Note that
22317
+ * 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
22318
+ * ```
22319
+ *
22320
+ * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`
22321
+ * directive on the root element of the application or on the `angular.js` script tag, whichever
22322
+ * appears first in the html document.
22323
+ *
22324
+ * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*
22325
+ *
22326
+ * @example
22327
+ * This example shows how to apply the `ngCsp` directive to the `html` tag.
22328
+ ```html
22329
+ <!doctype html>
22330
+ <html ng-app ng-csp>
22331
+ ...
22332
+ ...
22333
+ </html>
22334
+ ```
22335
+ * @example
22336
+ // Note: the suffix `.csp` in the example name triggers
22337
+ // csp mode in our http server!
22338
+ <example name="example.csp" module="cspExample" ng-csp="true">
22339
+ <file name="index.html">
22340
+ <div ng-controller="MainController as ctrl">
22341
+ <div>
22342
+ <button ng-click="ctrl.inc()" id="inc">Increment</button>
22343
+ <span id="counter">
22344
+ {{ctrl.counter}}
22345
+ </span>
22346
+ </div>
22347
+
22348
+ <div>
22349
+ <button ng-click="ctrl.evil()" id="evil">Evil</button>
22350
+ <span id="evilError">
22351
+ {{ctrl.evilError}}
22352
+ </span>
22353
+ </div>
22354
+ </div>
22355
+ </file>
22356
+ <file name="script.js">
22357
+ angular.module('cspExample', [])
22358
+ .controller('MainController', function() {
22359
+ this.counter = 0;
22360
+ this.inc = function() {
22361
+ this.counter++;
22362
+ };
22363
+ this.evil = function() {
22364
+ // jshint evil:true
22365
+ try {
22366
+ eval('1+2');
22367
+ } catch (e) {
22368
+ this.evilError = e.message;
22369
+ }
22370
+ };
22371
+ });
22372
+ </file>
22373
+ <file name="protractor.js" type="protractor">
22374
+ var util, webdriver;
22375
+
22376
+ var incBtn = element(by.id('inc'));
22377
+ var counter = element(by.id('counter'));
22378
+ var evilBtn = element(by.id('evil'));
22379
+ var evilError = element(by.id('evilError'));
22380
+
22381
+ function getAndClearSevereErrors() {
22382
+ return browser.manage().logs().get('browser').then(function(browserLog) {
22383
+ return browserLog.filter(function(logEntry) {
22384
+ return logEntry.level.value > webdriver.logging.Level.WARNING.value;
22385
+ });
22386
+ });
22387
+ }
22388
+
22389
+ function clearErrors() {
22390
+ getAndClearSevereErrors();
22391
+ }
22392
+
22393
+ function expectNoErrors() {
22394
+ getAndClearSevereErrors().then(function(filteredLog) {
22395
+ expect(filteredLog.length).toEqual(0);
22396
+ if (filteredLog.length) {
22397
+ console.log('browser console errors: ' + util.inspect(filteredLog));
22398
+ }
22399
+ });
22400
+ }
22401
+
22402
+ function expectError(regex) {
22403
+ getAndClearSevereErrors().then(function(filteredLog) {
22404
+ var found = false;
22405
+ filteredLog.forEach(function(log) {
22406
+ if (log.message.match(regex)) {
22407
+ found = true;
22408
+ }
22409
+ });
22410
+ if (!found) {
22411
+ throw new Error('expected an error that matches ' + regex);
22412
+ }
22413
+ });
22414
+ }
22415
+
22416
+ beforeEach(function() {
22417
+ util = require('util');
22418
+ webdriver = require('protractor/node_modules/selenium-webdriver');
22419
+ });
22420
+
22421
+ // For now, we only test on Chrome,
22422
+ // as Safari does not load the page with Protractor's injected scripts,
22423
+ // and Firefox webdriver always disables content security policy (#6358)
22424
+ if (browser.params.browser !== 'chrome') {
22425
+ return;
22426
+ }
22427
+
22428
+ it('should not report errors when the page is loaded', function() {
22429
+ // clear errors so we are not dependent on previous tests
22430
+ clearErrors();
22431
+ // Need to reload the page as the page is already loaded when
22432
+ // we come here
22433
+ browser.driver.getCurrentUrl().then(function(url) {
22434
+ browser.get(url);
22435
+ });
22436
+ expectNoErrors();
22437
+ });
22438
+
22439
+ it('should evaluate expressions', function() {
22440
+ expect(counter.getText()).toEqual('0');
22441
+ incBtn.click();
22442
+ expect(counter.getText()).toEqual('1');
22443
+ expectNoErrors();
22444
+ });
22445
+
22446
+ it('should throw and report an error when using "eval"', function() {
22447
+ evilBtn.click();
22448
+ expect(evilError.getText()).toMatch(/Content Security Policy/);
22449
+ expectError(/Content Security Policy/);
22450
+ });
22451
+ </file>
22452
+ </example>
22453
+ */
22454
+
22455
+// ngCsp is not implemented as a proper directive any more, because we need it be processed while we
22456
+// bootstrap the system (before $parse is instantiated), for this reason we just have
22457
+// the csp.isActive() fn that looks for ng-csp attribute anywhere in the current doc
22458
+
22459
+/**
22460
+ * @ngdoc directive
22461
+ * @name ngClick
22462
+ *
22463
+ * @description
22464
+ * The ngClick directive allows you to specify custom behavior when
22465
+ * an element is clicked.
22466
+ *
22467
+ * @element ANY
22468
+ * @priority 0
22469
+ * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon
22470
+ * click. ({@link guide/expression#-event- Event object is available as `$event`})
22471
+ *
22472
+ * @example
22473
+ <example>
22474
+ <file name="index.html">
22475
+ <button ng-click="count = count + 1" ng-init="count=0">
22476
+ Increment
22477
+ </button>
22478
+ <span>
22479
+ count: {{count}}
22480
+ </span>
22481
+ </file>
22482
+ <file name="protractor.js" type="protractor">
22483
+ it('should check ng-click', function() {
22484
+ expect(element(by.binding('count')).getText()).toMatch('0');
22485
+ element(by.css('button')).click();
22486
+ expect(element(by.binding('count')).getText()).toMatch('1');
22487
+ });
22488
+ </file>
22489
+ </example>
22490
+ */
22491
+/*
22492
+ * A directive that allows creation of custom onclick handlers that are defined as angular
22493
+ * expressions and are compiled and executed within the current scope.
22494
+ *
22495
+ * Events that are handled via these handler are always configured not to propagate further.
22496
+ */
22497
+var ngEventDirectives = {};
22498
+
22499
+// For events that might fire synchronously during DOM manipulation
22500
+// we need to execute their event handlers asynchronously using $evalAsync,
22501
+// so that they are not executed in an inconsistent state.
22502
+var forceAsyncEvents = {
22503
+ 'blur': true,
22504
+ 'focus': true
22505
+};
22506
+forEach(
22507
+ 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
22508
+ function(eventName) {
22509
+ var directiveName = directiveNormalize('ng-' + eventName);
22510
+ ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {
22511
+ return {
22512
+ restrict: 'A',
22513
+ compile: function($element, attr) {
22514
+ var fn = $parse(attr[directiveName]);
22515
+ return function ngEventHandler(scope, element) {
22516
+ element.on(eventName, function(event) {
22517
+ var callback = function() {
22518
+ fn(scope, {$event:event});
22519
+ };
22520
+ if (forceAsyncEvents[eventName] && $rootScope.$$phase) {
22521
+ scope.$evalAsync(callback);
22522
+ } else {
22523
+ scope.$apply(callback);
22524
+ }
22525
+ });
22526
+ };
22527
+ }
22528
+ };
22529
+ }];
22530
+ }
22531
+);
22532
+
22533
+/**
22534
+ * @ngdoc directive
22535
+ * @name ngDblclick
22536
+ *
22537
+ * @description
22538
+ * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.
22539
+ *
22540
+ * @element ANY
22541
+ * @priority 0
22542
+ * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon
22543
+ * a dblclick. (The Event object is available as `$event`)
22544
+ *
22545
+ * @example
22546
+ <example>
22547
+ <file name="index.html">
22548
+ <button ng-dblclick="count = count + 1" ng-init="count=0">
22549
+ Increment (on double click)
22550
+ </button>
22551
+ count: {{count}}
22552
+ </file>
22553
+ </example>
22554
+ */
22555
+
22556
+
22557
+/**
22558
+ * @ngdoc directive
22559
+ * @name ngMousedown
22560
+ *
22561
+ * @description
22562
+ * The ngMousedown directive allows you to specify custom behavior on mousedown event.
22563
+ *
22564
+ * @element ANY
22565
+ * @priority 0
22566
+ * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon
22567
+ * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})
22568
+ *
22569
+ * @example
22570
+ <example>
22571
+ <file name="index.html">
22572
+ <button ng-mousedown="count = count + 1" ng-init="count=0">
22573
+ Increment (on mouse down)
22574
+ </button>
22575
+ count: {{count}}
22576
+ </file>
22577
+ </example>
22578
+ */
22579
+
22580
+
22581
+/**
22582
+ * @ngdoc directive
22583
+ * @name ngMouseup
22584
+ *
22585
+ * @description
22586
+ * Specify custom behavior on mouseup event.
22587
+ *
22588
+ * @element ANY
22589
+ * @priority 0
22590
+ * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon
22591
+ * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})
22592
+ *
22593
+ * @example
22594
+ <example>
22595
+ <file name="index.html">
22596
+ <button ng-mouseup="count = count + 1" ng-init="count=0">
22597
+ Increment (on mouse up)
22598
+ </button>
22599
+ count: {{count}}
22600
+ </file>
22601
+ </example>
22602
+ */
22603
+
22604
+/**
22605
+ * @ngdoc directive
22606
+ * @name ngMouseover
22607
+ *
22608
+ * @description
22609
+ * Specify custom behavior on mouseover event.
22610
+ *
22611
+ * @element ANY
22612
+ * @priority 0
22613
+ * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon
22614
+ * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})
22615
+ *
22616
+ * @example
22617
+ <example>
22618
+ <file name="index.html">
22619
+ <button ng-mouseover="count = count + 1" ng-init="count=0">
22620
+ Increment (when mouse is over)
22621
+ </button>
22622
+ count: {{count}}
22623
+ </file>
22624
+ </example>
22625
+ */
22626
+
22627
+
22628
+/**
22629
+ * @ngdoc directive
22630
+ * @name ngMouseenter
22631
+ *
22632
+ * @description
22633
+ * Specify custom behavior on mouseenter event.
22634
+ *
22635
+ * @element ANY
22636
+ * @priority 0
22637
+ * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon
22638
+ * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})
22639
+ *
22640
+ * @example
22641
+ <example>
22642
+ <file name="index.html">
22643
+ <button ng-mouseenter="count = count + 1" ng-init="count=0">
22644
+ Increment (when mouse enters)
22645
+ </button>
22646
+ count: {{count}}
22647
+ </file>
22648
+ </example>
22649
+ */
22650
+
22651
+
22652
+/**
22653
+ * @ngdoc directive
22654
+ * @name ngMouseleave
22655
+ *
22656
+ * @description
22657
+ * Specify custom behavior on mouseleave event.
22658
+ *
22659
+ * @element ANY
22660
+ * @priority 0
22661
+ * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon
22662
+ * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})
22663
+ *
22664
+ * @example
22665
+ <example>
22666
+ <file name="index.html">
22667
+ <button ng-mouseleave="count = count + 1" ng-init="count=0">
22668
+ Increment (when mouse leaves)
22669
+ </button>
22670
+ count: {{count}}
22671
+ </file>
22672
+ </example>
22673
+ */
22674
+
22675
+
22676
+/**
22677
+ * @ngdoc directive
22678
+ * @name ngMousemove
22679
+ *
22680
+ * @description
22681
+ * Specify custom behavior on mousemove event.
22682
+ *
22683
+ * @element ANY
22684
+ * @priority 0
22685
+ * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon
22686
+ * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})
22687
+ *
22688
+ * @example
22689
+ <example>
22690
+ <file name="index.html">
22691
+ <button ng-mousemove="count = count + 1" ng-init="count=0">
22692
+ Increment (when mouse moves)
22693
+ </button>
22694
+ count: {{count}}
22695
+ </file>
22696
+ </example>
22697
+ */
22698
+
22699
+
22700
+/**
22701
+ * @ngdoc directive
22702
+ * @name ngKeydown
22703
+ *
22704
+ * @description
22705
+ * Specify custom behavior on keydown event.
22706
+ *
22707
+ * @element ANY
22708
+ * @priority 0
22709
+ * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon
22710
+ * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
22711
+ *
22712
+ * @example
22713
+ <example>
22714
+ <file name="index.html">
22715
+ <input ng-keydown="count = count + 1" ng-init="count=0">
22716
+ key down count: {{count}}
22717
+ </file>
22718
+ </example>
22719
+ */
22720
+
22721
+
22722
+/**
22723
+ * @ngdoc directive
22724
+ * @name ngKeyup
22725
+ *
22726
+ * @description
22727
+ * Specify custom behavior on keyup event.
22728
+ *
22729
+ * @element ANY
22730
+ * @priority 0
22731
+ * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon
22732
+ * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
22733
+ *
22734
+ * @example
22735
+ <example>
22736
+ <file name="index.html">
22737
+ <p>Typing in the input box below updates the key count</p>
22738
+ <input ng-keyup="count = count + 1" ng-init="count=0"> key up count: {{count}}
22739
+
22740
+ <p>Typing in the input box below updates the keycode</p>
22741
+ <input ng-keyup="event=$event">
22742
+ <p>event keyCode: {{ event.keyCode }}</p>
22743
+ <p>event altKey: {{ event.altKey }}</p>
22744
+ </file>
22745
+ </example>
22746
+ */
22747
+
22748
+
22749
+/**
22750
+ * @ngdoc directive
22751
+ * @name ngKeypress
22752
+ *
22753
+ * @description
22754
+ * Specify custom behavior on keypress event.
22755
+ *
22756
+ * @element ANY
22757
+ * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon
22758
+ * keypress. ({@link guide/expression#-event- Event object is available as `$event`}
22759
+ * and can be interrogated for keyCode, altKey, etc.)
22760
+ *
22761
+ * @example
22762
+ <example>
22763
+ <file name="index.html">
22764
+ <input ng-keypress="count = count + 1" ng-init="count=0">
22765
+ key press count: {{count}}
22766
+ </file>
22767
+ </example>
22768
+ */
22769
+
22770
+
22771
+/**
22772
+ * @ngdoc directive
22773
+ * @name ngSubmit
22774
+ *
22775
+ * @description
22776
+ * Enables binding angular expressions to onsubmit events.
22777
+ *
22778
+ * Additionally it prevents the default action (which for form means sending the request to the
22779
+ * server and reloading the current page), but only if the form does not contain `action`,
22780
+ * `data-action`, or `x-action` attributes.
22781
+ *
22782
+ * <div class="alert alert-warning">
22783
+ * **Warning:** Be careful not to cause "double-submission" by using both the `ngClick` and
22784
+ * `ngSubmit` handlers together. See the
22785
+ * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}
22786
+ * for a detailed discussion of when `ngSubmit` may be triggered.
22787
+ * </div>
22788
+ *
22789
+ * @element form
22790
+ * @priority 0
22791
+ * @param {expression} ngSubmit {@link guide/expression Expression} to eval.
22792
+ * ({@link guide/expression#-event- Event object is available as `$event`})
22793
+ *
22794
+ * @example
22795
+ <example module="submitExample">
22796
+ <file name="index.html">
22797
+ <script>
22798
+ angular.module('submitExample', [])
22799
+ .controller('ExampleController', ['$scope', function($scope) {
22800
+ $scope.list = [];
22801
+ $scope.text = 'hello';
22802
+ $scope.submit = function() {
22803
+ if ($scope.text) {
22804
+ $scope.list.push(this.text);
22805
+ $scope.text = '';
22806
+ }
22807
+ };
22808
+ }]);
22809
+ </script>
22810
+ <form ng-submit="submit()" ng-controller="ExampleController">
22811
+ Enter text and hit enter:
22812
+ <input type="text" ng-model="text" name="text" />
22813
+ <input type="submit" id="submit" value="Submit" />
22814
+ <pre>list={{list}}</pre>
22815
+ </form>
22816
+ </file>
22817
+ <file name="protractor.js" type="protractor">
22818
+ it('should check ng-submit', function() {
22819
+ expect(element(by.binding('list')).getText()).toBe('list=[]');
22820
+ element(by.css('#submit')).click();
22821
+ expect(element(by.binding('list')).getText()).toContain('hello');
22822
+ expect(element(by.model('text')).getAttribute('value')).toBe('');
22823
+ });
22824
+ it('should ignore empty strings', function() {
22825
+ expect(element(by.binding('list')).getText()).toBe('list=[]');
22826
+ element(by.css('#submit')).click();
22827
+ element(by.css('#submit')).click();
22828
+ expect(element(by.binding('list')).getText()).toContain('hello');
22829
+ });
22830
+ </file>
22831
+ </example>
22832
+ */
22833
+
22834
+/**
22835
+ * @ngdoc directive
22836
+ * @name ngFocus
22837
+ *
22838
+ * @description
22839
+ * Specify custom behavior on focus event.
22840
+ *
22841
+ * Note: As the `focus` event is executed synchronously when calling `input.focus()`
22842
+ * AngularJS executes the expression using `scope.$evalAsync` if the event is fired
22843
+ * during an `$apply` to ensure a consistent state.
22844
+ *
22845
+ * @element window, input, select, textarea, a
22846
+ * @priority 0
22847
+ * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon
22848
+ * focus. ({@link guide/expression#-event- Event object is available as `$event`})
22849
+ *
22850
+ * @example
22851
+ * See {@link ng.directive:ngClick ngClick}
22852
+ */
22853
+
22854
+/**
22855
+ * @ngdoc directive
22856
+ * @name ngBlur
22857
+ *
22858
+ * @description
22859
+ * Specify custom behavior on blur event.
22860
+ *
22861
+ * A [blur event](https://developer.mozilla.org/en-US/docs/Web/Events/blur) fires when
22862
+ * an element has lost focus.
22863
+ *
22864
+ * Note: As the `blur` event is executed synchronously also during DOM manipulations
22865
+ * (e.g. removing a focussed input),
22866
+ * AngularJS executes the expression using `scope.$evalAsync` if the event is fired
22867
+ * during an `$apply` to ensure a consistent state.
22868
+ *
22869
+ * @element window, input, select, textarea, a
22870
+ * @priority 0
22871
+ * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon
22872
+ * blur. ({@link guide/expression#-event- Event object is available as `$event`})
22873
+ *
22874
+ * @example
22875
+ * See {@link ng.directive:ngClick ngClick}
22876
+ */
22877
+
22878
+/**
22879
+ * @ngdoc directive
22880
+ * @name ngCopy
22881
+ *
22882
+ * @description
22883
+ * Specify custom behavior on copy event.
22884
+ *
22885
+ * @element window, input, select, textarea, a
22886
+ * @priority 0
22887
+ * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon
22888
+ * copy. ({@link guide/expression#-event- Event object is available as `$event`})
22889
+ *
22890
+ * @example
22891
+ <example>
22892
+ <file name="index.html">
22893
+ <input ng-copy="copied=true" ng-init="copied=false; value='copy me'" ng-model="value">
22894
+ copied: {{copied}}
22895
+ </file>
22896
+ </example>
22897
+ */
22898
+
22899
+/**
22900
+ * @ngdoc directive
22901
+ * @name ngCut
22902
+ *
22903
+ * @description
22904
+ * Specify custom behavior on cut event.
22905
+ *
22906
+ * @element window, input, select, textarea, a
22907
+ * @priority 0
22908
+ * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon
22909
+ * cut. ({@link guide/expression#-event- Event object is available as `$event`})
22910
+ *
22911
+ * @example
22912
+ <example>
22913
+ <file name="index.html">
22914
+ <input ng-cut="cut=true" ng-init="cut=false; value='cut me'" ng-model="value">
22915
+ cut: {{cut}}
22916
+ </file>
22917
+ </example>
22918
+ */
22919
+
22920
+/**
22921
+ * @ngdoc directive
22922
+ * @name ngPaste
22923
+ *
22924
+ * @description
22925
+ * Specify custom behavior on paste event.
22926
+ *
22927
+ * @element window, input, select, textarea, a
22928
+ * @priority 0
22929
+ * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon
22930
+ * paste. ({@link guide/expression#-event- Event object is available as `$event`})
22931
+ *
22932
+ * @example
22933
+ <example>
22934
+ <file name="index.html">
22935
+ <input ng-paste="paste=true" ng-init="paste=false" placeholder='paste here'>
22936
+ pasted: {{paste}}
22937
+ </file>
22938
+ </example>
22939
+ */
22940
+
22941
+/**
22942
+ * @ngdoc directive
22943
+ * @name ngIf
22944
+ * @restrict A
22945
+ *
22946
+ * @description
22947
+ * The `ngIf` directive removes or recreates a portion of the DOM tree based on an
22948
+ * {expression}. If the expression assigned to `ngIf` evaluates to a false
22949
+ * value then the element is removed from the DOM, otherwise a clone of the
22950
+ * element is reinserted into the DOM.
22951
+ *
22952
+ * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the
22953
+ * element in the DOM rather than changing its visibility via the `display` css property. A common
22954
+ * case when this difference is significant is when using css selectors that rely on an element's
22955
+ * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.
22956
+ *
22957
+ * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope
22958
+ * is created when the element is restored. The scope created within `ngIf` inherits from
22959
+ * its parent scope using
22960
+ * [prototypal inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance).
22961
+ * An important implication of this is if `ngModel` is used within `ngIf` to bind to
22962
+ * a javascript primitive defined in the parent scope. In this case any modifications made to the
22963
+ * variable within the child scope will override (hide) the value in the parent scope.
22964
+ *
22965
+ * Also, `ngIf` recreates elements using their compiled state. An example of this behavior
22966
+ * is if an element's class attribute is directly modified after it's compiled, using something like
22967
+ * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element
22968
+ * the added class will be lost because the original compiled state is used to regenerate the element.
22969
+ *
22970
+ * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`
22971
+ * and `leave` effects.
22972
+ *
22973
+ * @animations
22974
+ * enter - happens just after the `ngIf` contents change and a new DOM element is created and injected into the `ngIf` container
22975
+ * leave - happens just before the `ngIf` contents are removed from the DOM
22976
+ *
22977
+ * @element ANY
22978
+ * @scope
22979
+ * @priority 600
22980
+ * @param {expression} ngIf If the {@link guide/expression expression} is falsy then
22981
+ * the element is removed from the DOM tree. If it is truthy a copy of the compiled
22982
+ * element is added to the DOM tree.
22983
+ *
22984
+ * @example
22985
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
22986
+ <file name="index.html">
22987
+ Click me: <input type="checkbox" ng-model="checked" ng-init="checked=true" /><br/>
22988
+ Show when checked:
22989
+ <span ng-if="checked" class="animate-if">
22990
+ This is removed when the checkbox is unchecked.
22991
+ </span>
22992
+ </file>
22993
+ <file name="animations.css">
22994
+ .animate-if {
22995
+ background:white;
22996
+ border:1px solid black;
22997
+ padding:10px;
22998
+ }
22999
+
23000
+ .animate-if.ng-enter, .animate-if.ng-leave {
23001
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
23002
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
23003
+ }
23004
+
23005
+ .animate-if.ng-enter,
23006
+ .animate-if.ng-leave.ng-leave-active {
23007
+ opacity:0;
23008
+ }
23009
+
23010
+ .animate-if.ng-leave,
23011
+ .animate-if.ng-enter.ng-enter-active {
23012
+ opacity:1;
23013
+ }
23014
+ </file>
23015
+ </example>
23016
+ */
23017
+var ngIfDirective = ['$animate', function($animate) {
23018
+ return {
23019
+ multiElement: true,
23020
+ transclude: 'element',
23021
+ priority: 600,
23022
+ terminal: true,
23023
+ restrict: 'A',
23024
+ $$tlb: true,
23025
+ link: function ($scope, $element, $attr, ctrl, $transclude) {
23026
+ var block, childScope, previousElements;
23027
+ $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {
23028
+
23029
+ if (value) {
23030
+ if (!childScope) {
23031
+ $transclude(function (clone, newScope) {
23032
+ childScope = newScope;
23033
+ clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');
23034
+ // Note: We only need the first/last node of the cloned nodes.
23035
+ // However, we need to keep the reference to the jqlite wrapper as it might be changed later
23036
+ // by a directive with templateUrl when its template arrives.
23037
+ block = {
23038
+ clone: clone
23039
+ };
23040
+ $animate.enter(clone, $element.parent(), $element);
23041
+ });
23042
+ }
23043
+ } else {
23044
+ if (previousElements) {
23045
+ previousElements.remove();
23046
+ previousElements = null;
23047
+ }
23048
+ if (childScope) {
23049
+ childScope.$destroy();
23050
+ childScope = null;
23051
+ }
23052
+ if (block) {
23053
+ previousElements = getBlockNodes(block.clone);
23054
+ $animate.leave(previousElements).then(function() {
23055
+ previousElements = null;
23056
+ });
23057
+ block = null;
23058
+ }
23059
+ }
23060
+ });
23061
+ }
23062
+ };
23063
+}];
23064
+
23065
+/**
23066
+ * @ngdoc directive
23067
+ * @name ngInclude
23068
+ * @restrict ECA
23069
+ *
23070
+ * @description
23071
+ * Fetches, compiles and includes an external HTML fragment.
23072
+ *
23073
+ * By default, the template URL is restricted to the same domain and protocol as the
23074
+ * application document. This is done by calling {@link $sce#getTrustedResourceUrl
23075
+ * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols
23076
+ * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or
23077
+ * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link
23078
+ * ng.$sce Strict Contextual Escaping}.
23079
+ *
23080
+ * In addition, the browser's
23081
+ * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)
23082
+ * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)
23083
+ * policy may further restrict whether the template is successfully loaded.
23084
+ * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`
23085
+ * access on some browsers.
23086
+ *
23087
+ * @animations
23088
+ * enter - animation is used to bring new content into the browser.
23089
+ * leave - animation is used to animate existing content away.
23090
+ *
23091
+ * The enter and leave animation occur concurrently.
23092
+ *
23093
+ * @scope
23094
+ * @priority 400
23095
+ *
23096
+ * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,
23097
+ * make sure you wrap it in **single** quotes, e.g. `src="'myPartialTemplate.html'"`.
23098
+ * @param {string=} onload Expression to evaluate when a new partial is loaded.
23099
+ *
23100
+ * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll
23101
+ * $anchorScroll} to scroll the viewport after the content is loaded.
23102
+ *
23103
+ * - If the attribute is not set, disable scrolling.
23104
+ * - If the attribute is set without value, enable scrolling.
23105
+ * - Otherwise enable scrolling only if the expression evaluates to truthy value.
23106
+ *
23107
+ * @example
23108
+ <example module="includeExample" deps="angular-animate.js" animations="true">
23109
+ <file name="index.html">
23110
+ <div ng-controller="ExampleController">
23111
+ <select ng-model="template" ng-options="t.name for t in templates">
23112
+ <option value="">(blank)</option>
23113
+ </select>
23114
+ url of the template: <tt>{{template.url}}</tt>
23115
+ <hr/>
23116
+ <div class="slide-animate-container">
23117
+ <div class="slide-animate" ng-include="template.url"></div>
23118
+ </div>
23119
+ </div>
23120
+ </file>
23121
+ <file name="script.js">
23122
+ angular.module('includeExample', ['ngAnimate'])
23123
+ .controller('ExampleController', ['$scope', function($scope) {
23124
+ $scope.templates =
23125
+ [ { name: 'template1.html', url: 'template1.html'},
23126
+ { name: 'template2.html', url: 'template2.html'} ];
23127
+ $scope.template = $scope.templates[0];
23128
+ }]);
23129
+ </file>
23130
+ <file name="template1.html">
23131
+ Content of template1.html
23132
+ </file>
23133
+ <file name="template2.html">
23134
+ Content of template2.html
23135
+ </file>
23136
+ <file name="animations.css">
23137
+ .slide-animate-container {
23138
+ position:relative;
23139
+ background:white;
23140
+ border:1px solid black;
23141
+ height:40px;
23142
+ overflow:hidden;
23143
+ }
23144
+
23145
+ .slide-animate {
23146
+ padding:10px;
23147
+ }
23148
+
23149
+ .slide-animate.ng-enter, .slide-animate.ng-leave {
23150
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
23151
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
23152
+
23153
+ position:absolute;
23154
+ top:0;
23155
+ left:0;
23156
+ right:0;
23157
+ bottom:0;
23158
+ display:block;
23159
+ padding:10px;
23160
+ }
23161
+
23162
+ .slide-animate.ng-enter {
23163
+ top:-50px;
23164
+ }
23165
+ .slide-animate.ng-enter.ng-enter-active {
23166
+ top:0;
23167
+ }
23168
+
23169
+ .slide-animate.ng-leave {
23170
+ top:0;
23171
+ }
23172
+ .slide-animate.ng-leave.ng-leave-active {
23173
+ top:50px;
23174
+ }
23175
+ </file>
23176
+ <file name="protractor.js" type="protractor">
23177
+ var templateSelect = element(by.model('template'));
23178
+ var includeElem = element(by.css('[ng-include]'));
23179
+
23180
+ it('should load template1.html', function() {
23181
+ expect(includeElem.getText()).toMatch(/Content of template1.html/);
23182
+ });
23183
+
23184
+ it('should load template2.html', function() {
23185
+ if (browser.params.browser == 'firefox') {
23186
+ // Firefox can't handle using selects
23187
+ // See https://github.com/angular/protractor/issues/480
23188
+ return;
23189
+ }
23190
+ templateSelect.click();
23191
+ templateSelect.all(by.css('option')).get(2).click();
23192
+ expect(includeElem.getText()).toMatch(/Content of template2.html/);
23193
+ });
23194
+
23195
+ it('should change to blank', function() {
23196
+ if (browser.params.browser == 'firefox') {
23197
+ // Firefox can't handle using selects
23198
+ return;
23199
+ }
23200
+ templateSelect.click();
23201
+ templateSelect.all(by.css('option')).get(0).click();
23202
+ expect(includeElem.isPresent()).toBe(false);
23203
+ });
23204
+ </file>
23205
+ </example>
23206
+ */
23207
+
23208
+
23209
+/**
23210
+ * @ngdoc event
23211
+ * @name ngInclude#$includeContentRequested
23212
+ * @eventType emit on the scope ngInclude was declared in
23213
+ * @description
23214
+ * Emitted every time the ngInclude content is requested.
23215
+ *
23216
+ * @param {Object} angularEvent Synthetic event object.
23217
+ * @param {String} src URL of content to load.
23218
+ */
23219
+
23220
+
23221
+/**
23222
+ * @ngdoc event
23223
+ * @name ngInclude#$includeContentLoaded
23224
+ * @eventType emit on the current ngInclude scope
23225
+ * @description
23226
+ * Emitted every time the ngInclude content is reloaded.
23227
+ *
23228
+ * @param {Object} angularEvent Synthetic event object.
23229
+ * @param {String} src URL of content to load.
23230
+ */
23231
+
23232
+
23233
+/**
23234
+ * @ngdoc event
23235
+ * @name ngInclude#$includeContentError
23236
+ * @eventType emit on the scope ngInclude was declared in
23237
+ * @description
23238
+ * Emitted when a template HTTP request yields an erronous response (status < 200 || status > 299)
23239
+ *
23240
+ * @param {Object} angularEvent Synthetic event object.
23241
+ * @param {String} src URL of content to load.
23242
+ */
23243
+var ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate', '$sce',
23244
+ function($templateRequest, $anchorScroll, $animate, $sce) {
23245
+ return {
23246
+ restrict: 'ECA',
23247
+ priority: 400,
23248
+ terminal: true,
23249
+ transclude: 'element',
23250
+ controller: angular.noop,
23251
+ compile: function(element, attr) {
23252
+ var srcExp = attr.ngInclude || attr.src,
23253
+ onloadExp = attr.onload || '',
23254
+ autoScrollExp = attr.autoscroll;
23255
+
23256
+ return function(scope, $element, $attr, ctrl, $transclude) {
23257
+ var changeCounter = 0,
23258
+ currentScope,
23259
+ previousElement,
23260
+ currentElement;
23261
+
23262
+ var cleanupLastIncludeContent = function() {
23263
+ if(previousElement) {
23264
+ previousElement.remove();
23265
+ previousElement = null;
23266
+ }
23267
+ if(currentScope) {
23268
+ currentScope.$destroy();
23269
+ currentScope = null;
23270
+ }
23271
+ if(currentElement) {
23272
+ $animate.leave(currentElement).then(function() {
23273
+ previousElement = null;
23274
+ });
23275
+ previousElement = currentElement;
23276
+ currentElement = null;
23277
+ }
23278
+ };
23279
+
23280
+ scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {
23281
+ var afterAnimation = function() {
23282
+ if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {
23283
+ $anchorScroll();
23284
+ }
23285
+ };
23286
+ var thisChangeId = ++changeCounter;
23287
+
23288
+ if (src) {
23289
+ //set the 2nd param to true to ignore the template request error so that the inner
23290
+ //contents and scope can be cleaned up.
23291
+ $templateRequest(src, true).then(function(response) {
23292
+ if (thisChangeId !== changeCounter) return;
23293
+ var newScope = scope.$new();
23294
+ ctrl.template = response;
23295
+
23296
+ // Note: This will also link all children of ng-include that were contained in the original
23297
+ // html. If that content contains controllers, ... they could pollute/change the scope.
23298
+ // However, using ng-include on an element with additional content does not make sense...
23299
+ // Note: We can't remove them in the cloneAttchFn of $transclude as that
23300
+ // function is called before linking the content, which would apply child
23301
+ // directives to non existing elements.
23302
+ var clone = $transclude(newScope, function(clone) {
23303
+ cleanupLastIncludeContent();
23304
+ $animate.enter(clone, null, $element).then(afterAnimation);
23305
+ });
23306
+
23307
+ currentScope = newScope;
23308
+ currentElement = clone;
23309
+
23310
+ currentScope.$emit('$includeContentLoaded', src);
23311
+ scope.$eval(onloadExp);
23312
+ }, function() {
23313
+ if (thisChangeId === changeCounter) {
23314
+ cleanupLastIncludeContent();
23315
+ scope.$emit('$includeContentError', src);
23316
+ }
23317
+ });
23318
+ scope.$emit('$includeContentRequested', src);
23319
+ } else {
23320
+ cleanupLastIncludeContent();
23321
+ ctrl.template = null;
23322
+ }
23323
+ });
23324
+ };
23325
+ }
23326
+ };
23327
+}];
23328
+
23329
+// This directive is called during the $transclude call of the first `ngInclude` directive.
23330
+// It will replace and compile the content of the element with the loaded template.
23331
+// We need this directive so that the element content is already filled when
23332
+// the link function of another directive on the same element as ngInclude
23333
+// is called.
23334
+var ngIncludeFillContentDirective = ['$compile',
23335
+ function($compile) {
23336
+ return {
23337
+ restrict: 'ECA',
23338
+ priority: -400,
23339
+ require: 'ngInclude',
23340
+ link: function(scope, $element, $attr, ctrl) {
23341
+ if (/SVG/.test($element[0].toString())) {
23342
+ // WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not
23343
+ // support innerHTML, so detect this here and try to generate the contents
23344
+ // specially.
23345
+ $element.empty();
23346
+ $compile(jqLiteBuildFragment(ctrl.template, document).childNodes)(scope,
23347
+ function namespaceAdaptedClone(clone) {
23348
+ $element.append(clone);
23349
+ }, undefined, undefined, $element);
23350
+ return;
23351
+ }
23352
+
23353
+ $element.html(ctrl.template);
23354
+ $compile($element.contents())(scope);
23355
+ }
23356
+ };
23357
+ }];
23358
+
23359
+/**
23360
+ * @ngdoc directive
23361
+ * @name ngInit
23362
+ * @restrict AC
23363
+ *
23364
+ * @description
23365
+ * The `ngInit` directive allows you to evaluate an expression in the
23366
+ * current scope.
23367
+ *
23368
+ * <div class="alert alert-error">
23369
+ * The only appropriate use of `ngInit` is for aliasing special properties of
23370
+ * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you
23371
+ * should use {@link guide/controller controllers} rather than `ngInit`
23372
+ * to initialize values on a scope.
23373
+ * </div>
23374
+ * <div class="alert alert-warning">
23375
+ * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make
23376
+ * sure you have parenthesis for correct precedence:
23377
+ * <pre class="prettyprint">
23378
+ * <div ng-init="test1 = (data | orderBy:'name')"></div>
23379
+ * </pre>
23380
+ * </div>
23381
+ *
23382
+ * @priority 450
23383
+ *
23384
+ * @element ANY
23385
+ * @param {expression} ngInit {@link guide/expression Expression} to eval.
23386
+ *
23387
+ * @example
23388
+ <example module="initExample">
23389
+ <file name="index.html">
23390
+ <script>
23391
+ angular.module('initExample', [])
23392
+ .controller('ExampleController', ['$scope', function($scope) {
23393
+ $scope.list = [['a', 'b'], ['c', 'd']];
23394
+ }]);
23395
+ </script>
23396
+ <div ng-controller="ExampleController">
23397
+ <div ng-repeat="innerList in list" ng-init="outerIndex = $index">
23398
+ <div ng-repeat="value in innerList" ng-init="innerIndex = $index">
23399
+ <span class="example-init">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>
23400
+ </div>
23401
+ </div>
23402
+ </div>
23403
+ </file>
23404
+ <file name="protractor.js" type="protractor">
23405
+ it('should alias index positions', function() {
23406
+ var elements = element.all(by.css('.example-init'));
23407
+ expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');
23408
+ expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');
23409
+ expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');
23410
+ expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');
23411
+ });
23412
+ </file>
23413
+ </example>
23414
+ */
23415
+var ngInitDirective = ngDirective({
23416
+ priority: 450,
23417
+ compile: function() {
23418
+ return {
23419
+ pre: function(scope, element, attrs) {
23420
+ scope.$eval(attrs.ngInit);
23421
+ }
23422
+ };
23423
+ }
23424
+});
23425
+
23426
+/**
23427
+ * @ngdoc directive
23428
+ * @name ngNonBindable
23429
+ * @restrict AC
23430
+ * @priority 1000
23431
+ *
23432
+ * @description
23433
+ * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current
23434
+ * DOM element. This is useful if the element contains what appears to be Angular directives and
23435
+ * bindings but which should be ignored by Angular. This could be the case if you have a site that
23436
+ * displays snippets of code, for instance.
23437
+ *
23438
+ * @element ANY
23439
+ *
23440
+ * @example
23441
+ * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,
23442
+ * but the one wrapped in `ngNonBindable` is left alone.
23443
+ *
23444
+ * @example
23445
+ <example>
23446
+ <file name="index.html">
23447
+ <div>Normal: {{1 + 2}}</div>
23448
+ <div ng-non-bindable>Ignored: {{1 + 2}}</div>
23449
+ </file>
23450
+ <file name="protractor.js" type="protractor">
23451
+ it('should check ng-non-bindable', function() {
23452
+ expect(element(by.binding('1 + 2')).getText()).toContain('3');
23453
+ expect(element.all(by.css('div')).last().getText()).toMatch(/1 \+ 2/);
23454
+ });
23455
+ </file>
23456
+ </example>
23457
+ */
23458
+var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
23459
+
23460
+/**
23461
+ * @ngdoc directive
23462
+ * @name ngPluralize
23463
+ * @restrict EA
23464
+ *
23465
+ * @description
23466
+ * `ngPluralize` is a directive that displays messages according to en-US localization rules.
23467
+ * These rules are bundled with angular.js, but can be overridden
23468
+ * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive
23469
+ * by specifying the mappings between
23470
+ * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)
23471
+ * and the strings to be displayed.
23472
+ *
23473
+ * # Plural categories and explicit number rules
23474
+ * There are two
23475
+ * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)
23476
+ * in Angular's default en-US locale: "one" and "other".
23477
+ *
23478
+ * While a plural category may match many numbers (for example, in en-US locale, "other" can match
23479
+ * any number that is not 1), an explicit number rule can only match one number. For example, the
23480
+ * explicit number rule for "3" matches the number 3. There are examples of plural categories
23481
+ * and explicit number rules throughout the rest of this documentation.
23482
+ *
23483
+ * # Configuring ngPluralize
23484
+ * You configure ngPluralize by providing 2 attributes: `count` and `when`.
23485
+ * You can also provide an optional attribute, `offset`.
23486
+ *
23487
+ * The value of the `count` attribute can be either a string or an {@link guide/expression
23488
+ * Angular expression}; these are evaluated on the current scope for its bound value.
23489
+ *
23490
+ * The `when` attribute specifies the mappings between plural categories and the actual
23491
+ * string to be displayed. The value of the attribute should be a JSON object.
23492
+ *
23493
+ * The following example shows how to configure ngPluralize:
23494
+ *
23495
+ * ```html
23496
+ * <ng-pluralize count="personCount"
23497
+ when="{'0': 'Nobody is viewing.',
23498
+ * 'one': '1 person is viewing.',
23499
+ * 'other': '{} people are viewing.'}">
23500
+ * </ng-pluralize>
23501
+ *```
23502
+ *
23503
+ * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not
23504
+ * specify this rule, 0 would be matched to the "other" category and "0 people are viewing"
23505
+ * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for
23506
+ * other numbers, for example 12, so that instead of showing "12 people are viewing", you can
23507
+ * show "a dozen people are viewing".
23508
+ *
23509
+ * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted
23510
+ * into pluralized strings. In the previous example, Angular will replace `{}` with
23511
+ * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder
23512
+ * for <span ng-non-bindable>{{numberExpression}}</span>.
23513
+ *
23514
+ * # Configuring ngPluralize with offset
23515
+ * The `offset` attribute allows further customization of pluralized text, which can result in
23516
+ * a better user experience. For example, instead of the message "4 people are viewing this document",
23517
+ * you might display "John, Kate and 2 others are viewing this document".
23518
+ * The offset attribute allows you to offset a number by any desired value.
23519
+ * Let's take a look at an example:
23520
+ *
23521
+ * ```html
23522
+ * <ng-pluralize count="personCount" offset=2
23523
+ * when="{'0': 'Nobody is viewing.',
23524
+ * '1': '{{person1}} is viewing.',
23525
+ * '2': '{{person1}} and {{person2}} are viewing.',
23526
+ * 'one': '{{person1}}, {{person2}} and one other person are viewing.',
23527
+ * 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
23528
+ * </ng-pluralize>
23529
+ * ```
23530
+ *
23531
+ * Notice that we are still using two plural categories(one, other), but we added
23532
+ * three explicit number rules 0, 1 and 2.
23533
+ * When one person, perhaps John, views the document, "John is viewing" will be shown.
23534
+ * When three people view the document, no explicit number rule is found, so
23535
+ * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
23536
+ * In this case, plural category 'one' is matched and "John, Mary and one other person are viewing"
23537
+ * is shown.
23538
+ *
23539
+ * Note that when you specify offsets, you must provide explicit number rules for
23540
+ * numbers from 0 up to and including the offset. If you use an offset of 3, for example,
23541
+ * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for
23542
+ * plural categories "one" and "other".
23543
+ *
23544
+ * @param {string|expression} count The variable to be bound to.
23545
+ * @param {string} when The mapping between plural category to its corresponding strings.
23546
+ * @param {number=} offset Offset to deduct from the total number.
23547
+ *
23548
+ * @example
23549
+ <example module="pluralizeExample">
23550
+ <file name="index.html">
23551
+ <script>
23552
+ angular.module('pluralizeExample', [])
23553
+ .controller('ExampleController', ['$scope', function($scope) {
23554
+ $scope.person1 = 'Igor';
23555
+ $scope.person2 = 'Misko';
23556
+ $scope.personCount = 1;
23557
+ }]);
23558
+ </script>
23559
+ <div ng-controller="ExampleController">
23560
+ Person 1:<input type="text" ng-model="person1" value="Igor" /><br/>
23561
+ Person 2:<input type="text" ng-model="person2" value="Misko" /><br/>
23562
+ Number of People:<input type="text" ng-model="personCount" value="1" /><br/>
23563
+
23564
+ <!--- Example with simple pluralization rules for en locale --->
23565
+ Without Offset:
23566
+ <ng-pluralize count="personCount"
23567
+ when="{'0': 'Nobody is viewing.',
23568
+ 'one': '1 person is viewing.',
23569
+ 'other': '{} people are viewing.'}">
23570
+ </ng-pluralize><br>
23571
+
23572
+ <!--- Example with offset --->
23573
+ With Offset(2):
23574
+ <ng-pluralize count="personCount" offset=2
23575
+ when="{'0': 'Nobody is viewing.',
23576
+ '1': '{{person1}} is viewing.',
23577
+ '2': '{{person1}} and {{person2}} are viewing.',
23578
+ 'one': '{{person1}}, {{person2}} and one other person are viewing.',
23579
+ 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
23580
+ </ng-pluralize>
23581
+ </div>
23582
+ </file>
23583
+ <file name="protractor.js" type="protractor">
23584
+ it('should show correct pluralized string', function() {
23585
+ var withoutOffset = element.all(by.css('ng-pluralize')).get(0);
23586
+ var withOffset = element.all(by.css('ng-pluralize')).get(1);
23587
+ var countInput = element(by.model('personCount'));
23588
+
23589
+ expect(withoutOffset.getText()).toEqual('1 person is viewing.');
23590
+ expect(withOffset.getText()).toEqual('Igor is viewing.');
23591
+
23592
+ countInput.clear();
23593
+ countInput.sendKeys('0');
23594
+
23595
+ expect(withoutOffset.getText()).toEqual('Nobody is viewing.');
23596
+ expect(withOffset.getText()).toEqual('Nobody is viewing.');
23597
+
23598
+ countInput.clear();
23599
+ countInput.sendKeys('2');
23600
+
23601
+ expect(withoutOffset.getText()).toEqual('2 people are viewing.');
23602
+ expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');
23603
+
23604
+ countInput.clear();
23605
+ countInput.sendKeys('3');
23606
+
23607
+ expect(withoutOffset.getText()).toEqual('3 people are viewing.');
23608
+ expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');
23609
+
23610
+ countInput.clear();
23611
+ countInput.sendKeys('4');
23612
+
23613
+ expect(withoutOffset.getText()).toEqual('4 people are viewing.');
23614
+ expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');
23615
+ });
23616
+ it('should show data-bound names', function() {
23617
+ var withOffset = element.all(by.css('ng-pluralize')).get(1);
23618
+ var personCount = element(by.model('personCount'));
23619
+ var person1 = element(by.model('person1'));
23620
+ var person2 = element(by.model('person2'));
23621
+ personCount.clear();
23622
+ personCount.sendKeys('4');
23623
+ person1.clear();
23624
+ person1.sendKeys('Di');
23625
+ person2.clear();
23626
+ person2.sendKeys('Vojta');
23627
+ expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');
23628
+ });
23629
+ </file>
23630
+ </example>
23631
+ */
23632
+var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {
23633
+ var BRACE = /{}/g;
23634
+ return {
23635
+ restrict: 'EA',
23636
+ link: function(scope, element, attr) {
23637
+ var numberExp = attr.count,
23638
+ whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs
23639
+ offset = attr.offset || 0,
23640
+ whens = scope.$eval(whenExp) || {},
23641
+ whensExpFns = {},
23642
+ startSymbol = $interpolate.startSymbol(),
23643
+ endSymbol = $interpolate.endSymbol(),
23644
+ isWhen = /^when(Minus)?(.+)$/;
23645
+
23646
+ forEach(attr, function(expression, attributeName) {
23647
+ if (isWhen.test(attributeName)) {
23648
+ whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] =
23649
+ element.attr(attr.$attr[attributeName]);
23650
+ }
23651
+ });
23652
+ forEach(whens, function(expression, key) {
23653
+ whensExpFns[key] =
23654
+ $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +
23655
+ offset + endSymbol));
23656
+ });
23657
+
23658
+ scope.$watch(function ngPluralizeWatch() {
23659
+ var value = parseFloat(scope.$eval(numberExp));
23660
+
23661
+ if (!isNaN(value)) {
23662
+ //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,
23663
+ //check it against pluralization rules in $locale service
23664
+ if (!(value in whens)) value = $locale.pluralCat(value - offset);
23665
+ return whensExpFns[value](scope);
23666
+ } else {
23667
+ return '';
23668
+ }
23669
+ }, function ngPluralizeWatchAction(newVal) {
23670
+ element.text(newVal);
23671
+ });
23672
+ }
23673
+ };
23674
+}];
23675
+
23676
+/**
23677
+ * @ngdoc directive
23678
+ * @name ngRepeat
23679
+ *
23680
+ * @description
23681
+ * The `ngRepeat` directive instantiates a template once per item from a collection. Each template
23682
+ * instance gets its own scope, where the given loop variable is set to the current collection item,
23683
+ * and `$index` is set to the item index or key.
23684
+ *
23685
+ * Special properties are exposed on the local scope of each template instance, including:
23686
+ *
23687
+ * | Variable | Type | Details |
23688
+ * |-----------|-----------------|-----------------------------------------------------------------------------|
23689
+ * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) |
23690
+ * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. |
23691
+ * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |
23692
+ * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. |
23693
+ * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). |
23694
+ * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). |
23695
+ *
23696
+ * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.
23697
+ * This may be useful when, for instance, nesting ngRepeats.
23698
+ *
23699
+ * # Special repeat start and end points
23700
+ * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
23701
+ * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
23702
+ * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)
23703
+ * up to and including the ending HTML tag where **ng-repeat-end** is placed.
23704
+ *
23705
+ * The example below makes use of this feature:
23706
+ * ```html
23707
+ * <header ng-repeat-start="item in items">
23708
+ * Header {{ item }}
23709
+ * </header>
23710
+ * <div class="body">
23711
+ * Body {{ item }}
23712
+ * </div>
23713
+ * <footer ng-repeat-end>
23714
+ * Footer {{ item }}
23715
+ * </footer>
23716
+ * ```
23717
+ *
23718
+ * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:
23719
+ * ```html
23720
+ * <header>
23721
+ * Header A
23722
+ * </header>
23723
+ * <div class="body">
23724
+ * Body A
23725
+ * </div>
23726
+ * <footer>
23727
+ * Footer A
23728
+ * </footer>
23729
+ * <header>
23730
+ * Header B
23731
+ * </header>
23732
+ * <div class="body">
23733
+ * Body B
23734
+ * </div>
23735
+ * <footer>
23736
+ * Footer B
23737
+ * </footer>
23738
+ * ```
23739
+ *
23740
+ * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such
23741
+ * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).
23742
+ *
23743
+ * @animations
23744
+ * **.enter** - when a new item is added to the list or when an item is revealed after a filter
23745
+ *
23746
+ * **.leave** - when an item is removed from the list or when an item is filtered out
23747
+ *
23748
+ * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered
23749
+ *
23750
+ * @element ANY
23751
+ * @scope
23752
+ * @priority 1000
23753
+ * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These
23754
+ * formats are currently supported:
23755
+ *
23756
+ * * `variable in expression` – where variable is the user defined loop variable and `expression`
23757
+ * is a scope expression giving the collection to enumerate.
23758
+ *
23759
+ * For example: `album in artist.albums`.
23760
+ *
23761
+ * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,
23762
+ * and `expression` is the scope expression giving the collection to enumerate.
23763
+ *
23764
+ * For example: `(name, age) in {'adam':10, 'amalie':12}`.
23765
+ *
23766
+ * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function
23767
+ * which can be used to associate the objects in the collection with the DOM elements. If no tracking function
23768
+ * is specified the ng-repeat associates elements by identity in the collection. It is an error to have
23769
+ * more than one tracking function to resolve to the same key. (This would mean that two distinct objects are
23770
+ * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression,
23771
+ * before specifying a tracking expression.
23772
+ *
23773
+ * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
23774
+ * will be associated by item identity in the array.
23775
+ *
23776
+ * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique
23777
+ * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements
23778
+ * with the corresponding item in the array by identity. Moving the same object in array would move the DOM
23779
+ * element in the same way in the DOM.
23780
+ *
23781
+ * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this
23782
+ * case the object identity does not matter. Two objects are considered equivalent as long as their `id`
23783
+ * property is same.
23784
+ *
23785
+ * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter
23786
+ * to items in conjunction with a tracking expression.
23787
+ *
23788
+ * * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the
23789
+ * intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message
23790
+ * when a filter is active on the repeater, but the filtered result set is empty.
23791
+ *
23792
+ * For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after
23793
+ * the items have been processed through the filter.
23794
+ *
23795
+ * @example
23796
+ * This example initializes the scope to a list of names and
23797
+ * then uses `ngRepeat` to display every person:
23798
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
23799
+ <file name="index.html">
23800
+ <div ng-init="friends = [
23801
+ {name:'John', age:25, gender:'boy'},
23802
+ {name:'Jessie', age:30, gender:'girl'},
23803
+ {name:'Johanna', age:28, gender:'girl'},
23804
+ {name:'Joy', age:15, gender:'girl'},
23805
+ {name:'Mary', age:28, gender:'girl'},
23806
+ {name:'Peter', age:95, gender:'boy'},
23807
+ {name:'Sebastian', age:50, gender:'boy'},
23808
+ {name:'Erika', age:27, gender:'girl'},
23809
+ {name:'Patrick', age:40, gender:'boy'},
23810
+ {name:'Samantha', age:60, gender:'girl'}
23811
+ ]">
23812
+ I have {{friends.length}} friends. They are:
23813
+ <input type="search" ng-model="q" placeholder="filter friends..." />
23814
+ <ul class="example-animate-container">
23815
+ <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results">
23816
+ [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
23817
+ </li>
23818
+ <li class="animate-repeat" ng-if="results.length == 0">
23819
+ <strong>No results found...</strong>
23820
+ </li>
23821
+ </ul>
23822
+ </div>
23823
+ </file>
23824
+ <file name="animations.css">
23825
+ .example-animate-container {
23826
+ background:white;
23827
+ border:1px solid black;
23828
+ list-style:none;
23829
+ margin:0;
23830
+ padding:0 10px;
23831
+ }
23832
+
23833
+ .animate-repeat {
23834
+ line-height:40px;
23835
+ list-style:none;
23836
+ box-sizing:border-box;
23837
+ }
23838
+
23839
+ .animate-repeat.ng-move,
23840
+ .animate-repeat.ng-enter,
23841
+ .animate-repeat.ng-leave {
23842
+ -webkit-transition:all linear 0.5s;
23843
+ transition:all linear 0.5s;
23844
+ }
23845
+
23846
+ .animate-repeat.ng-leave.ng-leave-active,
23847
+ .animate-repeat.ng-move,
23848
+ .animate-repeat.ng-enter {
23849
+ opacity:0;
23850
+ max-height:0;
23851
+ }
23852
+
23853
+ .animate-repeat.ng-leave,
23854
+ .animate-repeat.ng-move.ng-move-active,
23855
+ .animate-repeat.ng-enter.ng-enter-active {
23856
+ opacity:1;
23857
+ max-height:40px;
23858
+ }
23859
+ </file>
23860
+ <file name="protractor.js" type="protractor">
23861
+ var friends = element.all(by.repeater('friend in friends'));
23862
+
23863
+ it('should render initial data set', function() {
23864
+ expect(friends.count()).toBe(10);
23865
+ expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');
23866
+ expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');
23867
+ expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');
23868
+ expect(element(by.binding('friends.length')).getText())
23869
+ .toMatch("I have 10 friends. They are:");
23870
+ });
23871
+
23872
+ it('should update repeater when filter predicate changes', function() {
23873
+ expect(friends.count()).toBe(10);
23874
+
23875
+ element(by.model('q')).sendKeys('ma');
23876
+
23877
+ expect(friends.count()).toBe(2);
23878
+ expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');
23879
+ expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');
23880
+ });
23881
+ </file>
23882
+ </example>
23883
+ */
23884
+var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
23885
+ var NG_REMOVED = '$$NG_REMOVED';
23886
+ var ngRepeatMinErr = minErr('ngRepeat');
23887
+
23888
+ var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) {
23889
+ // TODO(perf): generate setters to shave off ~40ms or 1-1.5%
23890
+ scope[valueIdentifier] = value;
23891
+ if (keyIdentifier) scope[keyIdentifier] = key;
23892
+ scope.$index = index;
23893
+ scope.$first = (index === 0);
23894
+ scope.$last = (index === (arrayLength - 1));
23895
+ scope.$middle = !(scope.$first || scope.$last);
23896
+ // jshint bitwise: false
23897
+ scope.$odd = !(scope.$even = (index&1) === 0);
23898
+ // jshint bitwise: true
23899
+ };
23900
+
23901
+ var getBlockStart = function(block) {
23902
+ return block.clone[0];
23903
+ };
23904
+
23905
+ var getBlockEnd = function(block) {
23906
+ return block.clone[block.clone.length - 1];
23907
+ };
23908
+
23909
+
23910
+ return {
23911
+ restrict: 'A',
23912
+ multiElement: true,
23913
+ transclude: 'element',
23914
+ priority: 1000,
23915
+ terminal: true,
23916
+ $$tlb: true,
23917
+ compile: function ngRepeatCompile($element, $attr) {
23918
+ var expression = $attr.ngRepeat;
23919
+ var ngRepeatEndComment = document.createComment(' end ngRepeat: ' + expression + ' ');
23920
+
23921
+ var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);
23922
+
23923
+ if (!match) {
23924
+ throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",
23925
+ expression);
23926
+ }
23927
+
23928
+ var lhs = match[1];
23929
+ var rhs = match[2];
23930
+ var aliasAs = match[3];
23931
+ var trackByExp = match[4];
23932
+
23933
+ match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
23934
+
23935
+ if (!match) {
23936
+ throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",
23937
+ lhs);
23938
+ }
23939
+ var valueIdentifier = match[3] || match[1];
23940
+ var keyIdentifier = match[2];
23941
+
23942
+ if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) ||
23943
+ /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(aliasAs))) {
23944
+ throw ngRepeatMinErr('badident', "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.",
23945
+ aliasAs);
23946
+ }
23947
+
23948
+ var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn;
23949
+ var hashFnLocals = {$id: hashKey};
23950
+
23951
+ if (trackByExp) {
23952
+ trackByExpGetter = $parse(trackByExp);
23953
+ } else {
23954
+ trackByIdArrayFn = function (key, value) {
23955
+ return hashKey(value);
23956
+ };
23957
+ trackByIdObjFn = function (key) {
23958
+ return key;
23959
+ };
23960
+ }
23961
+
23962
+ return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {
23963
+
23964
+ if (trackByExpGetter) {
23965
+ trackByIdExpFn = function(key, value, index) {
23966
+ // assign key, value, and $index to the locals so that they can be used in hash functions
23967
+ if (keyIdentifier) hashFnLocals[keyIdentifier] = key;
23968
+ hashFnLocals[valueIdentifier] = value;
23969
+ hashFnLocals.$index = index;
23970
+ return trackByExpGetter($scope, hashFnLocals);
23971
+ };
23972
+ }
23973
+
23974
+ // Store a list of elements from previous run. This is a hash where key is the item from the
23975
+ // iterator, and the value is objects with following properties.
23976
+ // - scope: bound scope
23977
+ // - element: previous element.
23978
+ // - index: position
23979
+ //
23980
+ // We are using no-proto object so that we don't need to guard against inherited props via
23981
+ // hasOwnProperty.
23982
+ var lastBlockMap = createMap();
23983
+
23984
+ //watch props
23985
+ $scope.$watchCollection(rhs, function ngRepeatAction(collection) {
23986
+ var index, length,
23987
+ previousNode = $element[0], // node that cloned nodes should be inserted after
23988
+ // initialized to the comment node anchor
23989
+ nextNode,
23990
+ // Same as lastBlockMap but it has the current state. It will become the
23991
+ // lastBlockMap on the next iteration.
23992
+ nextBlockMap = createMap(),
23993
+ collectionLength,
23994
+ key, value, // key/value of iteration
23995
+ trackById,
23996
+ trackByIdFn,
23997
+ collectionKeys,
23998
+ block, // last object information {scope, element, id}
23999
+ nextBlockOrder,
24000
+ elementsToRemove;
24001
+
24002
+ if (aliasAs) {
24003
+ $scope[aliasAs] = collection;
24004
+ }
24005
+
24006
+ if (isArrayLike(collection)) {
24007
+ collectionKeys = collection;
24008
+ trackByIdFn = trackByIdExpFn || trackByIdArrayFn;
24009
+ } else {
24010
+ trackByIdFn = trackByIdExpFn || trackByIdObjFn;
24011
+ // if object, extract keys, sort them and use to determine order of iteration over obj props
24012
+ collectionKeys = [];
24013
+ for (var itemKey in collection) {
24014
+ if (collection.hasOwnProperty(itemKey) && itemKey.charAt(0) != '$') {
24015
+ collectionKeys.push(itemKey);
24016
+ }
24017
+ }
24018
+ collectionKeys.sort();
24019
+ }
24020
+
24021
+ collectionLength = collectionKeys.length;
24022
+ nextBlockOrder = new Array(collectionLength);
24023
+
24024
+ // locate existing items
24025
+ for (index = 0; index < collectionLength; index++) {
24026
+ key = (collection === collectionKeys) ? index : collectionKeys[index];
24027
+ value = collection[key];
24028
+ trackById = trackByIdFn(key, value, index);
24029
+ if (lastBlockMap[trackById]) {
24030
+ // found previously seen block
24031
+ block = lastBlockMap[trackById];
24032
+ delete lastBlockMap[trackById];
24033
+ nextBlockMap[trackById] = block;
24034
+ nextBlockOrder[index] = block;
24035
+ } else if (nextBlockMap[trackById]) {
24036
+ // if collision detected. restore lastBlockMap and throw an error
24037
+ forEach(nextBlockOrder, function (block) {
24038
+ if (block && block.scope) lastBlockMap[block.id] = block;
24039
+ });
24040
+ throw ngRepeatMinErr('dupes',
24041
+ "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",
24042
+ expression, trackById, toJson(value));
24043
+ } else {
24044
+ // new never before seen block
24045
+ nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};
24046
+ nextBlockMap[trackById] = true;
24047
+ }
24048
+ }
24049
+
24050
+ // remove leftover items
24051
+ for (var blockKey in lastBlockMap) {
24052
+ block = lastBlockMap[blockKey];
24053
+ elementsToRemove = getBlockNodes(block.clone);
24054
+ $animate.leave(elementsToRemove);
24055
+ if (elementsToRemove[0].parentNode) {
24056
+ // if the element was not removed yet because of pending animation, mark it as deleted
24057
+ // so that we can ignore it later
24058
+ for (index = 0, length = elementsToRemove.length; index < length; index++) {
24059
+ elementsToRemove[index][NG_REMOVED] = true;
24060
+ }
24061
+ }
24062
+ block.scope.$destroy();
24063
+ }
24064
+
24065
+ // we are not using forEach for perf reasons (trying to avoid #call)
24066
+ for (index = 0; index < collectionLength; index++) {
24067
+ key = (collection === collectionKeys) ? index : collectionKeys[index];
24068
+ value = collection[key];
24069
+ block = nextBlockOrder[index];
24070
+
24071
+ if (block.scope) {
24072
+ // if we have already seen this object, then we need to reuse the
24073
+ // associated scope/element
24074
+
24075
+ nextNode = previousNode;
24076
+
24077
+ // skip nodes that are already pending removal via leave animation
24078
+ do {
24079
+ nextNode = nextNode.nextSibling;
24080
+ } while (nextNode && nextNode[NG_REMOVED]);
24081
+
24082
+ if (getBlockStart(block) != nextNode) {
24083
+ // existing item which got moved
24084
+ $animate.move(getBlockNodes(block.clone), null, jqLite(previousNode));
24085
+ }
24086
+ previousNode = getBlockEnd(block);
24087
+ updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);
24088
+ } else {
24089
+ // new item which we don't know about
24090
+ $transclude(function ngRepeatTransclude(clone, scope) {
24091
+ block.scope = scope;
24092
+ // http://jsperf.com/clone-vs-createcomment
24093
+ var endNode = ngRepeatEndComment.cloneNode(false);
24094
+ clone[clone.length++] = endNode;
24095
+
24096
+ // TODO(perf): support naked previousNode in `enter` to avoid creation of jqLite wrapper?
24097
+ $animate.enter(clone, null, jqLite(previousNode));
24098
+ previousNode = endNode;
24099
+ // Note: We only need the first/last node of the cloned nodes.
24100
+ // However, we need to keep the reference to the jqlite wrapper as it might be changed later
24101
+ // by a directive with templateUrl when its template arrives.
24102
+ block.clone = clone;
24103
+ nextBlockMap[block.id] = block;
24104
+ updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);
24105
+ });
24106
+ }
24107
+ }
24108
+ lastBlockMap = nextBlockMap;
24109
+ });
24110
+ };
24111
+ }
24112
+ };
24113
+}];
24114
+
24115
+var NG_HIDE_CLASS = 'ng-hide';
24116
+var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
24117
+/**
24118
+ * @ngdoc directive
24119
+ * @name ngShow
24120
+ *
24121
+ * @description
24122
+ * The `ngShow` directive shows or hides the given HTML element based on the expression
24123
+ * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding
24124
+ * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined
24125
+ * in AngularJS and sets the display style to none (using an !important flag).
24126
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
24127
+ *
24128
+ * ```html
24129
+ * <!-- when $scope.myValue is truthy (element is visible) -->
24130
+ * <div ng-show="myValue"></div>
24131
+ *
24132
+ * <!-- when $scope.myValue is falsy (element is hidden) -->
24133
+ * <div ng-show="myValue" class="ng-hide"></div>
24134
+ * ```
24135
+ *
24136
+ * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class
24137
+ * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed
24138
+ * from the element causing the element not to appear hidden.
24139
+ *
24140
+ * ## Why is !important used?
24141
+ *
24142
+ * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector
24143
+ * can be easily overridden by heavier selectors. For example, something as simple
24144
+ * as changing the display style on a HTML list item would make hidden elements appear visible.
24145
+ * This also becomes a bigger issue when dealing with CSS frameworks.
24146
+ *
24147
+ * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector
24148
+ * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the
24149
+ * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.
24150
+ *
24151
+ * ### Overriding `.ng-hide`
24152
+ *
24153
+ * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change
24154
+ * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
24155
+ * class in CSS:
24156
+ *
24157
+ * ```css
24158
+ * .ng-hide {
24159
+ * /&#42; this is just another form of hiding an element &#42;/
24160
+ * display:block!important;
24161
+ * position:absolute;
24162
+ * top:-9999px;
24163
+ * left:-9999px;
24164
+ * }
24165
+ * ```
24166
+ *
24167
+ * By default you don't need to override in CSS anything and the animations will work around the display style.
24168
+ *
24169
+ * ## A note about animations with `ngShow`
24170
+ *
24171
+ * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression
24172
+ * is true and false. This system works like the animation system present with ngClass except that
24173
+ * you must also include the !important flag to override the display property
24174
+ * so that you can perform an animation when the element is hidden during the time of the animation.
24175
+ *
24176
+ * ```css
24177
+ * //
24178
+ * //a working example can be found at the bottom of this page
24179
+ * //
24180
+ * .my-element.ng-hide-add, .my-element.ng-hide-remove {
24181
+ * /&#42; this is required as of 1.3x to properly
24182
+ * apply all styling in a show/hide animation &#42;/
24183
+ * transition:0s linear all;
24184
+ * }
24185
+ *
24186
+ * .my-element.ng-hide-add-active,
24187
+ * .my-element.ng-hide-remove-active {
24188
+ * /&#42; the transition is defined in the active class &#42;/
24189
+ * transition:1s linear all;
24190
+ * }
24191
+ *
24192
+ * .my-element.ng-hide-add { ... }
24193
+ * .my-element.ng-hide-add.ng-hide-add-active { ... }
24194
+ * .my-element.ng-hide-remove { ... }
24195
+ * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
24196
+ * ```
24197
+ *
24198
+ * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display
24199
+ * property to block during animation states--ngAnimate will handle the style toggling automatically for you.
24200
+ *
24201
+ * @animations
24202
+ * addClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a truthy value and the just before contents are set to visible
24203
+ * removeClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden
24204
+ *
24205
+ * @element ANY
24206
+ * @param {expression} ngShow If the {@link guide/expression expression} is truthy
24207
+ * then the element is shown or hidden respectively.
24208
+ *
24209
+ * @example
24210
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
24211
+ <file name="index.html">
24212
+ Click me: <input type="checkbox" ng-model="checked"><br/>
24213
+ <div>
24214
+ Show:
24215
+ <div class="check-element animate-show" ng-show="checked">
24216
+ <span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked.
24217
+ </div>
24218
+ </div>
24219
+ <div>
24220
+ Hide:
24221
+ <div class="check-element animate-show" ng-hide="checked">
24222
+ <span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked.
24223
+ </div>
24224
+ </div>
24225
+ </file>
24226
+ <file name="glyphicons.css">
24227
+ @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);
24228
+ </file>
24229
+ <file name="animations.css">
24230
+ .animate-show {
24231
+ line-height:20px;
24232
+ opacity:1;
24233
+ padding:10px;
24234
+ border:1px solid black;
24235
+ background:white;
24236
+ }
24237
+
24238
+ .animate-show.ng-hide-add.ng-hide-add-active,
24239
+ .animate-show.ng-hide-remove.ng-hide-remove-active {
24240
+ -webkit-transition:all linear 0.5s;
24241
+ transition:all linear 0.5s;
24242
+ }
24243
+
24244
+ .animate-show.ng-hide {
24245
+ line-height:0;
24246
+ opacity:0;
24247
+ padding:0 10px;
24248
+ }
24249
+
24250
+ .check-element {
24251
+ padding:10px;
24252
+ border:1px solid black;
24253
+ background:white;
24254
+ }
24255
+ </file>
24256
+ <file name="protractor.js" type="protractor">
24257
+ var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));
24258
+ var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));
24259
+
24260
+ it('should check ng-show / ng-hide', function() {
24261
+ expect(thumbsUp.isDisplayed()).toBeFalsy();
24262
+ expect(thumbsDown.isDisplayed()).toBeTruthy();
24263
+
24264
+ element(by.model('checked')).click();
24265
+
24266
+ expect(thumbsUp.isDisplayed()).toBeTruthy();
24267
+ expect(thumbsDown.isDisplayed()).toBeFalsy();
24268
+ });
24269
+ </file>
24270
+ </example>
24271
+ */
24272
+var ngShowDirective = ['$animate', function($animate) {
24273
+ return {
24274
+ restrict: 'A',
24275
+ multiElement: true,
24276
+ link: function(scope, element, attr) {
24277
+ scope.$watch(attr.ngShow, function ngShowWatchAction(value){
24278
+ // we're adding a temporary, animation-specific class for ng-hide since this way
24279
+ // we can control when the element is actually displayed on screen without having
24280
+ // to have a global/greedy CSS selector that breaks when other animations are run.
24281
+ // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845
24282
+ $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {
24283
+ tempClasses : NG_HIDE_IN_PROGRESS_CLASS
24284
+ });
24285
+ });
24286
+ }
24287
+ };
24288
+}];
24289
+
24290
+
24291
+/**
24292
+ * @ngdoc directive
24293
+ * @name ngHide
24294
+ *
24295
+ * @description
24296
+ * The `ngHide` directive shows or hides the given HTML element based on the expression
24297
+ * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding
24298
+ * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined
24299
+ * in AngularJS and sets the display style to none (using an !important flag).
24300
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
24301
+ *
24302
+ * ```html
24303
+ * <!-- when $scope.myValue is truthy (element is hidden) -->
24304
+ * <div ng-hide="myValue" class="ng-hide"></div>
24305
+ *
24306
+ * <!-- when $scope.myValue is falsy (element is visible) -->
24307
+ * <div ng-hide="myValue"></div>
24308
+ * ```
24309
+ *
24310
+ * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class
24311
+ * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed
24312
+ * from the element causing the element not to appear hidden.
24313
+ *
24314
+ * ## Why is !important used?
24315
+ *
24316
+ * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector
24317
+ * can be easily overridden by heavier selectors. For example, something as simple
24318
+ * as changing the display style on a HTML list item would make hidden elements appear visible.
24319
+ * This also becomes a bigger issue when dealing with CSS frameworks.
24320
+ *
24321
+ * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector
24322
+ * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the
24323
+ * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.
24324
+ *
24325
+ * ### Overriding `.ng-hide`
24326
+ *
24327
+ * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change
24328
+ * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
24329
+ * class in CSS:
24330
+ *
24331
+ * ```css
24332
+ * .ng-hide {
24333
+ * /&#42; this is just another form of hiding an element &#42;/
24334
+ * display:block!important;
24335
+ * position:absolute;
24336
+ * top:-9999px;
24337
+ * left:-9999px;
24338
+ * }
24339
+ * ```
24340
+ *
24341
+ * By default you don't need to override in CSS anything and the animations will work around the display style.
24342
+ *
24343
+ * ## A note about animations with `ngHide`
24344
+ *
24345
+ * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression
24346
+ * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide`
24347
+ * CSS class is added and removed for you instead of your own CSS class.
24348
+ *
24349
+ * ```css
24350
+ * //
24351
+ * //a working example can be found at the bottom of this page
24352
+ * //
24353
+ * .my-element.ng-hide-add, .my-element.ng-hide-remove {
24354
+ * transition:0.5s linear all;
24355
+ * }
24356
+ *
24357
+ * .my-element.ng-hide-add { ... }
24358
+ * .my-element.ng-hide-add.ng-hide-add-active { ... }
24359
+ * .my-element.ng-hide-remove { ... }
24360
+ * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
24361
+ * ```
24362
+ *
24363
+ * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display
24364
+ * property to block during animation states--ngAnimate will handle the style toggling automatically for you.
24365
+ *
24366
+ * @animations
24367
+ * removeClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden
24368
+ * addClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a non truthy value and just before the contents are set to visible
24369
+ *
24370
+ * @element ANY
24371
+ * @param {expression} ngHide If the {@link guide/expression expression} is truthy then
24372
+ * the element is shown or hidden respectively.
24373
+ *
24374
+ * @example
24375
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
24376
+ <file name="index.html">
24377
+ Click me: <input type="checkbox" ng-model="checked"><br/>
24378
+ <div>
24379
+ Show:
24380
+ <div class="check-element animate-hide" ng-show="checked">
24381
+ <span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked.
24382
+ </div>
24383
+ </div>
24384
+ <div>
24385
+ Hide:
24386
+ <div class="check-element animate-hide" ng-hide="checked">
24387
+ <span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked.
24388
+ </div>
24389
+ </div>
24390
+ </file>
24391
+ <file name="glyphicons.css">
24392
+ @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);
24393
+ </file>
24394
+ <file name="animations.css">
24395
+ .animate-hide {
24396
+ -webkit-transition:all linear 0.5s;
24397
+ transition:all linear 0.5s;
24398
+ line-height:20px;
24399
+ opacity:1;
24400
+ padding:10px;
24401
+ border:1px solid black;
24402
+ background:white;
24403
+ }
24404
+
24405
+ .animate-hide.ng-hide {
24406
+ line-height:0;
24407
+ opacity:0;
24408
+ padding:0 10px;
24409
+ }
24410
+
24411
+ .check-element {
24412
+ padding:10px;
24413
+ border:1px solid black;
24414
+ background:white;
24415
+ }
24416
+ </file>
24417
+ <file name="protractor.js" type="protractor">
24418
+ var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));
24419
+ var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));
24420
+
24421
+ it('should check ng-show / ng-hide', function() {
24422
+ expect(thumbsUp.isDisplayed()).toBeFalsy();
24423
+ expect(thumbsDown.isDisplayed()).toBeTruthy();
24424
+
24425
+ element(by.model('checked')).click();
24426
+
24427
+ expect(thumbsUp.isDisplayed()).toBeTruthy();
24428
+ expect(thumbsDown.isDisplayed()).toBeFalsy();
24429
+ });
24430
+ </file>
24431
+ </example>
24432
+ */
24433
+var ngHideDirective = ['$animate', function($animate) {
24434
+ return {
24435
+ restrict: 'A',
24436
+ multiElement: true,
24437
+ link: function(scope, element, attr) {
24438
+ scope.$watch(attr.ngHide, function ngHideWatchAction(value){
24439
+ // The comment inside of the ngShowDirective explains why we add and
24440
+ // remove a temporary class for the show/hide animation
24441
+ $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, {
24442
+ tempClasses : NG_HIDE_IN_PROGRESS_CLASS
24443
+ });
24444
+ });
24445
+ }
24446
+ };
24447
+}];
24448
+
24449
+/**
24450
+ * @ngdoc directive
24451
+ * @name ngStyle
24452
+ * @restrict AC
24453
+ *
24454
+ * @description
24455
+ * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.
24456
+ *
24457
+ * @element ANY
24458
+ * @param {expression} ngStyle
24459
+ *
24460
+ * {@link guide/expression Expression} which evals to an
24461
+ * object whose keys are CSS style names and values are corresponding values for those CSS
24462
+ * keys.
24463
+ *
24464
+ * Since some CSS style names are not valid keys for an object, they must be quoted.
24465
+ * See the 'background-color' style in the example below.
24466
+ *
24467
+ * @example
24468
+ <example>
24469
+ <file name="index.html">
24470
+ <input type="button" value="set color" ng-click="myStyle={color:'red'}">
24471
+ <input type="button" value="set background" ng-click="myStyle={'background-color':'blue'}">
24472
+ <input type="button" value="clear" ng-click="myStyle={}">
24473
+ <br/>
24474
+ <span ng-style="myStyle">Sample Text</span>
24475
+ <pre>myStyle={{myStyle}}</pre>
24476
+ </file>
24477
+ <file name="style.css">
24478
+ span {
24479
+ color: black;
24480
+ }
24481
+ </file>
24482
+ <file name="protractor.js" type="protractor">
24483
+ var colorSpan = element(by.css('span'));
24484
+
24485
+ it('should check ng-style', function() {
24486
+ expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
24487
+ element(by.css('input[value=\'set color\']')).click();
24488
+ expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');
24489
+ element(by.css('input[value=clear]')).click();
24490
+ expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
24491
+ });
24492
+ </file>
24493
+ </example>
24494
+ */
24495
+var ngStyleDirective = ngDirective(function(scope, element, attr) {
24496
+ scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {
24497
+ if (oldStyles && (newStyles !== oldStyles)) {
24498
+ forEach(oldStyles, function(val, style) { element.css(style, '');});
24499
+ }
24500
+ if (newStyles) element.css(newStyles);
24501
+ }, true);
24502
+});
24503
+
24504
+/**
24505
+ * @ngdoc directive
24506
+ * @name ngSwitch
24507
+ * @restrict EA
24508
+ *
24509
+ * @description
24510
+ * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.
24511
+ * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location
24512
+ * as specified in the template.
24513
+ *
24514
+ * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it
24515
+ * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element
24516
+ * matches the value obtained from the evaluated expression. In other words, you define a container element
24517
+ * (where you place the directive), place an expression on the **`on="..."` attribute**
24518
+ * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place
24519
+ * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on
24520
+ * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default
24521
+ * attribute is displayed.
24522
+ *
24523
+ * <div class="alert alert-info">
24524
+ * Be aware that the attribute values to match against cannot be expressions. They are interpreted
24525
+ * as literal string values to match against.
24526
+ * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the
24527
+ * value of the expression `$scope.someVal`.
24528
+ * </div>
24529
+
24530
+ * @animations
24531
+ * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container
24532
+ * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM
24533
+ *
24534
+ * @usage
24535
+ *
24536
+ * ```
24537
+ * <ANY ng-switch="expression">
24538
+ * <ANY ng-switch-when="matchValue1">...</ANY>
24539
+ * <ANY ng-switch-when="matchValue2">...</ANY>
24540
+ * <ANY ng-switch-default>...</ANY>
24541
+ * </ANY>
24542
+ * ```
24543
+ *
24544
+ *
24545
+ * @scope
24546
+ * @priority 1200
24547
+ * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
24548
+ * On child elements add:
24549
+ *
24550
+ * * `ngSwitchWhen`: the case statement to match against. If match then this
24551
+ * case will be displayed. If the same match appears multiple times, all the
24552
+ * elements will be displayed.
24553
+ * * `ngSwitchDefault`: the default case when no other case match. If there
24554
+ * are multiple default cases, all of them will be displayed when no other
24555
+ * case match.
24556
+ *
24557
+ *
24558
+ * @example
24559
+ <example module="switchExample" deps="angular-animate.js" animations="true">
24560
+ <file name="index.html">
24561
+ <div ng-controller="ExampleController">
24562
+ <select ng-model="selection" ng-options="item for item in items">
24563
+ </select>
24564
+ <tt>selection={{selection}}</tt>
24565
+ <hr/>
24566
+ <div class="animate-switch-container"
24567
+ ng-switch on="selection">
24568
+ <div class="animate-switch" ng-switch-when="settings">Settings Div</div>
24569
+ <div class="animate-switch" ng-switch-when="home">Home Span</div>
24570
+ <div class="animate-switch" ng-switch-default>default</div>
24571
+ </div>
24572
+ </div>
24573
+ </file>
24574
+ <file name="script.js">
24575
+ angular.module('switchExample', ['ngAnimate'])
24576
+ .controller('ExampleController', ['$scope', function($scope) {
24577
+ $scope.items = ['settings', 'home', 'other'];
24578
+ $scope.selection = $scope.items[0];
24579
+ }]);
24580
+ </file>
24581
+ <file name="animations.css">
24582
+ .animate-switch-container {
24583
+ position:relative;
24584
+ background:white;
24585
+ border:1px solid black;
24586
+ height:40px;
24587
+ overflow:hidden;
24588
+ }
24589
+
24590
+ .animate-switch {
24591
+ padding:10px;
24592
+ }
24593
+
24594
+ .animate-switch.ng-animate {
24595
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
24596
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
24597
+
24598
+ position:absolute;
24599
+ top:0;
24600
+ left:0;
24601
+ right:0;
24602
+ bottom:0;
24603
+ }
24604
+
24605
+ .animate-switch.ng-leave.ng-leave-active,
24606
+ .animate-switch.ng-enter {
24607
+ top:-50px;
24608
+ }
24609
+ .animate-switch.ng-leave,
24610
+ .animate-switch.ng-enter.ng-enter-active {
24611
+ top:0;
24612
+ }
24613
+ </file>
24614
+ <file name="protractor.js" type="protractor">
24615
+ var switchElem = element(by.css('[ng-switch]'));
24616
+ var select = element(by.model('selection'));
24617
+
24618
+ it('should start in settings', function() {
24619
+ expect(switchElem.getText()).toMatch(/Settings Div/);
24620
+ });
24621
+ it('should change to home', function() {
24622
+ select.all(by.css('option')).get(1).click();
24623
+ expect(switchElem.getText()).toMatch(/Home Span/);
24624
+ });
24625
+ it('should select default', function() {
24626
+ select.all(by.css('option')).get(2).click();
24627
+ expect(switchElem.getText()).toMatch(/default/);
24628
+ });
24629
+ </file>
24630
+ </example>
24631
+ */
24632
+var ngSwitchDirective = ['$animate', function($animate) {
24633
+ return {
24634
+ restrict: 'EA',
24635
+ require: 'ngSwitch',
24636
+
24637
+ // asks for $scope to fool the BC controller module
24638
+ controller: ['$scope', function ngSwitchController() {
24639
+ this.cases = {};
24640
+ }],
24641
+ link: function(scope, element, attr, ngSwitchController) {
24642
+ var watchExpr = attr.ngSwitch || attr.on,
24643
+ selectedTranscludes = [],
24644
+ selectedElements = [],
24645
+ previousLeaveAnimations = [],
24646
+ selectedScopes = [];
24647
+
24648
+ var spliceFactory = function(array, index) {
24649
+ return function() { array.splice(index, 1); };
24650
+ };
24651
+
24652
+ scope.$watch(watchExpr, function ngSwitchWatchAction(value) {
24653
+ var i, ii;
24654
+ for (i = 0, ii = previousLeaveAnimations.length; i < ii; ++i) {
24655
+ $animate.cancel(previousLeaveAnimations[i]);
24656
+ }
24657
+ previousLeaveAnimations.length = 0;
24658
+
24659
+ for (i = 0, ii = selectedScopes.length; i < ii; ++i) {
24660
+ var selected = getBlockNodes(selectedElements[i].clone);
24661
+ selectedScopes[i].$destroy();
24662
+ var promise = previousLeaveAnimations[i] = $animate.leave(selected);
24663
+ promise.then(spliceFactory(previousLeaveAnimations, i));
24664
+ }
24665
+
24666
+ selectedElements.length = 0;
24667
+ selectedScopes.length = 0;
24668
+
24669
+ if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {
24670
+ forEach(selectedTranscludes, function(selectedTransclude) {
24671
+ selectedTransclude.transclude(function(caseElement, selectedScope) {
24672
+ selectedScopes.push(selectedScope);
24673
+ var anchor = selectedTransclude.element;
24674
+ caseElement[caseElement.length++] = document.createComment(' end ngSwitchWhen: ');
24675
+ var block = { clone: caseElement };
24676
+
24677
+ selectedElements.push(block);
24678
+ $animate.enter(caseElement, anchor.parent(), anchor);
24679
+ });
24680
+ });
24681
+ }
24682
+ });
24683
+ }
24684
+ };
24685
+}];
24686
+
24687
+var ngSwitchWhenDirective = ngDirective({
24688
+ transclude: 'element',
24689
+ priority: 1200,
24690
+ require: '^ngSwitch',
24691
+ multiElement: true,
24692
+ link: function(scope, element, attrs, ctrl, $transclude) {
24693
+ ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);
24694
+ ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });
24695
+ }
24696
+});
24697
+
24698
+var ngSwitchDefaultDirective = ngDirective({
24699
+ transclude: 'element',
24700
+ priority: 1200,
24701
+ require: '^ngSwitch',
24702
+ multiElement: true,
24703
+ link: function(scope, element, attr, ctrl, $transclude) {
24704
+ ctrl.cases['?'] = (ctrl.cases['?'] || []);
24705
+ ctrl.cases['?'].push({ transclude: $transclude, element: element });
24706
+ }
24707
+});
24708
+
24709
+/**
24710
+ * @ngdoc directive
24711
+ * @name ngTransclude
24712
+ * @restrict EAC
24713
+ *
24714
+ * @description
24715
+ * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.
24716
+ *
24717
+ * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.
24718
+ *
24719
+ * @element ANY
24720
+ *
24721
+ * @example
24722
+ <example module="transcludeExample">
24723
+ <file name="index.html">
24724
+ <script>
24725
+ angular.module('transcludeExample', [])
24726
+ .directive('pane', function(){
24727
+ return {
24728
+ restrict: 'E',
24729
+ transclude: true,
24730
+ scope: { title:'@' },
24731
+ template: '<div style="border: 1px solid black;">' +
24732
+ '<div style="background-color: gray">{{title}}</div>' +
24733
+ '<ng-transclude></ng-transclude>' +
24734
+ '</div>'
24735
+ };
24736
+ })
24737
+ .controller('ExampleController', ['$scope', function($scope) {
24738
+ $scope.title = 'Lorem Ipsum';
24739
+ $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
24740
+ }]);
24741
+ </script>
24742
+ <div ng-controller="ExampleController">
24743
+ <input ng-model="title"><br>
24744
+ <textarea ng-model="text"></textarea> <br/>
24745
+ <pane title="{{title}}">{{text}}</pane>
24746
+ </div>
24747
+ </file>
24748
+ <file name="protractor.js" type="protractor">
24749
+ it('should have transcluded', function() {
24750
+ var titleElement = element(by.model('title'));
24751
+ titleElement.clear();
24752
+ titleElement.sendKeys('TITLE');
24753
+ var textElement = element(by.model('text'));
24754
+ textElement.clear();
24755
+ textElement.sendKeys('TEXT');
24756
+ expect(element(by.binding('title')).getText()).toEqual('TITLE');
24757
+ expect(element(by.binding('text')).getText()).toEqual('TEXT');
24758
+ });
24759
+ </file>
24760
+ </example>
24761
+ *
24762
+ */
24763
+var ngTranscludeDirective = ngDirective({
24764
+ restrict: 'EAC',
24765
+ link: function($scope, $element, $attrs, controller, $transclude) {
24766
+ if (!$transclude) {
24767
+ throw minErr('ngTransclude')('orphan',
24768
+ 'Illegal use of ngTransclude directive in the template! ' +
24769
+ 'No parent directive that requires a transclusion found. ' +
24770
+ 'Element: {0}',
24771
+ startingTag($element));
24772
+ }
24773
+
24774
+ $transclude(function(clone) {
24775
+ $element.empty();
24776
+ $element.append(clone);
24777
+ });
24778
+ }
24779
+});
24780
+
24781
+/**
24782
+ * @ngdoc directive
24783
+ * @name script
24784
+ * @restrict E
24785
+ *
24786
+ * @description
24787
+ * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the
24788
+ * template can be used by {@link ng.directive:ngInclude `ngInclude`},
24789
+ * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the
24790
+ * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be
24791
+ * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.
24792
+ *
24793
+ * @param {string} type Must be set to `'text/ng-template'`.
24794
+ * @param {string} id Cache name of the template.
24795
+ *
24796
+ * @example
24797
+ <example>
24798
+ <file name="index.html">
24799
+ <script type="text/ng-template" id="/tpl.html">
24800
+ Content of the template.
24801
+ </script>
24802
+
24803
+ <a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a>
24804
+ <div id="tpl-content" ng-include src="currentTpl"></div>
24805
+ </file>
24806
+ <file name="protractor.js" type="protractor">
24807
+ it('should load template defined inside script tag', function() {
24808
+ element(by.css('#tpl-link')).click();
24809
+ expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);
24810
+ });
24811
+ </file>
24812
+ </example>
24813
+ */
24814
+var scriptDirective = ['$templateCache', function($templateCache) {
24815
+ return {
24816
+ restrict: 'E',
24817
+ terminal: true,
24818
+ compile: function(element, attr) {
24819
+ if (attr.type == 'text/ng-template') {
24820
+ var templateUrl = attr.id,
24821
+ // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent
24822
+ text = element[0].text;
24823
+
24824
+ $templateCache.put(templateUrl, text);
24825
+ }
24826
+ }
24827
+ };
24828
+}];
24829
+
24830
+var ngOptionsMinErr = minErr('ngOptions');
24831
+/**
24832
+ * @ngdoc directive
24833
+ * @name select
24834
+ * @restrict E
24835
+ *
24836
+ * @description
24837
+ * HTML `SELECT` element with angular data-binding.
24838
+ *
24839
+ * # `ngOptions`
24840
+ *
24841
+ * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`
24842
+ * elements for the `<select>` element using the array or object obtained by evaluating the
24843
+ * `ngOptions` comprehension_expression.
24844
+ *
24845
+ * When an item in the `<select>` menu is selected, the array element or object property
24846
+ * represented by the selected option will be bound to the model identified by the `ngModel`
24847
+ * directive.
24848
+ *
24849
+ * <div class="alert alert-warning">
24850
+ * **Note:** `ngModel` compares by reference, not value. This is important when binding to an
24851
+ * array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).
24852
+ * </div>
24853
+ *
24854
+ * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can
24855
+ * be nested into the `<select>` element. This element will then represent the `null` or "not selected"
24856
+ * option. See example below for demonstration.
24857
+ *
24858
+ * <div class="alert alert-warning">
24859
+ * **Note:** `ngOptions` provides an iterator facility for the `<option>` element which should be used instead
24860
+ * of {@link ng.directive:ngRepeat ngRepeat} when you want the
24861
+ * `select` model to be bound to a non-string value. This is because an option element can only
24862
+ * be bound to string values at present.
24863
+ * </div>
24864
+ *
24865
+ * <div class="alert alert-info">
24866
+ * **Note:** Using `select as` will bind the result of the `select as` expression to the model, but
24867
+ * the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)
24868
+ * or property name (for object data sources) of the value within the collection.
24869
+ * </div>
24870
+ *
24871
+ * **Note:** Using `select as` together with `trackexpr` is not recommended.
24872
+ * Reasoning:
24873
+ * - Example: &lt;select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected"&gt;
24874
+ * values: [{id: 1, label: 'aLabel', subItem: {name: 'aSubItem'}}, {id: 2, label: 'bLabel', subItem: {name: 'bSubItem'}}],
24875
+ * $scope.selected = {name: 'aSubItem'};
24876
+ * - track by is always applied to `value`, with the purpose of preserving the selection,
24877
+ * (to `item` in this case)
24878
+ * - to calculate whether an item is selected we do the following:
24879
+ * 1. apply `track by` to the values in the array, e.g.
24880
+ * In the example: [1,2]
24881
+ * 2. apply `track by` to the already selected value in `ngModel`:
24882
+ * In the example: this is not possible, as `track by` refers to `item.id`, but the selected
24883
+ * value from `ngModel` is `{name: aSubItem}`.
24884
+ *
24885
+ * @param {string} ngModel Assignable angular expression to data-bind to.
24886
+ * @param {string=} name Property name of the form under which the control is published.
24887
+ * @param {string=} required The control is considered valid only if value is entered.
24888
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
24889
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
24890
+ * `required` when you want to data-bind to the `required` attribute.
24891
+ * @param {comprehension_expression=} ngOptions in one of the following forms:
24892
+ *
24893
+ * * for array data sources:
24894
+ * * `label` **`for`** `value` **`in`** `array`
24895
+ * * `select` **`as`** `label` **`for`** `value` **`in`** `array`
24896
+ * * `label` **`group by`** `group` **`for`** `value` **`in`** `array`
24897
+ * * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`
24898
+ * * for object data sources:
24899
+ * * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
24900
+ * * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
24901
+ * * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`
24902
+ * * `select` **`as`** `label` **`group by`** `group`
24903
+ * **`for` `(`**`key`**`,`** `value`**`) in`** `object`
24904
+ *
24905
+ * Where:
24906
+ *
24907
+ * * `array` / `object`: an expression which evaluates to an array / object to iterate over.
24908
+ * * `value`: local variable which will refer to each item in the `array` or each property value
24909
+ * of `object` during iteration.
24910
+ * * `key`: local variable which will refer to a property name in `object` during iteration.
24911
+ * * `label`: The result of this expression will be the label for `<option>` element. The
24912
+ * `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).
24913
+ * * `select`: The result of this expression will be bound to the model of the parent `<select>`
24914
+ * element. If not specified, `select` expression will default to `value`.
24915
+ * * `group`: The result of this expression will be used to group options using the `<optgroup>`
24916
+ * DOM element.
24917
+ * * `trackexpr`: Used when working with an array of objects. The result of this expression will be
24918
+ * used to identify the objects in the array. The `trackexpr` will most likely refer to the
24919
+ * `value` variable (e.g. `value.propertyName`). With this the selection is preserved
24920
+ * even when the options are recreated (e.g. reloaded from the server).
24921
+ *
24922
+ * @example
24923
+ <example module="selectExample">
24924
+ <file name="index.html">
24925
+ <script>
24926
+ angular.module('selectExample', [])
24927
+ .controller('ExampleController', ['$scope', function($scope) {
24928
+ $scope.colors = [
24929
+ {name:'black', shade:'dark'},
24930
+ {name:'white', shade:'light'},
24931
+ {name:'red', shade:'dark'},
24932
+ {name:'blue', shade:'dark'},
24933
+ {name:'yellow', shade:'light'}
24934
+ ];
24935
+ $scope.myColor = $scope.colors[2]; // red
24936
+ }]);
24937
+ </script>
24938
+ <div ng-controller="ExampleController">
24939
+ <ul>
24940
+ <li ng-repeat="color in colors">
24941
+ Name: <input ng-model="color.name">
24942
+ [<a href ng-click="colors.splice($index, 1)">X</a>]
24943
+ </li>
24944
+ <li>
24945
+ [<a href ng-click="colors.push({})">add</a>]
24946
+ </li>
24947
+ </ul>
24948
+ <hr/>
24949
+ Color (null not allowed):
24950
+ <select ng-model="myColor" ng-options="color.name for color in colors"></select><br>
24951
+
24952
+ Color (null allowed):
24953
+ <span class="nullable">
24954
+ <select ng-model="myColor" ng-options="color.name for color in colors">
24955
+ <option value="">-- choose color --</option>
24956
+ </select>
24957
+ </span><br/>
24958
+
24959
+ Color grouped by shade:
24960
+ <select ng-model="myColor" ng-options="color.name group by color.shade for color in colors">
24961
+ </select><br/>
24962
+
24963
+
24964
+ Select <a href ng-click="myColor = { name:'not in list', shade: 'other' }">bogus</a>.<br>
24965
+ <hr/>
24966
+ Currently selected: {{ {selected_color:myColor} }}
24967
+ <div style="border:solid 1px black; height:20px"
24968
+ ng-style="{'background-color':myColor.name}">
24969
+ </div>
24970
+ </div>
24971
+ </file>
24972
+ <file name="protractor.js" type="protractor">
24973
+ it('should check ng-options', function() {
24974
+ expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');
24975
+ element.all(by.model('myColor')).first().click();
24976
+ element.all(by.css('select[ng-model="myColor"] option')).first().click();
24977
+ expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');
24978
+ element(by.css('.nullable select[ng-model="myColor"]')).click();
24979
+ element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click();
24980
+ expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');
24981
+ });
24982
+ </file>
24983
+ </example>
24984
+ */
24985
+
24986
+var ngOptionsDirective = valueFn({
24987
+ restrict: 'A',
24988
+ terminal: true
24989
+});
24990
+
24991
+// jshint maxlen: false
24992
+var selectDirective = ['$compile', '$parse', function($compile, $parse) {
24993
+ //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888
24994
+ 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]+?))?$/,
24995
+ nullModelCtrl = {$setViewValue: noop};
24996
+// jshint maxlen: 100
24997
+
24998
+ return {
24999
+ restrict: 'E',
25000
+ require: ['select', '?ngModel'],
25001
+ controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {
25002
+ var self = this,
25003
+ optionsMap = {},
25004
+ ngModelCtrl = nullModelCtrl,
25005
+ nullOption,
25006
+ unknownOption;
25007
+
25008
+
25009
+ self.databound = $attrs.ngModel;
25010
+
25011
+
25012
+ self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {
25013
+ ngModelCtrl = ngModelCtrl_;
25014
+ nullOption = nullOption_;
25015
+ unknownOption = unknownOption_;
25016
+ };
25017
+
25018
+
25019
+ self.addOption = function(value, element) {
25020
+ assertNotHasOwnProperty(value, '"option value"');
25021
+ optionsMap[value] = true;
25022
+
25023
+ if (ngModelCtrl.$viewValue == value) {
25024
+ $element.val(value);
25025
+ if (unknownOption.parent()) unknownOption.remove();
25026
+ }
25027
+ // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459
25028
+ // Adding an <option selected="selected"> element to a <select required="required"> should
25029
+ // automatically select the new element
25030
+ if (element && element[0].hasAttribute('selected')) {
25031
+ element[0].selected = true;
25032
+ }
25033
+ };
25034
+
25035
+
25036
+ self.removeOption = function(value) {
25037
+ if (this.hasOption(value)) {
25038
+ delete optionsMap[value];
25039
+ if (ngModelCtrl.$viewValue == value) {
25040
+ this.renderUnknownOption(value);
25041
+ }
25042
+ }
25043
+ };
25044
+
25045
+
25046
+ self.renderUnknownOption = function(val) {
25047
+ var unknownVal = '? ' + hashKey(val) + ' ?';
25048
+ unknownOption.val(unknownVal);
25049
+ $element.prepend(unknownOption);
25050
+ $element.val(unknownVal);
25051
+ unknownOption.prop('selected', true); // needed for IE
25052
+ };
25053
+
25054
+
25055
+ self.hasOption = function(value) {
25056
+ return optionsMap.hasOwnProperty(value);
25057
+ };
25058
+
25059
+ $scope.$on('$destroy', function() {
25060
+ // disable unknown option so that we don't do work when the whole select is being destroyed
25061
+ self.renderUnknownOption = noop;
25062
+ });
25063
+ }],
25064
+
25065
+ link: function(scope, element, attr, ctrls) {
25066
+ // if ngModel is not defined, we don't need to do anything
25067
+ if (!ctrls[1]) return;
25068
+
25069
+ var selectCtrl = ctrls[0],
25070
+ ngModelCtrl = ctrls[1],
25071
+ multiple = attr.multiple,
25072
+ optionsExp = attr.ngOptions,
25073
+ nullOption = false, // if false, user will not be able to select it (used by ngOptions)
25074
+ emptyOption,
25075
+ renderScheduled = false,
25076
+ // we can't just jqLite('<option>') since jqLite is not smart enough
25077
+ // to create it in <select> and IE barfs otherwise.
25078
+ optionTemplate = jqLite(document.createElement('option')),
25079
+ optGroupTemplate =jqLite(document.createElement('optgroup')),
25080
+ unknownOption = optionTemplate.clone();
25081
+
25082
+ // find "null" option
25083
+ for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {
25084
+ if (children[i].value === '') {
25085
+ emptyOption = nullOption = children.eq(i);
25086
+ break;
25087
+ }
25088
+ }
25089
+
25090
+ selectCtrl.init(ngModelCtrl, nullOption, unknownOption);
25091
+
25092
+ // required validator
25093
+ if (multiple) {
25094
+ ngModelCtrl.$isEmpty = function(value) {
25095
+ return !value || value.length === 0;
25096
+ };
25097
+ }
25098
+
25099
+ if (optionsExp) setupAsOptions(scope, element, ngModelCtrl);
25100
+ else if (multiple) setupAsMultiple(scope, element, ngModelCtrl);
25101
+ else setupAsSingle(scope, element, ngModelCtrl, selectCtrl);
25102
+
25103
+
25104
+ ////////////////////////////
25105
+
25106
+
25107
+
25108
+ function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {
25109
+ ngModelCtrl.$render = function() {
25110
+ var viewValue = ngModelCtrl.$viewValue;
25111
+
25112
+ if (selectCtrl.hasOption(viewValue)) {
25113
+ if (unknownOption.parent()) unknownOption.remove();
25114
+ selectElement.val(viewValue);
25115
+ if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy
25116
+ } else {
25117
+ if (isUndefined(viewValue) && emptyOption) {
25118
+ selectElement.val('');
25119
+ } else {
25120
+ selectCtrl.renderUnknownOption(viewValue);
25121
+ }
25122
+ }
25123
+ };
25124
+
25125
+ selectElement.on('change', function() {
25126
+ scope.$apply(function() {
25127
+ if (unknownOption.parent()) unknownOption.remove();
25128
+ ngModelCtrl.$setViewValue(selectElement.val());
25129
+ });
25130
+ });
25131
+ }
25132
+
25133
+ function setupAsMultiple(scope, selectElement, ctrl) {
25134
+ var lastView;
25135
+ ctrl.$render = function() {
25136
+ var items = new HashMap(ctrl.$viewValue);
25137
+ forEach(selectElement.find('option'), function(option) {
25138
+ option.selected = isDefined(items.get(option.value));
25139
+ });
25140
+ };
25141
+
25142
+ // we have to do it on each watch since ngModel watches reference, but
25143
+ // we need to work of an array, so we need to see if anything was inserted/removed
25144
+ scope.$watch(function selectMultipleWatch() {
25145
+ if (!equals(lastView, ctrl.$viewValue)) {
25146
+ lastView = shallowCopy(ctrl.$viewValue);
25147
+ ctrl.$render();
25148
+ }
25149
+ });
25150
+
25151
+ selectElement.on('change', function() {
25152
+ scope.$apply(function() {
25153
+ var array = [];
25154
+ forEach(selectElement.find('option'), function(option) {
25155
+ if (option.selected) {
25156
+ array.push(option.value);
25157
+ }
25158
+ });
25159
+ ctrl.$setViewValue(array);
25160
+ });
25161
+ });
25162
+ }
25163
+
25164
+ function setupAsOptions(scope, selectElement, ctrl) {
25165
+ var match;
25166
+
25167
+ if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) {
25168
+ throw ngOptionsMinErr('iexp',
25169
+ "Expected expression in form of " +
25170
+ "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" +
25171
+ " but got '{0}'. Element: {1}",
25172
+ optionsExp, startingTag(selectElement));
25173
+ }
25174
+
25175
+ var displayFn = $parse(match[2] || match[1]),
25176
+ valueName = match[4] || match[6],
25177
+ selectAs = / as /.test(match[0]) && match[1],
25178
+ selectAsFn = selectAs ? $parse(selectAs) : null,
25179
+ keyName = match[5],
25180
+ groupByFn = $parse(match[3] || ''),
25181
+ valueFn = $parse(match[2] ? match[1] : valueName),
25182
+ valuesFn = $parse(match[7]),
25183
+ track = match[8],
25184
+ trackFn = track ? $parse(match[8]) : null,
25185
+ // This is an array of array of existing option groups in DOM.
25186
+ // We try to reuse these if possible
25187
+ // - optionGroupsCache[0] is the options with no option group
25188
+ // - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element
25189
+ optionGroupsCache = [[{element: selectElement, label:''}]],
25190
+ //re-usable object to represent option's locals
25191
+ locals = {};
25192
+
25193
+ if (nullOption) {
25194
+ // compile the element since there might be bindings in it
25195
+ $compile(nullOption)(scope);
25196
+
25197
+ // remove the class, which is added automatically because we recompile the element and it
25198
+ // becomes the compilation root
25199
+ nullOption.removeClass('ng-scope');
25200
+
25201
+ // we need to remove it before calling selectElement.empty() because otherwise IE will
25202
+ // remove the label from the element. wtf?
25203
+ nullOption.remove();
25204
+ }
25205
+
25206
+ // clear contents, we'll add what's needed based on the model
25207
+ selectElement.empty();
25208
+
25209
+ selectElement.on('change', selectionChanged);
25210
+
25211
+ ctrl.$render = render;
25212
+
25213
+ scope.$watchCollection(valuesFn, scheduleRendering);
25214
+ scope.$watchCollection(getLabels, scheduleRendering);
25215
+
25216
+ if (multiple) {
25217
+ scope.$watchCollection(function() { return ctrl.$modelValue; }, scheduleRendering);
25218
+ }
25219
+
25220
+ // ------------------------------------------------------------------ //
25221
+
25222
+ function callExpression(exprFn, key, value) {
25223
+ locals[valueName] = value;
25224
+ if (keyName) locals[keyName] = key;
25225
+ return exprFn(scope, locals);
25226
+ }
25227
+
25228
+ function selectionChanged() {
25229
+ scope.$apply(function() {
25230
+ var optionGroup,
25231
+ collection = valuesFn(scope) || [],
25232
+ key, value, optionElement, index, groupIndex, length, groupLength, trackIndex;
25233
+ var viewValue;
25234
+ if (multiple) {
25235
+ viewValue = [];
25236
+ forEach(selectElement.val(), function(selectedKey) {
25237
+ viewValue.push(getViewValue(selectedKey, collection[selectedKey]));
25238
+ });
25239
+ } else {
25240
+ var selectedKey = selectElement.val();
25241
+ viewValue = getViewValue(selectedKey, collection[selectedKey]);
25242
+ }
25243
+ ctrl.$setViewValue(viewValue);
25244
+ render();
25245
+ });
25246
+ }
25247
+
25248
+ function getViewValue(key, value) {
25249
+ if (key === '?') {
25250
+ return undefined;
25251
+ } else if (key === '') {
25252
+ return null;
25253
+ } else {
25254
+ var viewValueFn = selectAsFn ? selectAsFn : valueFn;
25255
+ return callExpression(viewValueFn, key, value);
25256
+ }
25257
+ }
25258
+
25259
+ function getLabels() {
25260
+ var values = valuesFn(scope);
25261
+ var toDisplay;
25262
+ if (values && isArray(values)) {
25263
+ toDisplay = new Array(values.length);
25264
+ for (var i = 0, ii = values.length; i < ii; i++) {
25265
+ toDisplay[i] = callExpression(displayFn, i, values[i]);
25266
+ }
25267
+ return toDisplay;
25268
+ } else if (values) {
25269
+ // TODO: Add a test for this case
25270
+ toDisplay = {};
25271
+ for (var prop in values) {
25272
+ if (values.hasOwnProperty(prop)) {
25273
+ toDisplay[prop] = callExpression(displayFn, prop, values[prop]);
25274
+ }
25275
+ }
25276
+ }
25277
+ return toDisplay;
25278
+ }
25279
+
25280
+ function createIsSelectedFn(viewValue) {
25281
+ var selectedSet;
25282
+ if (multiple) {
25283
+ if (trackFn && isArray(viewValue)) {
25284
+
25285
+ selectedSet = new HashMap([]);
25286
+ for (var trackIndex = 0; trackIndex < viewValue.length; trackIndex++) {
25287
+ // tracking by key
25288
+ selectedSet.put(callExpression(trackFn, null, viewValue[trackIndex]), true);
25289
+ }
25290
+ } else {
25291
+ selectedSet = new HashMap(viewValue);
25292
+ }
25293
+ } else if (trackFn) {
25294
+ viewValue = callExpression(trackFn, null, viewValue);
25295
+ }
25296
+
25297
+ return function isSelected(key, value) {
25298
+ var compareValueFn;
25299
+ if (trackFn) {
25300
+ compareValueFn = trackFn;
25301
+ } else if (selectAsFn) {
25302
+ compareValueFn = selectAsFn;
25303
+ } else {
25304
+ compareValueFn = valueFn;
25305
+ }
25306
+
25307
+ if (multiple) {
25308
+ return isDefined(selectedSet.remove(callExpression(compareValueFn, key, value)));
25309
+ } else {
25310
+ return viewValue == callExpression(compareValueFn, key, value);
25311
+ }
25312
+ };
25313
+ }
25314
+
25315
+ function scheduleRendering() {
25316
+ if (!renderScheduled) {
25317
+ scope.$$postDigest(render);
25318
+ renderScheduled = true;
25319
+ }
25320
+ }
25321
+
25322
+ /**
25323
+ * A new labelMap is created with each render.
25324
+ * This function is called for each existing option with added=false,
25325
+ * and each new option with added=true.
25326
+ * - Labels that are passed to this method twice,
25327
+ * (once with added=true and once with added=false) will end up with a value of 0, and
25328
+ * will cause no change to happen to the corresponding option.
25329
+ * - Labels that are passed to this method only once with added=false will end up with a
25330
+ * value of -1 and will eventually be passed to selectCtrl.removeOption()
25331
+ * - Labels that are passed to this method only once with added=true will end up with a
25332
+ * value of 1 and will eventually be passed to selectCtrl.addOption()
25333
+ */
25334
+ function updateLabelMap(labelMap, label, added) {
25335
+ labelMap[label] = labelMap[label] || 0;
25336
+ labelMap[label] += (added ? 1 : -1);
25337
+ }
25338
+
25339
+ function render() {
25340
+ renderScheduled = false;
25341
+
25342
+ // Temporary location for the option groups before we render them
25343
+ var optionGroups = {'':[]},
25344
+ optionGroupNames = [''],
25345
+ optionGroupName,
25346
+ optionGroup,
25347
+ option,
25348
+ existingParent, existingOptions, existingOption,
25349
+ viewValue = ctrl.$viewValue,
25350
+ values = valuesFn(scope) || [],
25351
+ keys = keyName ? sortedKeys(values) : values,
25352
+ key,
25353
+ value,
25354
+ groupLength, length,
25355
+ groupIndex, index,
25356
+ labelMap = {},
25357
+ selected,
25358
+ isSelected = createIsSelectedFn(viewValue),
25359
+ anySelected = false,
25360
+ lastElement,
25361
+ element,
25362
+ label;
25363
+
25364
+ // We now build up the list of options we need (we merge later)
25365
+ for (index = 0; length = keys.length, index < length; index++) {
25366
+ key = index;
25367
+ if (keyName) {
25368
+ key = keys[index];
25369
+ if ( key.charAt(0) === '$' ) continue;
25370
+ }
25371
+ value = values[key];
25372
+
25373
+ optionGroupName = callExpression(groupByFn, key, value) || '';
25374
+ if (!(optionGroup = optionGroups[optionGroupName])) {
25375
+ optionGroup = optionGroups[optionGroupName] = [];
25376
+ optionGroupNames.push(optionGroupName);
25377
+ }
25378
+
25379
+ selected = isSelected(key, value);
25380
+ anySelected = anySelected || selected;
25381
+
25382
+ label = callExpression(displayFn, key, value); // what will be seen by the user
25383
+
25384
+ // doing displayFn(scope, locals) || '' overwrites zero values
25385
+ label = isDefined(label) ? label : '';
25386
+ optionGroup.push({
25387
+ // either the index into array or key from object
25388
+ id: (keyName ? keys[index] : index),
25389
+ label: label,
25390
+ selected: selected // determine if we should be selected
25391
+ });
25392
+ }
25393
+ if (!multiple) {
25394
+ if (nullOption || viewValue === null) {
25395
+ // insert null option if we have a placeholder, or the model is null
25396
+ optionGroups[''].unshift({id:'', label:'', selected:!anySelected});
25397
+ } else if (!anySelected) {
25398
+ // option could not be found, we have to insert the undefined item
25399
+ optionGroups[''].unshift({id:'?', label:'', selected:true});
25400
+ }
25401
+ }
25402
+
25403
+ // Now we need to update the list of DOM nodes to match the optionGroups we computed above
25404
+ for (groupIndex = 0, groupLength = optionGroupNames.length;
25405
+ groupIndex < groupLength;
25406
+ groupIndex++) {
25407
+ // current option group name or '' if no group
25408
+ optionGroupName = optionGroupNames[groupIndex];
25409
+
25410
+ // list of options for that group. (first item has the parent)
25411
+ optionGroup = optionGroups[optionGroupName];
25412
+
25413
+ if (optionGroupsCache.length <= groupIndex) {
25414
+ // we need to grow the optionGroups
25415
+ existingParent = {
25416
+ element: optGroupTemplate.clone().attr('label', optionGroupName),
25417
+ label: optionGroup.label
25418
+ };
25419
+ existingOptions = [existingParent];
25420
+ optionGroupsCache.push(existingOptions);
25421
+ selectElement.append(existingParent.element);
25422
+ } else {
25423
+ existingOptions = optionGroupsCache[groupIndex];
25424
+ existingParent = existingOptions[0]; // either SELECT (no group) or OPTGROUP element
25425
+
25426
+ // update the OPTGROUP label if not the same.
25427
+ if (existingParent.label != optionGroupName) {
25428
+ existingParent.element.attr('label', existingParent.label = optionGroupName);
25429
+ }
25430
+ }
25431
+
25432
+ lastElement = null; // start at the beginning
25433
+ for(index = 0, length = optionGroup.length; index < length; index++) {
25434
+ option = optionGroup[index];
25435
+ if ((existingOption = existingOptions[index+1])) {
25436
+ // reuse elements
25437
+ lastElement = existingOption.element;
25438
+ if (existingOption.label !== option.label) {
25439
+ updateLabelMap(labelMap, existingOption.label, false);
25440
+ updateLabelMap(labelMap, option.label, true);
25441
+ lastElement.text(existingOption.label = option.label);
25442
+ }
25443
+ if (existingOption.id !== option.id) {
25444
+ lastElement.val(existingOption.id = option.id);
25445
+ }
25446
+ // lastElement.prop('selected') provided by jQuery has side-effects
25447
+ if (lastElement[0].selected !== option.selected) {
25448
+ lastElement.prop('selected', (existingOption.selected = option.selected));
25449
+ if (msie) {
25450
+ // See #7692
25451
+ // The selected item wouldn't visually update on IE without this.
25452
+ // Tested on Win7: IE9, IE10 and IE11. Future IEs should be tested as well
25453
+ lastElement.prop('selected', existingOption.selected);
25454
+ }
25455
+ }
25456
+ } else {
25457
+ // grow elements
25458
+
25459
+ // if it's a null option
25460
+ if (option.id === '' && nullOption) {
25461
+ // put back the pre-compiled element
25462
+ element = nullOption;
25463
+ } else {
25464
+ // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but
25465
+ // in this version of jQuery on some browser the .text() returns a string
25466
+ // rather then the element.
25467
+ (element = optionTemplate.clone())
25468
+ .val(option.id)
25469
+ .prop('selected', option.selected)
25470
+ .attr('selected', option.selected)
25471
+ .text(option.label);
25472
+ }
25473
+
25474
+ existingOptions.push(existingOption = {
25475
+ element: element,
25476
+ label: option.label,
25477
+ id: option.id,
25478
+ selected: option.selected
25479
+ });
25480
+ updateLabelMap(labelMap, option.label, true);
25481
+ if (lastElement) {
25482
+ lastElement.after(element);
25483
+ } else {
25484
+ existingParent.element.append(element);
25485
+ }
25486
+ lastElement = element;
25487
+ }
25488
+ }
25489
+ // remove any excessive OPTIONs in a group
25490
+ index++; // increment since the existingOptions[0] is parent element not OPTION
25491
+ while(existingOptions.length > index) {
25492
+ option = existingOptions.pop();
25493
+ updateLabelMap(labelMap, option.label, false);
25494
+ option.element.remove();
25495
+ }
25496
+ forEach(labelMap, function (count, label) {
25497
+ if (count > 0) {
25498
+ selectCtrl.addOption(label);
25499
+ } else if (count < 0) {
25500
+ selectCtrl.removeOption(label);
25501
+ }
25502
+ });
25503
+ }
25504
+ // remove any excessive OPTGROUPs from select
25505
+ while(optionGroupsCache.length > groupIndex) {
25506
+ optionGroupsCache.pop()[0].element.remove();
25507
+ }
25508
+ }
25509
+ }
25510
+ }
25511
+ };
25512
+}];
25513
+
25514
+var optionDirective = ['$interpolate', function($interpolate) {
25515
+ var nullSelectCtrl = {
25516
+ addOption: noop,
25517
+ removeOption: noop
25518
+ };
25519
+
25520
+ return {
25521
+ restrict: 'E',
25522
+ priority: 100,
25523
+ compile: function(element, attr) {
25524
+ if (isUndefined(attr.value)) {
25525
+ var interpolateFn = $interpolate(element.text(), true);
25526
+ if (!interpolateFn) {
25527
+ attr.$set('value', element.text());
25528
+ }
25529
+ }
25530
+
25531
+ return function (scope, element, attr) {
25532
+ var selectCtrlName = '$selectController',
25533
+ parent = element.parent(),
25534
+ selectCtrl = parent.data(selectCtrlName) ||
25535
+ parent.parent().data(selectCtrlName); // in case we are in optgroup
25536
+
25537
+ if (!selectCtrl || !selectCtrl.databound) {
25538
+ selectCtrl = nullSelectCtrl;
25539
+ }
25540
+
25541
+ if (interpolateFn) {
25542
+ scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {
25543
+ attr.$set('value', newVal);
25544
+ if (oldVal !== newVal) {
25545
+ selectCtrl.removeOption(oldVal);
25546
+ }
25547
+ selectCtrl.addOption(newVal, element);
25548
+ });
25549
+ } else {
25550
+ selectCtrl.addOption(attr.value, element);
25551
+ }
25552
+
25553
+ element.on('$destroy', function() {
25554
+ selectCtrl.removeOption(attr.value);
25555
+ });
25556
+ };
25557
+ }
25558
+ };
25559
+}];
25560
+
25561
+var styleDirective = valueFn({
25562
+ restrict: 'E',
25563
+ terminal: false
25564
+});
25565
+
25566
+ if (window.angular.bootstrap) {
25567
+ //AngularJS is already loaded, so we can return here...
25568
+ console.log('WARNING: Tried to load angular more than once.');
25569
+ return;
25570
+ }
25571
+
25572
+ //try to bind to jquery now so that one can write jqLite(document).ready()
25573
+ //but we will rebind on bootstrap again.
25574
+ bindJQuery();
25575
+
25576
+ publishExternalAPI(angular);
25577
+
25578
+ jqLite(document).ready(function() {
25579
+ angularInit(document, bootstrap);
25580
+ });
25581
+
25582
+})(window, document);
25583
+
25584
+!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>');
securis/src/main/webapp/js/angular/angular.min.js
....@@ -0,0 +1,247 @@
1
+/*
2
+ AngularJS v1.3.0
3
+ (c) 2010-2014 Google, Inc. http://angularjs.org
4
+ License: MIT
5
+*/
6
+(function(S,X,u){'use strict';function y(b){return function(){var a=arguments[0],c;c="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.3.0/"+(b?b+"/":"")+a;for(a=1;a<arguments.length;a++){c=c+(1==a?"?":"&")+"p"+(a-1)+"=";var d=encodeURIComponent,e;e=arguments[a];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;c+=d(e)}return Error(c)}}function Ra(b){if(null==b||Sa(b))return!1;var a=b.length;return b.nodeType===
7
+ka&&a?!0:I(b)||B(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function r(b,a,c){var d,e;if(b)if(F(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d,b);else if(B(b)||Ra(b)){var f="object"!==typeof b;d=0;for(e=b.length;d<e;d++)(f||d in b)&&a.call(c,b[d],d,b)}else if(b.forEach&&b.forEach!==r)b.forEach(a,c,b);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d,b);return b}function ic(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);
8
+return a.sort()}function zd(b,a,c){for(var d=ic(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function jc(b){return function(a,c){b(c,a)}}function Ad(){return++hb}function kc(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function E(b){for(var a=b.$$hashKey,c=1,d=arguments.length;c<d;c++){var e=arguments[c];if(e)for(var f=Object.keys(e),g=0,k=f.length;g<k;g++){var h=f[g];b[h]=e[h]}}kc(b,a);return b}function ba(b){return parseInt(b,10)}function lc(b,a){return E(new (E(function(){},{prototype:b})),
9
+a)}function A(){}function Ta(b){return b}function da(b){return function(){return b}}function w(b){return"undefined"===typeof b}function z(b){return"undefined"!==typeof b}function G(b){return null!==b&&"object"===typeof b}function I(b){return"string"===typeof b}function W(b){return"number"===typeof b}function ea(b){return"[object Date]"===Ia.call(b)}function F(b){return"function"===typeof b}function ib(b){return"[object RegExp]"===Ia.call(b)}function Sa(b){return b&&b.window===b}function Ua(b){return b&&
10
+b.$evalAsync&&b.$watch}function Va(b){return"boolean"===typeof b}function mc(b){return!(!b||!(b.nodeName||b.prop&&b.attr&&b.find))}function Bd(b){var a={};b=b.split(",");var c;for(c=0;c<b.length;c++)a[b[c]]=!0;return a}function pa(b){return N(b.nodeName||b[0].nodeName)}function Wa(b,a){var c=b.indexOf(a);0<=c&&b.splice(c,1);return a}function Ca(b,a,c,d){if(Sa(b)||Ua(b))throw Xa("cpws");if(a){if(b===a)throw Xa("cpi");c=c||[];d=d||[];if(G(b)){var e=c.indexOf(b);if(-1!==e)return d[e];c.push(b);d.push(a)}if(B(b))for(var f=
11
+a.length=0;f<b.length;f++)e=Ca(b[f],null,c,d),G(b[f])&&(c.push(b[f]),d.push(e)),a.push(e);else{var g=a.$$hashKey;B(a)?a.length=0:r(a,function(b,c){delete a[c]});for(f in b)b.hasOwnProperty(f)&&(e=Ca(b[f],null,c,d),G(b[f])&&(c.push(b[f]),d.push(e)),a[f]=e);kc(a,g)}}else if(a=b)B(b)?a=Ca(b,[],c,d):ea(b)?a=new Date(b.getTime()):ib(b)?(a=new RegExp(b.source,b.toString().match(/[^\/]*$/)[0]),a.lastIndex=b.lastIndex):G(b)&&(e=Object.create(Object.getPrototypeOf(b)),a=Ca(b,e,c,d));return a}function qa(b,
12
+a){if(B(b)){a=a||[];for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}else if(G(b))for(c in a=a||{},b)if("$"!==c.charAt(0)||"$"!==c.charAt(1))a[c]=b[c];return a||b}function la(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&"object"==c)if(B(b)){if(!B(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!la(b[d],a[d]))return!1;return!0}}else{if(ea(b))return ea(a)?la(b.getTime(),a.getTime()):!1;if(ib(b)&&ib(a))return b.toString()==a.toString();
13
+if(Ua(b)||Ua(a)||Sa(b)||Sa(a)||B(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!F(b[d])){if(!la(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==u&&!F(a[d]))return!1;return!0}return!1}function jb(b,a,c){return b.concat(Ya.call(a,c))}function nc(b,a){var c=2<arguments.length?Ya.call(arguments,2):[];return!F(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,c.concat(Ya.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?
14
+a.apply(b,arguments):a.call(b)}}function Cd(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)&&"$"===b.charAt(1)?c=u:Sa(a)?c="$WINDOW":a&&X===a?c="$DOCUMENT":Ua(a)&&(c="$SCOPE");return c}function ra(b,a){return"undefined"===typeof b?u:JSON.stringify(b,Cd,a?" ":null)}function oc(b){return I(b)?JSON.parse(b):b}function sa(b){b=D(b).clone();try{b.empty()}catch(a){}var c=D("<div>").append(b).html();try{return b[0].nodeType===kb?N(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+
15
+N(b)})}catch(d){return N(c)}}function pc(b){try{return decodeURIComponent(b)}catch(a){}}function qc(b){var a={},c,d;r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=pc(c[0]),z(d)&&(b=z(c[1])?pc(c[1]):!0,Hb.call(a,d)?B(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Ib(b){var a=[];r(b,function(b,d){B(b)?r(b,function(b){a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))}):a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))});return a.length?a.join("&"):""}function lb(b){return Da(b,
16
+!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Da(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Dd(b,a){var c,d,e=mb.length;b=D(b);for(d=0;d<e;++d)if(c=mb[d]+a,I(c=b.attr(c)))return c;return null}function Ed(b,a){var c,d,e={};r(mb,function(a){a+="app";!c&&b.hasAttribute&&b.hasAttribute(a)&&(c=b,d=b.getAttribute(a))});r(mb,function(a){a+="app";
17
+var e;!c&&(e=b.querySelector("["+a.replace(":","\\:")+"]"))&&(c=e,d=e.getAttribute(a))});c&&(e.strictDi=null!==Dd(c,"strict-di"),a(c,d?[d]:[],e))}function rc(b,a,c){G(c)||(c={});c=E({strictDi:!1},c);var d=function(){b=D(b);if(b.injector()){var d=b[0]===X?"document":sa(b);throw Xa("btstrpd",d.replace(/</,"&lt;").replace(/>/,"&gt;"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");
18
+d=Jb(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;S&&e.test(S.name)&&(c.debugInfoEnabled=!0,S.name=S.name.replace(e,""));if(S&&!f.test(S.name))return d();S.name=S.name.replace(f,"");ta.resumeBootstrap=function(b){r(b,function(b){a.push(b)});d()}}function Fd(){S.name="NG_ENABLE_DEBUG_INFO!"+S.name;S.location.reload()}function Gd(b){return ta.element(b).injector().get("$$testability")}
19
+function Kb(b,a){a=a||"_";return b.replace(Hd,function(b,d){return(d?a:"")+b.toLowerCase()})}function Id(){var b;sc||((ma=S.jQuery)&&ma.fn.on?(D=ma,E(ma.fn,{scope:Ja.scope,isolateScope:Ja.isolateScope,controller:Ja.controller,injector:Ja.injector,inheritedData:Ja.inheritedData}),b=ma.cleanData,ma.cleanData=function(a){var c;if(Lb)Lb=!1;else for(var d=0,e;null!=(e=a[d]);d++)(c=ma._data(e,"events"))&&c.$destroy&&ma(e).triggerHandler("$destroy");b(a)}):D=R,ta.element=D,sc=!0)}function Mb(b,a,c){if(!b)throw Xa("areq",
20
+a||"?",c||"required");return b}function nb(b,a,c){c&&B(b)&&(b=b[b.length-1]);Mb(F(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ka(b,a){if("hasOwnProperty"===b)throw Xa("badname",a);}function tc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&F(b)?nc(e,b):b}function ob(b){var a=b[0];b=b[b.length-1];var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==b);return D(c)}function wa(){return Object.create(null)}
21
+function Jd(b){function a(a,b,c){return a[b]||(a[b]=c())}var c=y("$injector"),d=y("ng");b=a(b,"angular",Object);b.$$minErr=b.$$minErr||y;return a(b,"module",function(){var b={};return function(f,g,k){if("hasOwnProperty"===f)throw d("badname","module");g&&b.hasOwnProperty(f)&&(b[f]=null);return a(b,f,function(){function a(c,d,e,f){f||(f=b);return function(){f[e||"push"]([c,d,arguments]);return n}}if(!g)throw c("nomod",f);var b=[],d=[],e=[],p=a("$injector","invoke","push",d),n={_invokeQueue:b,_configBlocks:d,
22
+_runBlocks:e,requires:g,name:f,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:p,run:function(a){e.push(a);return this}};k&&p(k);return n})}})}function Kd(b){E(b,{bootstrap:rc,copy:Ca,extend:E,equals:la,
23
+element:D,forEach:r,injector:Jb,noop:A,bind:nc,toJson:ra,fromJson:oc,identity:Ta,isUndefined:w,isDefined:z,isString:I,isFunction:F,isObject:G,isNumber:W,isElement:mc,isArray:B,version:Ld,isDate:ea,lowercase:N,uppercase:pb,callbacks:{counter:0},getTestability:Gd,$$minErr:y,$$csp:Za,reloadWithDebugInfo:Fd});$a=Jd(S);try{$a("ngLocale")}catch(a){$a("ngLocale",[]).provider("$locale",Md)}$a("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Nd});a.provider("$compile",uc).directive({a:Od,
24
+input:vc,textarea:vc,form:Pd,script:Qd,select:Rd,style:Sd,option:Td,ngBind:Ud,ngBindHtml:Vd,ngBindTemplate:Wd,ngClass:Xd,ngClassEven:Yd,ngClassOdd:Zd,ngCloak:$d,ngController:ae,ngForm:be,ngHide:ce,ngIf:de,ngInclude:ee,ngInit:fe,ngNonBindable:ge,ngPluralize:he,ngRepeat:ie,ngShow:je,ngStyle:ke,ngSwitch:le,ngSwitchWhen:me,ngSwitchDefault:ne,ngOptions:oe,ngTransclude:pe,ngModel:qe,ngList:re,ngChange:se,pattern:wc,ngPattern:wc,required:xc,ngRequired:xc,minlength:yc,ngMinlength:yc,maxlength:zc,ngMaxlength:zc,
25
+ngValue:te,ngModelOptions:ue}).directive({ngInclude:ve}).directive(qb).directive(Ac);a.provider({$anchorScroll:we,$animate:xe,$browser:ye,$cacheFactory:ze,$controller:Ae,$document:Be,$exceptionHandler:Ce,$filter:Bc,$interpolate:De,$interval:Ee,$http:Fe,$httpBackend:Ge,$location:He,$log:Ie,$parse:Je,$rootScope:Ke,$q:Le,$$q:Me,$sce:Ne,$sceDelegate:Oe,$sniffer:Pe,$templateCache:Qe,$templateRequest:Re,$$testability:Se,$timeout:Te,$window:Ue,$$rAF:Ve,$$asyncCallback:We})}])}function ab(b){return b.replace(Xe,
26
+function(a,b,d,e){return e?d.toUpperCase():d}).replace(Ye,"Moz$1")}function Cc(b){b=b.nodeType;return b===ka||!b||9===b}function Dc(b,a){var c,d,e=a.createDocumentFragment(),f=[];if(Nb.test(b)){c=c||e.appendChild(a.createElement("div"));d=(Ze.exec(b)||["",""])[1].toLowerCase();d=ha[d]||ha._default;c.innerHTML=d[1]+b.replace($e,"<$1></$2>")+d[2];for(d=d[0];d--;)c=c.lastChild;f=jb(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";r(f,function(a){e.appendChild(a)});
27
+return e}function R(b){if(b instanceof R)return b;var a;I(b)&&(b=U(b),a=!0);if(!(this instanceof R)){if(a&&"<"!=b.charAt(0))throw Ob("nosel");return new R(b)}if(a){a=X;var c;b=(c=af.exec(b))?[a.createElement(c[1])]:(c=Dc(b,a))?c.childNodes:[]}Ec(this,b)}function Pb(b){return b.cloneNode(!0)}function rb(b,a){a||sb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;d<e;d++)sb(c[d])}function Fc(b,a,c,d){if(z(d))throw Ob("offargs");var e=(d=tb(b))&&d.events,f=d&&d.handle;if(f)if(a)r(a.split(" "),
28
+function(a){if(z(c)){var d=e[a];Wa(d||[],c);if(d&&0<d.length)return}b.removeEventListener(a,f,!1);delete e[a]});else for(a in e)"$destroy"!==a&&b.removeEventListener(a,f,!1),delete e[a]}function sb(b,a){var c=b.ng339,d=c&&ub[c];d&&(a?delete d.data[a]:(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),Fc(b)),delete ub[c],b.ng339=u))}function tb(b,a){var c=b.ng339,c=c&&ub[c];a&&!c&&(b.ng339=c=++bf,c=ub[c]={events:{},data:{},handle:u});return c}function Qb(b,a,c){if(Cc(b)){var d=z(c),e=!d&&a&&!G(a),
29
+f=!a;b=(b=tb(b,!e))&&b.data;if(d)b[a]=c;else{if(f)return b;if(e)return b&&b[a];E(b,a)}}}function Rb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function Sb(b,a){a&&b.setAttribute&&r(a.split(" "),function(a){b.setAttribute("class",U((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+U(a)+" "," ")))})}function Tb(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");
30
+r(a.split(" "),function(a){a=U(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",U(c))}}function Ec(b,a){if(a)if(a.nodeType)b[b.length++]=a;else{var c=a.length;if("number"===typeof c&&a.window!==a){if(c)for(var d=0;d<c;d++)b[b.length++]=a[d]}else b[b.length++]=a}}function Gc(b,a){return vb(b,"$"+(a||"ngController")+"Controller")}function vb(b,a,c){9==b.nodeType&&(b=b.documentElement);for(a=B(a)?a:[a];b;){for(var d=0,e=a.length;d<e;d++)if((c=D.data(b,a[d]))!==u)return c;b=b.parentNode||
31
+11===b.nodeType&&b.host}}function Hc(b){for(rb(b,!0);b.firstChild;)b.removeChild(b.firstChild)}function Ic(b,a){a||rb(b);var c=b.parentNode;c&&c.removeChild(b)}function cf(b,a){a=a||S;if("complete"===a.document.readyState)a.setTimeout(b);else D(a).on("load",b)}function Jc(b,a){var c=wb[a.toLowerCase()];return c&&Kc[pa(b)]&&c}function df(b,a){var c=b.nodeName;return("INPUT"===c||"TEXTAREA"===c)&&Lc[a]}function ef(b,a){var c=function(c,e){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=
32
+a[e||c.type],g=f?f.length:0;if(g){if(w(c.immediatePropagationStopped)){var k=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();k&&k.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};1<g&&(f=qa(f));for(var h=0;h<g;h++)c.isImmediatePropagationStopped()||f[h].call(b,c)}};c.elem=b;return c}function La(b,a){var c=b&&b.$$hashKey;if(c)return"function"===typeof c&&(c=b.$$hashKey()),
33
+c;c=typeof b;return c="function"==c||"object"==c&&null!==b?b.$$hashKey=c+":"+(a||Ad)():c+":"+b}function bb(b,a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function ff(b){return(b=b.toString().replace(Mc,"").match(Nc))?"function("+(b[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function Ub(b,a,c){var d;if("function"===typeof b){if(!(d=b.$inject)){d=[];if(b.length){if(a)throw I(c)&&c||(c=b.name||ff(b)),Ea("strictdi",c);a=b.toString().replace(Mc,"");a=a.match(Nc);r(a[1].split(gf),
34
+function(a){a.replace(hf,function(a,b,c){d.push(c)})})}b.$inject=d}}else B(b)?(a=b.length-1,nb(b[a],"fn"),d=b.slice(0,a)):nb(b,"fn",!0);return d}function Jb(b,a){function c(a){return function(b,c){if(G(b))r(b,jc(a));else return a(b,c)}}function d(a,b){Ka(a,"service");if(F(b)||B(b))b=p.instantiate(b);if(!b.$get)throw Ea("pget",a);return q[a+"Provider"]=b}function e(a,b){return function(){var c=s.invoke(b,this,u,a);if(w(c))throw Ea("undef",a);return c}}function f(a,b,c){return d(a,{$get:!1!==c?e(a,
35
+b):b})}function g(a){var b=[],c;r(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=p.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{I(a)?(c=$a(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):F(a)?b.push(p.invoke(a)):B(a)?b.push(p.invoke(a)):nb(a,"module")}catch(e){throw B(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ea("modulerr",a,e.stack||e.message||e);}}});
36
+return b}function k(b,c){function d(a){if(b.hasOwnProperty(a)){if(b[a]===h)throw Ea("cdep",a+" <- "+l.join(" <- "));return b[a]}try{return l.unshift(a),b[a]=h,b[a]=c(a)}catch(e){throw b[a]===h&&delete b[a],e;}finally{l.shift()}}function e(b,c,f,g){"string"===typeof f&&(g=f,f=null);var h=[];g=Ub(b,a,g);var k,l,n;l=0;for(k=g.length;l<k;l++){n=g[l];if("string"!==typeof n)throw Ea("itkn",n);h.push(f&&f.hasOwnProperty(n)?f[n]:d(n))}B(b)&&(b=b[k]);return b.apply(c,h)}return{invoke:e,instantiate:function(a,
37
+b,c){var d=function(){};d.prototype=(B(a)?a[a.length-1]:a).prototype;d=new d;a=e(a,d,b,c);return G(a)||F(a)?a:d},get:d,annotate:Ub,has:function(a){return q.hasOwnProperty(a+"Provider")||b.hasOwnProperty(a)}}}a=!0===a;var h={},l=[],m=new bb([],!0),q={$provide:{provider:c(d),factory:c(f),service:c(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:c(function(a,b){return f(a,da(b),!1)}),constant:c(function(a,b){Ka(a,"constant");q[a]=b;n[a]=b}),decorator:function(a,b){var c=
38
+p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=s.invoke(d,c);return s.invoke(b,null,{$delegate:a})}}}},p=q.$injector=k(q,function(){throw Ea("unpr",l.join(" <- "));}),n={},s=n.$injector=k(n,function(a){var b=p.get(a+"Provider");return s.invoke(b.$get,b,u,a)});r(g(b),function(a){s.invoke(a||A)});return s}function we(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===
39
+pa(a))return b=a,!0});return b}function f(b){if(b){b.scrollIntoView();var c;c=g.yOffset;F(c)?c=c():mc(c)?(c=c[0],c="fixed"!==a.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):W(c)||(c=0);c&&(b=b.getBoundingClientRect().top,a.scrollBy(0,b-c))}else a.scrollTo(0,0)}function g(){var a=c.hash(),b;a?(b=k.getElementById(a))?f(b):(b=e(k.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var k=a.document;b&&d.$watch(function(){return c.hash()},function(a,b){a===b&&""===a||cf(function(){d.$evalAsync(g)})});
40
+return g}]}function We(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,0,!1)}}]}function jf(b,a,c,d){function e(a){try{a.apply(null,Ya.call(arguments,1))}finally{if(x--,0===x)for(;t.length;)try{t.pop()()}catch(b){c.error(b)}}}function f(a,b){(function xa(){r(T,function(a){a()});C=b(xa,a)})()}function g(){k();h()}function k(){M=b.history.state;M=w(M)?null:M;la(M,V)&&(M=V);V=M}function h(){if(H!==m.url()||P!==M)H=m.url(),P=M,r(O,function(a){a(m.url(),
41
+M)})}function l(a){try{return decodeURIComponent(a)}catch(b){return a}}var m=this,q=a[0],p=b.location,n=b.history,s=b.setTimeout,J=b.clearTimeout,v={};m.isMock=!1;var x=0,t=[];m.$$completeOutstandingRequest=e;m.$$incOutstandingRequestCount=function(){x++};m.notifyWhenNoOutstandingRequests=function(a){r(T,function(a){a()});0===x?a():t.push(a)};var T=[],C;m.addPollFn=function(a){w(C)&&f(100,s);T.push(a);return a};var M,P,H=p.href,Q=a.find("base"),aa=null;k();P=M;m.url=function(a,c,e){w(e)&&(e=null);
42
+p!==b.location&&(p=b.location);n!==b.history&&(n=b.history);if(a){var f=P===e;if(H!==a||d.history&&!f){var g=H&&Fa(H)===Fa(a);H=a;P=e;!d.history||g&&f?(g||(aa=a),c?p.replace(a):p.href=a):(n[c?"replaceState":"pushState"](e,"",a),k(),P=M);return m}}else return aa||p.href.replace(/%27/g,"'")};m.state=function(){return M};var O=[],K=!1,V=null;m.onUrlChange=function(a){if(!K){if(d.history)D(b).on("popstate",g);D(b).on("hashchange",g);K=!0}O.push(a);return a};m.$$checkUrlChange=h;m.baseHref=function(){var a=
43
+Q.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var ca={},Ma="",fa=m.baseHref();m.cookies=function(a,b){var d,e,f,g;if(a)b===u?q.cookie=encodeURIComponent(a)+"=;path="+fa+";expires=Thu, 01 Jan 1970 00:00:00 GMT":I(b)&&(d=(q.cookie=encodeURIComponent(a)+"="+encodeURIComponent(b)+";path="+fa).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(q.cookie!==Ma)for(Ma=q.cookie,d=Ma.split("; "),ca={},f=0;f<d.length;f++)e=
44
+d[f],g=e.indexOf("="),0<g&&(a=l(e.substring(0,g)),ca[a]===u&&(ca[a]=l(e.substring(g+1))));return ca}};m.defer=function(a,b){var c;x++;c=s(function(){delete v[c];e(a)},b||0);v[c]=!0;return c};m.defer.cancel=function(a){return v[a]?(delete v[a],J(a),e(A),!0):!1}}function ye(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new jf(b,d,a,c)}]}function ze(){this.$get=function(){function b(b,d){function e(a){a!=q&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,q),q=a,q.n=null)}function f(a,
45
+b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw y("$cacheFactory")("iid",b);var g=0,k=E({},d,{id:b}),h={},l=d&&d.capacity||Number.MAX_VALUE,m={},q=null,p=null;return a[b]={put:function(a,b){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}if(!w(b))return a in h||g++,h[a]=b,g>l&&this.remove(p.key),b},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return h[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==q&&(q=b.p);b==p&&(p=b.n);f(b.n,b.p);delete m[a]}delete h[a];
46
+g--},removeAll:function(){h={};g=0;m={};q=p=null},destroy:function(){m=k=h=null;delete a[b]},info:function(){return E({},k,{size:g})}}}var a={};b.info=function(){var b={};r(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Qe(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function uc(b,a){function c(a,b){var c=/^\s*([@=&])(\??)\s*(\w*)\s*$/,d={};r(a,function(a,e){var f=a.match(c);if(!f)throw ia("iscp",b,e,a);d[e]={attrName:f[3]||e,mode:f[1],
47
+optional:"?"===f[2]}});return d}var d={},e=/^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,f=/(([\d\w_\-]+)(?:\:([^;]+))?;?)/,g=Bd("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,h=/^(on[a-z]+|formaction)$/;this.directive=function q(a,e){Ka(a,"directive");I(a)?(Mb(e,"directiveFactory"),d.hasOwnProperty(a)||(d[a]=[],b.factory(a+"Directive",["$injector","$exceptionHandler",function(b,e){var f=[];r(d[a],function(d,g){try{var h=b.invoke(d);F(h)?h={compile:da(h)}:!h.compile&&h.link&&(h.compile=da(h.link));
48
+h.priority=h.priority||0;h.index=g;h.name=h.name||a;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"EA";G(h.scope)&&(h.$$isolateBindings=c(h.scope,h.name));f.push(h)}catch(k){e(k)}});return f}])),d[a].push(e)):r(a,jc(q));return this};this.aHrefSanitizationWhitelist=function(b){return z(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()};
49
+var l=!0;this.debugInfoEnabled=function(a){return z(a)?(l=a,this):l};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,c,s,J,v,x,t,T,C,M){function P(a,b){try{a.addClass(b)}catch(c){}}function H(a,b,c,d,e){a instanceof D||(a=D(a));r(a,function(b,c){b.nodeType==kb&&b.nodeValue.match(/\S+/)&&(a[c]=D(b).wrap("<span></span>").parent()[0])});var f=Q(a,b,a,c,d,e);H.$$addScopeClass(a);
50
+var g=null;return function(b,c,d,e,h){Mb(b,"scope");g||(g=(h=h&&h[0])?"foreignobject"!==pa(h)&&h.toString().match(/SVG/)?"svg":"html":"html");h="html"!==g?D(S(g,D("<div>").append(a).html())):c?Ja.clone.call(a):a;if(d)for(var k in d)h.data("$"+k+"Controller",d[k].instance);H.$$addScopeInfo(h,b);c&&c(h,b);f&&f(b,h,h,e);return h}}function Q(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,p,n,t,s;if(q)for(s=Array(c.length),p=0;p<h.length;p+=3)f=h[p],s[f]=c[f];else s=c;p=0;for(n=h.length;p<n;)k=s[h[p++]],c=
51
+h[p++],f=h[p++],c?(c.scope?(l=a.$new(),H.$$addScopeInfo(D(k),l)):l=a,t=c.transcludeOnThisElement?aa(a,c.transclude,e,c.elementTranscludeOnThisElement):!c.templateOnThisElement&&e?e:!e&&b?aa(a,b):null,c(f,l,k,d,t)):f&&f(a,k.childNodes,u,e)}for(var h=[],k,l,p,n,q,t=0;t<a.length;t++){k=new Xb;l=O(a[t],[],k,0===t?d:u,e);(f=l.length?ca(l,a[t],k,b,c,null,[],[],f):null)&&f.scope&&H.$$addScopeClass(k.$$element);k=f&&f.terminal||!(p=a[t].childNodes)||!p.length?null:Q(p,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&
52
+f.transclude:b);if(f||k)h.push(t,f,k),n=!0,q=q||f;f=null}return n?g:null}function aa(a,b,c,d){return function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,f,c,g)}}function O(b,c,g,h,k){var l=g.$attr,p;switch(b.nodeType){case ka:fa(c,ua(pa(b)),"E",h,k);for(var n,t,s,v=b.attributes,J=0,T=v&&v.length;J<T;J++){var M=!1,C=!1;n=v[J];p=n.name;n=U(n.value);t=ua(p);if(s=ya.test(t))p=Kb(t.substr(6),"-");var H=t.replace(/(Start|End)$/,""),P;a:{var O=H;if(d.hasOwnProperty(O)){P=void 0;for(var O=
53
+a.get(O+"Directive"),r=0,aa=O.length;r<aa;r++)if(P=O[r],P.multiElement){P=!0;break a}}P=!1}P&&t===H+"Start"&&(M=p,C=p.substr(0,p.length-5)+"end",p=p.substr(0,p.length-6));t=ua(p.toLowerCase());l[t]=p;if(s||!g.hasOwnProperty(t))g[t]=n,Jc(b,t)&&(g[t]=!0);R(b,c,n,t,s);fa(c,t,"A",h,k,M,C)}b=b.className;if(I(b)&&""!==b)for(;p=f.exec(b);)t=ua(p[2]),fa(c,t,"C",h,k)&&(g[t]=U(p[3])),b=b.substr(p.index+p[0].length);break;case kb:Y(c,b.nodeValue);break;case 8:try{if(p=e.exec(b.nodeValue))t=ua(p[1]),fa(c,t,"M",
54
+h,k)&&(g[t]=U(p[2]))}catch(x){}}c.sort(y);return c}function K(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ia("uterdir",b,c);a.nodeType==ka&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return D(d)}function V(a,b,c){return function(d,e,f,g,h){e=K(e[0],b,c);return a(d,e,f,g,h)}}function ca(a,d,e,f,g,h,l,q,t){function s(a,b,c,d){if(a){c&&(a=V(a,c,d));a.require=L.require;a.directiveName=ga;if(Q===L||L.$$isolateScope)a=
55
+Z(a,{isolateScope:!0});l.push(a)}if(b){c&&(b=V(b,c,d));b.require=L.require;b.directiveName=ga;if(Q===L||L.$$isolateScope)b=Z(b,{isolateScope:!0});q.push(b)}}function T(a,b,c,d){var e,f="data",g=!1,h=c,l;if(I(b)){if(l=b.match(k),b=b.substring(l[0].length),l[3]&&(l[1]?l[3]=null:l[1]=l[3]),"^"===l[1]?f="inheritedData":"^^"===l[1]&&(f="inheritedData",h=c.parent()),"?"===l[2]&&(g=!0),e=null,d&&"data"===f&&(e=d[b])&&(e=e.instance),e=e||h[f]("$"+b+"Controller"),!e&&!g)throw ia("ctreq",b,a);}else B(b)&&(e=
56
+[],r(b,function(b){e.push(T(a,b,c,d))}));return e}function M(a,c,f,g,h){function k(a,b,c){var d;Ua(a)||(c=b,b=a,a=u);E&&(d=P);c||(c=E?O.parent():O);return h(a,b,d,c,Wb)}var n,t,s,C,P,xb,O,K;d===f?(K=e,O=e.$$element):(O=D(f),K=new Xb(O,e));Q&&(C=c.$new(!0));xb=h&&k;aa&&(x={},P={},r(aa,function(a){var b={$scope:a===Q||a.$$isolateScope?C:c,$element:O,$attrs:K,$transclude:xb};s=a.controller;"@"==s&&(s=K[a.name]);b=v(s,b,!0,a.controllerAs);P[a.name]=b;E||O.data("$"+a.name+"Controller",b.instance);x[a.name]=
57
+b}));if(Q){H.$$addScopeInfo(O,C,!0,!(ca&&(ca===Q||ca===Q.$$originalDirective)));H.$$addScopeClass(O,!0);g=x&&x[Q.name];var V=C;g&&g.identifier&&!0===Q.bindToController&&(V=g.instance);r(C.$$isolateBindings=Q.$$isolateBindings,function(a,d){var e=a.attrName,f=a.optional,g,h,k,l;switch(a.mode){case "@":K.$observe(e,function(a){V[d]=a});K.$$observers[e].$$scope=c;K[e]&&(V[d]=b(K[e])(c));break;case "=":if(f&&!K[e])break;h=J(K[e]);l=h.literal?la:function(a,b){return a===b||a!==a&&b!==b};k=h.assign||function(){g=
58
+V[d]=h(c);throw ia("nonassign",K[e],Q.name);};g=V[d]=h(c);f=function(a){l(a,V[d])||(l(a,g)?k(c,a=V[d]):V[d]=a);return g=a};f.$stateful=!0;f=c.$watch(J(K[e],f),null,h.literal);C.$on("$destroy",f);break;case "&":h=J(K[e]),V[d]=function(a){return h(c,a)}}})}x&&(r(x,function(a){a()}),x=null);g=0;for(n=l.length;g<n;g++)t=l[g],$(t,t.isolateScope?C:c,O,K,t.require&&T(t.directiveName,t.require,O,P),xb);var Wb=c;Q&&(Q.template||null===Q.templateUrl)&&(Wb=C);a&&a(Wb,f.childNodes,u,h);for(g=q.length-1;0<=g;g--)t=
59
+q[g],$(t,t.isolateScope?C:c,O,K,t.require&&T(t.directiveName,t.require,O,P),xb)}t=t||{};for(var C=-Number.MAX_VALUE,P,aa=t.controllerDirectives,x,Q=t.newIsolateScopeDirective,ca=t.templateDirective,fa=t.nonTlbTranscludeDirective,Na=!1,A=!1,E=t.hasElementTranscludeDirective,Y=e.$$element=D(d),L,ga,y,Ga=f,N,R=0,ya=a.length;R<ya;R++){L=a[R];var W=L.$$start,Vb=L.$$end;W&&(Y=K(d,W,Vb));y=u;if(C>L.priority)break;if(y=L.scope)L.templateUrl||(G(y)?(xa("new/isolated scope",Q||P,L,Y),Q=L):xa("new/isolated scope",
60
+Q,L,Y)),P=P||L;ga=L.name;!L.templateUrl&&L.controller&&(y=L.controller,aa=aa||{},xa("'"+ga+"' controller",aa[ga],L,Y),aa[ga]=L);if(y=L.transclude)Na=!0,L.$$tlb||(xa("transclusion",fa,L,Y),fa=L),"element"==y?(E=!0,C=L.priority,y=Y,Y=e.$$element=D(X.createComment(" "+ga+": "+e[ga]+" ")),d=Y[0],yb(g,Ya.call(y,0),d),Ga=H(y,f,C,h&&h.name,{nonTlbTranscludeDirective:fa})):(y=D(Pb(d)).contents(),Y.empty(),Ga=H(y,f));if(L.template)if(A=!0,xa("template",ca,L,Y),ca=L,y=F(L.template)?L.template(Y,e):L.template,
61
+y=Oc(y),L.replace){h=L;y=Nb.test(y)?Pc(S(L.templateNamespace,U(y))):[];d=y[0];if(1!=y.length||d.nodeType!==ka)throw ia("tplrt",ga,"");yb(g,Y,d);ya={$attr:{}};y=O(d,[],ya);var ba=a.splice(R+1,a.length-(R+1));Q&&Ma(y);a=a.concat(y).concat(ba);z(e,ya);ya=a.length}else Y.html(y);if(L.templateUrl)A=!0,xa("template",ca,L,Y),ca=L,L.replace&&(h=L),M=w(a.splice(R,a.length-R),Y,e,g,Na&&Ga,l,q,{controllerDirectives:aa,newIsolateScopeDirective:Q,templateDirective:ca,nonTlbTranscludeDirective:fa}),ya=a.length;
62
+else if(L.compile)try{N=L.compile(Y,e,Ga),F(N)?s(null,N,W,Vb):N&&s(N.pre,N.post,W,Vb)}catch(kf){c(kf,sa(Y))}L.terminal&&(M.terminal=!0,C=Math.max(C,L.priority))}M.scope=P&&!0===P.scope;M.transcludeOnThisElement=Na;M.elementTranscludeOnThisElement=E;M.templateOnThisElement=A;M.transclude=Ga;t.hasElementTranscludeDirective=E;return M}function Ma(a){for(var b=0,c=a.length;b<c;b++)a[b]=lc(a[b],{$$isolateScope:!0})}function fa(b,e,f,g,h,k,l){if(e===h)return null;h=null;if(d.hasOwnProperty(e)){var p;e=
63
+a.get(e+"Directive");for(var t=0,s=e.length;t<s;t++)try{p=e[t],(g===u||g>p.priority)&&-1!=p.restrict.indexOf(f)&&(k&&(p=lc(p,{$$start:k,$$end:l})),b.push(p),h=p)}catch(v){c(v)}}return h}function z(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});r(b,function(b,f){"class"==f?(P(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+
64
+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function w(a,b,c,d,e,f,g,h){var k=[],l,p,n=b[0],t=a.shift(),q=E({},t,{templateUrl:null,transclude:null,replace:null,$$originalDirective:t}),v=F(t.templateUrl)?t.templateUrl(b,c):t.templateUrl,J=t.templateNamespace;b.empty();s(T.getTrustedResourceUrl(v)).then(function(s){var C,T;s=Oc(s);if(t.replace){s=Nb.test(s)?Pc(S(J,U(s))):[];C=s[0];if(1!=s.length||C.nodeType!==ka)throw ia("tplrt",t.name,v);s={$attr:{}};yb(d,b,C);var M=O(C,
65
+[],s);G(t.scope)&&Ma(M);a=M.concat(a);z(c,s)}else C=n,b.html(s);a.unshift(q);l=ca(a,C,c,e,b,t,f,g,h);r(d,function(a,c){a==C&&(d[c]=b[0])});for(p=Q(b[0].childNodes,e);k.length;){s=k.shift();T=k.shift();var H=k.shift(),K=k.shift(),M=b[0];if(!s.$$destroyed){if(T!==n){var x=T.className;h.hasElementTranscludeDirective&&t.replace||(M=Pb(C));yb(H,D(T),M);P(D(M),x)}T=l.transcludeOnThisElement?aa(s,l.transclude,K):K;l(p,s,M,d,T)}}k=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(k?(k.push(b),k.push(c),
66
+k.push(d),k.push(a)):(l.transcludeOnThisElement&&(a=aa(b,l.transclude,e)),l(p,b,c,d,a)))}}function y(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function xa(a,b,c,d){if(b)throw ia("multidir",b.name,c.name,a,sa(d));}function Y(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&H.$$addBindingClass(a);return function(a,c){var e=c.parent();b||H.$$addBindingClass(e);H.$$addBindingInfo(e,d.expressions);a.$watch(d,
67
+function(a){c[0].nodeValue=a})}}})}function S(a,b){a=N(a||"html");switch(a){case "svg":case "math":var c=X.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function Ga(a,b){if("srcdoc"==b)return T.HTML;var c=pa(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return T.RESOURCE_URL}function R(a,c,d,e,f){var k=b(d,!0);if(k){if("multiple"===e&&"select"===pa(a))throw ia("selmulti",sa(a));c.push({priority:100,compile:function(){return{pre:function(c,
68
+d,l){d=l.$$observers||(l.$$observers={});if(h.test(e))throw ia("nodomevents");l[e]&&(k=b(l[e],!0,Ga(a,e),g[e]||f))&&(l[e]=k(c),(d[e]||(d[e]=[])).$$inter=!0,(l.$$observers&&l.$$observers[e].$$scope||c).$watch(k,function(a,b){"class"===e&&a!=b?l.$updateClass(a,b):l.$set(e,a)}))}}}})}}function yb(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=
69
+c);break}f&&f.replaceChild(c,d);a=X.createDocumentFragment();a.appendChild(d);D(c).data(D(d).data());ma?(Lb=!0,ma.cleanData([d])):delete D.cache[d[D.expando]];d=1;for(e=b.length;d<e;d++)f=b[d],D(f).remove(),a.appendChild(f),delete b[d];b[0]=c;b.length=1}function Z(a,b){return E(function(){return a.apply(null,arguments)},a,b)}function $(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,sa(d))}}var Xb=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr=
70
+{};this.$$element=a};Xb.prototype={$normalize:ua,$addClass:function(a){a&&0<a.length&&C.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&C.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Qc(a,b);c&&c.length&&C.addClass(this.$$element,c);(c=Qc(b,a))&&c.length&&C.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=this.$$element[0],g=Jc(f,a),h=df(f,a),f=a;g?(this.$$element.prop(a,b),e=g):h&&(this[h]=b,f=h);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=
71
+e=Kb(a,"-"));g=pa(this.$$element);if("a"===g&&"href"===a||"img"===g&&"src"===a)this[a]=b=M(b,"src"===a);else if("img"===g&&"srcset"===a){for(var g="",h=U(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(h)?k:/(,)/,h=h.split(k),k=Math.floor(h.length/2),l=0;l<k;l++)var p=2*l,g=g+M(U(h[p]),!0),g=g+(" "+U(h[p+1]));h=U(h[2*l]).split(/\s/);g+=M(U(h[0]),!0);2===h.length&&(g+=" "+U(h[1]));this[a]=b=g}!1!==d&&(null===b||b===u?this.$$element.removeAttr(e):this.$$element.attr(e,b));(a=this.$$observers)&&
72
+r(a[f],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=wa()),e=d[a]||(d[a]=[]);e.push(b);x.$evalAsync(function(){e.$$inter||b(c[a])});return function(){Wa(e,b)}}};var ga=b.startSymbol(),Na=b.endSymbol(),Oc="{{"==ga||"}}"==Na?Ta:function(a){return a.replace(/\{\{/g,ga).replace(/}}/g,Na)},ya=/^ngAttr[A-Z]/;H.$$addBindingInfo=l?function(a,b){var c=a.data("$binding")||[];B(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:A;H.$$addBindingClass=l?
73
+function(a){P(a,"ng-binding")}:A;H.$$addScopeInfo=l?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:A;H.$$addScopeClass=l?function(a,b){P(a,b?"ng-isolate-scope":"ng-scope")}:A;return H}]}function ua(b){return ab(b.replace(lf,""))}function Qc(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),f=0;a:for(;f<d.length;f++){for(var g=d[f],k=0;k<e.length;k++)if(g==e[k])continue a;c+=(0<c.length?" ":"")+g}return c}function Pc(b){b=D(b);var a=b.length;if(1>=a)return b;for(;a--;)8===
74
+b[a].nodeType&&mf.call(b,a,1);return b}function Ae(){var b={},a=!1,c=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,c){Ka(a,"controller");G(a)?E(b,a):b[a]=c};this.allowGlobals=function(){a=!0};this.$get=["$injector","$window",function(d,e){function f(a,b,c,d){if(!a||!G(a.$scope))throw y("$controller")("noscp",d,b);a.$scope[b]=c}return function(g,k,h,l){var m,q,p;h=!0===h;l&&I(l)&&(p=l);I(g)&&(l=g.match(c),q=l[1],p=p||l[3],g=b.hasOwnProperty(q)?b[q]:tc(k.$scope,q,!0)||(a?tc(e,q,!0):u),nb(g,q,!0));
75
+if(h)return h=function(){},h.prototype=(B(g)?g[g.length-1]:g).prototype,m=new h,p&&f(k,p,m,q||g.name),E(function(){d.invoke(g,m,k,q);return m},{instance:m,identifier:p});m=d.instantiate(g,k,q);p&&f(k,p,m,q||g.name);return m}}]}function Be(){this.$get=["$window",function(b){return D(b.document)}]}function Ce(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Rc(b){var a={},c,d,e;if(!b)return a;r(b.split("\n"),function(b){e=b.indexOf(":");c=N(U(b.substr(0,e)));
76
+d=U(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function Sc(b){var a=G(b)?b:u;return function(c){a||(a=Rc(b));return c?a[N(c)]||null:a}}function Tc(b,a,c){if(F(c))return c(b,a);r(c,function(c){b=c(b,a)});return b}function Fe(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults={transformResponse:[function(d,e){if(I(d)){d=d.replace(c,"");var f=e("Content-Type");if(f&&0===f.indexOf("application/json")||b.test(d)&&a.test(d))d=
77
+oc(d)}return d}],transformRequest:[function(a){return G(a)&&"[object File]"!==Ia.call(a)&&"[object Blob]"!==Ia.call(a)?ra(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:qa(d),put:qa(d),patch:qa(d)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},f=!1;this.useApplyAsync=function(a){return z(a)?(f=!!a,this):f};var g=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(a,b,c,d,q,p){function n(a){function b(a){var d=
78
+E({},a);d.data=a.data?Tc(a.data,a.headers,c.transformResponse):a.data;a=a.status;return 200<=a&&300>a?d:q.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){var b=e.headers,c=E({},a.headers),d,f,b=E({},b.common,b[N(a.method)]);a:for(d in b){a=N(d);for(f in c)if(N(f)===a)continue a;c[d]=b[d]}(function(a){var b;r(a,function(c,d){F(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})})(c);return c}(a);E(c,a);c.headers=d;c.method=pb(c.method);var f=
79
+[function(a){d=a.headers;var c=Tc(a.data,Sc(d),a.transformRequest);w(c)&&r(d,function(a,b){"content-type"===N(b)&&delete d[b]});w(a.withCredentials)&&!w(e.withCredentials)&&(a.withCredentials=e.withCredentials);return s(a,c,d).then(b,b)},u],g=q.when(c);for(r(x,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(),g=g.then(a,h)}g.success=function(a){g.then(function(b){a(b.data,
80
+b.status,b.headers,c)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,c)});return g};return g}function s(c,g,l){function p(a,b,c,e){function g(){s(b,a,c,e)}O&&(200<=a&&300>a?O.put(V,[a,b,Rc(c),e]):O.remove(V));f?d.$applyAsync(g):(g(),d.$$phase||d.$apply())}function s(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?x.resolve:x.reject)({data:a,status:b,headers:Sc(d),config:c,statusText:e})}function H(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,
81
+1)}var x=q.defer(),r=x.promise,O,K,V=J(c.url,c.params);n.pendingRequests.push(c);r.then(H,H);!c.cache&&!e.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(O=G(c.cache)?c.cache:G(e.cache)?e.cache:v);if(O)if(K=O.get(V),z(K)){if(K&&F(K.then))return K.then(H,H),K;B(K)?s(K[1],K[0],qa(K[2]),K[3]):s(K,200,{},"OK")}else O.put(V,r);w(K)&&((K=Uc(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:u)&&(l[c.xsrfHeaderName||e.xsrfHeaderName]=K),a(c.method,V,g,p,l,c.timeout,c.withCredentials,c.responseType));
82
+return r}function J(a,b){if(!b)return a;var c=[];zd(b,function(a,b){null===a||w(a)||(B(a)||(a=[a]),r(a,function(a){G(a)&&(a=ea(a)?a.toISOString():ra(a));c.push(Da(b)+"="+Da(a))}))});0<c.length&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var v=c("$http"),x=[];r(g,function(a){x.unshift(I(a)?p.get(a):p.invoke(a))});n.pendingRequests=[];(function(a){r(arguments,function(a){n[a]=function(b,c){return n(E(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){r(arguments,function(a){n[a]=
83
+function(b,c,d){return n(E(d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=e;return n}]}function nf(){return new S.XMLHttpRequest}function Ge(){this.$get=["$browser","$window","$document",function(b,a,c){return of(b,nf,b.defer,a.angular.callbacks,c[0])}]}function of(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m,!1);f.removeEventListener("error",m,!1);e.body.removeChild(f);
84
+f=null;var g=-1,n="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),n=a.type,g="error"===a.type?404:200);c&&c(g,n)};f.addEventListener("load",m,!1);f.addEventListener("error",m,!1);e.body.appendChild(f);return m}return function(e,k,h,l,m,q,p,n){function s(){x&&x();t&&t.abort()}function J(a,d,e,f,g){C&&c.cancel(C);x=t=null;a(d,e,f,g);b.$$completeOutstandingRequest(A)}b.$$incOutstandingRequestCount();k=k||b.url();if("jsonp"==N(e)){var v="_"+(d.counter++).toString(36);d[v]=function(a){d[v].data=
85
+a;d[v].called=!0};var x=f(k.replace("JSON_CALLBACK","angular.callbacks."+v),v,function(a,b){J(l,a,d[v].data,"",b);d[v]=A})}else{var t=a();t.open(e,k,!0);r(m,function(a,b){z(a)&&t.setRequestHeader(b,a)});t.onload=function(){var a=t.statusText||"",b="response"in t?t.response:t.responseText,c=1223===t.status?204:t.status;0===c&&(c=b?200:"file"==za(k).protocol?404:0);J(l,c,b,t.getAllResponseHeaders(),a)};e=function(){J(l,-1,null,null,"")};t.onerror=e;t.onabort=e;p&&(t.withCredentials=!0);if(n)try{t.responseType=
86
+n}catch(T){if("json"!==n)throw T;}t.send(h||null)}if(0<q)var C=c(s,q);else q&&F(q.then)&&q.then(s)}}function De(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(a){return"\\\\\\"+a}function g(f,g,n,s){function J(c){return c.replace(l,b).replace(m,a)}function v(a){try{var b;var c=n?e.getTrusted(n,a):e.valueOf(a);if(null==c)b="";else{switch(typeof c){case "string":break;
87
+case "number":c=""+c;break;default:c=ra(c)}b=c}return b}catch(g){a=Yb("interr",f,g.toString()),d(a)}}s=!!s;for(var x,t,T=0,C=[],M=[],P=f.length,H=[],r=[];T<P;)if(-1!=(x=f.indexOf(b,T))&&-1!=(t=f.indexOf(a,x+k)))T!==x&&H.push(J(f.substring(T,x))),T=f.substring(x+k,t),C.push(T),M.push(c(T,v)),T=t+h,r.push(H.length),H.push("");else{T!==P&&H.push(J(f.substring(T)));break}if(n&&1<H.length)throw Yb("noconcat",f);if(!g||C.length){var u=function(a){for(var b=0,c=C.length;b<c;b++){if(s&&w(a[b]))return;H[r[b]]=
88
+a[b]}return H.join("")};return E(function(a){var b=0,c=C.length,e=Array(c);try{for(;b<c;b++)e[b]=M[b](a);return u(e)}catch(g){a=Yb("interr",f,g.toString()),d(a)}},{exp:f,expressions:C,$$watchDelegate:function(a,b,c){var d;return a.$watchGroup(M,function(c,e){var f=u(c);F(b)&&b.call(this,f,c!==e?d:f,a);d=f},c)}})}}var k=b.length,h=a.length,l=new RegExp(b.replace(/./g,f),"g"),m=new RegExp(a.replace(/./g,f),"g");g.startSymbol=function(){return b};g.endSymbol=function(){return a};return g}]}function Ee(){this.$get=
89
+["$rootScope","$window","$q","$$q",function(b,a,c,d){function e(e,k,h,l){var m=a.setInterval,q=a.clearInterval,p=0,n=z(l)&&!l,s=(n?d:c).defer(),J=s.promise;h=z(h)?h:0;J.then(null,null,e);J.$$intervalId=m(function(){s.notify(p++);0<h&&p>=h&&(s.resolve(p),q(J.$$intervalId),delete f[J.$$intervalId]);n||b.$apply()},k);f[J.$$intervalId]=s;return J}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):
90
+!1};return e}]}function Md(){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(" "),
91
+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(b){return 1===b?"one":"other"}}}}function Zb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=lb(b[a]);return b.join("/")}function Vc(b,a,c){b=za(b,c);a.$$protocol=
92
+b.protocol;a.$$host=b.hostname;a.$$port=ba(b.port)||pf[b.protocol]||null}function Wc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=za(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=qc(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function va(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Fa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function $b(b){return b.substr(0,
93
+Fa(b).lastIndexOf("/")+1)}function ac(b,a){this.$$html5=!0;a=a||"";var c=$b(b);Vc(b,this,b);this.$$parse=function(a){var e=va(c,a);if(!I(e))throw cb("ipthprfx",a,c);Wc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Ib(this.$$search),b=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Zb(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;(f=va(b,d))!==u?
94
+(g=f,g=(f=va(a,f))!==u?c+(va("/",f)||f):b+g):(f=va(c,d))!==u?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function bc(b,a){var c=$b(b);Vc(b,this,b);this.$$parse=function(d){var e=va(b,d)||va(c,d),e="#"==e.charAt(0)?va(a,e):this.$$html5?e:"";if(!I(e))throw cb("ihshprfx",d,a);Wc(e,this,b);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Ib(this.$$search),e=this.$$hash?
95
+"#"+lb(this.$$hash):"";this.$$url=Zb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Fa(b)==Fa(a)?(this.$$parse(a),!0):!1}}function Xc(b,a){this.$$html5=!0;bc.apply(this,arguments);var c=$b(b);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Fa(d)?f=d:(g=va(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Ib(this.$$search),e=this.$$hash?"#"+lb(this.$$hash):
96
+"";this.$$url=Zb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function zb(b){return function(){return this[b]}}function Yc(b,a){return function(c){if(w(c))return this[b];this[b]=a(c);this.$$compose();return this}}function He(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return z(a)?(b=a,this):b};this.html5Mode=function(b){return Va(b)?(a.enabled=b,this):G(b)?(Va(b.enabled)&&(a.enabled=b.enabled),Va(b.requireBase)&&(a.requireBase=b.requireBase),Va(b.rewriteLinks)&&
97
+(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a,b,c){var e=h.url(),f=h.$$state;try{d.url(a,b,c),h.$$state=d.state()}catch(g){throw h.url(e),h.$$state=f,g;}}function k(a,b){c.$broadcast("$locationChangeSuccess",h.absUrl(),a,h.$$state,b)}var h,l;l=d.baseHref();var m=d.url(),q;if(a.enabled){if(!l&&a.requireBase)throw cb("nobase");q=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(l||"/");l=e.history?ac:Xc}else q=Fa(m),
98
+l=bc;h=new l(q,"#"+b);h.$$parseLinkUrl(m,m);h.$$state=d.state();var p=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&2!=b.which){for(var e=D(b.target);"a"!==pa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");G(g)&&"[object SVGAnimatedString]"===g.toString()&&(g=za(g.animVal).href);p.test(g)||!g||e.attr("target")||b.isDefaultPrevented()||!h.$$parseLinkUrl(g,k)||(b.preventDefault(),h.absUrl()!=
99
+d.url()&&(c.$apply(),S.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=m&&d.url(h.absUrl(),!0);var n=!0;d.onUrlChange(function(a,b){c.$evalAsync(function(){var d=h.absUrl(),e=h.$$state;h.$$parse(a);h.$$state=b;c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented?(h.$$parse(d),h.$$state=e,g(d,!1,e)):(n=!1,k(d,e))});c.$$phase||c.$digest()});c.$watch(function(){var a=d.url(),b=d.state(),f=h.$$replace,l=a!==h.absUrl()||h.$$html5&&e.history&&b!==h.$$state;if(n||l)n=!1,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",
100
+h.absUrl(),a,h.$$state,b).defaultPrevented?(h.$$parse(a),h.$$state=b):(l&&g(h.absUrl(),f,b===h.$$state?null:h.$$state),k(a,b))});h.$$replace=!1});return h}]}function Ie(){var b=!0,a=this;this.debugEnabled=function(a){return z(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||
101
+{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(h){}return a?function(){var a=[];r(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function na(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw oa("isecfld",a);return b}function Aa(b,a){if(b){if(b.constructor===
102
+b)throw oa("isecfn",a);if(b.window===b)throw oa("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw oa("isecdom",a);if(b===Object)throw oa("isecobj",a);}return b}function cc(b){return b.constant}function Oa(b,a,c,d){Aa(b,d);a=a.split(".");for(var e,f=0;1<a.length;f++){e=na(a.shift(),d);var g=Aa(b[e],d);g||(g={},b[e]=g);b=g}e=na(a.shift(),d);Aa(b[e],d);return b[e]=c}function Zc(b,a,c,d,e,f){na(b,f);na(a,f);na(c,f);na(d,f);na(e,f);return function(f,k){var h=k&&k.hasOwnProperty(b)?
103
+k:f;if(null==h)return h;h=h[b];if(!a)return h;if(null==h)return u;h=h[a];if(!c)return h;if(null==h)return u;h=h[c];if(!d)return h;if(null==h)return u;h=h[d];return e?null==h?u:h=h[e]:h}}function $c(b,a,c){var d=ad[b];if(d)return d;var e=b.split("."),f=e.length;if(a.csp)d=6>f?Zc(e[0],e[1],e[2],e[3],e[4],c):function(a,b){var d=0,g;do g=Zc(e[d++],e[d++],e[d++],e[d++],e[d++],c)(a,b),b=u,a=g;while(d<f);return g};else{var g="";r(e,function(a,b){na(a,c);g+="if(s == null) return undefined;\ns="+(b?"s":'((l&&l.hasOwnProperty("'+
104
+a+'"))?l:s)')+"."+a+";\n"});g+="return s;";a=new Function("s","l",g);a.toString=da(g);d=a}d.sharedGetter=!0;d.assign=function(a,c){return Oa(a,b,c,b)};return ad[b]=d}function Je(){var b=wa(),a={csp:!1};this.$get=["$filter","$sniffer",function(c,d){function e(a){var b=a;a.sharedGetter&&(b=function(b,c){return a(b,c)},b.literal=a.literal,b.constant=a.constant,b.assign=a.assign);return b}function f(a,b){for(var c=0,d=a.length;c<d;c++){var e=a[c];e.constant||(e.inputs?f(e.inputs,b):-1===b.indexOf(e)&&
105
+b.push(e))}return b}function g(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=a.valueOf(),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function k(a,b,c,d){var e=d.$$inputs||(d.$$inputs=f(d.inputs,[])),h;if(1===e.length){var k=g,e=e[0];return a.$watch(function(a){var b=e(a);g(b,k)||(h=d(a),k=b&&b.valueOf());return h},b,c)}for(var l=[],m=0,q=e.length;m<q;m++)l[m]=g;return a.$watch(function(a){for(var b=!1,c=0,f=e.length;c<f;c++){var k=e[c](a);if(b||(b=!g(k,l[c])))l[c]=k&&k.valueOf()}b&&(h=
106
+d(a));return h},b,c)}function h(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;F(b)&&b.apply(this,arguments);z(a)&&d.$$postDigest(function(){z(f)&&e()})},c)}function l(a,b,c,d){function e(a){var b=!0;r(a,function(a){z(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;F(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function m(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){F(b)&&
107
+b.apply(this,arguments);e()},c)}function q(a,b){if(!b)return a;var c=function(c,d){var e=a(c,d),f=b(e,c,d);return z(e)?f:e};a.$$watchDelegate&&a.$$watchDelegate!==k?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=k,c.inputs=[a]);return c}a.csp=d.csp;return function(d,f){var g,J,v;switch(typeof d){case "string":return v=d=d.trim(),g=b[v],g||(":"===d.charAt(0)&&":"===d.charAt(1)&&(J=!0,d=d.substring(2)),g=new dc(a),g=(new db(g,c,a)).parse(d),g.constant?g.$$watchDelegate=m:J?(g=e(g),
108
+g.$$watchDelegate=g.literal?l:h):g.inputs&&(g.$$watchDelegate=k),b[v]=g),q(g,f);case "function":return q(d,f);default:return q(A,f)}}}]}function Le(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return bd(function(a){b.$evalAsync(a)},a)}]}function Me(){this.$get=["$browser","$exceptionHandler",function(b,a){return bd(function(a){b.defer(a)},a)}]}function bd(b,a){function c(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function d(){this.$$state=
109
+{status:0}}function e(a,b){return function(c){b.call(a,c)}}function f(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,b(function(){var b,d,e;e=c.pending;c.processScheduled=!1;c.pending=u;for(var f=0,g=e.length;f<g;++f){d=e[f][0];b=e[f][c.status];try{F(b)?d.resolve(b(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),a(h)}}}))}function g(){this.promise=new d;this.resolve=e(this,this.resolve);this.reject=e(this,this.reject);this.notify=e(this,this.notify)}var k=
110
+y("$q",TypeError);d.prototype={then:function(a,b,c){var d=new g;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&f(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return l(b,!0,a)},function(b){return l(b,!1,a)},b)}};g.prototype={resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(k("qcycle",a)):this.$$resolve(a))},$$resolve:function(b){var d,
111
+e;e=c(this,this.$$resolve,this.$$reject);try{if(G(b)||F(b))d=b&&b.then;F(d)?(this.promise.$$state.status=-1,d.call(b,e[0],e[1],this.notify)):(this.promise.$$state.value=b,this.promise.$$state.status=1,f(this.promise.$$state))}catch(g){e[1](g),a(g)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;f(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&
112
+d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;f<g;f++){e=d[f][0];b=d[f][3];try{e.notify(F(b)?b(c):c)}catch(h){a(h)}}})}};var h=function(a,b){var c=new g;b?c.resolve(a):c.reject(a);return c.promise},l=function(a,b,c){var d=null;try{F(c)&&(d=c())}catch(e){return h(e,!1)}return d&&F(d.then)?d.then(function(){return h(a,b)},function(a){return h(a,!1)}):h(a,b)},m=function(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)},q=function n(a){if(!F(a))throw k("norslvr",a);if(!(this instanceof
113
+n))return new n(a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};q.defer=function(){return new g};q.reject=function(a){var b=new g;b.reject(a);return b.promise};q.when=m;q.all=function(a){var b=new g,c=0,d=B(a)?[]:{};r(a,function(a,e){c++;m(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return q}function Ve(){this.$get=["$window","$timeout",function(b,
114
+a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};f.supported=e;return f}]}function Ke(){var b=10,a=y("$rootScope"),c=null,d=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler",
115
+"$parse","$browser",function(e,f,g,k){function h(){this.$id=++hb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$isolateBindings=null}function l(b){if(s.$$phase)throw a("inprog",s.$$phase);s.$$phase=b}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function q(){}function p(){for(;x.length;)try{x.shift()()}catch(a){f(a)}d=
116
+null}function n(){null===d&&(d=k.defer(function(){s.$apply(p)}))}h.prototype={constructor:h,$new:function(a,b){function c(){d.$$destroyed=!0}var d;b=b||this;a?(d=new h,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$id=++hb;this.$$ChildScope=null},this.$$ChildScope.prototype=this),d=new this.$$ChildScope);d.$parent=b;d.$$prevSibling=b.$$childTail;b.$$childHead?
117
+(b.$$childTail.$$nextSibling=d,b.$$childTail=d):b.$$childHead=b.$$childTail=d;(a||b!=this)&&d.$on("$destroy",c);return d},$watch:function(a,b,d){var e=g(a);if(e.$$watchDelegate)return e.$$watchDelegate(this,b,d,e);var f=this.$$watchers,h={fn:b,last:q,get:e,exp:a,eq:!!d};c=null;F(b)||(h.fn=A);f||(f=this.$$watchers=[]);f.unshift(h);return function(){Wa(f,h);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=
118
+!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});r(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(G(e))if(Ra(e))for(f!==p&&(f=p,s=f.length=0,l++),a=e.length,s!==a&&(l++,f.length=s=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===
119
+g||(l++,f[b]=g);else{f!==n&&(f=n={},s=0,l++);a=0;for(b in e)e.hasOwnProperty(b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(s++,f[b]=g,l++));if(s>a)for(b in l++,f)e.hasOwnProperty(b)||(s--,delete f[b])}else f!==e&&(f=e,l++);return l}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),p=[],n={},q=!0,s=0;return this.$watch(m,function(){q?(q=!1,b(e,e,d)):b(e,h,d);if(k)if(G(e))if(Ra(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)Hb.call(e,
120
+a)&&(h[a]=e[a]);else h=e})},$digest:function(){var e,g,h,m,n,r,Q=b,x,O=[],K,u,z;l("$digest");k.$$checkUrlChange();this===s&&null!==d&&(k.defer.cancel(d),p());c=null;do{r=!1;for(x=this;J.length;){try{z=J.shift(),z.scope.$eval(z.expression)}catch(y){f(y)}c=null}a:do{if(m=x.$$watchers)for(n=m.length;n--;)try{if(e=m[n])if((g=e.get(x))!==(h=e.last)&&!(e.eq?la(g,h):"number"===typeof g&&"number"===typeof h&&isNaN(g)&&isNaN(h)))r=!0,c=e,e.last=e.eq?Ca(g,null):g,e.fn(g,h===q?g:h,x),5>Q&&(K=4-Q,O[K]||(O[K]=
121
+[]),u=F(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,u+="; newVal: "+ra(g)+"; oldVal: "+ra(h),O[K].push(u));else if(e===c){r=!1;break a}}catch(D){f(D)}if(!(m=x.$$childHead||x!==this&&x.$$nextSibling))for(;x!==this&&!(m=x.$$nextSibling);)x=x.$parent}while(x=m);if((r||J.length)&&!Q--)throw s.$$phase=null,a("infdig",b,ra(O));}while(r||J.length);for(s.$$phase=null;v.length;)try{v.shift()()}catch(A){f(A)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=
122
+!0;if(this!==s){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=A;this.$on=this.$watch=this.$watchGroup=function(){return A};this.$$listeners={};this.$parent=
123
+this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a){s.$$phase||J.length||k.defer(function(){J.length&&s.$digest()});J.push({scope:this,expression:a})},$$postDigest:function(a){v.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){f(b)}finally{s.$$phase=null;try{s.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&
124
+x.push(b);n()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[c.indexOf(b)]=null;m(e,1,a)}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=jb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;
125
+l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,k)}catch(p){f(p)}else d.splice(l,1),l--,m--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=jb([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,
126
+1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var s=new h,J=s.$$asyncQueue=[],v=s.$$postDigestQueue=[],x=s.$$applyAsyncQueue=[];return s}]}function Nd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(a){return z(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a=b,this):a};this.$get=
127
+function(){return function(c,d){var e=d?a:b,f;f=za(c).href;return""===f||f.match(e)?c:"unsafe:"+f}}}function qf(b){if("self"===b)return b;if(I(b)){if(-1<b.indexOf("***"))throw Ba("iwcard",b);b=b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08").replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+b+"$")}if(ib(b))return new RegExp("^"+b.source+"$");throw Ba("imatcher");}function cd(b){var a=[];z(b)&&r(b,function(b){a.push(qf(b))});return a}function Oe(){this.SCE_CONTEXTS=
128
+ja;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=cd(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=cd(b));return a};this.$get=["$injector",function(c){function d(a,b){return"self"===a?Uc(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};
129
+return b}var f=function(a){throw Ba("unsafe");};c.has("$sanitize")&&(f=c.get("$sanitize"));var g=e(),k={};k[ja.HTML]=e(g);k[ja.CSS]=e(g);k[ja.URL]=e(g);k[ja.JS]=e(g);k[ja.RESOURCE_URL]=e(k[ja.URL]);return{trustAs:function(a,b){var c=k.hasOwnProperty(a)?k[a]:null;if(!c)throw Ba("icontext",a,b);if(null===b||b===u||""===b)return b;if("string"!==typeof b)throw Ba("itype",a);return new c(b)},getTrusted:function(c,e){if(null===e||e===u||""===e)return e;var g=k.hasOwnProperty(c)?k[c]:null;if(g&&e instanceof
130
+g)return e.$$unwrapTrustedValue();if(c===ja.RESOURCE_URL){var g=za(e.toString()),q,p,n=!1;q=0;for(p=b.length;q<p;q++)if(d(b[q],g)){n=!0;break}if(n)for(q=0,p=a.length;q<p;q++)if(d(a[q],g)){n=!1;break}if(n)return e;throw Ba("insecurl",e.toString());}if(c===ja.HTML)return f(e);throw Ba("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Ne(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$document","$parse","$sceDelegate",function(a,
131
+c,d){if(b&&8>a[0].documentMode)throw Ba("iequirks");var e=qa(ja);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Ta);e.parseAs=function(a,b){var d=c(b);return d.literal&&d.constant?d:c(b,function(b){return e.getTrusted(a,b)})};var f=e.parseAs,g=e.getTrusted,k=e.trustAs;r(ja,function(a,b){var c=N(b);e[ab("parse_as_"+c)]=function(b){return f(a,b)};e[ab("get_trusted_"+c)]=function(b){return g(a,
132
+b)};e[ab("trust_as_"+c)]=function(b){return k(a,b)}});return e}]}function Pe(){this.$get=["$window","$document",function(b,a){var c={},d=ba((/android (\d+)/.exec(N((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,k=/^(Moz|webkit|O|ms)(?=[A-Z])/,h=f.body&&f.body.style,l=!1,m=!1;if(h){for(var q in h)if(l=k.exec(q)){g=l[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in h&&"webkit");l=!!("transition"in h||g+"Transition"in h);m=!!("animation"in
133
+h||g+"Animation"in h);!d||l&&m||(l=I(f.body.style.webkitTransition),m=I(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"==a&&9==Pa)return!1;if(w(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:Za(),vendorPrefix:g,transitions:l,animations:m,android:d}}]}function Re(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){function g(){k.totalPendingRequests--;if(!f)throw ia("tpload",e);return c.reject()}
134
+var k=d;k.totalPendingRequests++;return a.get(e,{cache:b}).then(function(a){a=a.data;if(!a||0===a.length)return g();k.totalPendingRequests--;b.put(e,a);return a},g)}d.totalPendingRequests=0;return d}]}function Se(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var d=ta.element(a).data("$binding");d&&r(d,function(d){c?(new RegExp("(^|\\s)"+b+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=
135
+d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],k=0;k<g.length;++k){var h=a.querySelectorAll("["+g[k]+"model"+(c?"=":"*=")+'"'+b+'"]');if(h.length)return h}},getLocation:function(){return c.url()},setLocation:function(a){a!==c.url()&&(c.url(a),b.$digest())},whenStable:function(b){a.notifyWhenNoOutstandingRequests(b)}}}]}function Te(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(b,a,c,d,e){function f(f,h,l){var m=z(l)&&
136
+!l,q=(m?d:c).defer(),p=q.promise;h=a.defer(function(){try{q.resolve(f())}catch(a){q.reject(a),e(a)}finally{delete g[p.$$timeoutId]}m||b.$apply()},h);p.$$timeoutId=h;g[h]=q;return p}var g={};f.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return f}]}function za(b,a){var c=b;Pa&&(Z.setAttribute("href",c),c=Z.href);Z.setAttribute("href",c);return{href:Z.href,protocol:Z.protocol?Z.protocol.replace(/:$/,""):
137
+"",host:Z.host,search:Z.search?Z.search.replace(/^\?/,""):"",hash:Z.hash?Z.hash.replace(/^#/,""):"",hostname:Z.hostname,port:Z.port,pathname:"/"===Z.pathname.charAt(0)?Z.pathname:"/"+Z.pathname}}function Uc(b){b=I(b)?za(b):b;return b.protocol===dd.protocol&&b.host===dd.host}function Ue(){this.$get=da(S)}function Bc(b){function a(c,d){if(G(c)){var e={};r(c,function(b,c){e[c]=a(c,b)});return e}return b.factory(c+"Filter",d)}this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+
138
+"Filter")}}];a("currency",ed);a("date",fd);a("filter",rf);a("json",sf);a("limitTo",tf);a("lowercase",uf);a("number",gd);a("orderBy",hd);a("uppercase",vf)}function rf(){return function(b,a,c){if(!B(b))return b;var d=typeof c,e=[];e.check=function(a,b){for(var c=0;c<e.length;c++)if(!e[c](a,b))return!1;return!0};"function"!==d&&(c="boolean"===d&&c?function(a,b){return ta.equals(a,b)}:function(a,b){if(a&&b&&"object"===typeof a&&"object"===typeof b){for(var d in a)if("$"!==d.charAt(0)&&Hb.call(a,d)&&c(a[d],
139
+b[d]))return!0;return!1}b=(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)});var f=function(a,b){if("string"===typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(f(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a=
140
+{$:a};case "object":for(var g in a)(function(b){"undefined"!==typeof a[b]&&e.push(function(c){return f("$"==b?c:c&&c[b],a[b])})})(g);break;case "function":e.push(a);break;default:return b}d=[];for(g=0;g<b.length;g++){var k=b[g];e.check(k,g)&&d.push(k)}return d}}function ed(b){var a=b.NUMBER_FORMATS;return function(b,d,e){w(d)&&(d=a.CURRENCY_SYM);w(e)&&(e=2);return null==b?b:id(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,e).replace(/\u00A4/g,d)}}function gd(b){var a=b.NUMBER_FORMATS;return function(b,
141
+d){return null==b?b:id(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function id(b,a,c,d,e){if(!isFinite(b)||G(b))return"";var f=0>b;b=Math.abs(b);var g=b+"",k="",h=[],l=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?(g="0",b=0):(k=g,l=!0)}if(l)0<e&&-1<b&&1>b&&(k=b.toFixed(e));else{g=(g.split(jd)[1]||"").length;w(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);0===b&&(f=!1);b=(""+b).split(jd);g=b[0];
142
+b=b[1]||"";var m=0,q=a.lgSize,p=a.gSize;if(g.length>=q+p)for(m=g.length-q,l=0;l<m;l++)0===(m-l)%p&&0!==l&&(k+=c),k+=g.charAt(l);for(l=m;l<g.length;l++)0===(g.length-l)%q&&0!==l&&(k+=c),k+=g.charAt(l);for(;b.length<e;)b+="0";e&&"0"!==e&&(k+=d+b.substr(0,e))}h.push(f?a.negPre:a.posPre);h.push(k);h.push(f?a.negSuf:a.posSuf);return h.join("")}function Ab(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function $(b,a,c,d){c=c||0;return function(e){e=
143
+e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Ab(e,a,d)}}function Bb(b,a){return function(c,d){var e=c["get"+b](),f=pb(a?"SHORT"+b:b);return d[f][e]}}function kd(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function ld(b){return function(a){var c=kd(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Ab(a,b)}}function fd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,k=b[8]?
144
+a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ba(b[9]+b[10]),g=ba(b[9]+b[11]));k.call(a,ba(b[1]),ba(b[2])-1,ba(b[3]));f=ba(b[4]||0)-f;g=ba(b[5]||0)-g;k=ba(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));h.call(a,f,g,k,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var g="",k=[],h,l;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;I(c)&&(c=wf.test(c)?ba(c):a(c));W(c)&&(c=new Date(c));
145
+if(!ea(c))return c;for(;e;)(l=xf.exec(e))?(k=jb(k,l,1),e=k.pop()):(k.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset()));r(k,function(a){h=yf[a];g+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function sf(){return function(b){return ra(b,!0)}}function tf(){return function(b,a){W(b)&&(b=b.toString());if(!B(b)&&!I(b))return b;a=Infinity===Math.abs(Number(a))?Number(a):ba(a);if(I(b))return a?0<=a?b.slice(0,a):
146
+b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function hd(b){return function(a,c,d){function e(a,b){return b?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?(ea(a)&&ea(b)&&(a=a.valueOf(),b=b.valueOf()),"string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!Ra(a))return a;c=B(c)?c:[c];0===c.length&&(c=["+"]);c=c.map(function(a){var c=
147
+!1,d=a||Ta;if(I(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);if(""===a)return e(function(a,b){return f(a,b)},c);d=b(a);if(d.constant){var g=d();return e(function(a,b){return f(a[g],b[g])},c)}}return e(function(a,b){return f(d(a),d(b))},c)});for(var g=[],k=0;k<a.length;k++)g.push(a[k]);return g.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function Ha(b){F(b)&&(b={link:b});b.restrict=b.restrict||"AC";return da(b)}
148
+function md(b,a,c,d,e){var f=this,g=[],k=f.$$parentForm=b.parent().controller("form")||Cb;f.$error={};f.$$success={};f.$pending=u;f.$name=e(a.name||a.ngForm||"")(c);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;k.$addControl(f);f.$rollbackViewValue=function(){r(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){r(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ka(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a)};f.$$renameControl=function(a,
149
+b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];r(f.$pending,function(b,c){f.$setValidity(c,null,a)});r(f.$error,function(b,c){f.$setValidity(c,null,a)});Wa(g,a)};nd({ctrl:this,$element:b,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Wa(d,c),0===d.length&&delete a[b])},parentForm:k,$animate:d});f.$setDirty=function(){d.removeClass(b,Qa);d.addClass(b,Db);f.$dirty=
150
+!0;f.$pristine=!1;k.$setDirty()};f.$setPristine=function(){d.setClass(b,Qa,Db+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;r(g,function(a){a.$setPristine()})};f.$setUntouched=function(){r(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){d.addClass(b,"ng-submitted");f.$submitted=!0;k.$setSubmitted()}}function ec(b){b.$formatters.push(function(a){return b.$isEmpty(a)?a:a.toString()})}function eb(b,a,c,d,e,f){a.prop("validity");var g=a[0].placeholder,k={},h=N(a[0].type);if(!e.android){var l=
151
+!1;a.on("compositionstart",function(a){l=!0});a.on("compositionend",function(){l=!1;m()})}var m=function(b){if(!l){var e=a.val(),f=b&&b.type;Pa&&"input"===(b||k).type&&a[0].placeholder!==g?g=a[0].placeholder:("password"===h||c.ngTrim&&"false"===c.ngTrim||(e=U(e)),(d.$viewValue!==e||""===e&&d.$$hasNativeValidators)&&d.$setViewValue(e,f))}};if(e.hasEvent("input"))a.on("input",m);else{var q,p=function(a){q||(q=f.defer(function(){m(a);q=null}))};a.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&
152
+19>b||37<=b&&40>=b||p(a)});if(e.hasEvent("paste"))a.on("paste cut",p)}a.on("change",m);d.$render=function(){a.val(d.$isEmpty(d.$modelValue)?"":d.$viewValue)}}function Eb(b,a){return function(c,d){var e,f;if(ea(c))return c;if(I(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(zf.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/
153
+1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(b,c){c<a.length&&(f[a[c]]=+b)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function fb(b,a,c,d){return function(e,f,g,k,h,l,m){function q(a){return z(a)?ea(a)?a:c(a):u}od(e,f,g,k);eb(e,f,g,k,h,l);var p=k&&k.$options&&k.$options.timezone,n;k.$$parserName=b;k.$parsers.push(function(b){return k.$isEmpty(b)?null:a.test(b)?(b=c(b,n),"UTC"===p&&b.setMinutes(b.getMinutes()-b.getTimezoneOffset()),b):u});k.$formatters.push(function(a){if(k.$isEmpty(a))n=
154
+null;else{if(!ea(a))throw Fb("datefmt",a);if((n=a)&&"UTC"===p){var b=6E4*n.getTimezoneOffset();n=new Date(n.getTime()+b)}return m("date")(a,d,p)}return""});if(z(g.min)||g.ngMin){var s;k.$validators.min=function(a){return k.$isEmpty(a)||w(s)||c(a)>=s};g.$observe("min",function(a){s=q(a);k.$validate()})}if(z(g.max)||g.ngMax){var r;k.$validators.max=function(a){return k.$isEmpty(a)||w(r)||c(a)<=r};g.$observe("max",function(a){r=q(a);k.$validate()})}k.$isEmpty=function(a){return!a||a.getTime&&a.getTime()!==
155
+a.getTime()}}}function od(b,a,c,d){(d.$$hasNativeValidators=G(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{};return c.badInput&&!c.typeMismatch?u:b})}function pd(b,a,c,d,e){if(z(d)){b=b(d);if(!b.constant)throw y("ngModel")("constexpr",c,d);return b(a)}return e}function nd(b){function a(a,b){b&&!f[a]?(l.addClass(e,a),f[a]=!0):!b&&f[a]&&(l.removeClass(e,a),f[a]=!1)}function c(b,c){b=b?"-"+Kb(b,"-"):"";a(gb+b,!0===c);a(qd+b,!1===c)}var d=b.ctrl,e=b.$element,f={},g=b.set,k=
156
+b.unset,h=b.parentForm,l=b.$animate;f[qd]=!(f[gb]=e.hasClass(gb));d.$setValidity=function(b,e,f){e===u?(d.$pending||(d.$pending={}),g(d.$pending,b,f)):(d.$pending&&k(d.$pending,b,f),rd(d.$pending)&&(d.$pending=u));Va(e)?e?(k(d.$error,b,f),g(d.$$success,b,f)):(g(d.$error,b,f),k(d.$$success,b,f)):(k(d.$error,b,f),k(d.$$success,b,f));d.$pending?(a(sd,!0),d.$valid=d.$invalid=u,c("",null)):(a(sd,!1),d.$valid=rd(d.$error),d.$invalid=!d.$valid,c("",d.$valid));e=d.$pending&&d.$pending[b]?u:d.$error[b]?!1:
157
+d.$$success[b]?!0:null;c(b,e);h.$setValidity(b,e,d)}}function rd(b){if(b)for(var a in b)return!1;return!0}function fc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){if(!B(a)){if(I(a))return a.split(" ");if(G(a)){var b=[];r(a,function(a,c){a&&(b=b.concat(c.split(" ")))});return b}}return a}return{restrict:"AC",link:function(f,g,k){function h(a,b){var c=g.data("$classCounts")||
158
+{},d=[];r(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function l(b){if(!0===a||f.$index%2===a){var l=e(b||[]);if(!m){var n=h(l,1);k.$addClass(n)}else if(!la(b,m)){var s=e(m),n=d(l,s),l=d(s,l),n=h(n,1),l=h(l,-1);n&&n.length&&c.addClass(g,n);l&&l.length&&c.removeClass(g,l)}}m=qa(b)}var m;f.$watch(k[b],l,!0);k.$observe("class",function(a){l(f.$eval(k[b]))});"ngClass"!==b&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var l=
159
+e(f.$eval(k[b]));g===a?(g=h(l,1),k.$addClass(g)):(g=h(l,-1),k.$removeClass(g))}})}}}]}var Af=/^\/(.+)\/([a-z]*)$/,N=function(b){return I(b)?b.toLowerCase():b},Hb=Object.prototype.hasOwnProperty,pb=function(b){return I(b)?b.toUpperCase():b},Pa,D,ma,Ya=[].slice,mf=[].splice,Bf=[].push,Ia=Object.prototype.toString,Xa=y("ng"),ta=S.angular||(S.angular={}),$a,hb=0;Pa=X.documentMode;A.$inject=[];Ta.$inject=[];var B=Array.isArray,U=function(b){return I(b)?b.trim():b},Za=function(){if(z(Za.isActive_))return Za.isActive_;
160
+var b=!(!X.querySelector("[ng-csp]")&&!X.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return Za.isActive_=b},mb=["ng-","data-ng-","ng:","x-ng-"],Hd=/[A-Z]/g,sc=!1,Lb,ka=1,kb=3,Ld={full:"1.3.0",major:1,minor:3,dot:0,codeName:"superluminal-nudge"};R.expando="ng339";var ub=R.cache={},bf=1;R._data=function(b){return this.cache[b[this.expando]]||{}};var Xe=/([\:\-\_]+(.))/g,Ye=/^moz([A-Z])/,Cf={mouseleave:"mouseout",mouseenter:"mouseover"},Ob=y("jqLite"),af=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,
161
+Nb=/<|&#?\w+;/,Ze=/<([\w:]+)/,$e=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ha={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ha.optgroup=ha.option;ha.tbody=ha.tfoot=ha.colgroup=ha.caption=ha.thead;ha.th=ha.td;var Ja=R.prototype={ready:function(b){function a(){c||(c=
162
+!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(S).on("load",a),this.on("DOMContentLoaded",a))},toString:function(){var b=[];r(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?D(this[b]):D(this[this.length+b])},length:0,push:Bf,sort:[].sort,splice:[].splice},wb={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){wb[N(b)]=b});var Kc={};r("input select option textarea button form details".split(" "),
163
+function(b){Kc[b]=!0});var Lc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};r({data:Qb,removeData:sb},function(b,a){R[a]=b});r({data:Qb,inheritedData:vb,scope:function(b){return D.data(b,"$scope")||vb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return D.data(b,"$isolateScope")||D.data(b,"$isolateScopeNoTemplate")},controller:Gc,injector:function(b){return vb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Rb,
164
+css:function(b,a,c){a=ab(a);if(z(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=N(a);if(wb[d])if(z(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||A).specified?d:u;else if(z(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(z(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(w(b)){var d=a.nodeType;return d===ka||d===kb?a.textContent:""}a.textContent=
165
+b}b.$dv="";return b}(),val:function(b,a){if(w(a)){if(b.multiple&&"select"===pa(b)){var c=[];r(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(w(a))return b.innerHTML;rb(b,!0);b.innerHTML=a},empty:Hc},function(b,a){R.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Hc&&(2==b.length&&b!==Rb&&b!==Gc?a:d)===u){if(G(a)){for(e=0;e<g;e++)if(b===Qb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;
166
+g=e===u?Math.min(g,1):g;for(f=0;f<g;f++){var k=b(this[f],a,d);e=e?e+k:k}return e}for(e=0;e<g;e++)b(this[e],a,d);return this}});r({removeData:sb,on:function a(c,d,e,f){if(z(f))throw Ob("onargs");if(Cc(c)){var g=tb(c,!0);f=g.events;var k=g.handle;k||(k=g.handle=ef(c,f));for(var g=0<=d.indexOf(" ")?d.split(" "):[d],h=g.length;h--;){d=g[h];var l=f[d];l||(f[d]=[],"mouseenter"===d||"mouseleave"===d?a(c,Cf[d],function(a){var c=a.relatedTarget;c&&(c===this||this.contains(c))||k(a,d)}):"$destroy"!==d&&c.addEventListener(d,
167
+k,!1),l=f[d]);l.push(e)}}},off:Fc,one:function(a,c,d){a=D(a);a.on(c,function f(){a.off(c,d);a.off(c,f)});a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;rb(a);r(new R(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];r(a.childNodes,function(a){a.nodeType===ka&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){var d=a.nodeType;if(d===ka||11===d){c=new R(c);for(var d=0,e=c.length;d<
168
+e;d++)a.appendChild(c[d])}},prepend:function(a,c){if(a.nodeType===ka){var d=a.firstChild;r(new R(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=D(c).eq(0).clone()[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:Ic,detach:function(a){Ic(a,!0)},after:function(a,c){var d=a,e=a.parentNode;c=new R(c);for(var f=0,g=c.length;f<g;f++){var k=c[f];e.insertBefore(k,d.nextSibling);d=k}},addClass:Tb,removeClass:Sb,toggleClass:function(a,c,d){c&&r(c.split(" "),function(c){var f=
169
+d;w(f)&&(f=!Rb(a,c));(f?Tb:Sb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},clone:Pb,triggerHandler:function(a,c,d){var e,f,g=c.type||c,k=tb(a);if(k=(k=k&&k.events)&&k[g])e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=
170
+!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:A,type:g,target:a},c.type&&(e=E(e,c)),c=qa(k),f=d?[e].concat(d):[e],r(c,function(c){e.isImmediatePropagationStopped()||c.apply(a,f)})}},function(a,c){R.prototype[c]=function(c,e,f){for(var g,k=0,h=this.length;k<h;k++)w(g)?(g=a(this[k],c,e,f),z(g)&&(g=D(g))):Ec(g,a(this[k],c,e,f));return z(g)?g:this};R.prototype.bind=R.prototype.on;R.prototype.unbind=R.prototype.off});bb.prototype={put:function(a,
171
+c){this[La(a,this.nextUid)]=c},get:function(a){return this[La(a,this.nextUid)]},remove:function(a){var c=this[a=La(a,this.nextUid)];delete this[a];return c}};var Nc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,gf=/,/,hf=/^\s*(_?)(\S+?)\1\s*$/,Mc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ea=y("$injector");Jb.$$annotate=Ub;var Df=y("$animate"),xe=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw Df("notcsel",c);this.$$selectors[c.substr(1)]=e;
172
+a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null);return this.$$classNameFilter};this.$get=["$$q","$$asyncCallback","$rootScope",function(a,d,e){function f(d){var f,g=a.defer();g.promise.$$cancelFn=function(){f&&f()};e.$$postDigest(function(){f=d(function(){g.resolve()})});return g.promise}function g(a,c){var d=[],e=[],f=wa();r((a.attr("class")||"").split(/\s+/),function(a){f[a]=!0});r(c,function(a,c){var g=f[c];!1===a&&g?e.push(c):
173
+!0!==a||g||d.push(c)});return 0<d.length+e.length&&[d.length?d:null,e.length?e:null]}function k(a,c,d){for(var e=0,f=c.length;e<f;++e)a[c[e]]=d}function h(){m||(m=a.defer(),d(function(){m.resolve();m=null}));return m.promise}function l(a,c){if(ta.isObject(c)){var d=E(c.from||{},c.to||{});a.css(d)}}var m;return{animate:function(a,c,d){l(a,{from:c,to:d});return h()},enter:function(a,c,d,e){l(a,e);d?d.after(a):c.prepend(a);return h()},leave:function(a,c){a.remove();return h()},move:function(a,c,d,e){return this.enter(a,
174
+c,d,e)},addClass:function(a,c,d){return this.setClass(a,c,[],d)},$$addClassImmediately:function(a,c,d){a=D(a);c=I(c)?c:B(c)?c.join(" "):"";r(a,function(a){Tb(a,c)});l(a,d);return h()},removeClass:function(a,c,d){return this.setClass(a,[],c,d)},$$removeClassImmediately:function(a,c,d){a=D(a);c=I(c)?c:B(c)?c.join(" "):"";r(a,function(a){Sb(a,c)});l(a,d);return h()},setClass:function(a,c,d,e){var h=this,l=!1;a=D(a);var m=a.data("$$animateClasses");m?e&&m.options&&(m.options=ta.extend(m.options||{},e)):
175
+(m={classes:{},options:e},l=!0);e=m.classes;c=B(c)?c:c.split(" ");d=B(d)?d:d.split(" ");k(e,c,!0);k(e,d,!1);l&&(m.promise=f(function(c){var d=a.data("$$animateClasses");a.removeData("$$animateClasses");if(d){var e=g(a,d.classes);e&&h.$$setClassImmediately(a,e[0],e[1],d.options)}c()}),a.data("$$animateClasses",m));return m.promise},$$setClassImmediately:function(a,c,d,e){c&&this.$$addClassImmediately(a,c);d&&this.$$removeClassImmediately(a,d);l(a,e);return h()},enabled:A,cancel:A}}]}],ia=y("$compile");
176
+uc.$inject=["$provide","$$sanitizeUriProvider"];var lf=/^(x[\:\-_]|data[\:\-_])/i,Yb=y("$interpolate"),Ef=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,pf={http:80,https:443,ftp:21},cb=y("$location"),Ff={$$html5:!1,$$replace:!1,absUrl:zb("$$absUrl"),url:function(a){if(w(a))return this.$$url;a=Ef.exec(a);a[1]&&this.path(decodeURIComponent(a[1]));(a[2]||a[1])&&this.search(a[3]||"");this.hash(a[5]||"");return this},protocol:zb("$$protocol"),host:zb("$$host"),port:zb("$$port"),path:Yc("$$path",function(a){a=null!==
177
+a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(I(a)||W(a))a=a.toString(),this.$$search=qc(a);else if(G(a))a=Ca(a,{}),r(a,function(c,e){null==c&&delete a[e]}),this.$$search=a;else throw cb("isrcharg");break;default:w(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();return this},hash:Yc("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};
178
+r([Xc,bc,ac],function(a){a.prototype=Object.create(Ff);a.prototype.state=function(c){if(!arguments.length)return this.$$state;if(a!==ac||!this.$$html5)throw cb("nostate");this.$$state=w(c)?null:c;return this}});var oa=y("$parse"),Gf=Function.prototype.call,Hf=Function.prototype.apply,If=Function.prototype.bind,Gb=wa();r({"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:function(){}},function(a,c){a.constant=a.literal=a.sharedGetter=!0;Gb[c]=a});Gb["this"]=
179
+function(a){return a};Gb["this"].sharedGetter=!0;var gc=E(wa(),{"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return z(d)?z(e)?d+e:d:z(e)?e:u},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(z(d)?d:0)-(z(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,
180
+c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Jf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},dc=function(a){this.options=a};dc.prototype={constructor:dc,lex:function(a){this.text=a;this.index=0;this.ch=u;
181
+for(this.tokens=[];this.index<this.text.length;)if(this.ch=this.text.charAt(this.index),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();else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch}),this.index++;else if(this.isWhitespace(this.ch))this.index++;else{a=this.ch+this.peek();var c=a+this.peek(2),d=gc[this.ch],e=gc[a],f=gc[c];f?(this.tokens.push({index:this.index,
182
+text:c,fn:f}),this.index+=3):e?(this.tokens.push({index:this.index,text:a,fn:e}),this.index+=2):d?(this.tokens.push({index:this.index,text:this.ch,fn:d}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===
183
+a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=z(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw oa("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=N(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==
184
+d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}a*=1;this.tokens.push({index:c,text:a,constant:!0,fn:function(){return a}})},readIdent:function(){for(var a=this.text,c="",d=this.index,e,f,g,k;this.index<this.text.length;){k=this.text.charAt(this.index);if("."===k||this.isIdent(k)||this.isNumber(k))"."===
185
+k&&(e=this.index),c+=k;else break;this.index++}e&&"."===c[c.length-1]&&(this.index--,c=c.slice(0,-1),e=c.lastIndexOf("."),-1===e&&(e=u));if(e)for(f=this.index;f<this.text.length;){k=this.text.charAt(f);if("("===k){g=c.substr(e-d+1);c=c.substr(0,e-d);this.index=f;break}if(this.isWhitespace(k))f++;else break}this.tokens.push({index:d,text:c,fn:Gb[c]||$c(c,this.options,a)});g&&(this.tokens.push({index:e,text:"."}),this.tokens.push({index:e+1,text:g}))},readString:function(a){var c=this.index;this.index++;
186
+for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(f=this.text.substring(this.index+1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d+=Jf[g]||g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;this.tokens.push({index:c,text:e,string:d,constant:!0,fn:function(){return d}});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}};
187
+var db=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};db.ZERO=E(function(){return 0},{sharedGetter:!0,constant:!0});db.prototype={constructor:db,parse:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.statements();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);a.literal=!!a.literal;a.constant=!!a.constant;return a},primary:function(){var a;if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();
188
+else if(this.expect("{"))a=this.object();else{var c=this.expect();(a=c.fn)||this.throwError("not a primary expression",c);c.constant&&(a.constant=!0,a.literal=!0)}for(var d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw oa("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===
189
+this.tokens.length)throw oa("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){if(0<this.tokens.length){var f=this.tokens[0],g=f.text;if(g===a||g===c||g===d||g===e||!(a||c||d||e))return f}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},unaryFn:function(a,c){return E(function(d,e){return a(d,e,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a,
190
+c,d,e){return E(function(e,g){return c(e,g,a,d)},{constant:a.constant&&d.constant,inputs:!e&&[a,d]})},statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=0,g=a.length;f<g;f++)e=a[f](c,d);return e}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},filter:function(a){var c=this.expect(),d=this.$filter(c.text),e,f;if(this.peek(":"))for(e=
191
+[],f=[];this.expect(":");)e.push(this.expression());c=[a].concat(e||[]);return E(function(c,k){var h=a(c,k);if(f){f[0]=h;for(h=e.length;h--;)f[h+1]=e[h](c,k);return d.apply(u,f)}return d(h)},{constant:!d.$stateful&&c.every(cc),inputs:!d.$stateful&&c})},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(),
192
+E(function(d,f){return a.assign(d,c(d,f),f)},{inputs:[a,c]})):a},ternary:function(){var a=this.logicalOR(),c,d;if(d=this.expect("?")){c=this.assignment();if(d=this.expect(":")){var e=this.assignment();return E(function(d,g){return a(d,g)?c(d,g):e(d,g)},{constant:a.constant&&c.constant&&e.constant})}this.throwError("expected :",d)}return a},logicalOR:function(){for(var a=this.logicalAND(),c;c=this.expect("||");)a=this.binaryFn(a,c.fn,this.logicalAND(),!0);return a},logicalAND:function(){var a=this.equality(),
193
+c;if(c=this.expect("&&"))a=this.binaryFn(a,c.fn,this.logicalAND(),!0);return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.fn,this.equality());return a},relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=
194
+this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(db.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this.text,d=this.expect().text,e=$c(d,this.options,c);return E(function(c,d,k){return e(k||a(c,d))},{assign:function(e,g,k){(k=a(e,k))||a.assign(e,k={});return Oa(k,d,g,c)}})},objectIndex:function(a){var c=
195
+this.text,d=this.expression();this.consume("]");return E(function(e,f){var g=a(e,f),k=d(e,f);na(k,c);return g?Aa(g[k],c):u},{assign:function(e,f,g){var k=na(d(e,g),c);(g=Aa(a(e,g),c))||a.assign(e,g={});return g[k]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,k){var h=c?c(g,k):g,l=a(g,k,h)||A;if(f)for(var m=d.length;m--;)f[m]=Aa(d[m](g,k),e);Aa(h,
196
+e);if(l){if(l.constructor===l)throw oa("isecfn",e);if(l===Gf||l===Hf||l===If)throw oa("isecff",e);}h=l.apply?l.apply(h,f):l(f[0],f[1],f[2],f[3],f[4]);return Aa(h,e)}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;var c=this.expression();a.push(c)}while(this.expect(","))}this.consume("]");return E(function(c,e){for(var f=[],g=0,k=a.length;g<k;g++)f.push(a[g](c,e));return f},{literal:!0,constant:a.every(cc),inputs:a})},object:function(){var a=[],c=[];
197
+if("}"!==this.peekToken().text){do{if(this.peek("}"))break;var d=this.expect();a.push(d.string||d.text);this.consume(":");d=this.expression();c.push(d)}while(this.expect(","))}this.consume("}");return E(function(d,f){for(var g={},k=0,h=c.length;k<h;k++)g[a[k]]=c[k](d,f);return g},{literal:!0,constant:c.every(cc),inputs:c})}};var ad=wa(),Ba=y("$sce"),ja={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ia=y("$compile"),Z=X.createElement("a"),dd=za(S.location.href,!0);Bc.$inject=
198
+["$provide"];ed.$inject=["$locale"];gd.$inject=["$locale"];var jd=".",yf={yyyy:$("FullYear",4),yy:$("FullYear",2,0,!0),y:$("FullYear",1),MMMM:Bb("Month"),MMM:Bb("Month",!0),MM:$("Month",2,1),M:$("Month",1,1),dd:$("Date",2),d:$("Date",1),HH:$("Hours",2),H:$("Hours",1),hh:$("Hours",2,-12),h:$("Hours",1,-12),mm:$("Minutes",2),m:$("Minutes",1),ss:$("Seconds",2),s:$("Seconds",1),sss:$("Milliseconds",3),EEEE:Bb("Day"),EEE:Bb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=
199
+-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ab(Math[0<a?"floor":"ceil"](a/60),2)+Ab(Math.abs(a%60),2))},ww:ld(2),w:ld(1)},xf=/((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,wf=/^\-?\d+$/;fd.$inject=["$locale"];var uf=da(N),vf=da(pb);hd.$inject=["$parse"];var Od=da({restrict:"E",compile:function(a,c){if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===Ia.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||
200
+a.preventDefault()})}}}),qb={};r(wb,function(a,c){if("multiple"!=a){var d=ua("ng-"+c);qb[d]=function(){return{restrict:"A",priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});r(Lc,function(a,c){qb[c]=function(){return{priority:100,link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(Af))){f.$set("ngPattern",new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});r(["src","srcset","href"],function(a){var c=ua("ng-"+
201
+a);qb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===Ia.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$observe(c,function(c){c?(f.$set(k,c),Pa&&g&&e.prop(g,f[k])):"href"===a&&f.$set(k,null)})}}}});var Cb={$addControl:A,$$renameControl:function(a,c){a.$name=c},$removeControl:A,$setValidity:A,$setDirty:A,$setPristine:A,$setSubmitted:A};md.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var td=function(a){return["$timeout",
202
+function(c){return{name:"form",restrict:a?"EAC":"E",controller:md,compile:function(a){a.addClass(Qa).addClass(gb);return{pre:function(a,d,g,k){if(!("action"in g)){var h=function(c){a.$apply(function(){k.$commitViewValue();k.$setSubmitted()});c.preventDefault?c.preventDefault():c.returnValue=!1};d[0].addEventListener("submit",h,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",h,!1)},0,!1)})}var l=k.$$parentForm,m=k.$name;m&&(Oa(a,m,k,m),g.$observe(g.name?"name":"ngForm",
203
+function(c){m!==c&&(Oa(a,m,u,m),m=c,Oa(a,m,k,m),l.$$renameControl(k,m))}));d.on("$destroy",function(){l.$removeControl(k);m&&Oa(a,m,u,m);E(k,Cb)})}}}}}]},Pd=td(),be=td(!0),zf=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,Kf=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Lf=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Mf=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,ud=/^(\d{4})-(\d{2})-(\d{2})$/,
204
+vd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,hc=/^(\d{4})-W(\d\d)$/,wd=/^(\d{4})-(\d\d)$/,xd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Nf=/(\s+|^)default(\s+|$)/,Fb=new y("ngModel"),yd={text:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e)},date:fb("date",ud,Eb(ud,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":fb("datetimelocal",vd,Eb(vd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:fb("time",xd,Eb(xd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:fb("week",
205
+hc,function(a,c){if(ea(a))return a;if(I(a)){hc.lastIndex=0;var d=hc.exec(a);if(d){var e=+d[1],f=+d[2],g=d=0,k=0,h=0,l=kd(e),f=7*(f-1);c&&(d=c.getHours(),g=c.getMinutes(),k=c.getSeconds(),h=c.getMilliseconds());return new Date(e,0,l.getDate()+f,d,g,k,h)}}return NaN},"yyyy-Www"),month:fb("month",wd,Eb(wd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,g){od(a,c,d,e);eb(a,c,d,e,f,g);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:Mf.test(a)?parseFloat(a):u});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!W(a))throw Fb("numfmt",
206
+a);a=a.toString()}return a});if(d.min||d.ngMin){var k;e.$validators.min=function(a){return e.$isEmpty(a)||w(k)||a>=k};d.$observe("min",function(a){z(a)&&!W(a)&&(a=parseFloat(a,10));k=W(a)&&!isNaN(a)?a:u;e.$validate()})}if(d.max||d.ngMax){var h;e.$validators.max=function(a){return e.$isEmpty(a)||w(h)||a<=h};d.$observe("max",function(a){z(a)&&!W(a)&&(a=parseFloat(a,10));h=W(a)&&!isNaN(a)?a:u;e.$validate()})}},url:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e);e.$$parserName="url";e.$validators.url=function(a){return e.$isEmpty(a)||
207
+Kf.test(a)}},email:function(a,c,d,e,f,g){eb(a,c,d,e,f,g);ec(e);e.$$parserName="email";e.$validators.email=function(a){return e.$isEmpty(a)||Lf.test(a)}},radio:function(a,c,d,e){w(d.name)&&c.attr("name",++hb);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,k,h){var l=pd(h,a,"ngTrueValue",d.ngTrueValue,!0),m=pd(h,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",
208
+function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==l};e.$formatters.push(function(a){return la(a,l)});e.$parsers.push(function(a){return a?l:m})},hidden:A,button:A,submit:A,reset:A,file:A},vc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,k,h){h[0]&&(yd[N(k.type)]||yd.text)(f,g,k,h[0],c,a,d,e)}}}}],gb="ng-valid",qd="ng-invalid",Qa="ng-pristine",
209
+Db="ng-dirty",sd="ng-pending",Of=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,k,h,l,m){this.$modelValue=this.$viewValue=Number.NaN;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=m(d.name||
210
+"",!1)(a);var q=f(d.ngModel),p=null,n=this,s=function(){var c=q(a);n.$options&&n.$options.getterSetter&&F(c)&&(c=c());return c},J=function(c){var d;n.$options&&n.$options.getterSetter&&F(d=q(a))?d(n.$modelValue):q.assign(a,n.$modelValue)};this.$$setOptions=function(a){n.$options=a;if(!(q.assign||a&&a.getterSetter))throw Fb("nonassign",d.ngModel,sa(e));};this.$render=A;this.$isEmpty=function(a){return w(a)||""===a||null===a||a!==a};var v=e.inheritedData("$formController")||Cb,x=0;nd({ctrl:this,$element:e,
211
+set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:v,$animate:g});this.$setPristine=function(){n.$dirty=!1;n.$pristine=!0;g.removeClass(e,Db);g.addClass(e,Qa)};this.$setUntouched=function(){n.$touched=!1;n.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){n.$touched=!0;n.$untouched=!1;g.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){k.cancel(p);n.$viewValue=n.$$lastCommittedViewValue;n.$render()};this.$validate=function(){W(n.$modelValue)&&
212
+isNaN(n.$modelValue)||this.$$parseAndValidate()};this.$$runValidators=function(a,c,d,e){function f(){var a=!0;r(n.$validators,function(e,f){var g=e(c,d);a=a&&g;h(f,g)});return a?!0:(r(n.$asyncValidators,function(a,c){h(c,null)}),!1)}function g(){var a=[],e=!0;r(n.$asyncValidators,function(f,g){var k=f(c,d);if(!k||!F(k.then))throw Fb("$asyncValidators",k);h(g,u);a.push(k.then(function(){h(g,!0)},function(a){e=!1;h(g,!1)}))});a.length?l.all(a).then(function(){k(e)},A):k(!0)}function h(a,c){m===x&&n.$setValidity(a,
213
+c)}function k(a){m===x&&e(a)}x++;var m=x;(function(a){var c=n.$$parserName||"parse";if(a===u)h(c,null);else if(h(c,a),!a)return r(n.$validators,function(a,c){h(c,null)}),r(n.$asyncValidators,function(a,c){h(c,null)}),!1;return!0})(a)?f()?g():k(!1):k(!1)};this.$commitViewValue=function(){var a=n.$viewValue;k.cancel(p);if(n.$$lastCommittedViewValue!==a||""===a&&n.$$hasNativeValidators)n.$$lastCommittedViewValue=a,n.$pristine&&(n.$dirty=!0,n.$pristine=!1,g.removeClass(e,Qa),g.addClass(e,Db),v.$setDirty()),
214
+this.$$parseAndValidate()};this.$$parseAndValidate=function(){var a=n.$$lastCommittedViewValue,c=a,d=w(c)?u:!0;if(d)for(var e=0;e<n.$parsers.length;e++)if(c=n.$parsers[e](c),w(c)){d=!1;break}W(n.$modelValue)&&isNaN(n.$modelValue)&&(n.$modelValue=s());var f=n.$modelValue,g=n.$options&&n.$options.allowInvalid;g&&(n.$modelValue=c,n.$modelValue!==f&&n.$$writeModelToScope());n.$$runValidators(d,c,a,function(a){g||(n.$modelValue=a?c:u,n.$modelValue!==f&&n.$$writeModelToScope())})};this.$$writeModelToScope=
215
+function(){J(n.$modelValue);r(n.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};this.$setViewValue=function(a,c){n.$viewValue=a;n.$options&&!n.$options.updateOnDefault||n.$$debounceViewValueCommit(c)};this.$$debounceViewValueCommit=function(c){var d=0,e=n.$options;e&&z(e.debounce)&&(e=e.debounce,W(e)?d=e:W(e[c])?d=e[c]:W(e["default"])&&(d=e["default"]));k.cancel(p);d?p=k(function(){n.$commitViewValue()},d):h.$$phase?n.$commitViewValue():a.$apply(function(){n.$commitViewValue()})};a.$watch(function(){var a=
216
+s();if(a!==n.$modelValue){n.$modelValue=a;for(var c=n.$formatters,d=c.length,e=a;d--;)e=c[d](e);n.$viewValue!==e&&(n.$viewValue=n.$$lastCommittedViewValue=e,n.$render(),n.$$runValidators(u,a,e,A))}return a})}],qe=function(){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Of,priority:1,compile:function(a){a.addClass(Qa).addClass("ng-untouched").addClass(gb);return{pre:function(a,d,e,f){var g=f[0],k=f[1]||Cb;g.$$setOptions(f[2]&&f[2].$options);k.$addControl(g);e.$observe("name",
217
+function(a){g.$name!==a&&k.$$renameControl(g,a)});a.$on("$destroy",function(){k.$removeControl(g)})},post:function(a,d,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)d.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});d.on("blur",function(d){g.$touched||a.$apply(function(){g.$setTouched()})})}}}}},se=da({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),xc=function(){return{restrict:"A",require:"?ngModel",
218
+link:function(a,c,d,e){e&&(d.required=!0,e.$validators.required=function(a){return!d.required||!e.$isEmpty(a)},d.$observe("required",function(){e.$validate()}))}}},wc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f,g=d.ngPattern||d.pattern;d.$observe("pattern",function(a){I(a)&&0<a.length&&(a=new RegExp(a));if(a&&!a.test)throw y("ngPattern")("noregexp",g,a,sa(c));f=a||u;e.$validate()});e.$validators.pattern=function(a){return e.$isEmpty(a)||w(f)||f.test(a)}}}}},
219
+zc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("maxlength",function(a){f=ba(a)||0;e.$validate()});e.$validators.maxlength=function(a,c){return e.$isEmpty(a)||c.length<=f}}}}},yc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=ba(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(a)||c.length>=f}}}}},re=function(){return{restrict:"A",priority:100,
220
+require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,k=g?U(f):f;e.$parsers.push(function(a){if(!w(a)){var c=[];a&&r(a.split(k),function(a){a&&c.push(g?U(a):a)});return c}});e.$formatters.push(function(a){return B(a)?a.join(f):u});e.$isEmpty=function(a){return!a||!a.length}}}},Pf=/^(true|false|\d+)$/,te=function(){return{restrict:"A",priority:100,compile:function(a,c){return Pf.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,
221
+c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},ue=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,c){var d=this;this.$options=a.$eval(c.ngModelOptions);this.$options.updateOn!==u?(this.$options.updateOnDefault=!1,this.$options.updateOn=U(this.$options.updateOn.replace(Nf,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Ud=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,
222
+e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],Wd=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],Vd=["$sce","$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),k=c(f.ngBindHtml,
223
+function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(k,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],Xd=fc("",!0),Zd=fc("Odd",0),Yd=fc("Even",1),$d=Ha({compile:function(a,c){c.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ae=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Ac={},Qf={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),
224
+function(a){var c=ua("ng-"+a);Ac[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var k=d(g[c]);return function(c,d){d.on(a,function(d){var f=function(){k(c,{$event:d})};Qf[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var de=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var k,h,l;c.$watch(e.ngIf,function(c){c?h||g(function(c,f){h=f;c[c.length++]=X.createComment(" end ngIf: "+
225
+e.ngIf+" ");k={clone:c};a.enter(c,d.parent(),d)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ob(k.clone),a.leave(l).then(function(){l=null}),k=null))})}}}],ee=["$templateRequest","$anchorScroll","$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:ta.noop,compile:function(f,g){var k=g.ngInclude||g.src,h=g.onload||"",l=g.autoscroll;return function(f,g,p,n,r){var u=0,v,x,t,y=function(){x&&(x.remove(),x=null);v&&(v.$destroy(),
226
+v=null);t&&(d.leave(t).then(function(){x=null}),x=t,t=null)};f.$watch(e.parseAsResourceUrl(k),function(e){var k=function(){!z(l)||l&&!f.$eval(l)||c()},p=++u;e?(a(e,!0).then(function(a){if(p===u){var c=f.$new();n.template=a;a=r(c,function(a){y();d.enter(a,null,g).then(k)});v=c;t=a;v.$emit("$includeContentLoaded",e);f.$eval(h)}},function(){p===u&&(y(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(y(),n.template=null)})}}}}],ve=["$compile",function(a){return{restrict:"ECA",
227
+priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Dc(f.template,X).childNodes)(c,function(a){d.append(a)},u,u,d)):(d.html(f.template),a(d.contents())(c))}}}],fe=Ha({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),ge=Ha({terminal:!0,priority:1E3}),he=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var k=g.count,h=g.$attr.when&&f.attr(g.$attr.when),l=g.offset||0,m=e.$eval(h)||
228
+{},q={},p=c.startSymbol(),n=c.endSymbol(),s=/^when(Minus)?(.+)$/;r(g,function(a,c){s.test(c)&&(m[N(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});r(m,function(a,e){q[e]=c(a.replace(d,p+k+"-"+l+n))});e.$watch(function(){var c=parseFloat(e.$eval(k));if(isNaN(c))return"";c in m||(c=a.pluralCat(c-l));return q[c](e)},function(a){f.text(a)})}}}],ie=["$parse","$animate",function(a,c){var d=y("ngRepeat"),e=function(a,c,d,e,l,m,q){a[d]=e;l&&(a[l]=m);a.$index=c;a.$first=0===c;a.$last=c===
229
+q-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(c&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(f,g){var k=g.ngRepeat,h=X.createComment(" end ngRepeat: "+k+" "),l=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw d("iexp",k);var m=l[1],q=l[2],p=l[3],n=l[4],l=m.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!l)throw d("iidexp",m);var s=l[3]||l[1],J=
230
+l[2];if(p&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(p)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(p)))throw d("badident",p);var v,x,t,y,z={$id:La};n?v=a(n):(t=function(a,c){return La(c)},y=function(a){return a});return function(a,f,g,l,n){v&&(x=function(c,d,e){J&&(z[J]=c);z[s]=d;z.$index=e;return v(a,z)});var m=wa();a.$watchCollection(q,function(g){var l,q,z=f[0],H,v=wa(),C,Q,A,E,w,B,F;p&&(a[p]=g);if(Ra(g))w=g,q=x||t;else{q=x||y;w=[];for(F in g)g.hasOwnProperty(F)&&
231
+"$"!=F.charAt(0)&&w.push(F);w.sort()}C=w.length;F=Array(C);for(l=0;l<C;l++)if(Q=g===w?l:w[l],A=g[Q],E=q(Q,A,l),m[E])B=m[E],delete m[E],v[E]=B,F[l]=B;else{if(v[E])throw r(F,function(a){a&&a.scope&&(m[a.id]=a)}),d("dupes",k,E,ra(A));F[l]={id:E,scope:u,clone:u};v[E]=!0}for(H in m){B=m[H];E=ob(B.clone);c.leave(E);if(E[0].parentNode)for(l=0,q=E.length;l<q;l++)E[l].$$NG_REMOVED=!0;B.scope.$destroy()}for(l=0;l<C;l++)if(Q=g===w?l:w[l],A=g[Q],B=F[l],B.scope){H=z;do H=H.nextSibling;while(H&&H.$$NG_REMOVED);
232
+B.clone[0]!=H&&c.move(ob(B.clone),null,D(z));z=B.clone[B.clone.length-1];e(B.scope,l,s,A,J,Q,C)}else n(function(a,d){B.scope=d;var f=h.cloneNode(!1);a[a.length++]=f;c.enter(a,null,D(z));z=f;B.clone=a;v[B.id]=B;e(B.scope,l,s,A,J,Q,C)});m=v})}}}}],je=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(c,d,e){c.$watch(e.ngShow,function(c){a[c?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ce=["$animate",function(a){return{restrict:"A",multiElement:!0,
233
+link:function(c,d,e){c.$watch(e.ngHide,function(c){a[c?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ke=Ha(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),le=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],k=[],h=[],l=[],m=function(a,c){return function(){a.splice(c,1)}};c.$watch(e.ngSwitch||e.on,function(c){var d,
234
+e;d=0;for(e=h.length;d<e;++d)a.cancel(h[d]);d=h.length=0;for(e=l.length;d<e;++d){var s=ob(k[d].clone);l[d].$destroy();(h[d]=a.leave(s)).then(m(h,d))}k.length=0;l.length=0;(g=f.cases["!"+c]||f.cases["?"])&&r(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=X.createComment(" end ngSwitchWhen: ");k.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],me=Ha({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]=
235
+e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),ne=Ha({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:f,element:c})}}),pe=Ha({restrict:"EAC",link:function(a,c,d,e,f){if(!f)throw y("ngTransclude")("orphan",sa(c));f(function(a){c.empty();c.append(a)})}}),Qd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==
236
+d.type&&a.put(d.id,c[0].text)}}}],Rf=y("ngOptions"),oe=da({restrict:"A",terminal:!0}),Rd=["$compile","$parse",function(a,c){var d=/^\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]+?))?$/,e={$setViewValue:A};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var h=this,l={},m=e,q;h.databound=d.ngModel;
237
+h.init=function(a,c,d){m=a;q=d};h.addOption=function(c,d){Ka(c,'"option value"');l[c]=!0;m.$viewValue==c&&(a.val(c),q.parent()&&q.remove());d&&d[0].hasAttribute("selected")&&(d[0].selected=!0)};h.removeOption=function(a){this.hasOption(a)&&(delete l[a],m.$viewValue==a&&this.renderUnknownOption(a))};h.renderUnknownOption=function(c){c="? "+La(c)+" ?";q.val(c);a.prepend(q);a.val(c);q.prop("selected",!0)};h.hasOption=function(a){return l.hasOwnProperty(a)};c.$on("$destroy",function(){h.renderUnknownOption=
238
+A})}],link:function(e,g,k,h){function l(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(C.parent()&&C.remove(),c.val(a),""===a&&v.prop("selected",!0)):w(a)&&v?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){C.parent()&&C.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new bb(d.$viewValue);r(c.find("option"),function(c){c.selected=z(a.get(c.value))})};a.$watch(function(){la(e,d.$viewValue)||(e=qa(d.$viewValue),
239
+d.$render())});c.on("change",function(){a.$apply(function(){var a=[];r(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function q(e,f,g){function h(a,c,d){N[A]=d;F&&(N[F]=c);return a(e,N)}function k(a){var c;if(n)if(G&&B(a)){c=new bb([]);for(var d=0;d<a.length;d++)c.put(h(G,null,a[d]),!0)}else c=new bb(a);else G&&(a=h(G,null,a));return function(d,e){var f;f=G?G:w?w:I;return n?z(c.remove(h(f,d,e))):a==h(f,d,e)}}function l(){x||(e.$$postDigest(q),x=!0)}function m(a,
240
+c,d){a[c]=a[c]||0;a[c]+=d?1:-1}function q(){x=!1;var a={"":[]},c=[""],d,l,s,u,v;s=g.$viewValue;u=P(e)||[];var A=F?ic(u):u,w,B,D,I,G,N={};I=k(s);v=!1;var S;for(G=0;D=A.length,G<D;G++){w=G;if(F&&(w=A[G],"$"===w.charAt(0)))continue;B=u[w];d=h(M,w,B)||"";(l=a[d])||(l=a[d]=[],c.push(d));d=I(w,B);v=v||d;w=h(C,w,B);w=z(w)?w:"";l.push({id:F?A[G]:G,label:w,selected:d})}n||(y||null===s?a[""].unshift({id:"",label:"",selected:!v}):v||a[""].unshift({id:"?",label:"",selected:!0}));I=0;for(A=c.length;I<A;I++){d=
241
+c[I];l=a[d];R.length<=I?(s={element:E.clone().attr("label",d),label:l.label},u=[s],R.push(u),f.append(s.element)):(u=R[I],s=u[0],s.label!=d&&s.element.attr("label",s.label=d));w=null;G=0;for(D=l.length;G<D;G++)d=l[G],(v=u[G+1])?(w=v.element,v.label!==d.label&&(m(N,v.label,!1),m(N,d.label,!0),w.text(v.label=d.label)),v.id!==d.id&&w.val(v.id=d.id),w[0].selected!==d.selected&&(w.prop("selected",v.selected=d.selected),Pa&&w.prop("selected",v.selected))):(""===d.id&&y?S=y:(S=t.clone()).val(d.id).prop("selected",
242
+d.selected).attr("selected",d.selected).text(d.label),u.push(v={element:S,label:d.label,id:d.id,selected:d.selected}),m(N,d.label,!0),w?w.after(S):s.element.append(S),w=S);for(G++;u.length>G;)d=u.pop(),m(N,d.label,!1),d.element.remove();r(N,function(a,c){0<a?p.addOption(c):0>a&&p.removeOption(c)})}for(;R.length>I;)R.pop()[0].element.remove()}var v;if(!(v=s.match(d)))throw Rf("iexp",s,sa(f));var C=c(v[2]||v[1]),A=v[4]||v[6],D=/ as /.test(v[0])&&v[1],w=D?c(D):null,F=v[5],M=c(v[3]||""),I=c(v[2]?v[1]:
243
+A),P=c(v[7]),G=v[8]?c(v[8]):null,R=[[{element:f,label:""}]],N={};y&&(a(y)(e),y.removeClass("ng-scope"),y.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=P(e)||[],c;if(n)c=[],r(f.val(),function(d){c.push("?"===d?u:""===d?null:h(w?w:I,d,a[d]))});else{var d=f.val();c="?"===d?u:""===d?null:h(w?w:I,d,a[d])}g.$setViewValue(c);q()})});g.$render=q;e.$watchCollection(P,l);e.$watchCollection(function(){var a=P(e),c;if(a&&B(a)){c=Array(a.length);for(var d=0,f=a.length;d<f;d++)c[d]=h(C,
244
+d,a[d])}else if(a)for(d in c={},a)a.hasOwnProperty(d)&&(c[d]=h(C,d,a[d]));return c},l);n&&e.$watchCollection(function(){return g.$modelValue},l)}if(h[1]){var p=h[0];h=h[1];var n=k.multiple,s=k.ngOptions,y=!1,v,x=!1,t=D(X.createElement("option")),E=D(X.createElement("optgroup")),C=t.clone();k=0;for(var A=g.children(),F=A.length;k<F;k++)if(""===A[k].value){v=y=A.eq(k);break}p.init(h,y,C);n&&(h.$isEmpty=function(a){return!a||0===a.length});s?q(e,g,h):n?m(e,g,h):l(e,g,h,p)}}}}],Td=["$interpolate",function(a){var c=
245
+{addOption:A,removeOption:A};return{restrict:"E",priority:100,compile:function(d,e){if(w(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var l=d.parent(),m=l.data("$selectController")||l.parent().data("$selectController");m&&m.databound||(m=c);f?a.$watch(f,function(a,c){e.$set("value",a);c!==a&&m.removeOption(c);m.addOption(a,d)}):m.addOption(e.value,d);d.on("$destroy",function(){m.removeOption(e.value)})}}}}],Sd=da({restrict:"E",terminal:!1});S.angular.bootstrap?
246
+console.log("WARNING: Tried to load angular more than once."):(Id(),Kd(ta),D(X).ready(function(){Ed(X,rc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>');
247
+//# sourceMappingURL=angular.min.js.map
securis/src/main/webapp/js/angular/angular.min.js.map
....@@ -0,0 +1,8 @@
1
+{
2
+"version":3,
3
+"file":"angular.min.js",
4
+"lineCount":246,
5
+"mappings":"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",
6
+"sources":["angular.js"],
7
+"names":["window","document","undefined","minErr","isArrayLike","obj","isWindow","length","nodeType","NODE_TYPE_ELEMENT","isString","isArray","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","sortedKeys","keys","push","sort","forEachSorted","i","reverseParams","iteratorFn","value","nextUid","uid","setHashKey","h","$$hashKey","extend","dst","ii","arguments","Object","j","jj","int","str","parseInt","inherit","parent","extra","prototype","noop","identity","$","valueFn","isUndefined","isDefined","isObject","isNumber","isDate","toString","isRegExp","isScope","$evalAsync","$watch","isBoolean","isElement","node","nodeName","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","stackSource","stackDest","ngMinErr","result","Date","getTime","RegExp","match","lastIndex","emptyObject","create","getPrototypeOf","shallowCopy","src","charAt","equals","o1","o2","t1","t2","keySet","concat","array1","array2","slice","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","toJson","pretty","JSON","stringify","fromJson","json","parse","startingTag","jqLite","clone","empty","e","elemHtml","append","html","NODE_TYPE_TEXT","replace","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","key_value","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","getAttribute","candidate","querySelector","strictDi","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","test","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","skipDestroyOnNextJQueryCleanData","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","constructor","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","createMap","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","animation","filter","directive","run","block","publishExternalAPI","version","uppercase","counter","csp","angularModule","$LocaleProvider","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","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","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$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","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$asyncCallback","$$AsyncCallbackProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","cloneNode","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","type","unsupported","expandoStore","jqLiteExpandoStore","handle","listenerFns","removeEventListener","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","parentNode","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","getAliasedAttrName","ALIASED_ATTR","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","anonFn","args","fnText","STRIP_COMMENTS","FN_ARGS","annotate","$inject","argDecl","FN_ARG_SPLIT","FN_ARG","all","underscore","last","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","$get","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","INSTANTIATING","err","shift","locals","Type","Constructor","instance","returnedValue","has","$injector","instanceCache","decorator","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","servicename","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","Array","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","supported","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","error","startPoller","interval","check","pollFns","pollFn","pollTimeout","cacheStateAndFireUrlChange","cacheState","fireUrlChange","cachedState","history","state","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","safeDecodeURIComponent","rawDocument","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","addPollFn","self.addPollFn","href","baseElement","reloadLocation","self.url","sameState","sameBase","stripHash","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$checkUrlChange","baseHref","self.baseHref","lastCookies","lastCookieString","cookiePath","cookies","self.cookies","cookieLength","cookie","warn","cookieArray","substring","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","this.$get","cacheFactory","cacheId","options","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","LOCAL_REGEXP","bindings","definition","scopeName","$compileMinErr","attrName","mode","optional","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","REQUIRE_PREFIX_REGEXP","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","require","restrict","$$isolateBindings","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","safeAddClass","$element","className","addClass","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","transcludeControllers","parentBoundTranscludeFn","futureParentElement","$linkNode","wrapTemplate","controllerName","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","$new","transcludeOnThisElement","createBoundTranscludeFn","transclude","elementTranscludeOnThisElement","templateOnThisElement","attrs","linkFnFound","Attributes","collectDirectives","applyDirectivesToNode","$$element","terminal","previousBoundTranscludeFn","elementTransclusion","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","attrsMap","$attr","addDirective","directiveNormalize","nName","isNgAttr","nAttrs","attributes","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","substr","directiveNName","multiElement","addAttrInterpolateDirective","addTextInterpolateDirective","NODE_TYPE_COMMENT","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","getControllers","elementControllers","retrievalMethod","$searchElement","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","scopeToChild","controllerDirectives","$scope","$attrs","$transclude","controllerInstance","controllerAs","templateDirective","$$originalDirective","isolateScopeController","isolateBindingContext","identifier","bindToController","lastValue","parentGet","parentSet","compare","$observe","$$observers","$$scope","literal","b","assign","parentValueWatch","parentValue","$stateful","unwatch","$on","invokeLinkFn","template","templateUrl","terminalPriority","newScopeDirective","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","$$start","$$end","directiveValue","assertNoDuplicate","$$tlb","createComment","replaceWith","replaceDirective","contents","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectivesAsIsolate","mergeTemplateAttributes","compileTemplateUrl","Math","max","tDirectives","startAttrName","endAttrName","srcAttr","dstAttr","$set","tAttrs","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","getTrustedResourceUrl","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","wrapper","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","allOrNothing","attrInterpolatePreLinkFn","$$inter","newValue","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","replaceChild","expando","k","kk","annotation","attributesToCopy","$normalize","$addClass","classVal","$removeClass","removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","dataName","PREFIX_REGEXP","str1","str2","values","tokens1","tokens2","token","jqNodes","globals","CNTRL_REG","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","expression","later","ident","exception","cause","parseHeaders","headers","line","headersGetter","headersObj","transformData","fns","JSON_START","JSON_END","PROTECTION_PREFIX","CONTENT_TYPE_APPLICATION_JSON","defaults","transformResponse","defaultHttpResponseTransform","contentType","APPLICATION_JSON","transformRequest","d","common","patch","xsrfCookieName","xsrfHeaderName","useApplyAsync","this.useApplyAsync","interceptorFactories","interceptors","requestConfig","response","resp","status","reject","mergeHeaders","defHeaders","reqHeaders","defHeaderName","reqHeaderName","lowercaseDefHeaderName","execHeaders","headerContent","headerFn","header","chain","serverRequest","reqData","withCredentials","sendReq","promise","when","reversedInterceptors","interceptor","request","requestError","responseError","thenFn","rejectFn","success","promise.success","promise.error","done","headersString","statusText","resolveHttpPromise","resolvePromise","$applyAsync","$$phase","deferred","resolve","removePendingReq","pendingRequests","cachedResp","buildUrl","params","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","v","toISOString","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","callbacks","$browserDefer","jsonpReq","callbackId","async","body","called","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","send","this.startSymbol","this.endSymbol","escape","ch","mustHaveExpression","trustedContext","unescapeText","escapedStartRegexp","escapedEndRegexp","parseStringifyInterceptor","getTrusted","valueOf","newErr","$interpolateMinErr","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","exp","endSymbolLength","compute","interpolationFn","$$watchDelegate","objectEquality","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","count","invokeApply","setInterval","clearInterval","iteration","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","NUMBER_FORMATS","DECIMAL_SEP","GROUP_SEP","PATTERNS","minInt","minFrac","maxFrac","posPre","posSuf","negPre","negSuf","gSize","lgSize","CURRENCY_SYM","DATETIME_FORMATS","MONTH","SHORTMONTH","DAY","SHORTDAY","AMPMS","medium","short","fullDate","longDate","mediumDate","shortDate","mediumTime","shortTime","pluralCat","num","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","appBase","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","pathname","$$search","search","$$hash","beginsWith","begin","whole","stripFile","lastIndexOf","LocationHtml5Url","basePrefix","$$html5","appBaseNoFile","$$parse","this.$$parse","pathUrl","$locationMinErr","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","property","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","IGNORE_URI_REGEXP","ctrlKey","metaKey","which","target","absHref","animVal","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","console","logFn","log","hasApply","arg1","arg2","ensureSafeMemberName","fullExpression","$parseMinErr","ensureSafeObject","children","isConstant","setter","setValue","fullExp","propertyObj","cspSafeGetterFn","key0","key1","key2","key3","key4","cspSafeGetter","pathVal","getterFn","getterFnCache","pathKeys","pathKeysLength","code","evaledFnGetter","Function","sharedGetter","fn.assign","$parseOptions","wrapSharedExpression","wrapped","collectExpressionInputs","inputs","expressionInputDirtyCheck","oldValueOfValue","inputsWatchDelegate","parsedExpression","inputExpressions","$$inputs","lastResult","oldInputValue","expressionInputWatch","newInputValue","oldInputValueOfValues","expressionInputsWatch","changed","oneTimeWatchDelegate","oneTimeWatch","oneTimeListener","old","$$postDigest","oneTimeLiteralWatchDelegate","isAllDefined","allDefined","constantWatchDelegate","constantWatch","constantListener","addInterceptor","interceptorFn","oneTime","cacheKey","lexer","Lexer","parser","Parser","qFactory","nextTick","exceptionHandler","callOnce","resolveFn","Promise","simpleBind","scheduleProcessQueue","processScheduled","pending","Deferred","$qMinErr","TypeError","onFulfilled","onRejected","progressBack","catch","finally","handleCallback","$$reject","$$resolve","progress","makePromise","resolved","isResolved","callbackOutput","errback","$Q","Q","resolver","promises","results","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","TTL","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","Scope","$id","$parent","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$listeners","$$listenerCount","beginPhase","phase","decrementListenerCount","current","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","destroyChild","child","$$ChildScope","this.$$ChildScope","watchExp","watcher","eq","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","expr","unwatchFn","watchGroupSubAction","$watchCollection","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","logMsg","asyncTask","asyncQueue","$eval","isNaN","next","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","$emit","targetScope","listenerArgs","currentScope","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","maybeTrusted","allowed","this.enabled","documentMode","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","pushState","hasEvent","msie","divElm","handleRequestFn","tpl","ignoreRequestError","handleError","totalPendingRequests","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","base","urlParsingNode","requestUrl","originUrl","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","comparatorType","predicates","predicates.check","objKey","filtered","$locale","formats","amount","currencySymbol","fractionSize","formatNumber","number","groupSep","decimalSep","isFinite","isNegative","abs","numStr","formatedText","hasExponent","toFixed","fractionLen","min","round","fraction","lgroup","group","padNumber","digits","neg","dateGetter","date","dateStrGetter","shortForm","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","timezone","NUMBER_STRING","DATE_FORMATS_SPLIT","setMinutes","getMinutes","getTimezoneOffset","DATE_FORMATS","object","limit","Infinity","out","sortPredicate","reverseOrder","reverseComparator","comp","descending","v1","v2","map","predicate","arrayCopy","ngDirective","FormController","controls","parentForm","$$parentForm","nullFormCtrl","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$addControl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","set","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","VALIDITY_STATE_PROPERTY","placeholder","noevent","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","keyCode","$render","ctrl.$render","$modelValue","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","$ngModelMinErr","timezoneOffset","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","ctrl.$isEmpty","validity","badInput","typeMismatch","parseConstantExpr","fallback","parseFn","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","hasClass","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","classDirective","arrayDifference","arrayClasses","classes","digestClassCounts","classCounts","classesToUpdate","ngClassWatchAction","$index","old$index","mod","REGEX_STRING_REGEXP","isActive_","active","full","major","minor","dot","codeName","JQLite._data","MOUSE_EVENT_MAP","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","ready","trigger","fired","removeData","removeAttribute","css","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","related","relatedTarget","contains","off","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","$$annotate","$animateMinErr","$$selectors","classNameFilter","this.classNameFilter","$$classNameFilter","runAnimationPostDigest","cancelFn","$$cancelFn","defer.promise.$$cancelFn","ngAnimatePostDigest","ngAnimateNotifyComplete","resolveElementClasses","hasClasses","cachedClassManipulation","op","asyncPromise","currentDefer","applyStyles","styles","from","to","animate","enter","leave","move","$$addClassImmediately","$$removeClassImmediately","add","createdCache","STORAGE_KEY","$$setClassImmediately","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","CALL","APPLY","BIND","CONSTANTS","null","true","false","constantGetter","OPERATORS","+","-","*","/","%","===","!==","==","!=","<",">","<=",">=","&&","||","!","ESCAPE","lex","tokens","is","readString","peek","readNumber","isIdent","readIdent","isWhitespace","ch2","ch3","fn2","fn3","throwError","chars","isExpOperator","start","end","colStr","peekCh","lastDot","peekIndex","methodName","quote","rawString","hex","String","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","msg","peekToken","e1","e2","e3","e4","t","unaryFn","right","$parseUnaryFn","binaryFn","left","isBranching","$parseBinaryFn","$parseStatements","inputFn","argsFn","$parseFilter","every","assignment","ternary","$parseAssignment","logicalOR","middle","$parseTernary","logicalAND","equality","relational","additive","multiplicative","unary","field","$parseFieldAccess","o","indexFn","$parseObjectIndex","fnGetter","contextGetter","expressionText","$parseFunctionCall","elementFns","elementFn","$parseArrayLiteral","valueFns","$parseObjectLiteral","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","Z","timeZoneGetter","zone","paddedZone","ww","w","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","ngFormCompile","formElement","ngFormPreLink","handleFormSubmission","returnValue","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","DEFAULT_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","minutes","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrls","NgModelController","$asyncValidators","$viewChangeListeners","$untouched","$touched","parsedNgModel","pendingDebounce","ngModelGet","modelValue","getterSetter","ngModelSet","$$setOptions","this.$$setOptions","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","$$parseAndValidate","$$runValidators","this.$$runValidators","parseValid","viewValue","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","allValid","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","this.$$parseAndValidate","parserValid","prevModelValue","allowInvalid","$$writeModelToScope","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","ctrl.$validators.maxlength","ctrl.$validators.minlength","trimValues","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","that","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","getStringValue","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","forceAsyncEvents","ngEventHandler","$event","previousElements","ngIfWatchAction","newScope","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","BRACE","numberExp","whenExp","whens","whensExpFns","isWhen","attributeName","ngPluralizeWatch","ngPluralizeWatchAction","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","lhs","rhs","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","collection","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","itemKey","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","tempClasses","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","callExpression","exprFn","valueName","keyName","createIsSelectedFn","selectedSet","trackFn","trackIndex","isSelected","compareValueFn","selectAsFn","scheduleRendering","renderScheduled","render","updateLabelMap","labelMap","label","added","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","valuesFn","groupIndex","anySelected","groupByFn","displayFn","nullOption","groupLength","optionGroupsCache","optGroupTemplate","lastElement","optionTemplate","optionsExp","selectAs","track","selectionChanged","selectedKey","viewValueFn","getLabels","toDisplay","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","$$csp"]
8
+}
securis/src/main/webapp/js/angular/chosen.js
....@@ -0,0 +1,109 @@
1
+// Generated by CoffeeScript 1.6.2
2
+(function() {
3
+ var __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
4
+
5
+ angular.module('localytics.directives', []);
6
+
7
+ angular.module('localytics.directives').directive('chosen', function() {
8
+ var CHOSEN_OPTION_WHITELIST, NG_OPTIONS_REGEXP, isEmpty, snakeCase;
9
+
10
+ NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/;
11
+ CHOSEN_OPTION_WHITELIST = ['noResultsText', 'allowSingleDeselect', 'disableSearchThreshold', 'disableSearch', 'enableSplitWordSearch', 'inheritSelectClasses', 'maxSelectedOptions', 'placeholderTextMultiple', 'placeholderTextSingle', 'searchContains', 'singleBackstrokeDelete', 'displayDisabledOptions', 'displaySelectedOptions', 'width'];
12
+ snakeCase = function(input) {
13
+ return input.replace(/[A-Z]/g, function($1) {
14
+ return "_" + ($1.toLowerCase());
15
+ });
16
+ };
17
+ isEmpty = function(value) {
18
+ var key;
19
+
20
+ if (angular.isArray(value)) {
21
+ return value.length === 0;
22
+ } else if (angular.isObject(value)) {
23
+ for (key in value) {
24
+ if (value.hasOwnProperty(key)) {
25
+ return false;
26
+ }
27
+ }
28
+ }
29
+ return true;
30
+ };
31
+ return {
32
+ restrict: 'A',
33
+ require: '?ngModel',
34
+ terminal: true,
35
+ link: function(scope, element, attr, ngModel) {
36
+ var chosen, defaultText, disableWithMessage, empty, initOrUpdate, match, options, origRender, removeEmptyMessage, startLoading, stopLoading, valuesExpr, viewWatch;
37
+
38
+ element.addClass('localytics-chosen');
39
+ options = scope.$eval(attr.chosen) || {};
40
+ angular.forEach(attr, function(value, key) {
41
+ if (__indexOf.call(CHOSEN_OPTION_WHITELIST, key) >= 0) {
42
+ return options[snakeCase(key)] = scope.$eval(value);
43
+ }
44
+ });
45
+ startLoading = function() {
46
+ return element.addClass('loading').attr('disabled', true).trigger('chosen:updated');
47
+ };
48
+ stopLoading = function() {
49
+ return element.removeClass('loading').attr('disabled', false).trigger('chosen:updated');
50
+ };
51
+ chosen = null;
52
+ defaultText = null;
53
+ empty = false;
54
+ initOrUpdate = function() {
55
+ if (chosen) {
56
+ return element.trigger('chosen:updated');
57
+ } else {
58
+ chosen = element.chosen(options).data('chosen');
59
+ return defaultText = chosen.default_text;
60
+ }
61
+ };
62
+ removeEmptyMessage = function() {
63
+ empty = false;
64
+ return element.attr('data-placeholder', defaultText);
65
+ };
66
+ disableWithMessage = function() {
67
+ empty = true;
68
+ return element.attr('data-placeholder', chosen.results_none_found).attr('disabled', true).trigger('chosen:updated');
69
+ };
70
+ if (ngModel) {
71
+ origRender = ngModel.$render;
72
+ ngModel.$render = function() {
73
+ origRender();
74
+ return initOrUpdate();
75
+ };
76
+ if (attr.multiple) {
77
+ viewWatch = function() {
78
+ return ngModel.$viewValue;
79
+ };
80
+ scope.$watch(viewWatch, ngModel.$render, true);
81
+ }
82
+ } else {
83
+ initOrUpdate();
84
+ }
85
+ attr.$observe('disabled', function() {
86
+ return element.trigger('chosen:updated');
87
+ });
88
+ if (attr.ngOptions && ngModel) {
89
+ match = attr.ngOptions.match(NG_OPTIONS_REGEXP);
90
+ valuesExpr = match[7];
91
+ return scope.$watchCollection(valuesExpr, function(newVal, oldVal) {
92
+ if (angular.isUndefined(newVal)) {
93
+ return startLoading();
94
+ } else {
95
+ if (empty) {
96
+ removeEmptyMessage();
97
+ }
98
+ stopLoading();
99
+ if (isEmpty(newVal)) {
100
+ return disableWithMessage();
101
+ }
102
+ }
103
+ });
104
+ }
105
+ }
106
+ };
107
+ });
108
+
109
+}).call(this);
securis/src/main/webapp/js/angular/toaster.js
....@@ -0,0 +1,145 @@
1
+'use strict';
2
+
3
+/*
4
+ * AngularJS Toaster
5
+ * Version: 0.4.1
6
+ *
7
+ * Copyright 2013 Jiri Kavulak.
8
+ * All Rights Reserved.
9
+ * Use, reproduction, distribution, and modification of this code is subject to the terms and
10
+ * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
11
+ *
12
+ * Author: Jiri Kavulak
13
+ * Related to project of John Papa and Hans Fjällemark
14
+ */
15
+
16
+angular.module('toaster',[] )
17
+.service('toaster', ['$rootScope', function ($rootScope) {
18
+ this.pop = function (type, title, body, timeout, bodyOutputType) {
19
+ this.toast = {
20
+ type: type,
21
+ title: title,
22
+ body: body,
23
+ timeout: timeout,
24
+ bodyOutputType: bodyOutputType
25
+ };
26
+ $rootScope.$broadcast('toaster-newToast');
27
+ };
28
+}])
29
+.constant('toasterConfig', {
30
+ 'tap-to-dismiss': true,
31
+ 'newest-on-top': true,
32
+ //'fade-in': 1000, // done in css
33
+ //'on-fade-in': undefined, // not implemented
34
+ //'fade-out': 1000, // done in css
35
+ // 'on-fade-out': undefined, // not implemented
36
+ //'extended-time-out': 1000, // not implemented
37
+ 'time-out': 5000, // Set timeOut and extendedTimeout to 0 to make it sticky
38
+ 'icon-classes': {
39
+ error: 'toast-error',
40
+ info: 'toast-info',
41
+ success: 'toast-success',
42
+ warning: 'toast-warning'
43
+ },
44
+ 'body-output-type': '', // Options: '', 'trustedHtml', 'template'
45
+ 'body-template': 'toasterBodyTmpl.html',
46
+ 'icon-class': 'toast-info',
47
+ 'position-class': 'toast-top-right',
48
+ 'title-class': 'toast-title',
49
+ 'message-class': 'toast-message'
50
+ })
51
+.directive('toasterContainer', ['$compile', '$timeout', '$sce', 'toasterConfig', 'toaster',
52
+function ($compile, $timeout, $sce, toasterConfig, toaster) {
53
+ return {
54
+ replace: true,
55
+ restrict: 'EA',
56
+ link: function (scope, elm, attrs){
57
+
58
+ var id = 0;
59
+
60
+ var mergedConfig = toasterConfig;
61
+ if (attrs.toasterOptions) {
62
+ angular.extend(mergedConfig, scope.$eval(attrs.toasterOptions));
63
+ }
64
+
65
+ scope.config = {
66
+ position: mergedConfig['position-class'],
67
+ title: mergedConfig['title-class'],
68
+ message: mergedConfig['message-class'],
69
+ tap: mergedConfig['tap-to-dismiss']
70
+ };
71
+
72
+ function addToast (toast){
73
+ toast.type = mergedConfig['icon-classes'][toast.type];
74
+ if (!toast.type)
75
+ toast.type = mergedConfig['icon-class'];
76
+
77
+ id++;
78
+ angular.extend(toast, { id: id });
79
+
80
+ switch(toast.bodyOutputType)
81
+ {
82
+ case 'trustedHtml':
83
+ toast.html = $sce.trustAsHtml(toast.body);
84
+ break;
85
+ case 'template':
86
+ toast.bodyTemplate = mergedConfig['body-template'];
87
+ break;
88
+ }
89
+
90
+ var timeout = typeof(toast.timeout) == "number" ? toast.timeout : mergedConfig['time-out'];
91
+ if (timeout > 0)
92
+ setTimeout(toast, timeout);
93
+
94
+ if (mergedConfig['newest-on-top'] === true)
95
+ scope.toasters.unshift(toast);
96
+ else
97
+ scope.toasters.push(toast);
98
+ }
99
+
100
+ function setTimeout(toast, time){
101
+ toast.timeout= $timeout(function (){
102
+ scope.removeToast(toast.id);
103
+ }, time);
104
+ }
105
+
106
+ scope.toasters = [];
107
+ scope.$on('toaster-newToast', function () {
108
+ addToast(toaster.toast);
109
+ });
110
+ },
111
+ controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {
112
+
113
+ $scope.stopTimer = function(toast){
114
+ if(toast.timeout)
115
+ $timeout.cancel(toast.timeout);
116
+ };
117
+
118
+ $scope.removeToast = function (id){
119
+ var i = 0;
120
+ for (i; i < $scope.toasters.length; i++){
121
+ if($scope.toasters[i].id === id)
122
+ break;
123
+ }
124
+ $scope.toasters.splice(i, 1);
125
+ };
126
+
127
+ $scope.remove = function(id){
128
+ if ($scope.config.tap === true){
129
+ $scope.removeToast(id);
130
+ }
131
+ };
132
+ }],
133
+ template:
134
+ '<div id="toast-container" ng-class="config.position">' +
135
+ '<div ng-repeat="toaster in toasters" class="toast" ng-class="toaster.type" ng-click="remove(toaster.id)" ng-mouseover="stopTimer(toaster)">' +
136
+ '<div ng-class="config.title">{{toaster.title}}</div>' +
137
+ '<div ng-class="config.message" ng-switch on="toaster.bodyOutputType">' +
138
+ '<div ng-switch-when="trustedHtml" ng-bind-html="toaster.html"></div>' +
139
+ '<div ng-switch-when="template"><div ng-include="toaster.bodyTemplate"></div></div>' +
140
+ '<div ng-switch-default >{{toaster.body}}</div>' +
141
+ '</div>' +
142
+ '</div>' +
143
+ '</div>'
144
+ };
145
+}]);
securis/src/main/webapp/js/catalogs.js
....@@ -0,0 +1,272 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+ /*
5
+ * Catalogs module
6
+ */
7
+
8
+ angular
9
+ .module('catalogs', [ 'ngResource' ])
10
+
11
+ .service(
12
+ 'Catalogs',
13
+ [
14
+ '$rootScope',
15
+ '$http',
16
+ '$resource',
17
+ '$q',
18
+ function($rootScope, $http, $resource, $q) {
19
+ var resources = {
20
+ application : $resource(
21
+ '/application/:appId', {
22
+ appId : '@id'
23
+ }),
24
+ user : $resource('/user/:userId', {
25
+ userId : '@username'
26
+ }),
27
+ organization : $resource(
28
+ '/organization/:orgId', {
29
+ orgId : '@id'
30
+ }),
31
+ licensetype : $resource(
32
+ '/licensetype/:licenseTypeId', {
33
+ licenseTypeId : '@id'
34
+ })
35
+ }
36
+
37
+ var _metadata = null;
38
+ var _current = null;
39
+
40
+ var _list = function() {
41
+ return $http.get('/js/catalogs.json')
42
+ .success(function(data) {
43
+ _metadata = data;
44
+ })
45
+ }
46
+ this.init = function() {
47
+ if (_metadata) {
48
+ console.debug('Catalogs already initilizated');
49
+ var defer = $q.defer();
50
+ defer.resolve(_metadata);
51
+ return defer.promise;
52
+ }
53
+ return _list();
54
+ }
55
+ this.getList = function() {
56
+ return _metadata;
57
+ }
58
+ this.getName = function(index) {
59
+ if (index === undefined)
60
+ return _current ? _current.name : '';
61
+ return _metadata ? _metadata[index].name
62
+ : '';
63
+ }
64
+ this.getResource = function(res) {
65
+ if (res === undefined)
66
+ return _current ? resources[_current.resource]
67
+ : null;
68
+ return resources[res];
69
+ }
70
+ this.getPk = function(catalogMetadata) {
71
+ if (!catalogMetadata)
72
+ catalogMetadata = _current;
73
+
74
+ for (var i = 0; i < catalogMetadata.fields.length; i++)
75
+ if (catalogMetadata.fields[i].pk)
76
+ return catalogMetadata.fields[i].name;
77
+
78
+ return null;
79
+ }
80
+ /**
81
+ * Returns catalog metadata
82
+ *
83
+ * @param index:
84
+ * Return current catalog if
85
+ * undefined, if string It find the
86
+ * catalog by resoource name if
87
+ * number it find it by position
88
+ */
89
+ this.getMetadata = function(index) {
90
+ if (!_metadata)
91
+ throw new Error(
92
+ 'There is no catalog metadata info');
93
+ if (index === undefined)
94
+ return _current;
95
+ if (typeof index === 'string') {
96
+ for (var i = _metadata.length - 1; i >= 0
97
+ && _metadata[i].resource !== index; i--)
98
+ ;
99
+ index = i;
100
+ }
101
+
102
+ return _metadata[index];
103
+ }
104
+ this.setCurrent = function(index) {
105
+ if (!_metadata)
106
+ throw new Error(
107
+ 'There is no catalog metadata info');
108
+ if (index === undefined)
109
+ _current = null;
110
+ else
111
+ _current = _metadata[index];
112
+ }
113
+ /***********************************************
114
+ * Catalog fields methods *
115
+ **********************************************/
116
+
117
+ /**
118
+ * Returns the first field in form that should
119
+ * get the focus. We find the first field that
120
+ * is not read only
121
+ */
122
+ this.getFFF = this.getFirstFocusableField = function() {
123
+ if (!_current)
124
+ throw new Error(
125
+ 'There is no current catalog selected');
126
+
127
+ for (var i = 0; i < _current.fields.length; i++)
128
+ if (!_current.fields[i].readOnly)
129
+ return _current.fields[i].name;
130
+
131
+ return null;
132
+ }
133
+
134
+ /**
135
+ * Find the field by name or position
136
+ */
137
+ this.getField = function(key, catalog) {
138
+ catalog = catalog || _current;
139
+ if (!catalog)
140
+ throw new Error('There is no current catalog selected');
141
+ var index = -1;
142
+ if (typeof key === 'string') {
143
+ for (var i = catalog.fields.length - 1; i >= 0
144
+ && catalog.fields[i].name !== key; i--);
145
+ index = i;
146
+ } else {
147
+ index = key; // In this case key === field position
148
+ }
149
+
150
+ return index === -1 ? {}
151
+ : catalog.fields[index];
152
+ }
153
+
154
+ /***********************************************
155
+ * Catalog resource operations on server *
156
+ **********************************************/
157
+
158
+ function _success(response) {
159
+ console.debug('$resource action success')
160
+ console.log(_current);
161
+
162
+ }
163
+ function _fail(response) {
164
+ console.error('Error trying to get data, HTTP error code: '
165
+ + response.status)
166
+ }
167
+
168
+ this.save = function(data) {
169
+ if (!_current)
170
+ throw new Error('There is no current catalog selected');
171
+
172
+ var resource = this.getResource();
173
+ return resource.save(data, _success, _fail);
174
+ }
175
+ this.remove = function(data) {
176
+ return this.getResource().remove({}, data,
177
+ _success, _fail)
178
+ }
179
+ this.query = function() {
180
+ return this.getResource().query({},
181
+ _success, _fail);
182
+ }
183
+ this.refreshRef = function(refs, res,
184
+ preloadedData) {
185
+ // We check if there is some field for the
186
+ // resource passed as parameter
187
+ var field = (function() {
188
+ for (var i = _current.fields.length - 1; i >= 0; i--) {
189
+ if (_current.fields[i].resource === res)
190
+ return _current.fields[i];
191
+ }
192
+ return null;
193
+ })();
194
+
195
+ // If field for that resource is not found
196
+ // there is nothing to refresh
197
+ if (!field)
198
+ return;
199
+ var resource = this.getResource(res);
200
+ var data = preloadedData || resource.query({}, _success, _fail);
201
+ var that = this;
202
+ data.$promise.then(function(responseData) {
203
+ var pk = that.getPk(that
204
+ .getMetadata(field.resource))
205
+ var comboData = []
206
+ responseData.forEach(function(row) {
207
+ comboData.push({
208
+ id : row[pk],
209
+ label : row.label || row.name
210
+ || row.code
211
+ || row.first_name + ' '
212
+ + row.last_name
213
+ });
214
+ })
215
+ refs[field.name] = comboData;
216
+ })
217
+ }
218
+ this.loadRefs = function(callback, refsFields) {
219
+ if (!refsFields || refsFields.length === 0) {
220
+ if (!_current)
221
+ throw new Error('There is no current catalog selected');
222
+ refsFields = [];
223
+ _current.fields.forEach(function(f) {
224
+ if (f.resource)
225
+ refsFields.push(f)
226
+
227
+ });
228
+ }
229
+
230
+ var that = this;
231
+ var promises = []
232
+ var refs = []
233
+ refsFields.forEach(function(f) {
234
+ var resource = that
235
+ .getResource(f.resource);
236
+ refs[f.name] = resource.query({},
237
+ _success, _fail);
238
+ promises.push(refs[f.name].$promise);
239
+ });
240
+
241
+ $q.all(promises)
242
+ .then(function() {
243
+ refsFields.forEach(function(rf) {
244
+ var cat = that.getResource(rf.resource);
245
+ var pk = that.getPk(that.getMetadata(rf.resource))
246
+ //console.log('PK field for ' + rf.name + ' is ' + pk)
247
+ var comboData = []
248
+ refs[rf.name].forEach(function(row) {
249
+ comboData.push({
250
+ id : row[pk],
251
+ label : row.label
252
+ || row.name
253
+ || row.code
254
+ || row.first_name
255
+ + ' '
256
+ + (row.last_name || '')
257
+ });
258
+ })
259
+ refs[rf.name] = comboData;
260
+ });
261
+ // Next lines are to load special catalogs with predefined values, just like user roles
262
+ _current && _current.fields.forEach(function(f) {
263
+ if (f.values)
264
+ refs[f.name] = f.values;
265
+ });
266
+ callback(refs);
267
+ })
268
+ }
269
+
270
+ } ])
271
+
272
+})();
securis/src/main/webapp/js/catalogs.json
....@@ -0,0 +1,204 @@
1
+[ {
2
+ "name" : "Applications",
3
+ "resource" : "application",
4
+ "list_fields" : [ "name", "description", "creationTimestamp" ],
5
+ "fields" : [ {
6
+ "name" : "id",
7
+ "display" : "ID",
8
+ "type" : "number",
9
+ "pk" : true,
10
+ "autogenerate" : true,
11
+ "readOnly" : true
12
+ }, {
13
+ "name" : "name",
14
+ "display" : "Name",
15
+ "type" : "string",
16
+ "maxlength" : 45,
17
+ "mandatory" : true
18
+ }, {
19
+ "name" : "description",
20
+ "display" : "Description",
21
+ "type" : "string",
22
+ "maxlength" : 500,
23
+ "multiline" : 2
24
+ }, {
25
+ "name" : "license_filename",
26
+ "display" : "License filename",
27
+ "type" : "string",
28
+ "maxlength" : 100,
29
+ "mandatory" : true
30
+ }, {
31
+ "name" : "creation_timestamp",
32
+ "display" : "Creation date",
33
+ "autogenerate" : true,
34
+ "type" : "date",
35
+ "readOnly" : true
36
+ }, {
37
+ "name" : "metadata",
38
+ "display" : "Metadata",
39
+ "type" : "metadata",
40
+ "allow_creation": true
41
+ } ]
42
+}, {
43
+ "name" : "License types",
44
+ "list_fields" : [ "code", "name", "application_name", "creationTimestamp" ],
45
+ "resource" : "licensetype",
46
+ "fields" : [ {
47
+ "name" : "id",
48
+ "display" : "ID",
49
+ "type" : "number",
50
+ "pk" : true,
51
+ "autogenerate" : true,
52
+ "readOnly" : true
53
+ }, {
54
+ "name" : "code",
55
+ "display" : "Code",
56
+ "type" : "string",
57
+ "maxlength" : 10,
58
+ "mandatory" : true
59
+ }, {
60
+ "name" : "name",
61
+ "display" : "Name",
62
+ "type" : "string",
63
+ "maxlength" : 45,
64
+ "mandatory" : true
65
+ }, {
66
+ "name" : "description",
67
+ "display" : "Description",
68
+ "type" : "string",
69
+ "maxlength" : 500,
70
+ "multiline" : 2
71
+ }, {
72
+ "name" : "application_id",
73
+ "display" : "Application",
74
+ "resource" : "application",
75
+ "mandatory" : true,
76
+ "type" : "select",
77
+ "onchange": "updateMetadata"
78
+ }, {
79
+ "name" : "creation_timestamp",
80
+ "display" : "Creation date",
81
+ "autogenerate" : true,
82
+ "type" : "date",
83
+ "readOnly" : true
84
+ }, {
85
+ "name" : "application_name",
86
+ "display" : "Application",
87
+ "listingOnly" : true
88
+ }, {
89
+ "name" : "metadata",
90
+ "display" : "Metadata",
91
+ "type" : "metadata",
92
+ "allow_creation": false
93
+ } ]
94
+}, {
95
+ "name" : "Organizations",
96
+ "list_fields" : [ "code", "name", "org_parent_name", "creationTimestamp" ],
97
+ "resource" : "organization",
98
+ "fields" : [ {
99
+ "name" : "id",
100
+ "display" : "ID",
101
+ "type" : "number",
102
+ "pk" : true,
103
+ "autogenerate" : true,
104
+ "readOnly" : true
105
+ }, {
106
+ "name" : "code",
107
+ "display" : "Code",
108
+ "type" : "string",
109
+ "maxlength" : 10,
110
+ "mandatory" : true
111
+ }, {
112
+ "name" : "name",
113
+ "display" : "Name",
114
+ "type" : "string",
115
+ "maxlength" : 45,
116
+ "mandatory" : true
117
+ }, {
118
+ "name" : "description",
119
+ "display" : "Description",
120
+ "type" : "string",
121
+ "maxlength" : 500,
122
+ "multiline" : 2
123
+ }, {
124
+ "name" : "org_parent_id",
125
+ "display" : "Parent organization",
126
+ "resource" : "organization",
127
+ "type" : "select"
128
+ }, {
129
+ "name" : "users_ids",
130
+ "display" : "Users",
131
+ "resource" : "user",
132
+ "type" : "multiselect"
133
+ }, {
134
+ "name" : "creation_timestamp",
135
+ "display" : "Creation date",
136
+ "autogenerate" : true,
137
+ "type" : "date",
138
+ "readOnly" : true
139
+ }, {
140
+ "name" : "org_parent_name",
141
+ "display" : "Parent org",
142
+ "listingOnly" : true
143
+ } ]
144
+}, {
145
+ "name" : "Users",
146
+ "list_fields" : [ "username", "first_name", "last_name", "lastLogin" ],
147
+ "resource" : "user",
148
+ "fields" : [ {
149
+ "name" : "username",
150
+ "display" : "Username",
151
+ "type" : "string",
152
+ "maxlength" : 45,
153
+ "pk" : true,
154
+ "readOnly" : true,
155
+ "mandatory" : true
156
+ }, {
157
+ "name" : "email",
158
+ "display" : "Email",
159
+ "type" : "email",
160
+ "maxlength" : 150,
161
+ "mandatory" : true
162
+ }, {
163
+ "name" : "first_name",
164
+ "display" : "First name",
165
+ "type" : "string",
166
+ "maxlength" : 100,
167
+ "mandatory" : true
168
+ }, {
169
+ "name" : "password",
170
+ "display" : "Password",
171
+ "type" : "password",
172
+ "maxlength" : 100,
173
+ "mandatory" : false
174
+ }, {
175
+ "name" : "last_name",
176
+ "display" : "Last name",
177
+ "type" : "string",
178
+ "maxlength" : 100
179
+ }, {
180
+ "name" : "organizations_ids",
181
+ "display" : "Organizations",
182
+ "resource" : "organization",
183
+ "type" : "multiselect"
184
+ }, {
185
+ "name" : "roles",
186
+ "display" : "Roles",
187
+ "values" : [{"id":1, "label":"Advance"}, {"id":2, "label":"Admin"}],
188
+ "type" : "multiselect"
189
+ }, {
190
+ "name" : "lastLogin",
191
+ "display" : "Last login",
192
+ "autogenerate" : true,
193
+ "type" : "date",
194
+ "readOnly" : true
195
+ }, {
196
+ "name" : "creation_timestamp",
197
+ "display" : "Creation date",
198
+ "autogenerate" : true,
199
+ "type" : "date",
200
+ "readOnly" : true
201
+ }]
202
+ }
203
+
204
+]
securis/src/main/webapp/js/commons.js
....@@ -0,0 +1,224 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+ var app = angular.module('app', [ 'ngRoute', 'ngAnimate', 'ngResource' ]);
5
+
6
+ app.directive(
7
+ 'catalogField',
8
+ function() {
9
+ return {
10
+ restrict : 'A', // only activate on element
11
+ // attribute
12
+ require : '?ngModel', // get a hold of
13
+ // NgModelController
14
+ link : function(scope, element, attrs, ngModel) {
15
+ if (!ngModel)
16
+ return; // do nothing if no ng-model
17
+ // TODO: Replace the hard-coded form ID by the
18
+ // appropiate dynamic field
19
+ scope.catalogForm[attrs.name] = scope.catalogForm['{{field.name}}'];
20
+ scope.catalogForm[attrs.name].$name = attrs.name;
21
+ }
22
+ };
23
+ });
24
+
25
+ app.factory('Catalogs', function($http, $resource) {
26
+ var CatalogsService = {
27
+ resources : {
28
+ application : $resource('/application/:appId', {
29
+ appId : '@id'
30
+ }, {
31
+ update : {
32
+ method : "PUT"
33
+ },
34
+ test: {
35
+ url: '/application/:appId',
36
+ method : "DELETE",
37
+ params : {
38
+ appId : '@id'
39
+ }
40
+ }
41
+ }),
42
+ user : $resource('/user/:userId', {
43
+ userId : '@id'
44
+ }, {
45
+ update : {
46
+ method : "PUT"
47
+ }
48
+ }),
49
+ licensetype : $resource('/licenseType/:licenseTypeId', {
50
+ licenseTypeId : '@id'
51
+ }, {
52
+ update : {
53
+ method : "PUT"
54
+ }
55
+ })
56
+
57
+ },
58
+ list : function(initFn) {
59
+ $http.get('/js/catalogs.json').success(function(data) {
60
+ console.log(data);
61
+ CatalogsService.data = data;
62
+ initFn();
63
+ })
64
+ return CatalogsService;
65
+ },
66
+ getName : function(index) {
67
+ return CatalogsService.data ? CatalogsService.data[index].name
68
+ : '';
69
+ },
70
+ getResource : function(index) {
71
+ return CatalogsService.data ? CatalogsService.data[index].resource
72
+ : '';
73
+ },
74
+ getMetadata : function(index) {
75
+ return CatalogsService.data ? CatalogsService.data[index] : {};
76
+ },
77
+ save: function(catalog, data) {
78
+ var resource = CatalogsService.resources[catalog.toLowerCase()];
79
+ function success(data) {
80
+ console.log('success')
81
+ console.log(data)
82
+ }
83
+ function fail(data, status) {
84
+ console.log('error')
85
+ console.error(data)
86
+ console.error(status)
87
+ }
88
+ if (data.id && data.id !== '')
89
+ return resource.update(data, success, fail)
90
+ else
91
+ return resource.save(data, success, fail)
92
+ },
93
+ remove: function(catalog, data) {
94
+ var resource = CatalogsService.resources[catalog.toLowerCase()];
95
+ function success(data) {
96
+ console.log('success')
97
+ console.log(data)
98
+ }
99
+ function fail(data, status) {
100
+ console.log('error')
101
+ console.error(data)
102
+ console.error(status)
103
+ }
104
+ return resource.remove({}, data, success, fail)
105
+ },
106
+ query: function(catalog, callback) {
107
+ console.log('HI catalog ???? ' + catalog);
108
+ var resource = CatalogsService.resources[catalog.toLowerCase()];
109
+ function success(data) {
110
+ console.log('success')
111
+ console.log(data)
112
+ }
113
+ function fail(data, status) {
114
+ console.log('error')
115
+ console.error(data)
116
+ console.error(status)
117
+ }
118
+ return resource.query({}, success, fail);
119
+ }
120
+ }
121
+
122
+ return CatalogsService;
123
+
124
+ });
125
+
126
+ app.controller('CatalogsCtrl', [
127
+ '$scope',
128
+ '$http',
129
+ 'Catalogs',
130
+ function($scope, $http, Catalogs) {
131
+ $scope.formu = {};
132
+ $scope.catalogIndex = 0;
133
+ $scope.catalogs = Catalogs.list(function() {
134
+ $scope.catalogMetadata = Catalogs.getMetadata($scope.catalogIndex);
135
+ $scope.list = Catalogs.query(Catalogs.getResource($scope.catalogIndex));
136
+ });
137
+
138
+ $scope.catalogMetadata = {};
139
+ $scope.selectCatalog = function(index, $event) {
140
+ $scope.catalogIndex = index;
141
+ $scope.catalogMetadata = Catalogs.getMetadata($scope.catalogIndex);
142
+ $scope.list = Catalogs.query(Catalogs.getResource($scope.catalogIndex));
143
+ console.log($event);
144
+ }
145
+ $scope.edit = function(data) {
146
+ $scope.showForm = true;
147
+ $scope.isNew = false;
148
+ for (var k in data) {
149
+ if (k.indexOf('$') !== 0) $scope.formu[k] = data[k]
150
+ }
151
+ // TODO: Load in formu values for Form
152
+ // $scope.formu = {};
153
+ }
154
+ $scope.delete = function(data) {
155
+ BootstrapDialog.confirm('The record will be deleted, are you sure?', function(result){
156
+ if(result) {
157
+ var catalogName = Catalogs.getResource($scope.catalogIndex);
158
+ var promise = Catalogs.remove(catalogName, data).$promise;
159
+ promise.then(function(data) {
160
+ $scope.list = Catalogs.query(catalogName);
161
+ });
162
+ }
163
+ });
164
+ $scope.showForm = false;
165
+ $scope.isNew = false;
166
+ // TODO: Load in formu values for Form
167
+ // $scope.formu = {};
168
+ }
169
+
170
+ } ]);
171
+
172
+ app.controller('CatalogFormCtrl', [ '$scope', '$http', 'Catalogs',
173
+ function($scope, $http, Catalogs) {
174
+ $scope.showForm = false;
175
+ $scope.scope = $scope;
176
+ console.log('Form: currentCatalog:' + $scope.cataLogIndex);
177
+
178
+ $scope.editNew = function() {
179
+ $scope.showForm = true;
180
+ $scope.isNew = true;
181
+ // $scope.formu = {};
182
+ }
183
+ $scope.cancel = function() {
184
+ $scope.showForm = false;
185
+ }
186
+
187
+ $scope.saveCatalog = function() {
188
+ if ($scope.catalogForm.$invalid) {
189
+ alert(JSON.stringify($scope.catalogForm))
190
+ } else {
191
+ var catalogName = Catalogs.getResource($scope.catalogIndex);
192
+ var promise = Catalogs.save(catalogName, $scope.formu).$promise;
193
+ promise.then(function(data) {
194
+ $scope.$parent.list = Catalogs.query(catalogName);
195
+ });
196
+ }
197
+ }
198
+ } ]);
199
+
200
+ app.controller('CatalogListCtrl', [ '$scope', '$http', '$filter', 'Catalogs',
201
+ function($scope, $http, $filter, Catalogs) {
202
+ console.log('List: currentCatalog: ' + $scope.currentCatalog);
203
+ var _indexOfField = function(name) {
204
+ if (!$scope.catalogMetadata) return -1;
205
+ for (var i = $scope.catalogMetadata.fields.length - 1; i >= 0 && $scope.catalogMetadata.fields[i].name !== name; i--);
206
+ return i;
207
+ }
208
+
209
+ $scope.print = function(name, value) {
210
+ var index = _indexOfField(name);
211
+ if (index === -1) return value;
212
+ var type = $scope.catalogMetadata.fields[index].type;
213
+
214
+ return type === 'date' ? $filter('date')(value, 'yyyy-MM-dd') : value;
215
+ }
216
+
217
+ $scope.display = function(name) {
218
+ var index = _indexOfField(name);
219
+ return index === -1 ? '' : $scope.catalogMetadata.fields[index].display;
220
+ }
221
+
222
+ } ]);
223
+
224
+})();
securis/src/main/webapp/js/i18n.js
....@@ -0,0 +1,82 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+ /*
5
+ * Catalogs module
6
+ */
7
+
8
+ angular.module('i18n', [])
9
+
10
+ .service('$L', ['$http', function ($http) {
11
+ var url_tpl = '/lang/messages_{0}.json';
12
+ var _defaultLang = 'en';
13
+ var _currentLang = 'en';
14
+ var _messages = null;
15
+
16
+ /**
17
+ * It works similar to MessageFormat in Java
18
+ */
19
+ var format = function() {
20
+ var args = arguments;
21
+
22
+ return this.replace(/\{(\d+)\}/g, function() {
23
+ return args[arguments[1]];
24
+ });
25
+ };
26
+
27
+ this.setLocale = function(newLoc) {
28
+ _currentLang = newLoc;
29
+ if (_currentLang === defaultLang)
30
+ _messages = null;
31
+ else {
32
+ $http.get(format.apply(url_tpl, [newLoc])).success(function(data) {
33
+ _messages = data;
34
+ // TODO: Launch event ???
35
+ });
36
+ }
37
+ }
38
+
39
+ /**
40
+ * It accepts direct messages and templates:
41
+ * {
42
+ * "hello": "hola",
43
+ * "Hello {0}!!: "Hola {0}!!"
44
+ * }
45
+ * $L.get('hello'); // This returns "hola"
46
+ * $L.get('Hello {0}!!', 'John'); // This returns: "Hola John!!" if languaje is spanish
47
+ */
48
+ this.get = function(msg) {
49
+ if (!_messages || !_messages[msg]) {
50
+ if (arguments.length === 1) return msg;
51
+ var params = Array.prototype.slice.call(arguments, 1);
52
+ return format.apply(msg, params);
53
+ }
54
+
55
+ if (arguments.length === 1) return _messages[msg];
56
+ var params = Array.prototype.slice.call(arguments, 1);
57
+ return format.apply(_messages[msg], params);
58
+ }
59
+
60
+ var that = this;
61
+ String.prototype.$i18n = function() {
62
+ var args = [this];
63
+ Array.prototype.push.apply(args, Array.prototype.slice.call(arguments, 0));
64
+ return that.get.apply(that, args)
65
+ };
66
+
67
+ }])
68
+ .directive(
69
+ 'i18n',
70
+ function($L) {
71
+ return {
72
+ restrict : 'A', // only activate on element attribute
73
+ require : '',
74
+ link : function(scope, element, attrs) {
75
+ var txt = attrs.i18n || element.text();
76
+ element.text($L.get(txt));
77
+ }
78
+ };
79
+ });
80
+
81
+
82
+})();
securis/src/main/webapp/js/lang/messages_es.json
....@@ -0,0 +1,4 @@
1
+{
2
+"": "",
3
+"": ""
4
+}
securis/src/main/webapp/js/lang/messages_fr.json
....@@ -0,0 +1,4 @@
1
+{
2
+"": "",
3
+"": ""
4
+}
securis/src/main/webapp/js/licenses.js
....@@ -0,0 +1,803 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+
5
+
6
+ var HTTP_ERRORS = {
7
+ 401: "Unathorized action",
8
+ 418: "Application error",
9
+ 403: "Forbidden action",
10
+ 500: "Server error",
11
+ 404: "Element not found"
12
+ }
13
+
14
+ var app = angular.module('securis');
15
+ app.service('Packs', ['$L','$resource', 'toaster', function($L, $resource, toaster) {
16
+ var PACK_STATUS = {
17
+ CREATED: 'CR',
18
+ ACTIVE: 'AC',
19
+ ONHOLD: 'OH',
20
+ EXPIRED: 'EX',
21
+ CANCELLED: 'CA'
22
+ }
23
+ var PACK_STATUSES = {
24
+ 'CR': $L.get('Created'),
25
+ 'AC': $L.get('Active'),
26
+ 'OH': $L.get('On Hold'),
27
+ 'EX': $L.get('Expired'),
28
+ 'CA': $L.get('Cancelled')
29
+ };
30
+ /**
31
+ * These transitions could be get from server, class Pack.Status, but we
32
+ * copy them for simplicity, this info won't change easily
33
+ */
34
+ var PACK_ACTIONS_BY_STATUS = {
35
+ activate: [PACK_STATUS.CREATED, PACK_STATUS.EXPIRED, PACK_STATUS.ONHOLD],
36
+ putonhold: [PACK_STATUS.ACTIVE],
37
+ cancel: [PACK_STATUS.EXPIRED, PACK_STATUS.ONHOLD, PACK_STATUS.ACTIVE],
38
+ 'delete': [PACK_STATUS.CREATED, PACK_STATUS.CANCELLED]
39
+ }
40
+
41
+ var packResource = $resource('/pack/:packId/:action',
42
+ {
43
+ packId : '@id',
44
+ action : '@action'
45
+ },
46
+ {
47
+ activate: {
48
+ method: "POST",
49
+ params: {action: "activate"}
50
+ },
51
+ putonhold: {
52
+ method: "POST",
53
+ params: {action: "putonhold"}
54
+ },
55
+ cancel: {
56
+ method: "POST",
57
+ params: {action: "cancel"}
58
+ }
59
+ }
60
+ );
61
+ this.getStatusColor = function(status) {
62
+ var COLORS_BY_STATUS = {
63
+ 'CR': '#808080',
64
+ 'AC': '#329e5a',
65
+ 'OH': '#9047c7',
66
+ 'EX': '#ea7824',
67
+ 'CA': '#a21717'
68
+ };
69
+
70
+ return COLORS_BY_STATUS[status];
71
+ },
72
+ this.getStatusName = function(status) {
73
+ return PACK_STATUSES[status];
74
+ }
75
+
76
+ this.savePackData = function(pack, isNew, _onsuccess) {
77
+ var _success = function() {
78
+ _onsuccess();
79
+ toaster.pop('success', 'Packs', $L.get("Pack '{0}' {1} successfully", pack.code, isNew ? $L.get("created") : $L.get("updated")));
80
+ }
81
+ var _error = function(error) {
82
+ console.log(error);
83
+ toaster.pop('error', 'Packs', $L.get("Error {0} pack '{1}'. Reason: {2}", isNew ? $L.get("creating") : $L.get("updating"), pack.code, $L.get(error.headers('X-SECURIS-ERROR-MSG'))));
84
+ }
85
+ packResource.save(pack, _success, _error);
86
+ }
87
+
88
+ this.isActionAvailable = function(action, pack) {
89
+ var validStatuses = PACK_ACTIONS_BY_STATUS[action];
90
+ return pack && validStatuses && validStatuses.indexOf(pack.status) !== -1;
91
+ }
92
+ var _createSuccessCallback = function(actionName, message, _innerCallback) {
93
+ return function() {
94
+ _innerCallback && _innerCallback();
95
+ toaster.pop('success', actionName, message);
96
+ }
97
+ }
98
+ var _createErrorCallback = function(pack, actionName, _innerCallback) {
99
+ return function(error) {
100
+ console.log(error);
101
+ _innerCallback && _innerCallback();
102
+ toaster.pop('error', actionName, $L.get("Error on action '{0}', pack '{1}'. Reason: {2}", actionName, pack.code, $L.get(error.headers('X-SECURIS-ERROR-MSG'))));
103
+ }
104
+ }
105
+ this.getPacksList = function(_onsuccess, _onerror) {
106
+ return packResource.query(_onsuccess, _onerror);
107
+ }
108
+ this.activate = function(pack, _onsuccess, _onerror) {
109
+ console.log('Activation on pack: ' + pack.id);
110
+ var _success = _createSuccessCallback($L.get('Activation'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("activated")), _onsuccess);
111
+ var _error = _createErrorCallback(pack, $L.get('Activation'), _onerror);
112
+ packResource.activate({id: pack.id}, _success, _error);
113
+ }
114
+ this.putonhold = function(pack, _onsuccess, _onerror) {
115
+ console.log('Put on hold on pack: ' + pack.id);
116
+ var _success = _createSuccessCallback($L.get('Put on hold'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("put on hold")), _onsuccess);
117
+ var _error = _createErrorCallback(pack, $L.get('Put on hold'), _onerror);
118
+ packResource.putonhold({id: pack.id}, _success, _error);
119
+ }
120
+ this.cancel = function(pack, extra_data, _onsuccess, _onerror) {
121
+ console.log('Cancellation on pack: ' + pack.id);
122
+ var _success = _createSuccessCallback($L.get('Cancellation'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("cancelled")), _onsuccess);
123
+ var _error = _createErrorCallback(pack, $L.get('Cancellation'), _onerror);
124
+ var params = angular.extend({id: pack.id}, extra_data);
125
+ packResource.cancel(params, _success, _error);
126
+ }
127
+ this.delete = function(pack, _onsuccess, _onerror) {
128
+ console.log('Delete on pack: ' + pack.id);
129
+ var _success = _createSuccessCallback($L.get('Deletion'), $L.get("Pack '{0}' {1} successfully", pack.code, $L.get("deleted")), _onsuccess);
130
+ var _error = _createErrorCallback(pack, $L.get('Deletion'), _onerror);
131
+ packResource.delete({packId: pack.id}, _success, _error);
132
+ }
133
+
134
+ }]);
135
+
136
+ app.service('Licenses', ['$L', '$resource', 'toaster', function($L, $resource, toaster) {
137
+ var LIC_STATUS = {
138
+ CREATED: 'CR',
139
+ ACTIVE: 'AC',
140
+ REQUESTED: 'RE',
141
+ PREACTIVE: 'PA',
142
+ EXPIRED: 'EX',
143
+ CANCELLED: 'CA'
144
+ }
145
+
146
+ var LIC_STATUSES = {
147
+ 'CR': $L.get('Created'),
148
+ 'AC': $L.get('Active'),
149
+ 'PA': $L.get('Pre-active'),
150
+ 'RE': $L.get('Requested'),
151
+ 'EX': $L.get('Expired'),
152
+ 'CA': $L.get('Cancelled')
153
+ };
154
+
155
+ /**
156
+ * These transitions could be get from server, class License.Status, but
157
+ * we copy them for simplicity, this info won't change easily
158
+ */
159
+ var LIC_ACTIONS_BY_STATUS = {
160
+ activate: [LIC_STATUS.CREATED, LIC_STATUS.REQUESTED, LIC_STATUS.PREACTIVE],
161
+ send: [LIC_STATUS.ACTIVE, LIC_STATUS.PREACTIVE],
162
+ download: [LIC_STATUS.ACTIVE, LIC_STATUS.PREACTIVE],
163
+ block: [LIC_STATUS.CANCELLED],
164
+ unblock: [LIC_STATUS.CANCELLED],
165
+ cancel: [LIC_STATUS.REQUESTED, LIC_STATUS.EXPIRED, LIC_STATUS.PREACTIVE, LIC_STATUS.ACTIVE],
166
+ 'delete': [LIC_STATUS.CREATED, LIC_STATUS.CANCELLED]
167
+ }
168
+
169
+ var licenseResource = $resource('/license/:licenseId/:action', {
170
+ licenseId : '@id',
171
+ action : '@action'
172
+ },
173
+ {
174
+ activate: {
175
+ method: "POST",
176
+ params: {action: "activate"}
177
+ },
178
+ cancel: {
179
+ method: "POST",
180
+ params: {action: "cancel"}
181
+ },
182
+ download: {
183
+ method: "GET",
184
+ params: {action: "download"}
185
+ },
186
+ block: {
187
+ method: "POST",
188
+ params: {action: "block"}
189
+ },
190
+ send: {
191
+ method: "POST",
192
+ params: {action: "send"}
193
+ },
194
+ unblock: {
195
+ method: "POST",
196
+ params: {action: "unblock"}
197
+ }
198
+ });
199
+
200
+
201
+ this.isActionAvailable = function(action, lic) {
202
+ var validStatuses = LIC_ACTIONS_BY_STATUS[action];
203
+ return lic && validStatuses && validStatuses.indexOf(lic.status) !== -1;
204
+ }
205
+ this.getStatusColor = function(status) {
206
+ var COLORS_BY_STATUS = {
207
+ 'CR': '#808080',
208
+ 'AC': '#329e5a',
209
+ 'RE': '#2981d4',
210
+ 'EX': '#ea7824',
211
+ 'CA': '#a21717'
212
+ };
213
+
214
+ return COLORS_BY_STATUS[status];
215
+ },
216
+ this.getStatusName = function(status) {
217
+ return LIC_STATUSES[status];
218
+ }
219
+
220
+ this.saveLicenseData = function(license, isNew, _onsuccess) {
221
+ var _success = function() {
222
+ _onsuccess();
223
+ toaster.pop('success', 'Licenses', $L.get("License '{0}' {1} successfully", license.code, isNew ? $L.get("created") : $L.get("updated")));
224
+ }
225
+ var _error = function(error) {
226
+ console.log(error);
227
+ toaster.pop('error', 'Licenses', $L.get("Error {0} license '{1}'. Reason: {2}", isNew ? $L.get("creating") : $L.get("updating"), license.code, $L.get(error.headers('X-SECURIS-ERROR-MSG'))));
228
+ }
229
+ licenseResource.save(license, _success, _error);
230
+ }
231
+
232
+ var _createSuccessCallback = function(actionName, message, _innerCallback) {
233
+ return function() {
234
+ _innerCallback && _innerCallback();
235
+ toaster.pop('success', actionName, message);
236
+ }
237
+ }
238
+ var _createErrorCallback = function(license, actionName, _innerCallback) {
239
+ return function(error) {
240
+ console.log(error);
241
+ _innerCallback && _innerCallback();
242
+ toaster.pop('error', actionName, $L.get("Error on action '{0}', license '{1}'. Reason: {2}", actionName, license.code, $L.get(error.headers('X-SECURIS-ERROR-MSG'))));
243
+ }
244
+ }
245
+
246
+ this.getLicensesList = function(pack, _onsuccess, _onerror) {
247
+ return licenseResource.query({packId: pack.id}, _onsuccess, _onerror);
248
+ }
249
+ this.activate = function(license, _onsuccess, _onerror) {
250
+ console.log('Activation on license: ' + license.id);
251
+ var _success = _createSuccessCallback($L.get('Activation'), $L.get("License '{0}' {1} successfully", license.code, $L.get("activated")), _onsuccess);
252
+ var _error = _createErrorCallback(license, $L.get('Activation'), _onerror);
253
+ licenseResource.activate({id: license.id}, _success, _error);
254
+ }
255
+ this.block = function(license, _onsuccess, _onerror) {
256
+ console.log('Block on license: ' + license.id);
257
+ var _success = _createSuccessCallback($L.get('Block'), $L.get("License '{0}' {1} successfully", license.code, $L.get("blocked")), _onsuccess);
258
+ var _error = _createErrorCallback(license, $L.get('Block'), _onerror);
259
+ licenseResource.putonhold({id: license.id}, _success, _error);
260
+ }
261
+ this.unblock = function(license, _onsuccess, _onerror) {
262
+ console.log('Unblock on license: ' + license.id);
263
+ var _success = _createSuccessCallback($L.get('Unblock'), $L.get("License '{0}' {1} successfully", license.code, $L.get("unblocked")), _onsuccess);
264
+ var _error = _createErrorCallback(license, $L.get('Unblock'), _onerror);
265
+ licenseResource.putonhold({id: license.id}, _success, _error);
266
+ }
267
+ this.cancel = function(license, extra_data, _onsuccess, _onerror) {
268
+ console.log('Cancellation on license: ' + license.id);
269
+ var _success = _createSuccessCallback($L.get('Cancellation'), $L.get("License '{0}' {1} successfully", license.code, $L.get("cancelled")), _onsuccess);
270
+ var _error = _createErrorCallback(license, $L.get('Cancellation'), _onerror);
271
+ var params = angular.extend({id: license.id}, extra_data);
272
+ licenseResource.cancel(params, _success, _error);
273
+ }
274
+ this.delete = function(license, _onsuccess, _onerror) {
275
+ console.log('Delete on license: ' + license.id);
276
+ var _success = _createSuccessCallback($L.get('Deletion'), $L.get("License '{0}' {1} successfully", license.code, $L.get("deleted")), _onsuccess);
277
+ var _error = _createErrorCallback(license, $L.get('Deletion'), _onerror);
278
+ licenseResource.delete({licenseId: license.id}, _success, _error);
279
+ }
280
+ }]);
281
+
282
+ app.directive('fileLoader',
283
+ function($timeout, $parse) {
284
+ return {
285
+ restrict : 'A', // only activate on element attribute
286
+ require : '',
287
+ link : function(scope, element, attrs) {
288
+ console.log('scope.license: ' + scope.$parent.license);
289
+ var setter = $parse(attrs.fileLoader).assign;
290
+ element.bind('change', function(evt) {
291
+ if (!window.FileReader) { // Browser is not
292
+ // compatible
293
+ BootstrapDialog.alert($L.get("Open your .req file with a text editor and copy&paste the content in the form text field?"));
294
+ return;
295
+ }
296
+ console.log('File selected');
297
+ // console.log('scope.license: ' +
298
+ // scope.$parent.license);
299
+ var field = $parse(attrs.fileLoader);
300
+ // console.log('field: ' + field);
301
+ var fileList = evt.target.files;
302
+ if (fileList != null && fileList[0]) {
303
+ var reader = new FileReader();
304
+ reader.onerror = function(data) {
305
+ setter(scope.$parent, 'ERROR');
306
+ scope.$apply();
307
+ }
308
+ reader.onload = function(data) {
309
+ setter(scope.$parent, reader.result);
310
+ scope.$apply();
311
+ }
312
+
313
+ reader.readAsText(fileList[0]);
314
+ } else {
315
+ setter(scope.$parent, '');
316
+ scope.$apply();
317
+ }
318
+ });
319
+
320
+ }
321
+ };
322
+ });
323
+
324
+
325
+ app.controller('PackAndLicensesCtrl', [
326
+ '$scope',
327
+ '$http',
328
+ 'toaster',
329
+ '$store',
330
+ '$L',
331
+ function($scope, $http, toaster, $store, $L) {
332
+ $store.set('location', '/licenses');
333
+
334
+ $scope.maxLengthErrorMsg = function(displayname, fieldMaxlength) {
335
+ return $L.get("{0} length is too long (max: {1}).", $L.get(displayname), fieldMaxlength);
336
+ }
337
+ $scope.mandatoryFieldErrorMsg = function(displayname) {
338
+ return $L.get("'{0}' is required.", $L.get(displayname));
339
+ }
340
+ $scope.field1ShouldBeGreaterThanField2 = function(field1, field2) {
341
+ return $L.get("{0} should be greater than {1}", $L.get(field1), $L.get(field2));
342
+ }
343
+ $scope.ellipsis = function(txt, len) {
344
+ if (!txt || txt.length <= len) return txt;
345
+ return txt.substring(0, len) + '...';
346
+ }
347
+ $scope.currentPack = $store.get('currentPack');
348
+
349
+ }]);
350
+
351
+ app.controller('PacksCtrl', [
352
+ '$scope',
353
+ '$http',
354
+ '$resource',
355
+ 'toaster',
356
+ 'Catalogs',
357
+ 'Packs',
358
+ '$store',
359
+ '$L',
360
+ function($scope, $http, $resource, toaster, Catalogs, Packs, $store, $L) {
361
+ $scope.Packs = Packs;
362
+
363
+
364
+ $scope.mandatory = {
365
+ code: true,
366
+ num_licenses: true,
367
+ init_valid_date: true,
368
+ end_valid_date: true,
369
+ status: true,
370
+ organization_id: true,
371
+ license_type_id: true
372
+ }
373
+ $scope.maxlength = {
374
+ code: 50,
375
+ comments: 1024
376
+ }
377
+ $scope.refs = {};
378
+ Catalogs.init().then(function() {
379
+ var refFields = [{resource: 'organization', name: 'organization_id'},{resource: 'licensetype', name: 'license_type_id'}];
380
+ Catalogs.loadRefs(function(refs) {
381
+ $scope.refs = refs;
382
+ }, refFields);
383
+ });
384
+
385
+ // Used to create the form with the appropriate data
386
+ $scope.isNew = undefined;
387
+
388
+ // Selected pack from listing
389
+ // pack is the edited pack, in creation contains the data for
390
+ // the new pack
391
+ $scope.pack = null;
392
+
393
+ $scope.packs = Packs.getPacksList();
394
+
395
+ $scope.save = function() {
396
+ Packs.savePackData($scope.pack, $scope.isNew, function() {
397
+ if (!$scope.isNew) {
398
+ $scope.showForm = false;
399
+ } else {
400
+ $scope.newPack();
401
+ }
402
+ $scope.packs = Packs.getPacksList();
403
+ });
404
+ }
405
+
406
+ /**
407
+ * Execute an action over the pack, activation, onhold,
408
+ * cancellation
409
+ */
410
+ $scope.execute = function(action, pack) {
411
+ var _execute = function(extra_data) {
412
+ if (extra_data) {
413
+ Packs[action](pack || $scope.pack, extra_data, function() {
414
+ if (!$scope.isNew) $scope.showForm = false;
415
+ $scope.packs = Packs.getPacksList();
416
+ });
417
+ } else {
418
+ Packs[action](pack || $scope.pack, function() {
419
+ if (!$scope.isNew) $scope.showForm = false;
420
+ $scope.packs = Packs.getPacksList();
421
+ });
422
+ }
423
+ }
424
+ if (action === 'delete') {
425
+ BootstrapDialog.confirm($L.get("The pack '{0}' will be deleted, are you sure ?", pack.code), function(answer) {
426
+ if (answer) {
427
+ _execute();
428
+ }
429
+ });
430
+ } else {
431
+ if (action === 'cancel') {
432
+ BootstrapDialog.show({
433
+ title: $L.get("Pack cancellation"),
434
+ type: BootstrapDialog.TYPE_DANGER,
435
+ message: function(dialog) {
436
+ var $content = $('<div></div>');
437
+ var $message = $('<div></div>');
438
+ $message.append($('<label/>').text($L.get("The pack '{0}' and all its licenses will be cancelled, this action cannot be undone", pack.code)));
439
+ $content.append($message);
440
+
441
+ var $message = $('<div style="margin-top:10pt;"/>');
442
+ var pageToLoad = dialog.getData('pageToLoad');
443
+ $message.append($('<label style="margin-right:5pt;"/>').text($L.get("Cancellation reason:") + " "));
444
+ $message.append($('<input type="text" style="width:100%;" maxlength="512" id="_pack_cancellation_reason"/>'));
445
+ $content.append($message);
446
+ return $content;
447
+ },
448
+ closable: true,
449
+ buttons: [{
450
+ id: 'btn-cancel',
451
+ label: $L.get('Close'),
452
+ cssClass: 'btn-default',
453
+ action: function(dialogRef) {
454
+ dialogRef.close();
455
+ }
456
+ }, {
457
+ id: 'btn-ok',
458
+ label: $L.get('Cancel pack'),
459
+ cssClass: 'btn-primary',
460
+ action: function(dialogRef){
461
+ var reason = $('#_pack_cancellation_reason').val();
462
+ console.log('Ready to cancel pack, by reason: ' + reason);
463
+ if (!reason) {
464
+ $('#_pack_cancellation_reason').focus();
465
+ } else {
466
+ _execute({reason: reason});
467
+ dialogRef.close();
468
+ }
469
+ }
470
+ }]
471
+ });
472
+ } else {
473
+ _execute();
474
+ }
475
+ }
476
+ }
477
+
478
+
479
+ $scope.newPack = function() {
480
+ $scope.isNew = true;
481
+ $scope.showForm = true;
482
+ $scope.pack = {
483
+ license_preactivation: true,
484
+ status: 'CR',
485
+ num_licenses: 1,
486
+ init_valid_date: new Date(),
487
+ default_valid_period: 30,
488
+ license_type_id: null,
489
+ organization_id: null // !$scope.refs.organization_id
490
+ // ||
491
+ // !$scope.refs.organization_id.length
492
+ // ? null :
493
+ // $scope.refs.organization_id[0].id
494
+ }
495
+ setTimeout(function() {
496
+ $('#code').focus();
497
+ }, 0);
498
+ }
499
+
500
+ $scope.editPack = function(selectedPack) {
501
+ $scope.isNew = false;
502
+ $scope.showForm = true;
503
+ if (!(selectedPack.init_valid_date instanceof Date)) {
504
+ selectedPack.init_valid_date = new Date(selectedPack.init_valid_date);
505
+ }
506
+ if (!(selectedPack.end_valid_date instanceof Date)) {
507
+ selectedPack.end_valid_date = new Date(selectedPack.end_valid_date);
508
+ }
509
+
510
+ $scope.pack = selectedPack;
511
+
512
+ // $scope.pack.organization_name =
513
+ // $scope.getLabelFromId('organization_id',
514
+ // $scope.pack.organization_id);
515
+ $scope.pack.license_type_name = $scope.getLabelFromId('license_type_id', $scope.pack.license_type_id);
516
+ $scope.pack.status_name = Packs.getStatusName($scope.pack.status);
517
+
518
+ setTimeout(function() {
519
+ $('#code').focus();
520
+ }, 0);
521
+ }
522
+
523
+ $scope.deletePack = function(selectedPack) {
524
+ $scope.showForm = false;
525
+ BootstrapDialog.confirm($L.get("The pack '{0}' will be deleted, are you sure?", selectedPack.code), function(result){
526
+ if(result) {
527
+ var promise = packResource.remove({}, {id: selectedPack.id}).$promise;
528
+ promise.then(function(data) {
529
+ $scope.selectPack(null);
530
+ $scope.packs = packResource.query();
531
+ toaster.pop('success', Catalogs.getName(), $L.get("Pack '{0}' deleted successfully", selectedPack.code));
532
+ },function(error) {
533
+ console.log(error);
534
+ toaster.pop('error', Catalogs.getName(), $L.get("Error deleting pack, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000);
535
+ });
536
+ }
537
+ });
538
+ $scope.isNew = false;
539
+ }
540
+
541
+
542
+ $scope.cancel = function() {
543
+ $scope.showForm = false;
544
+ }
545
+
546
+ $scope.selectPack = function(pack) {
547
+ $scope.$parent.currentPack = pack;
548
+ $store.put('currentPack', pack);
549
+ $scope.$parent.$broadcast('pack_changed', pack);
550
+ }
551
+
552
+ $scope.getLabelFromId = function(field, myid) {
553
+ var label = null;
554
+ $scope.refs[field].forEach(function (elem) {
555
+ if (elem.id === myid) {
556
+ label = elem.label;
557
+ }
558
+ });
559
+ return label;
560
+ }
561
+
562
+ $scope.createMetadataRow = function() {
563
+ if (!$scope.formu.metadata) {
564
+ $scope.formu.metadata = [];
565
+ }
566
+ $scope.formu.metadata.push({key: '', value: '', mandatory: true});
567
+ }
568
+ $scope.removeMetadataKey = function(row_md) {
569
+ $scope.formu.metadata.splice( $scope.formu.metadata.indexOf(row_md), 1 );
570
+ }
571
+ $scope.updateMetadata = function() {
572
+ // Called when Application ID change in current field
573
+ var newLTId = $scope.pack['license_type_id'];
574
+ if (newLTId) {
575
+ // Only if there is a "valid" value selected we should
576
+ // update the metadata
577
+ Catalogs.getResource('licensetype').get({licenseTypeId: newLTId}).$promise.then(function(lt) {
578
+ $scope.pack.metadata = [];
579
+ lt.metadata.forEach(function(md) {
580
+ $scope.pack.metadata.push({
581
+ key: md.key,
582
+ value: md.value,
583
+ readonly: !!md.value,
584
+ mandatory: md.mandatory
585
+ });
586
+ });
587
+ });
588
+ }
589
+ }
590
+ } ]);
591
+
592
+ app.controller('LicensesCtrl', [
593
+ '$scope',
594
+ '$http',
595
+ '$resource',
596
+ 'toaster',
597
+ 'Licenses',
598
+ '$store',
599
+ '$L',
600
+ function($scope, $http, $resource, toaster, Licenses, $store, $L) {
601
+ $scope.Licenses = Licenses;
602
+ $scope.$on('pack_changed', function(evt, message) {
603
+ $scope.licenses = Licenses.getLicensesList($scope.currentPack);
604
+ $scope.creationAvailable = $scope.currentPack.status == 'AC';
605
+ if ($scope.showForm) {
606
+ if ($scope.isNew) {
607
+ $scope.license.pack_id = $scope.currentPack.id
608
+ } else {
609
+ $scope.showForm = false;
610
+ }
611
+ }
612
+ })
613
+
614
+ $scope.mandatory = {
615
+ code: true,
616
+ email: true
617
+ }
618
+ $scope.maxlength = {
619
+ code: 50,
620
+ request_data: 500,
621
+ comments: 1024
622
+ }
623
+ $scope.refs = {};
624
+
625
+ // Used to create the form with the
626
+ // appropriate data
627
+ $scope.isNew = undefined;
628
+
629
+ // Selected license from listing
630
+ // license is the edited license, in
631
+ // creation contains the data for
632
+ // the new license
633
+ $scope.license = null;
634
+ if ($scope.currentPack) {
635
+ $scope.licenses = Licenses.getLicensesList($scope.currentPack);
636
+ }
637
+
638
+ $scope.save = function() {
639
+ Licenses.saveLicenseData($scope.license, $scope.isNew, function() {
640
+ if (!$scope.isNew) {
641
+ $scope.showForm = false;
642
+ } else {
643
+ $scope.newLicense();
644
+ }
645
+ $scope.licenses = Licenses.getLicensesList($scope.currentPack);
646
+ });
647
+ }
648
+
649
+ $scope.newLicense = function() {
650
+ if (!$scope.currentPack) {
651
+ BootstrapDialog.show({
652
+ title: $L.get('New license'),
653
+ type: BootstrapDialog.TYPE_WARNING,
654
+ message: $L.get('Please, select a pack before to create a new license'),
655
+ buttons: [{
656
+ label: 'OK',
657
+ action: function(dialog) {
658
+ dialog.close();
659
+ }
660
+ }]
661
+ });
662
+ return;
663
+ }
664
+ if (!$scope.creationAvailable) {
665
+ BootstrapDialog.show({
666
+ title: $L.get('Pack not active'),
667
+ type: BootstrapDialog.TYPE_WARNING,
668
+ message: $L.get('Current pack is not active, so licenses cannot be created'),
669
+ buttons: [{
670
+ label: 'OK',
671
+ action: function(dialog) {
672
+ dialog.close();
673
+ }
674
+ }]
675
+ });
676
+ return;
677
+ }
678
+
679
+ $scope.isNew = true;
680
+ $scope.showForm = true;
681
+ $scope.license = {
682
+ pack_id: $scope.currentPack.id
683
+ }
684
+ setTimeout(function() {
685
+ $('#licenseForm * #code').focus();
686
+ }, 0);
687
+ }
688
+
689
+ $scope.editLicense = function(selectedlicense) {
690
+ $scope.isNew = false;
691
+ $scope.showForm = true;
692
+ $scope.license = selectedlicense;
693
+ $scope.license.status_name = Licenses.getStatusName($scope.license.status);
694
+
695
+ setTimeout(function() {
696
+ $('#licenseForm * #code').focus();
697
+ }, 0);
698
+ }
699
+
700
+ $scope.deletelicense = function(selectedlicense) {
701
+ $scope.showForm = false;
702
+ BootstrapDialog.confirm($L.get("The license '{0}' will be deleted, are you sure?", selectedlicense.code), function(result){
703
+ if(result) {
704
+ var promise = licenseResource.remove({}, {id: selectedlicense.id}).$promise;
705
+ promise.then(function(data) {
706
+ $scope.selectlicense(null);
707
+ $scope.licenses = Licenses.getLicensesList($scope.currentPack);
708
+ toaster.pop('success', Catalogs.getName(), $L.get("License '{0}' deleted successfully", selectedlicense.code));
709
+ },function(error) {
710
+ console.log(error);
711
+ toaster.pop('error', Catalogs.getName(), $L.get("Error deleting license, reason: {0}. Details: {1}", $L.get(HTTP_ERRORS[error.status]), error.headers('X-SECURIS-ERROR-MSG')), 10000);
712
+ });
713
+ }
714
+ });
715
+ $scope.isNew = false;
716
+ }
717
+
718
+ $scope.execute = function(action, license) {
719
+ if (!license) {
720
+ license = $scope.license;
721
+ }
722
+ var _execute = function(extra_data) {
723
+ if (extra_data) {
724
+ Licenses[action](license, extra_data, function() {
725
+ if (!$scope.isNew) $scope.showForm = false;
726
+ $scope.licenses = Licenses.getLicensesList($scope.currentPack);
727
+ });
728
+ } else {
729
+ Licenses[action](license, function() {
730
+ if (!$scope.isNew) $scope.showForm = false;
731
+ $scope.licenses = Licenses.getLicensesList($scope.currentPack);
732
+ });
733
+ }
734
+ }
735
+ if (action === 'delete') {
736
+ BootstrapDialog.confirm($L.get("The license '{0}' will be deleted, are you sure?", license.code), function(result){
737
+ if(result) {
738
+ _execute();
739
+ }
740
+ });
741
+ } else {
742
+ if (action === 'cancel') {
743
+ BootstrapDialog.show({
744
+ title: $L.get("License cancellation"),
745
+ type: BootstrapDialog.TYPE_DANGER,
746
+ message: function(dialog) {
747
+ var $content = $('<div></div>');
748
+ var $message = $('<div></div>');
749
+ var pageToLoad = dialog.getData('pageToLoad');
750
+ $message.append($('<label/>').text($L.get("This action cannot be undone.", $scope.pack.code)));
751
+ $content.append($message);
752
+
753
+ var $message = $('<div style="margin-top:10pt;"/>');
754
+ $message.append($('<label style="margin-right:5pt;"/>').text($L.get("Cancellation reason:") + " "));
755
+ $message.append($('<input type="text" style="width:100%;" maxlength="512" id="_lic_cancellation_reason"/>'));
756
+ $content.append($message);
757
+ return $content;
758
+ },
759
+ closable: true,
760
+ buttons: [{
761
+ id: 'btn-cancel',
762
+ label: $L.get('Close'),
763
+ cssClass: 'btn-default',
764
+ action: function(dialogRef) {
765
+ dialogRef.close();
766
+ }
767
+ }, {
768
+ id: 'btn-ok',
769
+ label: $L.get('Cancel license'),
770
+ cssClass: 'btn-primary',
771
+ action: function(dialogRef){
772
+ var reason = $('#_lic_cancellation_reason').val();
773
+ console.log('Ready to cancel license, by reason: ' + reason);
774
+ if (!reason) {
775
+ $('#_lic_cancellation_reason').focus();
776
+ } else {
777
+ _execute({reason: reason});
778
+ dialogRef.close();
779
+ }
780
+ }
781
+ }]
782
+ });
783
+ } else {
784
+ _execute();
785
+ }
786
+ }
787
+ }
788
+
789
+
790
+ $scope.cancel = function() {
791
+ $scope.showForm = false;
792
+ }
793
+
794
+ $scope.showStatus = function(lic) {
795
+
796
+ }
797
+ $scope.showStatusLong = function(license) {
798
+
799
+ }
800
+
801
+ } ]);
802
+
803
+})();
securis/src/main/webapp/js/login.js
....@@ -0,0 +1,48 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+ var app = angular.module('securis');
5
+
6
+ app.controller('LoginCtrl', ['$scope', '$http', '$location', 'toaster', '$L', '$store',
7
+ function($scope, $http, $location, toaster, $L, $store) {
8
+
9
+
10
+ $('#username').focus();
11
+
12
+ $scope.submit = function() {
13
+ console.log('Sending user: ' + $scope.username + ' pass: ' + $scope.password);
14
+ $http({ method: 'POST',
15
+ url: '/user/login',
16
+ headers: {
17
+ "Content-Type": "application/x-www-form-urlencoded"
18
+ },
19
+ data: $.param({
20
+ username: $scope.username,
21
+ password: $scope.password
22
+ })
23
+ }).
24
+ success(function(data, status, headers, config) {
25
+ toaster.pop('success', $L.get('Login successful'), $L.get('User {0} has logged in application', $scope.username), 1500);
26
+ var location = $store.get('location') || '/licenses';
27
+
28
+ $location.path(location);
29
+ $store.put('username', $scope.username);
30
+ $store.put('token', data.token);
31
+ $http.defaults.headers.common['X-SECURIS-TOKEN'] = data.token;
32
+ }).
33
+ error(function(data, status, headers, config) {
34
+ if (status === 403 /* forbidden */ || status === 401 /* unauthorized */) {
35
+ toaster.pop('error', $L.get('Login error'), $L.get('Invalid credentials'), 2000);
36
+ } else if (status === 418 /* Teapot */) {
37
+ toaster.pop('error', $L.get('Login error'), $L.get(headers['X-SECURIS-ERROR-MSG']), 2000);
38
+ } else {
39
+ console.error(data + " status: "+ status);
40
+ toaster.pop('error', $L.get('Unexpected Login error'), $L.get('Unexpected error HTTP ({0}) accessing to server. Contact with the administrator.', status), 5000);
41
+ }
42
+ $('#username').focus();
43
+ });
44
+ return false;
45
+ }
46
+ }]);
47
+
48
+})();
securis/src/main/webapp/js/main.js
....@@ -0,0 +1,116 @@
1
+(function() {
2
+ 'use strict';
3
+
4
+ var m = angular.module('securis', [ 'ngRoute', 'ngResource', 'toaster', 'localytics.directives', 'catalogs', 'i18n' ]);
5
+
6
+ m.service('$store', function() {
7
+ this.get = function(key, defaultValue) {
8
+ return store.get(key) || defaultValue;
9
+ }
10
+ this.set = this.put = function(key, value) {
11
+ store.set(key, value);
12
+ }
13
+ this.remove = this.delete = function(key) {
14
+ return store.remove(key);
15
+ }
16
+ this.clear = this.clearAll = function() {
17
+ store.clear();
18
+ }
19
+ this.getAll = function() {
20
+ return store.getAll();
21
+ }
22
+ });
23
+
24
+ m.factory('securisHttpInterceptor', function($q, $location, $store, toaster) {
25
+ var isUnauthorizedAccess = function(rejection) {
26
+ return rejection.status === 401 /* Unauthorized */;
27
+ }
28
+ return {
29
+ 'request': function(config) {
30
+ var token = $store.get('token');
31
+ if (token) {
32
+ var la = $store.get('last_access');
33
+ var now = new Date().getTime();
34
+ if (la !== null) {
35
+ if (now > (la + 1800000)) { // Session timeout is 1/2
36
+ // hour
37
+ $store.clear();
38
+ $location.path('/login');
39
+ toaster.pop('warning', 'Session has expired', null, 4000);
40
+ } else {
41
+ console.debug('Last access recent');
42
+ }
43
+ }
44
+ $store.set('last_access', now);
45
+ }
46
+ return config || $q.when(config);
47
+ },
48
+ 'responseError': function(rejection) {
49
+ // do something on error
50
+ if (isUnauthorizedAccess(rejection)) {
51
+ if ($location.path() !== '/login') {
52
+ $store.clear();
53
+ $location.path('/login');
54
+ console.error('There was an unathorized access to url {0}, method: {1}'.$i18n(rejection.config.url, rejection.config.method));
55
+ } else {
56
+ // console.log('Error on login ...')
57
+ }
58
+ }
59
+ return $q.reject(rejection);
60
+ }
61
+ };
62
+ });
63
+
64
+ m.config(function($routeProvider, $locationProvider, $httpProvider) {
65
+ console.debug('Configuring routes...');
66
+ $routeProvider.when('/login', {
67
+ templateUrl: 'login.html',
68
+ controller: 'LoginCtrl'
69
+ });
70
+ $routeProvider.when('/licenses', {
71
+ templateUrl: 'licenses.html',
72
+ controller: 'PackAndLicensesCtrl'
73
+ });
74
+ $routeProvider.when('/admin', {
75
+ templateUrl: 'admin.html',
76
+ controller: 'AdminCtrl'
77
+ });
78
+
79
+ // configure html5 to get links working on jsfiddle
80
+ $locationProvider.html5Mode(true);
81
+ $httpProvider.interceptors.push('securisHttpInterceptor');
82
+ });
83
+
84
+ m.controller('MainCtrl', ['$scope', '$http', '$location', '$L', '$store',
85
+ function($scope, $http, $location, $L, $store) {
86
+
87
+ $scope.currentRoute = null;
88
+ console.log('Current location: ' + $location);
89
+ console.log($location);
90
+ $location.path('/login');
91
+ if ($store.get('token') != null) {
92
+
93
+ $http.get('/check', {
94
+ headers: {
95
+ 'X-SECURIS-TOKEN': $store.get('token')
96
+ }
97
+ }).success(function(data) {
98
+ if (data.valid) {
99
+ $http.defaults.headers.common['X-SECURIS-TOKEN'] = $store.get('token');
100
+ var location = $store.get('location') || '/licenses';
101
+
102
+ $location.path(location);
103
+ $store.set('user', data.user);
104
+ }
105
+ });
106
+ }
107
+
108
+ $scope.logout = function() {
109
+ $store.remove('user');
110
+ $store.remove('token');
111
+ $location.path('/login');
112
+ }
113
+
114
+ }]);
115
+
116
+})();
securis/src/main/webapp/js/vendor/bootstrap-dialog.js
....@@ -0,0 +1,654 @@
1
+/* ================================================
2
+ * Make use of Twitter Bootstrap's modal more monkey-friendly.
3
+ *
4
+ * For Bootstrap 3.
5
+ *
6
+ * javanoob@hotmail.com
7
+ *
8
+ * Licensed under The MIT License.
9
+ * ================================================ */
10
+var BootstrapDialog = null;
11
+!function($) {
12
+ "use strict";
13
+
14
+ BootstrapDialog = function(options) {
15
+ this.defaultOptions = {
16
+ id: BootstrapDialog.newGuid(),
17
+ type: BootstrapDialog.TYPE_PRIMARY,
18
+ size: BootstrapDialog.SIZE_NORMAL,
19
+ cssClass: '',
20
+ title: null,
21
+ message: null,
22
+ buttons: [],
23
+ closable: true,
24
+ spinicon: BootstrapDialog.ICON_SPINNER,
25
+ data: {},
26
+ onshow: null,
27
+ onhide: null,
28
+ autodestroy: true
29
+ };
30
+ this.indexedButtons = {};
31
+ this.realized = false;
32
+ this.opened = false;
33
+ this.initOptions(options);
34
+ this.holdThisInstance();
35
+ };
36
+
37
+ /**
38
+ * Some constants.
39
+ */
40
+ BootstrapDialog.NAMESPACE = 'bootstrap-dialog';
41
+
42
+ BootstrapDialog.TYPE_DEFAULT = 'type-default';
43
+ BootstrapDialog.TYPE_INFO = 'type-info';
44
+ BootstrapDialog.TYPE_PRIMARY = 'type-primary';
45
+ BootstrapDialog.TYPE_SUCCESS = 'type-success';
46
+ BootstrapDialog.TYPE_WARNING = 'type-warning';
47
+ BootstrapDialog.TYPE_DANGER = 'type-danger';
48
+
49
+ BootstrapDialog.DEFAULT_TEXTS = {};
50
+ BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_DEFAULT] = 'Information';
51
+ BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_INFO] = 'Information';
52
+ BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_PRIMARY] = 'Information';
53
+ BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_SUCCESS] = 'Success';
54
+ BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_WARNING] = 'Warning';
55
+ BootstrapDialog.DEFAULT_TEXTS[BootstrapDialog.TYPE_DANGER] = 'Danger';
56
+
57
+ BootstrapDialog.SIZE_NORMAL = 'size-normal';
58
+ BootstrapDialog.SIZE_LARGE = 'size-large';
59
+
60
+ BootstrapDialog.BUTTON_SIZES = {};
61
+ BootstrapDialog.BUTTON_SIZES[BootstrapDialog.SIZE_NORMAL] = '';
62
+ BootstrapDialog.BUTTON_SIZES[BootstrapDialog.SIZE_LARGE] = 'btn-lg';
63
+
64
+ BootstrapDialog.ICON_SPINNER = 'glyphicon glyphicon-asterisk';
65
+
66
+ /**
67
+ * Open / Close all created dialogs all at once.
68
+ */
69
+ BootstrapDialog.dialogs = {};
70
+ BootstrapDialog.openAll = function() {
71
+ $.each(BootstrapDialog.dialogs, function(id, dialogInstance) {
72
+ dialogInstance.open();
73
+ });
74
+ };
75
+ BootstrapDialog.closeAll = function() {
76
+ $.each(BootstrapDialog.dialogs, function(id, dialogInstance) {
77
+ dialogInstance.close();
78
+ });
79
+ };
80
+
81
+ BootstrapDialog.prototype = {
82
+ constructor: BootstrapDialog,
83
+ initOptions: function(options) {
84
+ this.options = $.extend(true, this.defaultOptions, options);
85
+
86
+ return this;
87
+ },
88
+ holdThisInstance: function() {
89
+ BootstrapDialog.dialogs[this.getId()] = this;
90
+
91
+ return this;
92
+ },
93
+ initModalStuff: function() {
94
+ this.setModal(this.createModal())
95
+ .setModalDialog(this.createModalDialog())
96
+ .setModalContent(this.createModalContent())
97
+ .setModalHeader(this.createModalHeader())
98
+ .setModalBody(this.createModalBody())
99
+ .setModalFooter(this.createModalFooter());
100
+
101
+ this.getModal().append(this.getModalDialog());
102
+ this.getModalDialog().append(this.getModalContent());
103
+ this.getModalContent()
104
+ .append(this.getModalHeader())
105
+ .append(this.getModalBody())
106
+ .append(this.getModalFooter());
107
+
108
+ return this;
109
+ },
110
+ createModal: function() {
111
+ return $('<div class="modal fade" tabindex="-1" id="' + this.getId() + '"></div>');
112
+ },
113
+ getModal: function() {
114
+ return this.$modal;
115
+ },
116
+ setModal: function($modal) {
117
+ this.$modal = $modal;
118
+
119
+ return this;
120
+ },
121
+ createModalDialog: function() {
122
+ return $('<div class="modal-dialog"></div>');
123
+ },
124
+ getModalDialog: function() {
125
+ return this.$modalDialog;
126
+ },
127
+ setModalDialog: function($modalDialog) {
128
+ this.$modalDialog = $modalDialog;
129
+
130
+ return this;
131
+ },
132
+ createModalContent: function() {
133
+ return $('<div class="modal-content"></div>');
134
+ },
135
+ getModalContent: function() {
136
+ return this.$modalContent;
137
+ },
138
+ setModalContent: function($modalContent) {
139
+ this.$modalContent = $modalContent;
140
+
141
+ return this;
142
+ },
143
+ createModalHeader: function() {
144
+ return $('<div class="modal-header"></div>');
145
+ },
146
+ getModalHeader: function() {
147
+ return this.$modalHeader;
148
+ },
149
+ setModalHeader: function($modalHeader) {
150
+ this.$modalHeader = $modalHeader;
151
+
152
+ return this;
153
+ },
154
+ createModalBody: function() {
155
+ return $('<div class="modal-body"></div>');
156
+ },
157
+ getModalBody: function() {
158
+ return this.$modalBody;
159
+ },
160
+ setModalBody: function($modalBody) {
161
+ this.$modalBody = $modalBody;
162
+
163
+ return this;
164
+ },
165
+ createModalFooter: function() {
166
+ return $('<div class="modal-footer"></div>');
167
+ },
168
+ getModalFooter: function() {
169
+ return this.$modaFooter;
170
+ },
171
+ setModalFooter: function($modaFooter) {
172
+ this.$modaFooter = $modaFooter;
173
+
174
+ return this;
175
+ },
176
+ createDynamicContent: function(rawContent) {
177
+ var content = null;
178
+ if (typeof rawContent === 'function') {
179
+ content = rawContent.call(rawContent, this);
180
+ } else {
181
+ content = rawContent;
182
+ }
183
+ if (typeof content === 'string') {
184
+ content = this.formatStringContent(content);
185
+ }
186
+
187
+ return content;
188
+ },
189
+ formatStringContent: function(content) {
190
+ return content.replace(/\r\n/g, '<br />').replace(/[\r\n]/g, '<br />');
191
+ },
192
+ setData: function(key, value) {
193
+ this.options.data[key] = value;
194
+
195
+ return this;
196
+ },
197
+ getData: function(key) {
198
+ return this.options.data[key];
199
+ },
200
+ setId: function(id) {
201
+ this.options.id = id;
202
+
203
+ return this;
204
+ },
205
+ getId: function() {
206
+ return this.options.id;
207
+ },
208
+ getType: function() {
209
+ return this.options.type;
210
+ },
211
+ setType: function(type) {
212
+ this.options.type = type;
213
+
214
+ return this;
215
+ },
216
+ getSize: function() {
217
+ return this.options.size;
218
+ },
219
+ setSize: function(size) {
220
+ this.options.size = size;
221
+
222
+ return this;
223
+ },
224
+ getCssClass: function() {
225
+ return this.options.cssClass;
226
+ },
227
+ setCssClass: function(cssClass){
228
+ this.options.cssClass = cssClass;
229
+
230
+ return this;
231
+ },
232
+ getTitle: function() {
233
+ return this.options.title;
234
+ },
235
+ setTitle: function(title) {
236
+ this.options.title = title;
237
+
238
+ return this;
239
+ },
240
+ getMessage: function() {
241
+ return this.options.message;
242
+ },
243
+ setMessage: function(message) {
244
+ this.options.message = message;
245
+
246
+ return this;
247
+ },
248
+ isClosable: function() {
249
+ return this.options.closable;
250
+ },
251
+ setClosable: function(closable) {
252
+ this.options.closable = closable;
253
+ this.updateClosable();
254
+
255
+ return this;
256
+ },
257
+ getSpinicon: function() {
258
+ return this.options.spinicon;
259
+ },
260
+ setSpinicon: function(spinicon) {
261
+ this.options.spinicon = spinicon;
262
+
263
+ return this;
264
+ },
265
+ addButton: function(button) {
266
+ this.options.buttons.push(button);
267
+
268
+ return this;
269
+ },
270
+ addButtons: function(buttons) {
271
+ var that = this;
272
+
273
+ $.each(buttons, function(index, button) {
274
+ that.addButton(button);
275
+ });
276
+
277
+ return this;
278
+ },
279
+ getButtons: function() {
280
+ return this.options.buttons;
281
+ },
282
+ setButtons: function(buttons) {
283
+ this.options.buttons = buttons;
284
+
285
+ return this;
286
+ },
287
+ /**
288
+ * If there is id provided for a button option, it will be in dialog.indexedButtons list.
289
+ *
290
+ * In that case you can use dialog.getButton(id) to find the button.
291
+ *
292
+ * @param {type} id
293
+ * @returns {undefined}
294
+ */
295
+ getButton: function(id) {
296
+ if (typeof this.indexedButtons[id] !== 'undefined') {
297
+ return this.indexedButtons[id];
298
+ }
299
+
300
+ return null;
301
+ },
302
+ getButtonSize: function() {
303
+ if (typeof BootstrapDialog.BUTTON_SIZES[this.getSize()] !== 'undefined') {
304
+ return BootstrapDialog.BUTTON_SIZES[this.getSize()];
305
+ }
306
+
307
+ return '';
308
+ },
309
+ isAutodestroy: function() {
310
+ return this.options.autodestroy;
311
+ },
312
+ setAutodestroy: function(autodestroy) {
313
+ this.options.autodestroy = autodestroy;
314
+ },
315
+ getDefaultText: function() {
316
+ return BootstrapDialog.DEFAULT_TEXTS[this.getType()];
317
+ },
318
+ getNamespace: function(name) {
319
+ return BootstrapDialog.NAMESPACE + '-' + name;
320
+ },
321
+ createHeaderContent: function() {
322
+ var $container = $('<div></div>');
323
+ $container.addClass(this.getNamespace('header'));
324
+
325
+ // title
326
+ $container.append(this.createTitleContent());
327
+
328
+ // Close button
329
+ $container.append(this.createCloseButton());
330
+
331
+ return $container;
332
+ },
333
+ createTitleContent: function() {
334
+ var $title = $('<div></div>');
335
+ $title.addClass(this.getNamespace('title'));
336
+ $title.append(this.getTitle() !== null ? this.createDynamicContent(this.getTitle()) : this.getDefaultText());
337
+
338
+ return $title;
339
+ },
340
+ createCloseButton: function() {
341
+ var $container = $('<div></div>');
342
+ $container.addClass(this.getNamespace('close-button'));
343
+ var $icon = $('<button class="close">×</button>');
344
+ $container.append($icon);
345
+ $container.on('click', {dialog: this}, function(event) {
346
+ event.data.dialog.close();
347
+ });
348
+
349
+ return $container;
350
+ },
351
+ createBodyContent: function() {
352
+ var $container = $('<div></div>');
353
+ $container.addClass(this.getNamespace('body'));
354
+
355
+ // Message
356
+ $container.append(this.createMessageContent());
357
+
358
+ return $container;
359
+ },
360
+ createMessageContent: function() {
361
+ var $message = $('<div></div>');
362
+ $message.addClass(this.getNamespace('message'));
363
+ $message.append(this.createDynamicContent(this.getMessage()));
364
+
365
+ return $message;
366
+ },
367
+ createFooterContent: function() {
368
+ var $container = $('<div></div>');
369
+ $container.addClass(this.getNamespace('footer'));
370
+
371
+ // Buttons
372
+ $container.append(this.createFooterButtons());
373
+
374
+ return $container;
375
+ },
376
+ createFooterButtons: function() {
377
+ var that = this;
378
+ var $container = $('<div></div>');
379
+ $container.addClass(this.getNamespace('footer-buttons'));
380
+ this.indexedButtons = {};
381
+ $.each(this.options.buttons, function(index, button) {
382
+ var $button = that.createButton(button);
383
+ if (typeof button.id !== 'undefined') {
384
+ that.indexedButtons[button.id] = $button;
385
+ }
386
+ $container.append($button);
387
+ });
388
+
389
+ return $container;
390
+ },
391
+ createButton: function(button) {
392
+ var $button = $('<button class="btn"></button>');
393
+ $button.addClass(this.getButtonSize());
394
+
395
+ // Icon
396
+ if (typeof button.icon !== undefined && $.trim(button.icon) !== '') {
397
+ $button.append(this.createButtonIcon(button.icon));
398
+ }
399
+
400
+ // Label
401
+ if (typeof button.label !== undefined) {
402
+ $button.append(button.label);
403
+ }
404
+
405
+ // Css class
406
+ if (typeof button.cssClass !== undefined && $.trim(button.cssClass) !== '') {
407
+ $button.addClass(button.cssClass);
408
+ } else {
409
+ $button.addClass('btn-default');
410
+ }
411
+
412
+ // Button on click
413
+ $button.on('click', {dialog: this, button: button}, function(event) {
414
+ var dialog = event.data.dialog;
415
+ var button = event.data.button;
416
+ if (typeof button.action === 'function') {
417
+ button.action.call(this, dialog);
418
+ }
419
+
420
+ if (button.autospin) {
421
+ var $button = $(this);
422
+ $button.find('.' + dialog.getNamespace('button-icon')).remove();
423
+ $button.prepend(dialog.createButtonIcon(dialog.getSpinicon()).addClass('icon-spin'));
424
+ }
425
+ });
426
+
427
+ return $button;
428
+ },
429
+ createButtonIcon: function(icon) {
430
+ var $icon = $('<span></span>');
431
+ $icon.addClass(this.getNamespace('button-icon')).addClass(icon);
432
+
433
+ return $icon;
434
+ },
435
+ /**
436
+ * Invoke this only after the dialog is realized.
437
+ *
438
+ * @param {type} enable
439
+ * @returns {undefined}
440
+ */
441
+ enableButtons: function(enable) {
442
+ var $buttons = this.getModalFooter().find('.btn');
443
+ $buttons.prop("disabled", !enable).toggleClass('disabled', !enable);
444
+
445
+ return this;
446
+ },
447
+ /**
448
+ * Invoke this only after the dialog is realized.
449
+ *
450
+ * @param {type} enable
451
+ * @returns {undefined}
452
+ */
453
+ updateClosable: function() {
454
+ if (this.isRealized()) {
455
+ // Backdrop, I did't find a way to change bs3 backdrop option after the dialog is popped up, so here's a new wheel.
456
+ var $theBigMask = this.getModal();
457
+ $theBigMask.off('click').on('click', {dialog: this}, function(event) {
458
+ event.target === this && event.data.dialog.isClosable() && event.data.dialog.close();
459
+ });
460
+
461
+ // Close button
462
+ this.getModalHeader().find('.' + this.getNamespace('close-button')).toggle(this.isClosable());
463
+
464
+ // ESC key support
465
+ $theBigMask.off('keyup').on('keyup', {dialog: this}, function(event) {
466
+ event.which === 27 && event.data.dialog.isClosable() && event.data.dialog.close();
467
+ });
468
+ }
469
+
470
+ return this;
471
+ },
472
+ /**
473
+ * Set handler for modal event 'show'.
474
+ * This is a setter!
475
+ *
476
+ * @param {type} onopen
477
+ * @returns {_L9.BootstrapDialog.prototype}
478
+ */
479
+ onShow: function(onshow) {
480
+ this.options.onshow = onshow;
481
+
482
+ return this;
483
+ },
484
+ /**
485
+ * Set handler for modal event 'hide'.
486
+ * This is a setter!
487
+ *
488
+ * @param {type} onclose
489
+ * @returns {_L9.BootstrapDialog.prototype}
490
+ */
491
+ onHide: function(onhide) {
492
+ this.options.onhide = onhide;
493
+
494
+ return this;
495
+ },
496
+ isRealized: function() {
497
+ return this.realized;
498
+ },
499
+ setRealized: function(realized) {
500
+ this.realized = realized;
501
+
502
+ return this;
503
+ },
504
+ isOpened: function() {
505
+ return this.opened;
506
+ },
507
+ setOpened: function(opened) {
508
+ this.opened = opened;
509
+
510
+ return this;
511
+ },
512
+ handleModalEvents: function() {
513
+ this.getModal().on('show.bs.modal', {dialog: this}, function(event) {
514
+ var dialog = event.data.dialog;
515
+ typeof dialog.options.onshow === 'function' && dialog.options.onshow(dialog);
516
+ dialog.showPageScrollBar(true);
517
+ });
518
+ this.getModal().on('hide.bs.modal', {dialog: this}, function(event) {
519
+ var dialog = event.data.dialog;
520
+ typeof dialog.options.onhide === 'function' && dialog.options.onhide(dialog);
521
+ });
522
+ this.getModal().on('hidden.bs.modal', {dialog: this}, function(event) {
523
+ var dialog = event.data.dialog;
524
+ dialog.isAutodestroy() && $(this).remove();
525
+ dialog.showPageScrollBar(false);
526
+ });
527
+
528
+ return this;
529
+ },
530
+ showPageScrollBar: function(show) {
531
+ $(document.body).toggleClass('modal-open', show);
532
+ },
533
+ realize: function() {
534
+ this.initModalStuff();
535
+ this.getModal().addClass(BootstrapDialog.NAMESPACE)
536
+ .addClass(this.getType())
537
+ .addClass(this.getSize())
538
+ .addClass(this.getCssClass());
539
+ this.getModalHeader().append(this.createHeaderContent());
540
+ this.getModalBody().append(this.createBodyContent());
541
+ this.getModalFooter().append(this.createFooterContent());
542
+ this.getModal().modal({
543
+ backdrop: 'static',
544
+ keyboard: false,
545
+ show: false
546
+ });
547
+ this.handleModalEvents();
548
+ this.setRealized(true);
549
+
550
+ return this;
551
+ },
552
+ open: function() {
553
+ !this.isRealized() && this.realize();
554
+ this.updateClosable();
555
+ this.getModal().modal('show');
556
+ this.setOpened(true);
557
+
558
+ return this;
559
+ },
560
+ close: function() {
561
+ this.getModal().modal('hide');
562
+ if (this.isAutodestroy()) {
563
+ delete BootstrapDialog.dialogs[this.getId()];
564
+ }
565
+ this.setOpened(false);
566
+
567
+ return this;
568
+ }
569
+ };
570
+
571
+ /**
572
+ * RFC4122 version 4 compliant unique id creator.
573
+ *
574
+ * Added by https://github.com/tufanbarisyildirim/
575
+ *
576
+ * @returns {String}
577
+ */
578
+ BootstrapDialog.newGuid = function() {
579
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
580
+ var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
581
+ return v.toString(16);
582
+ });
583
+ };
584
+
585
+ /* ================================================
586
+ * For lazy people
587
+ * ================================================ */
588
+
589
+ /**
590
+ * Shortcut function: show
591
+ *
592
+ * @param {type} options
593
+ * @returns {undefined}
594
+ */
595
+ BootstrapDialog.show = function(options) {
596
+ new BootstrapDialog(options).open();
597
+ };
598
+
599
+ /**
600
+ * Alert window
601
+ *
602
+ * @param {type} message
603
+ * @param {type} callback
604
+ * @returns {undefined}
605
+ */
606
+ BootstrapDialog.alert = function(message, callback) {
607
+ new BootstrapDialog({
608
+ message: message,
609
+ data: {
610
+ 'callback': callback
611
+ },
612
+ closable: false,
613
+ buttons: [{
614
+ label: 'OK',
615
+ action: function(dialog) {
616
+ typeof dialog.getData('callback') === 'function' && dialog.getData('callback')(true);
617
+ dialog.close();
618
+ }
619
+ }]
620
+ }).open();
621
+ };
622
+
623
+ /**
624
+ * Confirm window
625
+ *
626
+ * @param {type} message
627
+ * @param {type} callback
628
+ * @returns {undefined}
629
+ */
630
+ BootstrapDialog.confirm = function(message, callback) {
631
+ new BootstrapDialog({
632
+ title: 'Confirmation',
633
+ message: message,
634
+ closable: false,
635
+ data: {
636
+ 'callback': callback
637
+ },
638
+ buttons: [{
639
+ label: 'Cancel',
640
+ action: function(dialog) {
641
+ typeof dialog.getData('callback') === 'function' && dialog.getData('callback')(false);
642
+ dialog.close();
643
+ }
644
+ }, {
645
+ label: 'OK',
646
+ cssClass: 'btn-primary',
647
+ action: function(dialog) {
648
+ typeof dialog.getData('callback') === 'function' && dialog.getData('callback')(true);
649
+ dialog.close();
650
+ }
651
+ }]
652
+ }).open();
653
+ };
654
+}(window.jQuery);
securis/src/main/webapp/js/vendor/bootstrap.js
....@@ -0,0 +1,2114 @@
1
+/*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
8
+
9
+/* ========================================================================
10
+ * Bootstrap: transition.js v3.2.0
11
+ * http://getbootstrap.com/javascript/#transitions
12
+ * ========================================================================
13
+ * Copyright 2011-2014 Twitter, Inc.
14
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15
+ * ======================================================================== */
16
+
17
+
18
++function ($) {
19
+ 'use strict';
20
+
21
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
22
+ // ============================================================
23
+
24
+ function transitionEnd() {
25
+ var el = document.createElement('bootstrap')
26
+
27
+ var transEndEventNames = {
28
+ WebkitTransition : 'webkitTransitionEnd',
29
+ MozTransition : 'transitionend',
30
+ OTransition : 'oTransitionEnd otransitionend',
31
+ transition : 'transitionend'
32
+ }
33
+
34
+ for (var name in transEndEventNames) {
35
+ if (el.style[name] !== undefined) {
36
+ return { end: transEndEventNames[name] }
37
+ }
38
+ }
39
+
40
+ return false // explicit for ie8 ( ._.)
41
+ }
42
+
43
+ // http://blog.alexmaccaw.com/css-transitions
44
+ $.fn.emulateTransitionEnd = function (duration) {
45
+ var called = false
46
+ var $el = this
47
+ $(this).one('bsTransitionEnd', function () { called = true })
48
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
49
+ setTimeout(callback, duration)
50
+ return this
51
+ }
52
+
53
+ $(function () {
54
+ $.support.transition = transitionEnd()
55
+
56
+ if (!$.support.transition) return
57
+
58
+ $.event.special.bsTransitionEnd = {
59
+ bindType: $.support.transition.end,
60
+ delegateType: $.support.transition.end,
61
+ handle: function (e) {
62
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
63
+ }
64
+ }
65
+ })
66
+
67
+}(jQuery);
68
+
69
+/* ========================================================================
70
+ * Bootstrap: alert.js v3.2.0
71
+ * http://getbootstrap.com/javascript/#alerts
72
+ * ========================================================================
73
+ * Copyright 2011-2014 Twitter, Inc.
74
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
75
+ * ======================================================================== */
76
+
77
+
78
++function ($) {
79
+ 'use strict';
80
+
81
+ // ALERT CLASS DEFINITION
82
+ // ======================
83
+
84
+ var dismiss = '[data-dismiss="alert"]'
85
+ var Alert = function (el) {
86
+ $(el).on('click', dismiss, this.close)
87
+ }
88
+
89
+ Alert.VERSION = '3.2.0'
90
+
91
+ Alert.prototype.close = function (e) {
92
+ var $this = $(this)
93
+ var selector = $this.attr('data-target')
94
+
95
+ if (!selector) {
96
+ selector = $this.attr('href')
97
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
98
+ }
99
+
100
+ var $parent = $(selector)
101
+
102
+ if (e) e.preventDefault()
103
+
104
+ if (!$parent.length) {
105
+ $parent = $this.hasClass('alert') ? $this : $this.parent()
106
+ }
107
+
108
+ $parent.trigger(e = $.Event('close.bs.alert'))
109
+
110
+ if (e.isDefaultPrevented()) return
111
+
112
+ $parent.removeClass('in')
113
+
114
+ function removeElement() {
115
+ // detach from parent, fire event then clean up data
116
+ $parent.detach().trigger('closed.bs.alert').remove()
117
+ }
118
+
119
+ $.support.transition && $parent.hasClass('fade') ?
120
+ $parent
121
+ .one('bsTransitionEnd', removeElement)
122
+ .emulateTransitionEnd(150) :
123
+ removeElement()
124
+ }
125
+
126
+
127
+ // ALERT PLUGIN DEFINITION
128
+ // =======================
129
+
130
+ function Plugin(option) {
131
+ return this.each(function () {
132
+ var $this = $(this)
133
+ var data = $this.data('bs.alert')
134
+
135
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
136
+ if (typeof option == 'string') data[option].call($this)
137
+ })
138
+ }
139
+
140
+ var old = $.fn.alert
141
+
142
+ $.fn.alert = Plugin
143
+ $.fn.alert.Constructor = Alert
144
+
145
+
146
+ // ALERT NO CONFLICT
147
+ // =================
148
+
149
+ $.fn.alert.noConflict = function () {
150
+ $.fn.alert = old
151
+ return this
152
+ }
153
+
154
+
155
+ // ALERT DATA-API
156
+ // ==============
157
+
158
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
159
+
160
+}(jQuery);
161
+
162
+/* ========================================================================
163
+ * Bootstrap: button.js v3.2.0
164
+ * http://getbootstrap.com/javascript/#buttons
165
+ * ========================================================================
166
+ * Copyright 2011-2014 Twitter, Inc.
167
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
168
+ * ======================================================================== */
169
+
170
+
171
++function ($) {
172
+ 'use strict';
173
+
174
+ // BUTTON PUBLIC CLASS DEFINITION
175
+ // ==============================
176
+
177
+ var Button = function (element, options) {
178
+ this.$element = $(element)
179
+ this.options = $.extend({}, Button.DEFAULTS, options)
180
+ this.isLoading = false
181
+ }
182
+
183
+ Button.VERSION = '3.2.0'
184
+
185
+ Button.DEFAULTS = {
186
+ loadingText: 'loading...'
187
+ }
188
+
189
+ Button.prototype.setState = function (state) {
190
+ var d = 'disabled'
191
+ var $el = this.$element
192
+ var val = $el.is('input') ? 'val' : 'html'
193
+ var data = $el.data()
194
+
195
+ state = state + 'Text'
196
+
197
+ if (data.resetText == null) $el.data('resetText', $el[val]())
198
+
199
+ $el[val](data[state] == null ? this.options[state] : data[state])
200
+
201
+ // push to event loop to allow forms to submit
202
+ setTimeout($.proxy(function () {
203
+ if (state == 'loadingText') {
204
+ this.isLoading = true
205
+ $el.addClass(d).attr(d, d)
206
+ } else if (this.isLoading) {
207
+ this.isLoading = false
208
+ $el.removeClass(d).removeAttr(d)
209
+ }
210
+ }, this), 0)
211
+ }
212
+
213
+ Button.prototype.toggle = function () {
214
+ var changed = true
215
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
216
+
217
+ if ($parent.length) {
218
+ var $input = this.$element.find('input')
219
+ if ($input.prop('type') == 'radio') {
220
+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
221
+ else $parent.find('.active').removeClass('active')
222
+ }
223
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
224
+ }
225
+
226
+ if (changed) this.$element.toggleClass('active')
227
+ }
228
+
229
+
230
+ // BUTTON PLUGIN DEFINITION
231
+ // ========================
232
+
233
+ function Plugin(option) {
234
+ return this.each(function () {
235
+ var $this = $(this)
236
+ var data = $this.data('bs.button')
237
+ var options = typeof option == 'object' && option
238
+
239
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
240
+
241
+ if (option == 'toggle') data.toggle()
242
+ else if (option) data.setState(option)
243
+ })
244
+ }
245
+
246
+ var old = $.fn.button
247
+
248
+ $.fn.button = Plugin
249
+ $.fn.button.Constructor = Button
250
+
251
+
252
+ // BUTTON NO CONFLICT
253
+ // ==================
254
+
255
+ $.fn.button.noConflict = function () {
256
+ $.fn.button = old
257
+ return this
258
+ }
259
+
260
+
261
+ // BUTTON DATA-API
262
+ // ===============
263
+
264
+ $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
265
+ var $btn = $(e.target)
266
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
267
+ Plugin.call($btn, 'toggle')
268
+ e.preventDefault()
269
+ })
270
+
271
+}(jQuery);
272
+
273
+/* ========================================================================
274
+ * Bootstrap: carousel.js v3.2.0
275
+ * http://getbootstrap.com/javascript/#carousel
276
+ * ========================================================================
277
+ * Copyright 2011-2014 Twitter, Inc.
278
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
279
+ * ======================================================================== */
280
+
281
+
282
++function ($) {
283
+ 'use strict';
284
+
285
+ // CAROUSEL CLASS DEFINITION
286
+ // =========================
287
+
288
+ var Carousel = function (element, options) {
289
+ this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
290
+ this.$indicators = this.$element.find('.carousel-indicators')
291
+ this.options = options
292
+ this.paused =
293
+ this.sliding =
294
+ this.interval =
295
+ this.$active =
296
+ this.$items = null
297
+
298
+ this.options.pause == 'hover' && this.$element
299
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
300
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
301
+ }
302
+
303
+ Carousel.VERSION = '3.2.0'
304
+
305
+ Carousel.DEFAULTS = {
306
+ interval: 5000,
307
+ pause: 'hover',
308
+ wrap: true
309
+ }
310
+
311
+ Carousel.prototype.keydown = function (e) {
312
+ switch (e.which) {
313
+ case 37: this.prev(); break
314
+ case 39: this.next(); break
315
+ default: return
316
+ }
317
+
318
+ e.preventDefault()
319
+ }
320
+
321
+ Carousel.prototype.cycle = function (e) {
322
+ e || (this.paused = false)
323
+
324
+ this.interval && clearInterval(this.interval)
325
+
326
+ this.options.interval
327
+ && !this.paused
328
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
329
+
330
+ return this
331
+ }
332
+
333
+ Carousel.prototype.getItemIndex = function (item) {
334
+ this.$items = item.parent().children('.item')
335
+ return this.$items.index(item || this.$active)
336
+ }
337
+
338
+ Carousel.prototype.to = function (pos) {
339
+ var that = this
340
+ var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
341
+
342
+ if (pos > (this.$items.length - 1) || pos < 0) return
343
+
344
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
345
+ if (activeIndex == pos) return this.pause().cycle()
346
+
347
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
348
+ }
349
+
350
+ Carousel.prototype.pause = function (e) {
351
+ e || (this.paused = true)
352
+
353
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
354
+ this.$element.trigger($.support.transition.end)
355
+ this.cycle(true)
356
+ }
357
+
358
+ this.interval = clearInterval(this.interval)
359
+
360
+ return this
361
+ }
362
+
363
+ Carousel.prototype.next = function () {
364
+ if (this.sliding) return
365
+ return this.slide('next')
366
+ }
367
+
368
+ Carousel.prototype.prev = function () {
369
+ if (this.sliding) return
370
+ return this.slide('prev')
371
+ }
372
+
373
+ Carousel.prototype.slide = function (type, next) {
374
+ var $active = this.$element.find('.item.active')
375
+ var $next = next || $active[type]()
376
+ var isCycling = this.interval
377
+ var direction = type == 'next' ? 'left' : 'right'
378
+ var fallback = type == 'next' ? 'first' : 'last'
379
+ var that = this
380
+
381
+ if (!$next.length) {
382
+ if (!this.options.wrap) return
383
+ $next = this.$element.find('.item')[fallback]()
384
+ }
385
+
386
+ if ($next.hasClass('active')) return (this.sliding = false)
387
+
388
+ var relatedTarget = $next[0]
389
+ var slideEvent = $.Event('slide.bs.carousel', {
390
+ relatedTarget: relatedTarget,
391
+ direction: direction
392
+ })
393
+ this.$element.trigger(slideEvent)
394
+ if (slideEvent.isDefaultPrevented()) return
395
+
396
+ this.sliding = true
397
+
398
+ isCycling && this.pause()
399
+
400
+ if (this.$indicators.length) {
401
+ this.$indicators.find('.active').removeClass('active')
402
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
403
+ $nextIndicator && $nextIndicator.addClass('active')
404
+ }
405
+
406
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
407
+ if ($.support.transition && this.$element.hasClass('slide')) {
408
+ $next.addClass(type)
409
+ $next[0].offsetWidth // force reflow
410
+ $active.addClass(direction)
411
+ $next.addClass(direction)
412
+ $active
413
+ .one('bsTransitionEnd', function () {
414
+ $next.removeClass([type, direction].join(' ')).addClass('active')
415
+ $active.removeClass(['active', direction].join(' '))
416
+ that.sliding = false
417
+ setTimeout(function () {
418
+ that.$element.trigger(slidEvent)
419
+ }, 0)
420
+ })
421
+ .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
422
+ } else {
423
+ $active.removeClass('active')
424
+ $next.addClass('active')
425
+ this.sliding = false
426
+ this.$element.trigger(slidEvent)
427
+ }
428
+
429
+ isCycling && this.cycle()
430
+
431
+ return this
432
+ }
433
+
434
+
435
+ // CAROUSEL PLUGIN DEFINITION
436
+ // ==========================
437
+
438
+ function Plugin(option) {
439
+ return this.each(function () {
440
+ var $this = $(this)
441
+ var data = $this.data('bs.carousel')
442
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
443
+ var action = typeof option == 'string' ? option : options.slide
444
+
445
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
446
+ if (typeof option == 'number') data.to(option)
447
+ else if (action) data[action]()
448
+ else if (options.interval) data.pause().cycle()
449
+ })
450
+ }
451
+
452
+ var old = $.fn.carousel
453
+
454
+ $.fn.carousel = Plugin
455
+ $.fn.carousel.Constructor = Carousel
456
+
457
+
458
+ // CAROUSEL NO CONFLICT
459
+ // ====================
460
+
461
+ $.fn.carousel.noConflict = function () {
462
+ $.fn.carousel = old
463
+ return this
464
+ }
465
+
466
+
467
+ // CAROUSEL DATA-API
468
+ // =================
469
+
470
+ $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
471
+ var href
472
+ var $this = $(this)
473
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
474
+ if (!$target.hasClass('carousel')) return
475
+ var options = $.extend({}, $target.data(), $this.data())
476
+ var slideIndex = $this.attr('data-slide-to')
477
+ if (slideIndex) options.interval = false
478
+
479
+ Plugin.call($target, options)
480
+
481
+ if (slideIndex) {
482
+ $target.data('bs.carousel').to(slideIndex)
483
+ }
484
+
485
+ e.preventDefault()
486
+ })
487
+
488
+ $(window).on('load', function () {
489
+ $('[data-ride="carousel"]').each(function () {
490
+ var $carousel = $(this)
491
+ Plugin.call($carousel, $carousel.data())
492
+ })
493
+ })
494
+
495
+}(jQuery);
496
+
497
+/* ========================================================================
498
+ * Bootstrap: collapse.js v3.2.0
499
+ * http://getbootstrap.com/javascript/#collapse
500
+ * ========================================================================
501
+ * Copyright 2011-2014 Twitter, Inc.
502
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
503
+ * ======================================================================== */
504
+
505
+
506
++function ($) {
507
+ 'use strict';
508
+
509
+ // COLLAPSE PUBLIC CLASS DEFINITION
510
+ // ================================
511
+
512
+ var Collapse = function (element, options) {
513
+ this.$element = $(element)
514
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
515
+ this.transitioning = null
516
+
517
+ if (this.options.parent) this.$parent = $(this.options.parent)
518
+ if (this.options.toggle) this.toggle()
519
+ }
520
+
521
+ Collapse.VERSION = '3.2.0'
522
+
523
+ Collapse.DEFAULTS = {
524
+ toggle: true
525
+ }
526
+
527
+ Collapse.prototype.dimension = function () {
528
+ var hasWidth = this.$element.hasClass('width')
529
+ return hasWidth ? 'width' : 'height'
530
+ }
531
+
532
+ Collapse.prototype.show = function () {
533
+ if (this.transitioning || this.$element.hasClass('in')) return
534
+
535
+ var startEvent = $.Event('show.bs.collapse')
536
+ this.$element.trigger(startEvent)
537
+ if (startEvent.isDefaultPrevented()) return
538
+
539
+ var actives = this.$parent && this.$parent.find('> .panel > .in')
540
+
541
+ if (actives && actives.length) {
542
+ var hasData = actives.data('bs.collapse')
543
+ if (hasData && hasData.transitioning) return
544
+ Plugin.call(actives, 'hide')
545
+ hasData || actives.data('bs.collapse', null)
546
+ }
547
+
548
+ var dimension = this.dimension()
549
+
550
+ this.$element
551
+ .removeClass('collapse')
552
+ .addClass('collapsing')[dimension](0)
553
+
554
+ this.transitioning = 1
555
+
556
+ var complete = function () {
557
+ this.$element
558
+ .removeClass('collapsing')
559
+ .addClass('collapse in')[dimension]('')
560
+ this.transitioning = 0
561
+ this.$element
562
+ .trigger('shown.bs.collapse')
563
+ }
564
+
565
+ if (!$.support.transition) return complete.call(this)
566
+
567
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
568
+
569
+ this.$element
570
+ .one('bsTransitionEnd', $.proxy(complete, this))
571
+ .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
572
+ }
573
+
574
+ Collapse.prototype.hide = function () {
575
+ if (this.transitioning || !this.$element.hasClass('in')) return
576
+
577
+ var startEvent = $.Event('hide.bs.collapse')
578
+ this.$element.trigger(startEvent)
579
+ if (startEvent.isDefaultPrevented()) return
580
+
581
+ var dimension = this.dimension()
582
+
583
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
584
+
585
+ this.$element
586
+ .addClass('collapsing')
587
+ .removeClass('collapse')
588
+ .removeClass('in')
589
+
590
+ this.transitioning = 1
591
+
592
+ var complete = function () {
593
+ this.transitioning = 0
594
+ this.$element
595
+ .trigger('hidden.bs.collapse')
596
+ .removeClass('collapsing')
597
+ .addClass('collapse')
598
+ }
599
+
600
+ if (!$.support.transition) return complete.call(this)
601
+
602
+ this.$element
603
+ [dimension](0)
604
+ .one('bsTransitionEnd', $.proxy(complete, this))
605
+ .emulateTransitionEnd(350)
606
+ }
607
+
608
+ Collapse.prototype.toggle = function () {
609
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
610
+ }
611
+
612
+
613
+ // COLLAPSE PLUGIN DEFINITION
614
+ // ==========================
615
+
616
+ function Plugin(option) {
617
+ return this.each(function () {
618
+ var $this = $(this)
619
+ var data = $this.data('bs.collapse')
620
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
621
+
622
+ if (!data && options.toggle && option == 'show') option = !option
623
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
624
+ if (typeof option == 'string') data[option]()
625
+ })
626
+ }
627
+
628
+ var old = $.fn.collapse
629
+
630
+ $.fn.collapse = Plugin
631
+ $.fn.collapse.Constructor = Collapse
632
+
633
+
634
+ // COLLAPSE NO CONFLICT
635
+ // ====================
636
+
637
+ $.fn.collapse.noConflict = function () {
638
+ $.fn.collapse = old
639
+ return this
640
+ }
641
+
642
+
643
+ // COLLAPSE DATA-API
644
+ // =================
645
+
646
+ $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
647
+ var href
648
+ var $this = $(this)
649
+ var target = $this.attr('data-target')
650
+ || e.preventDefault()
651
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
652
+ var $target = $(target)
653
+ var data = $target.data('bs.collapse')
654
+ var option = data ? 'toggle' : $this.data()
655
+ var parent = $this.attr('data-parent')
656
+ var $parent = parent && $(parent)
657
+
658
+ if (!data || !data.transitioning) {
659
+ if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
660
+ $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
661
+ }
662
+
663
+ Plugin.call($target, option)
664
+ })
665
+
666
+}(jQuery);
667
+
668
+/* ========================================================================
669
+ * Bootstrap: dropdown.js v3.2.0
670
+ * http://getbootstrap.com/javascript/#dropdowns
671
+ * ========================================================================
672
+ * Copyright 2011-2014 Twitter, Inc.
673
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
674
+ * ======================================================================== */
675
+
676
+
677
++function ($) {
678
+ 'use strict';
679
+
680
+ // DROPDOWN CLASS DEFINITION
681
+ // =========================
682
+
683
+ var backdrop = '.dropdown-backdrop'
684
+ var toggle = '[data-toggle="dropdown"]'
685
+ var Dropdown = function (element) {
686
+ $(element).on('click.bs.dropdown', this.toggle)
687
+ }
688
+
689
+ Dropdown.VERSION = '3.2.0'
690
+
691
+ Dropdown.prototype.toggle = function (e) {
692
+ var $this = $(this)
693
+
694
+ if ($this.is('.disabled, :disabled')) return
695
+
696
+ var $parent = getParent($this)
697
+ var isActive = $parent.hasClass('open')
698
+
699
+ clearMenus()
700
+
701
+ if (!isActive) {
702
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
703
+ // if mobile we use a backdrop because click events don't delegate
704
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
705
+ }
706
+
707
+ var relatedTarget = { relatedTarget: this }
708
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
709
+
710
+ if (e.isDefaultPrevented()) return
711
+
712
+ $this.trigger('focus')
713
+
714
+ $parent
715
+ .toggleClass('open')
716
+ .trigger('shown.bs.dropdown', relatedTarget)
717
+ }
718
+
719
+ return false
720
+ }
721
+
722
+ Dropdown.prototype.keydown = function (e) {
723
+ if (!/(38|40|27)/.test(e.keyCode)) return
724
+
725
+ var $this = $(this)
726
+
727
+ e.preventDefault()
728
+ e.stopPropagation()
729
+
730
+ if ($this.is('.disabled, :disabled')) return
731
+
732
+ var $parent = getParent($this)
733
+ var isActive = $parent.hasClass('open')
734
+
735
+ if (!isActive || (isActive && e.keyCode == 27)) {
736
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
737
+ return $this.trigger('click')
738
+ }
739
+
740
+ var desc = ' li:not(.divider):visible a'
741
+ var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
742
+
743
+ if (!$items.length) return
744
+
745
+ var index = $items.index($items.filter(':focus'))
746
+
747
+ if (e.keyCode == 38 && index > 0) index-- // up
748
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
749
+ if (!~index) index = 0
750
+
751
+ $items.eq(index).trigger('focus')
752
+ }
753
+
754
+ function clearMenus(e) {
755
+ if (e && e.which === 3) return
756
+ $(backdrop).remove()
757
+ $(toggle).each(function () {
758
+ var $parent = getParent($(this))
759
+ var relatedTarget = { relatedTarget: this }
760
+ if (!$parent.hasClass('open')) return
761
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
762
+ if (e.isDefaultPrevented()) return
763
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
764
+ })
765
+ }
766
+
767
+ function getParent($this) {
768
+ var selector = $this.attr('data-target')
769
+
770
+ if (!selector) {
771
+ selector = $this.attr('href')
772
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
773
+ }
774
+
775
+ var $parent = selector && $(selector)
776
+
777
+ return $parent && $parent.length ? $parent : $this.parent()
778
+ }
779
+
780
+
781
+ // DROPDOWN PLUGIN DEFINITION
782
+ // ==========================
783
+
784
+ function Plugin(option) {
785
+ return this.each(function () {
786
+ var $this = $(this)
787
+ var data = $this.data('bs.dropdown')
788
+
789
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
790
+ if (typeof option == 'string') data[option].call($this)
791
+ })
792
+ }
793
+
794
+ var old = $.fn.dropdown
795
+
796
+ $.fn.dropdown = Plugin
797
+ $.fn.dropdown.Constructor = Dropdown
798
+
799
+
800
+ // DROPDOWN NO CONFLICT
801
+ // ====================
802
+
803
+ $.fn.dropdown.noConflict = function () {
804
+ $.fn.dropdown = old
805
+ return this
806
+ }
807
+
808
+
809
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
810
+ // ===================================
811
+
812
+ $(document)
813
+ .on('click.bs.dropdown.data-api', clearMenus)
814
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
815
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
816
+ .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
817
+
818
+}(jQuery);
819
+
820
+/* ========================================================================
821
+ * Bootstrap: modal.js v3.2.0
822
+ * http://getbootstrap.com/javascript/#modals
823
+ * ========================================================================
824
+ * Copyright 2011-2014 Twitter, Inc.
825
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
826
+ * ======================================================================== */
827
+
828
+
829
++function ($) {
830
+ 'use strict';
831
+
832
+ // MODAL CLASS DEFINITION
833
+ // ======================
834
+
835
+ var Modal = function (element, options) {
836
+ this.options = options
837
+ this.$body = $(document.body)
838
+ this.$element = $(element)
839
+ this.$backdrop =
840
+ this.isShown = null
841
+ this.scrollbarWidth = 0
842
+
843
+ if (this.options.remote) {
844
+ this.$element
845
+ .find('.modal-content')
846
+ .load(this.options.remote, $.proxy(function () {
847
+ this.$element.trigger('loaded.bs.modal')
848
+ }, this))
849
+ }
850
+ }
851
+
852
+ Modal.VERSION = '3.2.0'
853
+
854
+ Modal.DEFAULTS = {
855
+ backdrop: true,
856
+ keyboard: true,
857
+ show: true
858
+ }
859
+
860
+ Modal.prototype.toggle = function (_relatedTarget) {
861
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
862
+ }
863
+
864
+ Modal.prototype.show = function (_relatedTarget) {
865
+ var that = this
866
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
867
+
868
+ this.$element.trigger(e)
869
+
870
+ if (this.isShown || e.isDefaultPrevented()) return
871
+
872
+ this.isShown = true
873
+
874
+ this.checkScrollbar()
875
+ this.$body.addClass('modal-open')
876
+
877
+ this.setScrollbar()
878
+ this.escape()
879
+
880
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
881
+
882
+ this.backdrop(function () {
883
+ var transition = $.support.transition && that.$element.hasClass('fade')
884
+
885
+ if (!that.$element.parent().length) {
886
+ that.$element.appendTo(that.$body) // don't move modals dom position
887
+ }
888
+
889
+ that.$element
890
+ .show()
891
+ .scrollTop(0)
892
+
893
+ if (transition) {
894
+ that.$element[0].offsetWidth // force reflow
895
+ }
896
+
897
+ that.$element
898
+ .addClass('in')
899
+ .attr('aria-hidden', false)
900
+
901
+ that.enforceFocus()
902
+
903
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
904
+
905
+ transition ?
906
+ that.$element.find('.modal-dialog') // wait for modal to slide in
907
+ .one('bsTransitionEnd', function () {
908
+ that.$element.trigger('focus').trigger(e)
909
+ })
910
+ .emulateTransitionEnd(300) :
911
+ that.$element.trigger('focus').trigger(e)
912
+ })
913
+ }
914
+
915
+ Modal.prototype.hide = function (e) {
916
+ if (e) e.preventDefault()
917
+
918
+ e = $.Event('hide.bs.modal')
919
+
920
+ this.$element.trigger(e)
921
+
922
+ if (!this.isShown || e.isDefaultPrevented()) return
923
+
924
+ this.isShown = false
925
+
926
+ this.$body.removeClass('modal-open')
927
+
928
+ this.resetScrollbar()
929
+ this.escape()
930
+
931
+ $(document).off('focusin.bs.modal')
932
+
933
+ this.$element
934
+ .removeClass('in')
935
+ .attr('aria-hidden', true)
936
+ .off('click.dismiss.bs.modal')
937
+
938
+ $.support.transition && this.$element.hasClass('fade') ?
939
+ this.$element
940
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
941
+ .emulateTransitionEnd(300) :
942
+ this.hideModal()
943
+ }
944
+
945
+ Modal.prototype.enforceFocus = function () {
946
+ $(document)
947
+ .off('focusin.bs.modal') // guard against infinite focus loop
948
+ .on('focusin.bs.modal', $.proxy(function (e) {
949
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
950
+ this.$element.trigger('focus')
951
+ }
952
+ }, this))
953
+ }
954
+
955
+ Modal.prototype.escape = function () {
956
+ if (this.isShown && this.options.keyboard) {
957
+ this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
958
+ e.which == 27 && this.hide()
959
+ }, this))
960
+ } else if (!this.isShown) {
961
+ this.$element.off('keyup.dismiss.bs.modal')
962
+ }
963
+ }
964
+
965
+ Modal.prototype.hideModal = function () {
966
+ var that = this
967
+ this.$element.hide()
968
+ this.backdrop(function () {
969
+ that.$element.trigger('hidden.bs.modal')
970
+ })
971
+ }
972
+
973
+ Modal.prototype.removeBackdrop = function () {
974
+ this.$backdrop && this.$backdrop.remove()
975
+ this.$backdrop = null
976
+ }
977
+
978
+ Modal.prototype.backdrop = function (callback) {
979
+ var that = this
980
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
981
+
982
+ if (this.isShown && this.options.backdrop) {
983
+ var doAnimate = $.support.transition && animate
984
+
985
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
986
+ .appendTo(this.$body)
987
+
988
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
989
+ if (e.target !== e.currentTarget) return
990
+ this.options.backdrop == 'static'
991
+ ? this.$element[0].focus.call(this.$element[0])
992
+ : this.hide.call(this)
993
+ }, this))
994
+
995
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
996
+
997
+ this.$backdrop.addClass('in')
998
+
999
+ if (!callback) return
1000
+
1001
+ doAnimate ?
1002
+ this.$backdrop
1003
+ .one('bsTransitionEnd', callback)
1004
+ .emulateTransitionEnd(150) :
1005
+ callback()
1006
+
1007
+ } else if (!this.isShown && this.$backdrop) {
1008
+ this.$backdrop.removeClass('in')
1009
+
1010
+ var callbackRemove = function () {
1011
+ that.removeBackdrop()
1012
+ callback && callback()
1013
+ }
1014
+ $.support.transition && this.$element.hasClass('fade') ?
1015
+ this.$backdrop
1016
+ .one('bsTransitionEnd', callbackRemove)
1017
+ .emulateTransitionEnd(150) :
1018
+ callbackRemove()
1019
+
1020
+ } else if (callback) {
1021
+ callback()
1022
+ }
1023
+ }
1024
+
1025
+ Modal.prototype.checkScrollbar = function () {
1026
+ if (document.body.clientWidth >= window.innerWidth) return
1027
+ this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
1028
+ }
1029
+
1030
+ Modal.prototype.setScrollbar = function () {
1031
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1032
+ if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
1033
+ }
1034
+
1035
+ Modal.prototype.resetScrollbar = function () {
1036
+ this.$body.css('padding-right', '')
1037
+ }
1038
+
1039
+ Modal.prototype.measureScrollbar = function () { // thx walsh
1040
+ var scrollDiv = document.createElement('div')
1041
+ scrollDiv.className = 'modal-scrollbar-measure'
1042
+ this.$body.append(scrollDiv)
1043
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
1044
+ this.$body[0].removeChild(scrollDiv)
1045
+ return scrollbarWidth
1046
+ }
1047
+
1048
+
1049
+ // MODAL PLUGIN DEFINITION
1050
+ // =======================
1051
+
1052
+ function Plugin(option, _relatedTarget) {
1053
+ return this.each(function () {
1054
+ var $this = $(this)
1055
+ var data = $this.data('bs.modal')
1056
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1057
+
1058
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
1059
+ if (typeof option == 'string') data[option](_relatedTarget)
1060
+ else if (options.show) data.show(_relatedTarget)
1061
+ })
1062
+ }
1063
+
1064
+ var old = $.fn.modal
1065
+
1066
+ $.fn.modal = Plugin
1067
+ $.fn.modal.Constructor = Modal
1068
+
1069
+
1070
+ // MODAL NO CONFLICT
1071
+ // =================
1072
+
1073
+ $.fn.modal.noConflict = function () {
1074
+ $.fn.modal = old
1075
+ return this
1076
+ }
1077
+
1078
+
1079
+ // MODAL DATA-API
1080
+ // ==============
1081
+
1082
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1083
+ var $this = $(this)
1084
+ var href = $this.attr('href')
1085
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
1086
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1087
+
1088
+ if ($this.is('a')) e.preventDefault()
1089
+
1090
+ $target.one('show.bs.modal', function (showEvent) {
1091
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
1092
+ $target.one('hidden.bs.modal', function () {
1093
+ $this.is(':visible') && $this.trigger('focus')
1094
+ })
1095
+ })
1096
+ Plugin.call($target, option, this)
1097
+ })
1098
+
1099
+}(jQuery);
1100
+
1101
+/* ========================================================================
1102
+ * Bootstrap: tooltip.js v3.2.0
1103
+ * http://getbootstrap.com/javascript/#tooltip
1104
+ * Inspired by the original jQuery.tipsy by Jason Frame
1105
+ * ========================================================================
1106
+ * Copyright 2011-2014 Twitter, Inc.
1107
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1108
+ * ======================================================================== */
1109
+
1110
+
1111
++function ($) {
1112
+ 'use strict';
1113
+
1114
+ // TOOLTIP PUBLIC CLASS DEFINITION
1115
+ // ===============================
1116
+
1117
+ var Tooltip = function (element, options) {
1118
+ this.type =
1119
+ this.options =
1120
+ this.enabled =
1121
+ this.timeout =
1122
+ this.hoverState =
1123
+ this.$element = null
1124
+
1125
+ this.init('tooltip', element, options)
1126
+ }
1127
+
1128
+ Tooltip.VERSION = '3.2.0'
1129
+
1130
+ Tooltip.DEFAULTS = {
1131
+ animation: true,
1132
+ placement: 'top',
1133
+ selector: false,
1134
+ template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
1135
+ trigger: 'hover focus',
1136
+ title: '',
1137
+ delay: 0,
1138
+ html: false,
1139
+ container: false,
1140
+ viewport: {
1141
+ selector: 'body',
1142
+ padding: 0
1143
+ }
1144
+ }
1145
+
1146
+ Tooltip.prototype.init = function (type, element, options) {
1147
+ this.enabled = true
1148
+ this.type = type
1149
+ this.$element = $(element)
1150
+ this.options = this.getOptions(options)
1151
+ this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
1152
+
1153
+ var triggers = this.options.trigger.split(' ')
1154
+
1155
+ for (var i = triggers.length; i--;) {
1156
+ var trigger = triggers[i]
1157
+
1158
+ if (trigger == 'click') {
1159
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1160
+ } else if (trigger != 'manual') {
1161
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
1162
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
1163
+
1164
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1165
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1166
+ }
1167
+ }
1168
+
1169
+ this.options.selector ?
1170
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1171
+ this.fixTitle()
1172
+ }
1173
+
1174
+ Tooltip.prototype.getDefaults = function () {
1175
+ return Tooltip.DEFAULTS
1176
+ }
1177
+
1178
+ Tooltip.prototype.getOptions = function (options) {
1179
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1180
+
1181
+ if (options.delay && typeof options.delay == 'number') {
1182
+ options.delay = {
1183
+ show: options.delay,
1184
+ hide: options.delay
1185
+ }
1186
+ }
1187
+
1188
+ return options
1189
+ }
1190
+
1191
+ Tooltip.prototype.getDelegateOptions = function () {
1192
+ var options = {}
1193
+ var defaults = this.getDefaults()
1194
+
1195
+ this._options && $.each(this._options, function (key, value) {
1196
+ if (defaults[key] != value) options[key] = value
1197
+ })
1198
+
1199
+ return options
1200
+ }
1201
+
1202
+ Tooltip.prototype.enter = function (obj) {
1203
+ var self = obj instanceof this.constructor ?
1204
+ obj : $(obj.currentTarget).data('bs.' + this.type)
1205
+
1206
+ if (!self) {
1207
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1208
+ $(obj.currentTarget).data('bs.' + this.type, self)
1209
+ }
1210
+
1211
+ clearTimeout(self.timeout)
1212
+
1213
+ self.hoverState = 'in'
1214
+
1215
+ if (!self.options.delay || !self.options.delay.show) return self.show()
1216
+
1217
+ self.timeout = setTimeout(function () {
1218
+ if (self.hoverState == 'in') self.show()
1219
+ }, self.options.delay.show)
1220
+ }
1221
+
1222
+ Tooltip.prototype.leave = function (obj) {
1223
+ var self = obj instanceof this.constructor ?
1224
+ obj : $(obj.currentTarget).data('bs.' + this.type)
1225
+
1226
+ if (!self) {
1227
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1228
+ $(obj.currentTarget).data('bs.' + this.type, self)
1229
+ }
1230
+
1231
+ clearTimeout(self.timeout)
1232
+
1233
+ self.hoverState = 'out'
1234
+
1235
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
1236
+
1237
+ self.timeout = setTimeout(function () {
1238
+ if (self.hoverState == 'out') self.hide()
1239
+ }, self.options.delay.hide)
1240
+ }
1241
+
1242
+ Tooltip.prototype.show = function () {
1243
+ var e = $.Event('show.bs.' + this.type)
1244
+
1245
+ if (this.hasContent() && this.enabled) {
1246
+ this.$element.trigger(e)
1247
+
1248
+ var inDom = $.contains(document.documentElement, this.$element[0])
1249
+ if (e.isDefaultPrevented() || !inDom) return
1250
+ var that = this
1251
+
1252
+ var $tip = this.tip()
1253
+
1254
+ var tipId = this.getUID(this.type)
1255
+
1256
+ this.setContent()
1257
+ $tip.attr('id', tipId)
1258
+ this.$element.attr('aria-describedby', tipId)
1259
+
1260
+ if (this.options.animation) $tip.addClass('fade')
1261
+
1262
+ var placement = typeof this.options.placement == 'function' ?
1263
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
1264
+ this.options.placement
1265
+
1266
+ var autoToken = /\s?auto?\s?/i
1267
+ var autoPlace = autoToken.test(placement)
1268
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1269
+
1270
+ $tip
1271
+ .detach()
1272
+ .css({ top: 0, left: 0, display: 'block' })
1273
+ .addClass(placement)
1274
+ .data('bs.' + this.type, this)
1275
+
1276
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1277
+
1278
+ var pos = this.getPosition()
1279
+ var actualWidth = $tip[0].offsetWidth
1280
+ var actualHeight = $tip[0].offsetHeight
1281
+
1282
+ if (autoPlace) {
1283
+ var orgPlacement = placement
1284
+ var $parent = this.$element.parent()
1285
+ var parentDim = this.getPosition($parent)
1286
+
1287
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' :
1288
+ placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' :
1289
+ placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' :
1290
+ placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' :
1291
+ placement
1292
+
1293
+ $tip
1294
+ .removeClass(orgPlacement)
1295
+ .addClass(placement)
1296
+ }
1297
+
1298
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1299
+
1300
+ this.applyPlacement(calculatedOffset, placement)
1301
+
1302
+ var complete = function () {
1303
+ that.$element.trigger('shown.bs.' + that.type)
1304
+ that.hoverState = null
1305
+ }
1306
+
1307
+ $.support.transition && this.$tip.hasClass('fade') ?
1308
+ $tip
1309
+ .one('bsTransitionEnd', complete)
1310
+ .emulateTransitionEnd(150) :
1311
+ complete()
1312
+ }
1313
+ }
1314
+
1315
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
1316
+ var $tip = this.tip()
1317
+ var width = $tip[0].offsetWidth
1318
+ var height = $tip[0].offsetHeight
1319
+
1320
+ // manually read margins because getBoundingClientRect includes difference
1321
+ var marginTop = parseInt($tip.css('margin-top'), 10)
1322
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
1323
+
1324
+ // we must check for NaN for ie 8/9
1325
+ if (isNaN(marginTop)) marginTop = 0
1326
+ if (isNaN(marginLeft)) marginLeft = 0
1327
+
1328
+ offset.top = offset.top + marginTop
1329
+ offset.left = offset.left + marginLeft
1330
+
1331
+ // $.fn.offset doesn't round pixel values
1332
+ // so we use setOffset directly with our own function B-0
1333
+ $.offset.setOffset($tip[0], $.extend({
1334
+ using: function (props) {
1335
+ $tip.css({
1336
+ top: Math.round(props.top),
1337
+ left: Math.round(props.left)
1338
+ })
1339
+ }
1340
+ }, offset), 0)
1341
+
1342
+ $tip.addClass('in')
1343
+
1344
+ // check to see if placing tip in new offset caused the tip to resize itself
1345
+ var actualWidth = $tip[0].offsetWidth
1346
+ var actualHeight = $tip[0].offsetHeight
1347
+
1348
+ if (placement == 'top' && actualHeight != height) {
1349
+ offset.top = offset.top + height - actualHeight
1350
+ }
1351
+
1352
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
1353
+
1354
+ if (delta.left) offset.left += delta.left
1355
+ else offset.top += delta.top
1356
+
1357
+ var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
1358
+ var arrowPosition = delta.left ? 'left' : 'top'
1359
+ var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
1360
+
1361
+ $tip.offset(offset)
1362
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
1363
+ }
1364
+
1365
+ Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
1366
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
1367
+ }
1368
+
1369
+ Tooltip.prototype.setContent = function () {
1370
+ var $tip = this.tip()
1371
+ var title = this.getTitle()
1372
+
1373
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1374
+ $tip.removeClass('fade in top bottom left right')
1375
+ }
1376
+
1377
+ Tooltip.prototype.hide = function () {
1378
+ var that = this
1379
+ var $tip = this.tip()
1380
+ var e = $.Event('hide.bs.' + this.type)
1381
+
1382
+ this.$element.removeAttr('aria-describedby')
1383
+
1384
+ function complete() {
1385
+ if (that.hoverState != 'in') $tip.detach()
1386
+ that.$element.trigger('hidden.bs.' + that.type)
1387
+ }
1388
+
1389
+ this.$element.trigger(e)
1390
+
1391
+ if (e.isDefaultPrevented()) return
1392
+
1393
+ $tip.removeClass('in')
1394
+
1395
+ $.support.transition && this.$tip.hasClass('fade') ?
1396
+ $tip
1397
+ .one('bsTransitionEnd', complete)
1398
+ .emulateTransitionEnd(150) :
1399
+ complete()
1400
+
1401
+ this.hoverState = null
1402
+
1403
+ return this
1404
+ }
1405
+
1406
+ Tooltip.prototype.fixTitle = function () {
1407
+ var $e = this.$element
1408
+ if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
1409
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1410
+ }
1411
+ }
1412
+
1413
+ Tooltip.prototype.hasContent = function () {
1414
+ return this.getTitle()
1415
+ }
1416
+
1417
+ Tooltip.prototype.getPosition = function ($element) {
1418
+ $element = $element || this.$element
1419
+ var el = $element[0]
1420
+ var isBody = el.tagName == 'BODY'
1421
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
1422
+ scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
1423
+ width: isBody ? $(window).width() : $element.outerWidth(),
1424
+ height: isBody ? $(window).height() : $element.outerHeight()
1425
+ }, isBody ? { top: 0, left: 0 } : $element.offset())
1426
+ }
1427
+
1428
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
1429
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1430
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1431
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
1432
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1433
+
1434
+ }
1435
+
1436
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
1437
+ var delta = { top: 0, left: 0 }
1438
+ if (!this.$viewport) return delta
1439
+
1440
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
1441
+ var viewportDimensions = this.getPosition(this.$viewport)
1442
+
1443
+ if (/right|left/.test(placement)) {
1444
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
1445
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
1446
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
1447
+ delta.top = viewportDimensions.top - topEdgeOffset
1448
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
1449
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
1450
+ }
1451
+ } else {
1452
+ var leftEdgeOffset = pos.left - viewportPadding
1453
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
1454
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
1455
+ delta.left = viewportDimensions.left - leftEdgeOffset
1456
+ } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
1457
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1458
+ }
1459
+ }
1460
+
1461
+ return delta
1462
+ }
1463
+
1464
+ Tooltip.prototype.getTitle = function () {
1465
+ var title
1466
+ var $e = this.$element
1467
+ var o = this.options
1468
+
1469
+ title = $e.attr('data-original-title')
1470
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1471
+
1472
+ return title
1473
+ }
1474
+
1475
+ Tooltip.prototype.getUID = function (prefix) {
1476
+ do prefix += ~~(Math.random() * 1000000)
1477
+ while (document.getElementById(prefix))
1478
+ return prefix
1479
+ }
1480
+
1481
+ Tooltip.prototype.tip = function () {
1482
+ return (this.$tip = this.$tip || $(this.options.template))
1483
+ }
1484
+
1485
+ Tooltip.prototype.arrow = function () {
1486
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
1487
+ }
1488
+
1489
+ Tooltip.prototype.validate = function () {
1490
+ if (!this.$element[0].parentNode) {
1491
+ this.hide()
1492
+ this.$element = null
1493
+ this.options = null
1494
+ }
1495
+ }
1496
+
1497
+ Tooltip.prototype.enable = function () {
1498
+ this.enabled = true
1499
+ }
1500
+
1501
+ Tooltip.prototype.disable = function () {
1502
+ this.enabled = false
1503
+ }
1504
+
1505
+ Tooltip.prototype.toggleEnabled = function () {
1506
+ this.enabled = !this.enabled
1507
+ }
1508
+
1509
+ Tooltip.prototype.toggle = function (e) {
1510
+ var self = this
1511
+ if (e) {
1512
+ self = $(e.currentTarget).data('bs.' + this.type)
1513
+ if (!self) {
1514
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
1515
+ $(e.currentTarget).data('bs.' + this.type, self)
1516
+ }
1517
+ }
1518
+
1519
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1520
+ }
1521
+
1522
+ Tooltip.prototype.destroy = function () {
1523
+ clearTimeout(this.timeout)
1524
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
1525
+ }
1526
+
1527
+
1528
+ // TOOLTIP PLUGIN DEFINITION
1529
+ // =========================
1530
+
1531
+ function Plugin(option) {
1532
+ return this.each(function () {
1533
+ var $this = $(this)
1534
+ var data = $this.data('bs.tooltip')
1535
+ var options = typeof option == 'object' && option
1536
+
1537
+ if (!data && option == 'destroy') return
1538
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1539
+ if (typeof option == 'string') data[option]()
1540
+ })
1541
+ }
1542
+
1543
+ var old = $.fn.tooltip
1544
+
1545
+ $.fn.tooltip = Plugin
1546
+ $.fn.tooltip.Constructor = Tooltip
1547
+
1548
+
1549
+ // TOOLTIP NO CONFLICT
1550
+ // ===================
1551
+
1552
+ $.fn.tooltip.noConflict = function () {
1553
+ $.fn.tooltip = old
1554
+ return this
1555
+ }
1556
+
1557
+}(jQuery);
1558
+
1559
+/* ========================================================================
1560
+ * Bootstrap: popover.js v3.2.0
1561
+ * http://getbootstrap.com/javascript/#popovers
1562
+ * ========================================================================
1563
+ * Copyright 2011-2014 Twitter, Inc.
1564
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1565
+ * ======================================================================== */
1566
+
1567
+
1568
++function ($) {
1569
+ 'use strict';
1570
+
1571
+ // POPOVER PUBLIC CLASS DEFINITION
1572
+ // ===============================
1573
+
1574
+ var Popover = function (element, options) {
1575
+ this.init('popover', element, options)
1576
+ }
1577
+
1578
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1579
+
1580
+ Popover.VERSION = '3.2.0'
1581
+
1582
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
1583
+ placement: 'right',
1584
+ trigger: 'click',
1585
+ content: '',
1586
+ template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1587
+ })
1588
+
1589
+
1590
+ // NOTE: POPOVER EXTENDS tooltip.js
1591
+ // ================================
1592
+
1593
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1594
+
1595
+ Popover.prototype.constructor = Popover
1596
+
1597
+ Popover.prototype.getDefaults = function () {
1598
+ return Popover.DEFAULTS
1599
+ }
1600
+
1601
+ Popover.prototype.setContent = function () {
1602
+ var $tip = this.tip()
1603
+ var title = this.getTitle()
1604
+ var content = this.getContent()
1605
+
1606
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1607
+ $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
1608
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
1609
+ ](content)
1610
+
1611
+ $tip.removeClass('fade top bottom left right in')
1612
+
1613
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
1614
+ // this manually by checking the contents.
1615
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
1616
+ }
1617
+
1618
+ Popover.prototype.hasContent = function () {
1619
+ return this.getTitle() || this.getContent()
1620
+ }
1621
+
1622
+ Popover.prototype.getContent = function () {
1623
+ var $e = this.$element
1624
+ var o = this.options
1625
+
1626
+ return $e.attr('data-content')
1627
+ || (typeof o.content == 'function' ?
1628
+ o.content.call($e[0]) :
1629
+ o.content)
1630
+ }
1631
+
1632
+ Popover.prototype.arrow = function () {
1633
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
1634
+ }
1635
+
1636
+ Popover.prototype.tip = function () {
1637
+ if (!this.$tip) this.$tip = $(this.options.template)
1638
+ return this.$tip
1639
+ }
1640
+
1641
+
1642
+ // POPOVER PLUGIN DEFINITION
1643
+ // =========================
1644
+
1645
+ function Plugin(option) {
1646
+ return this.each(function () {
1647
+ var $this = $(this)
1648
+ var data = $this.data('bs.popover')
1649
+ var options = typeof option == 'object' && option
1650
+
1651
+ if (!data && option == 'destroy') return
1652
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1653
+ if (typeof option == 'string') data[option]()
1654
+ })
1655
+ }
1656
+
1657
+ var old = $.fn.popover
1658
+
1659
+ $.fn.popover = Plugin
1660
+ $.fn.popover.Constructor = Popover
1661
+
1662
+
1663
+ // POPOVER NO CONFLICT
1664
+ // ===================
1665
+
1666
+ $.fn.popover.noConflict = function () {
1667
+ $.fn.popover = old
1668
+ return this
1669
+ }
1670
+
1671
+}(jQuery);
1672
+
1673
+/* ========================================================================
1674
+ * Bootstrap: scrollspy.js v3.2.0
1675
+ * http://getbootstrap.com/javascript/#scrollspy
1676
+ * ========================================================================
1677
+ * Copyright 2011-2014 Twitter, Inc.
1678
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1679
+ * ======================================================================== */
1680
+
1681
+
1682
++function ($) {
1683
+ 'use strict';
1684
+
1685
+ // SCROLLSPY CLASS DEFINITION
1686
+ // ==========================
1687
+
1688
+ function ScrollSpy(element, options) {
1689
+ var process = $.proxy(this.process, this)
1690
+
1691
+ this.$body = $('body')
1692
+ this.$scrollElement = $(element).is('body') ? $(window) : $(element)
1693
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
1694
+ this.selector = (this.options.target || '') + ' .nav li > a'
1695
+ this.offsets = []
1696
+ this.targets = []
1697
+ this.activeTarget = null
1698
+ this.scrollHeight = 0
1699
+
1700
+ this.$scrollElement.on('scroll.bs.scrollspy', process)
1701
+ this.refresh()
1702
+ this.process()
1703
+ }
1704
+
1705
+ ScrollSpy.VERSION = '3.2.0'
1706
+
1707
+ ScrollSpy.DEFAULTS = {
1708
+ offset: 10
1709
+ }
1710
+
1711
+ ScrollSpy.prototype.getScrollHeight = function () {
1712
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
1713
+ }
1714
+
1715
+ ScrollSpy.prototype.refresh = function () {
1716
+ var offsetMethod = 'offset'
1717
+ var offsetBase = 0
1718
+
1719
+ if (!$.isWindow(this.$scrollElement[0])) {
1720
+ offsetMethod = 'position'
1721
+ offsetBase = this.$scrollElement.scrollTop()
1722
+ }
1723
+
1724
+ this.offsets = []
1725
+ this.targets = []
1726
+ this.scrollHeight = this.getScrollHeight()
1727
+
1728
+ var self = this
1729
+
1730
+ this.$body
1731
+ .find(this.selector)
1732
+ .map(function () {
1733
+ var $el = $(this)
1734
+ var href = $el.data('target') || $el.attr('href')
1735
+ var $href = /^#./.test(href) && $(href)
1736
+
1737
+ return ($href
1738
+ && $href.length
1739
+ && $href.is(':visible')
1740
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
1741
+ })
1742
+ .sort(function (a, b) { return a[0] - b[0] })
1743
+ .each(function () {
1744
+ self.offsets.push(this[0])
1745
+ self.targets.push(this[1])
1746
+ })
1747
+ }
1748
+
1749
+ ScrollSpy.prototype.process = function () {
1750
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1751
+ var scrollHeight = this.getScrollHeight()
1752
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
1753
+ var offsets = this.offsets
1754
+ var targets = this.targets
1755
+ var activeTarget = this.activeTarget
1756
+ var i
1757
+
1758
+ if (this.scrollHeight != scrollHeight) {
1759
+ this.refresh()
1760
+ }
1761
+
1762
+ if (scrollTop >= maxScroll) {
1763
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
1764
+ }
1765
+
1766
+ if (activeTarget && scrollTop <= offsets[0]) {
1767
+ return activeTarget != (i = targets[0]) && this.activate(i)
1768
+ }
1769
+
1770
+ for (i = offsets.length; i--;) {
1771
+ activeTarget != targets[i]
1772
+ && scrollTop >= offsets[i]
1773
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1774
+ && this.activate(targets[i])
1775
+ }
1776
+ }
1777
+
1778
+ ScrollSpy.prototype.activate = function (target) {
1779
+ this.activeTarget = target
1780
+
1781
+ $(this.selector)
1782
+ .parentsUntil(this.options.target, '.active')
1783
+ .removeClass('active')
1784
+
1785
+ var selector = this.selector +
1786
+ '[data-target="' + target + '"],' +
1787
+ this.selector + '[href="' + target + '"]'
1788
+
1789
+ var active = $(selector)
1790
+ .parents('li')
1791
+ .addClass('active')
1792
+
1793
+ if (active.parent('.dropdown-menu').length) {
1794
+ active = active
1795
+ .closest('li.dropdown')
1796
+ .addClass('active')
1797
+ }
1798
+
1799
+ active.trigger('activate.bs.scrollspy')
1800
+ }
1801
+
1802
+
1803
+ // SCROLLSPY PLUGIN DEFINITION
1804
+ // ===========================
1805
+
1806
+ function Plugin(option) {
1807
+ return this.each(function () {
1808
+ var $this = $(this)
1809
+ var data = $this.data('bs.scrollspy')
1810
+ var options = typeof option == 'object' && option
1811
+
1812
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
1813
+ if (typeof option == 'string') data[option]()
1814
+ })
1815
+ }
1816
+
1817
+ var old = $.fn.scrollspy
1818
+
1819
+ $.fn.scrollspy = Plugin
1820
+ $.fn.scrollspy.Constructor = ScrollSpy
1821
+
1822
+
1823
+ // SCROLLSPY NO CONFLICT
1824
+ // =====================
1825
+
1826
+ $.fn.scrollspy.noConflict = function () {
1827
+ $.fn.scrollspy = old
1828
+ return this
1829
+ }
1830
+
1831
+
1832
+ // SCROLLSPY DATA-API
1833
+ // ==================
1834
+
1835
+ $(window).on('load.bs.scrollspy.data-api', function () {
1836
+ $('[data-spy="scroll"]').each(function () {
1837
+ var $spy = $(this)
1838
+ Plugin.call($spy, $spy.data())
1839
+ })
1840
+ })
1841
+
1842
+}(jQuery);
1843
+
1844
+/* ========================================================================
1845
+ * Bootstrap: tab.js v3.2.0
1846
+ * http://getbootstrap.com/javascript/#tabs
1847
+ * ========================================================================
1848
+ * Copyright 2011-2014 Twitter, Inc.
1849
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1850
+ * ======================================================================== */
1851
+
1852
+
1853
++function ($) {
1854
+ 'use strict';
1855
+
1856
+ // TAB CLASS DEFINITION
1857
+ // ====================
1858
+
1859
+ var Tab = function (element) {
1860
+ this.element = $(element)
1861
+ }
1862
+
1863
+ Tab.VERSION = '3.2.0'
1864
+
1865
+ Tab.prototype.show = function () {
1866
+ var $this = this.element
1867
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
1868
+ var selector = $this.data('target')
1869
+
1870
+ if (!selector) {
1871
+ selector = $this.attr('href')
1872
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
1873
+ }
1874
+
1875
+ if ($this.parent('li').hasClass('active')) return
1876
+
1877
+ var previous = $ul.find('.active:last a')[0]
1878
+ var e = $.Event('show.bs.tab', {
1879
+ relatedTarget: previous
1880
+ })
1881
+
1882
+ $this.trigger(e)
1883
+
1884
+ if (e.isDefaultPrevented()) return
1885
+
1886
+ var $target = $(selector)
1887
+
1888
+ this.activate($this.closest('li'), $ul)
1889
+ this.activate($target, $target.parent(), function () {
1890
+ $this.trigger({
1891
+ type: 'shown.bs.tab',
1892
+ relatedTarget: previous
1893
+ })
1894
+ })
1895
+ }
1896
+
1897
+ Tab.prototype.activate = function (element, container, callback) {
1898
+ var $active = container.find('> .active')
1899
+ var transition = callback
1900
+ && $.support.transition
1901
+ && $active.hasClass('fade')
1902
+
1903
+ function next() {
1904
+ $active
1905
+ .removeClass('active')
1906
+ .find('> .dropdown-menu > .active')
1907
+ .removeClass('active')
1908
+
1909
+ element.addClass('active')
1910
+
1911
+ if (transition) {
1912
+ element[0].offsetWidth // reflow for transition
1913
+ element.addClass('in')
1914
+ } else {
1915
+ element.removeClass('fade')
1916
+ }
1917
+
1918
+ if (element.parent('.dropdown-menu')) {
1919
+ element.closest('li.dropdown').addClass('active')
1920
+ }
1921
+
1922
+ callback && callback()
1923
+ }
1924
+
1925
+ transition ?
1926
+ $active
1927
+ .one('bsTransitionEnd', next)
1928
+ .emulateTransitionEnd(150) :
1929
+ next()
1930
+
1931
+ $active.removeClass('in')
1932
+ }
1933
+
1934
+
1935
+ // TAB PLUGIN DEFINITION
1936
+ // =====================
1937
+
1938
+ function Plugin(option) {
1939
+ return this.each(function () {
1940
+ var $this = $(this)
1941
+ var data = $this.data('bs.tab')
1942
+
1943
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
1944
+ if (typeof option == 'string') data[option]()
1945
+ })
1946
+ }
1947
+
1948
+ var old = $.fn.tab
1949
+
1950
+ $.fn.tab = Plugin
1951
+ $.fn.tab.Constructor = Tab
1952
+
1953
+
1954
+ // TAB NO CONFLICT
1955
+ // ===============
1956
+
1957
+ $.fn.tab.noConflict = function () {
1958
+ $.fn.tab = old
1959
+ return this
1960
+ }
1961
+
1962
+
1963
+ // TAB DATA-API
1964
+ // ============
1965
+
1966
+ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1967
+ e.preventDefault()
1968
+ Plugin.call($(this), 'show')
1969
+ })
1970
+
1971
+}(jQuery);
1972
+
1973
+/* ========================================================================
1974
+ * Bootstrap: affix.js v3.2.0
1975
+ * http://getbootstrap.com/javascript/#affix
1976
+ * ========================================================================
1977
+ * Copyright 2011-2014 Twitter, Inc.
1978
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1979
+ * ======================================================================== */
1980
+
1981
+
1982
++function ($) {
1983
+ 'use strict';
1984
+
1985
+ // AFFIX CLASS DEFINITION
1986
+ // ======================
1987
+
1988
+ var Affix = function (element, options) {
1989
+ this.options = $.extend({}, Affix.DEFAULTS, options)
1990
+
1991
+ this.$target = $(this.options.target)
1992
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
1993
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
1994
+
1995
+ this.$element = $(element)
1996
+ this.affixed =
1997
+ this.unpin =
1998
+ this.pinnedOffset = null
1999
+
2000
+ this.checkPosition()
2001
+ }
2002
+
2003
+ Affix.VERSION = '3.2.0'
2004
+
2005
+ Affix.RESET = 'affix affix-top affix-bottom'
2006
+
2007
+ Affix.DEFAULTS = {
2008
+ offset: 0,
2009
+ target: window
2010
+ }
2011
+
2012
+ Affix.prototype.getPinnedOffset = function () {
2013
+ if (this.pinnedOffset) return this.pinnedOffset
2014
+ this.$element.removeClass(Affix.RESET).addClass('affix')
2015
+ var scrollTop = this.$target.scrollTop()
2016
+ var position = this.$element.offset()
2017
+ return (this.pinnedOffset = position.top - scrollTop)
2018
+ }
2019
+
2020
+ Affix.prototype.checkPositionWithEventLoop = function () {
2021
+ setTimeout($.proxy(this.checkPosition, this), 1)
2022
+ }
2023
+
2024
+ Affix.prototype.checkPosition = function () {
2025
+ if (!this.$element.is(':visible')) return
2026
+
2027
+ var scrollHeight = $(document).height()
2028
+ var scrollTop = this.$target.scrollTop()
2029
+ var position = this.$element.offset()
2030
+ var offset = this.options.offset
2031
+ var offsetTop = offset.top
2032
+ var offsetBottom = offset.bottom
2033
+
2034
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
2035
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
2036
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2037
+
2038
+ var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
2039
+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
2040
+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
2041
+
2042
+ if (this.affixed === affix) return
2043
+ if (this.unpin != null) this.$element.css('top', '')
2044
+
2045
+ var affixType = 'affix' + (affix ? '-' + affix : '')
2046
+ var e = $.Event(affixType + '.bs.affix')
2047
+
2048
+ this.$element.trigger(e)
2049
+
2050
+ if (e.isDefaultPrevented()) return
2051
+
2052
+ this.affixed = affix
2053
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2054
+
2055
+ this.$element
2056
+ .removeClass(Affix.RESET)
2057
+ .addClass(affixType)
2058
+ .trigger($.Event(affixType.replace('affix', 'affixed')))
2059
+
2060
+ if (affix == 'bottom') {
2061
+ this.$element.offset({
2062
+ top: scrollHeight - this.$element.height() - offsetBottom
2063
+ })
2064
+ }
2065
+ }
2066
+
2067
+
2068
+ // AFFIX PLUGIN DEFINITION
2069
+ // =======================
2070
+
2071
+ function Plugin(option) {
2072
+ return this.each(function () {
2073
+ var $this = $(this)
2074
+ var data = $this.data('bs.affix')
2075
+ var options = typeof option == 'object' && option
2076
+
2077
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
2078
+ if (typeof option == 'string') data[option]()
2079
+ })
2080
+ }
2081
+
2082
+ var old = $.fn.affix
2083
+
2084
+ $.fn.affix = Plugin
2085
+ $.fn.affix.Constructor = Affix
2086
+
2087
+
2088
+ // AFFIX NO CONFLICT
2089
+ // =================
2090
+
2091
+ $.fn.affix.noConflict = function () {
2092
+ $.fn.affix = old
2093
+ return this
2094
+ }
2095
+
2096
+
2097
+ // AFFIX DATA-API
2098
+ // ==============
2099
+
2100
+ $(window).on('load', function () {
2101
+ $('[data-spy="affix"]').each(function () {
2102
+ var $spy = $(this)
2103
+ var data = $spy.data()
2104
+
2105
+ data.offset = data.offset || {}
2106
+
2107
+ if (data.offsetBottom) data.offset.bottom = data.offsetBottom
2108
+ if (data.offsetTop) data.offset.top = data.offsetTop
2109
+
2110
+ Plugin.call($spy, data)
2111
+ })
2112
+ })
2113
+
2114
+}(jQuery);
securis/src/main/webapp/js/vendor/bootstrap.min.js
....@@ -0,0 +1,6 @@
1
+/*!
2
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
3
+ * Copyright 2011-2014 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
securis/src/main/webapp/js/vendor/chosen.jquery.js
....@@ -0,0 +1,1166 @@
1
+// Chosen, a Select Box Enhancer for jQuery and Prototype
2
+// by Patrick Filler for Harvest, http://getharvest.com
3
+//
4
+// Version 1.0.0
5
+// Full source at https://github.com/harvesthq/chosen
6
+// Copyright (c) 2011 Harvest http://getharvest.com
7
+
8
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
9
+// This file is generated by `grunt build`, do not edit it by hand.
10
+(function() {
11
+ var $, AbstractChosen, Chosen, SelectParser, _ref,
12
+ __hasProp = {}.hasOwnProperty,
13
+ __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
14
+
15
+ SelectParser = (function() {
16
+ function SelectParser() {
17
+ this.options_index = 0;
18
+ this.parsed = [];
19
+ }
20
+
21
+ SelectParser.prototype.add_node = function(child) {
22
+ if (child.nodeName.toUpperCase() === "OPTGROUP") {
23
+ return this.add_group(child);
24
+ } else {
25
+ return this.add_option(child);
26
+ }
27
+ };
28
+
29
+ SelectParser.prototype.add_group = function(group) {
30
+ var group_position, option, _i, _len, _ref, _results;
31
+
32
+ group_position = this.parsed.length;
33
+ this.parsed.push({
34
+ array_index: group_position,
35
+ group: true,
36
+ label: this.escapeExpression(group.label),
37
+ children: 0,
38
+ disabled: group.disabled
39
+ });
40
+ _ref = group.childNodes;
41
+ _results = [];
42
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
43
+ option = _ref[_i];
44
+ _results.push(this.add_option(option, group_position, group.disabled));
45
+ }
46
+ return _results;
47
+ };
48
+
49
+ SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
50
+ if (option.nodeName.toUpperCase() === "OPTION") {
51
+ if (option.text !== "") {
52
+ if (group_position != null) {
53
+ this.parsed[group_position].children += 1;
54
+ }
55
+ this.parsed.push({
56
+ array_index: this.parsed.length,
57
+ options_index: this.options_index,
58
+ value: option.value,
59
+ text: option.text,
60
+ html: option.innerHTML,
61
+ selected: option.selected,
62
+ disabled: group_disabled === true ? group_disabled : option.disabled,
63
+ group_array_index: group_position,
64
+ classes: option.className,
65
+ style: option.style.cssText
66
+ });
67
+ } else {
68
+ this.parsed.push({
69
+ array_index: this.parsed.length,
70
+ options_index: this.options_index,
71
+ empty: true
72
+ });
73
+ }
74
+ return this.options_index += 1;
75
+ }
76
+ };
77
+
78
+ SelectParser.prototype.escapeExpression = function(text) {
79
+ var map, unsafe_chars;
80
+
81
+ if ((text == null) || text === false) {
82
+ return "";
83
+ }
84
+ if (!/[\&\<\>\"\'\`]/.test(text)) {
85
+ return text;
86
+ }
87
+ map = {
88
+ "<": "&lt;",
89
+ ">": "&gt;",
90
+ '"': "&quot;",
91
+ "'": "&#x27;",
92
+ "`": "&#x60;"
93
+ };
94
+ unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
95
+ return text.replace(unsafe_chars, function(chr) {
96
+ return map[chr] || "&amp;";
97
+ });
98
+ };
99
+
100
+ return SelectParser;
101
+
102
+ })();
103
+
104
+ SelectParser.select_to_array = function(select) {
105
+ var child, parser, _i, _len, _ref;
106
+
107
+ parser = new SelectParser();
108
+ _ref = select.childNodes;
109
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
110
+ child = _ref[_i];
111
+ parser.add_node(child);
112
+ }
113
+ return parser.parsed;
114
+ };
115
+
116
+ AbstractChosen = (function() {
117
+ function AbstractChosen(form_field, options) {
118
+ this.form_field = form_field;
119
+ this.options = options != null ? options : {};
120
+ if (!AbstractChosen.browser_is_supported()) {
121
+ return;
122
+ }
123
+ this.is_multiple = this.form_field.multiple;
124
+ this.set_default_text();
125
+ this.set_default_values();
126
+ this.setup();
127
+ this.set_up_html();
128
+ this.register_observers();
129
+ }
130
+
131
+ AbstractChosen.prototype.set_default_values = function() {
132
+ var _this = this;
133
+
134
+ this.click_test_action = function(evt) {
135
+ return _this.test_active_click(evt);
136
+ };
137
+ this.activate_action = function(evt) {
138
+ return _this.activate_field(evt);
139
+ };
140
+ this.active_field = false;
141
+ this.mouse_on_container = false;
142
+ this.results_showing = false;
143
+ this.result_highlighted = null;
144
+ this.result_single_selected = null;
145
+ this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
146
+ this.disable_search_threshold = this.options.disable_search_threshold || 0;
147
+ this.disable_search = this.options.disable_search || false;
148
+ this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
149
+ this.group_search = this.options.group_search != null ? this.options.group_search : true;
150
+ this.search_contains = this.options.search_contains || false;
151
+ this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
152
+ this.max_selected_options = this.options.max_selected_options || Infinity;
153
+ this.inherit_select_classes = this.options.inherit_select_classes || false;
154
+ this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
155
+ return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
156
+ };
157
+
158
+ AbstractChosen.prototype.set_default_text = function() {
159
+ if (this.form_field.getAttribute("data-placeholder")) {
160
+ this.default_text = this.form_field.getAttribute("data-placeholder");
161
+ } else if (this.is_multiple) {
162
+ this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
163
+ } else {
164
+ this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
165
+ }
166
+ return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
167
+ };
168
+
169
+ AbstractChosen.prototype.mouse_enter = function() {
170
+ return this.mouse_on_container = true;
171
+ };
172
+
173
+ AbstractChosen.prototype.mouse_leave = function() {
174
+ return this.mouse_on_container = false;
175
+ };
176
+
177
+ AbstractChosen.prototype.input_focus = function(evt) {
178
+ var _this = this;
179
+
180
+ if (this.is_multiple) {
181
+ if (!this.active_field) {
182
+ return setTimeout((function() {
183
+ return _this.container_mousedown();
184
+ }), 50);
185
+ }
186
+ } else {
187
+ if (!this.active_field) {
188
+ return this.activate_field();
189
+ }
190
+ }
191
+ };
192
+
193
+ AbstractChosen.prototype.input_blur = function(evt) {
194
+ var _this = this;
195
+
196
+ if (!this.mouse_on_container) {
197
+ this.active_field = false;
198
+ return setTimeout((function() {
199
+ return _this.blur_test();
200
+ }), 100);
201
+ }
202
+ };
203
+
204
+ AbstractChosen.prototype.results_option_build = function(options) {
205
+ var content, data, _i, _len, _ref;
206
+
207
+ content = '';
208
+ _ref = this.results_data;
209
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
210
+ data = _ref[_i];
211
+ if (data.group) {
212
+ content += this.result_add_group(data);
213
+ } else {
214
+ content += this.result_add_option(data);
215
+ }
216
+ if (options != null ? options.first : void 0) {
217
+ if (data.selected && this.is_multiple) {
218
+ this.choice_build(data);
219
+ } else if (data.selected && !this.is_multiple) {
220
+ this.single_set_selected_text(data.text);
221
+ }
222
+ }
223
+ }
224
+ return content;
225
+ };
226
+
227
+ AbstractChosen.prototype.result_add_option = function(option) {
228
+ var classes, style;
229
+
230
+ if (!option.search_match) {
231
+ return '';
232
+ }
233
+ if (!this.include_option_in_results(option)) {
234
+ return '';
235
+ }
236
+ classes = [];
237
+ if (!option.disabled && !(option.selected && this.is_multiple)) {
238
+ classes.push("active-result");
239
+ }
240
+ if (option.disabled && !(option.selected && this.is_multiple)) {
241
+ classes.push("disabled-result");
242
+ }
243
+ if (option.selected) {
244
+ classes.push("result-selected");
245
+ }
246
+ if (option.group_array_index != null) {
247
+ classes.push("group-option");
248
+ }
249
+ if (option.classes !== "") {
250
+ classes.push(option.classes);
251
+ }
252
+ style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
253
+ return "<li class=\"" + (classes.join(' ')) + "\"" + style + " data-option-array-index=\"" + option.array_index + "\">" + option.search_text + "</li>";
254
+ };
255
+
256
+ AbstractChosen.prototype.result_add_group = function(group) {
257
+ if (!(group.search_match || group.group_match)) {
258
+ return '';
259
+ }
260
+ if (!(group.active_options > 0)) {
261
+ return '';
262
+ }
263
+ return "<li class=\"group-result\">" + group.search_text + "</li>";
264
+ };
265
+
266
+ AbstractChosen.prototype.results_update_field = function() {
267
+ this.set_default_text();
268
+ if (!this.is_multiple) {
269
+ this.results_reset_cleanup();
270
+ }
271
+ this.result_clear_highlight();
272
+ this.result_single_selected = null;
273
+ this.results_build();
274
+ if (this.results_showing) {
275
+ return this.winnow_results();
276
+ }
277
+ };
278
+
279
+ AbstractChosen.prototype.results_toggle = function() {
280
+ if (this.results_showing) {
281
+ return this.results_hide();
282
+ } else {
283
+ return this.results_show();
284
+ }
285
+ };
286
+
287
+ AbstractChosen.prototype.results_search = function(evt) {
288
+ if (this.results_showing) {
289
+ return this.winnow_results();
290
+ } else {
291
+ return this.results_show();
292
+ }
293
+ };
294
+
295
+ AbstractChosen.prototype.winnow_results = function() {
296
+ var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
297
+
298
+ this.no_results_clear();
299
+ results = 0;
300
+ searchText = this.get_search_text();
301
+ escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
302
+ regexAnchor = this.search_contains ? "" : "^";
303
+ regex = new RegExp(regexAnchor + escapedSearchText, 'i');
304
+ zregex = new RegExp(escapedSearchText, 'i');
305
+ _ref = this.results_data;
306
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
307
+ option = _ref[_i];
308
+ option.search_match = false;
309
+ results_group = null;
310
+ if (this.include_option_in_results(option)) {
311
+ if (option.group) {
312
+ option.group_match = false;
313
+ option.active_options = 0;
314
+ }
315
+ if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
316
+ results_group = this.results_data[option.group_array_index];
317
+ if (results_group.active_options === 0 && results_group.search_match) {
318
+ results += 1;
319
+ }
320
+ results_group.active_options += 1;
321
+ }
322
+ if (!(option.group && !this.group_search)) {
323
+ option.search_text = option.group ? option.label : option.html;
324
+ option.search_match = this.search_string_match(option.search_text, regex);
325
+ if (option.search_match && !option.group) {
326
+ results += 1;
327
+ }
328
+ if (option.search_match) {
329
+ if (searchText.length) {
330
+ startpos = option.search_text.search(zregex);
331
+ text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
332
+ option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
333
+ }
334
+ if (results_group != null) {
335
+ results_group.group_match = true;
336
+ }
337
+ } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
338
+ option.search_match = true;
339
+ }
340
+ }
341
+ }
342
+ }
343
+ this.result_clear_highlight();
344
+ if (results < 1 && searchText.length) {
345
+ this.update_results_content("");
346
+ return this.no_results(searchText);
347
+ } else {
348
+ this.update_results_content(this.results_option_build());
349
+ return this.winnow_results_set_highlight();
350
+ }
351
+ };
352
+
353
+ AbstractChosen.prototype.search_string_match = function(search_string, regex) {
354
+ var part, parts, _i, _len;
355
+
356
+ if (regex.test(search_string)) {
357
+ return true;
358
+ } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
359
+ parts = search_string.replace(/\[|\]/g, "").split(" ");
360
+ if (parts.length) {
361
+ for (_i = 0, _len = parts.length; _i < _len; _i++) {
362
+ part = parts[_i];
363
+ if (regex.test(part)) {
364
+ return true;
365
+ }
366
+ }
367
+ }
368
+ }
369
+ };
370
+
371
+ AbstractChosen.prototype.choices_count = function() {
372
+ var option, _i, _len, _ref;
373
+
374
+ if (this.selected_option_count != null) {
375
+ return this.selected_option_count;
376
+ }
377
+ this.selected_option_count = 0;
378
+ _ref = this.form_field.options;
379
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
380
+ option = _ref[_i];
381
+ if (option.selected) {
382
+ this.selected_option_count += 1;
383
+ }
384
+ }
385
+ return this.selected_option_count;
386
+ };
387
+
388
+ AbstractChosen.prototype.choices_click = function(evt) {
389
+ evt.preventDefault();
390
+ if (!(this.results_showing || this.is_disabled)) {
391
+ return this.results_show();
392
+ }
393
+ };
394
+
395
+ AbstractChosen.prototype.keyup_checker = function(evt) {
396
+ var stroke, _ref;
397
+
398
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
399
+ this.search_field_scale();
400
+ switch (stroke) {
401
+ case 8:
402
+ if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
403
+ return this.keydown_backstroke();
404
+ } else if (!this.pending_backstroke) {
405
+ this.result_clear_highlight();
406
+ return this.results_search();
407
+ }
408
+ break;
409
+ case 13:
410
+ evt.preventDefault();
411
+ if (this.results_showing) {
412
+ return this.result_select(evt);
413
+ }
414
+ break;
415
+ case 27:
416
+ if (this.results_showing) {
417
+ this.results_hide();
418
+ }
419
+ return true;
420
+ case 9:
421
+ case 38:
422
+ case 40:
423
+ case 16:
424
+ case 91:
425
+ case 17:
426
+ break;
427
+ default:
428
+ return this.results_search();
429
+ }
430
+ };
431
+
432
+ AbstractChosen.prototype.container_width = function() {
433
+ if (this.options.width != null) {
434
+ return this.options.width;
435
+ } else {
436
+ return "" + this.form_field.offsetWidth + "px";
437
+ }
438
+ };
439
+
440
+ AbstractChosen.prototype.include_option_in_results = function(option) {
441
+ if (this.is_multiple && (!this.display_selected_options && option.selected)) {
442
+ return false;
443
+ }
444
+ if (!this.display_disabled_options && option.disabled) {
445
+ return false;
446
+ }
447
+ if (option.empty) {
448
+ return false;
449
+ }
450
+ return true;
451
+ };
452
+
453
+ AbstractChosen.browser_is_supported = function() {
454
+ if (window.navigator.appName === "Microsoft Internet Explorer") {
455
+ return document.documentMode >= 8;
456
+ }
457
+ if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
458
+ return false;
459
+ }
460
+ if (/Android/i.test(window.navigator.userAgent)) {
461
+ if (/Mobile/i.test(window.navigator.userAgent)) {
462
+ return false;
463
+ }
464
+ }
465
+ return true;
466
+ };
467
+
468
+ AbstractChosen.default_multiple_text = "Select Some Options";
469
+
470
+ AbstractChosen.default_single_text = "Select an Option";
471
+
472
+ AbstractChosen.default_no_result_text = "No results match";
473
+
474
+ return AbstractChosen;
475
+
476
+ })();
477
+
478
+ $ = jQuery;
479
+
480
+ $.fn.extend({
481
+ chosen: function(options) {
482
+ if (!AbstractChosen.browser_is_supported()) {
483
+ return this;
484
+ }
485
+ return this.each(function(input_field) {
486
+ var $this, chosen;
487
+
488
+ $this = $(this);
489
+ chosen = $this.data('chosen');
490
+ if (options === 'destroy' && chosen) {
491
+ chosen.destroy();
492
+ } else if (!chosen) {
493
+ $this.data('chosen', new Chosen(this, options));
494
+ }
495
+ });
496
+ }
497
+ });
498
+
499
+ Chosen = (function(_super) {
500
+ __extends(Chosen, _super);
501
+
502
+ function Chosen() {
503
+ _ref = Chosen.__super__.constructor.apply(this, arguments);
504
+ return _ref;
505
+ }
506
+
507
+ Chosen.prototype.setup = function() {
508
+ this.form_field_jq = $(this.form_field);
509
+ this.current_selectedIndex = this.form_field.selectedIndex;
510
+ return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl");
511
+ };
512
+
513
+ Chosen.prototype.set_up_html = function() {
514
+ var container_classes, container_props;
515
+
516
+ container_classes = ["chosen-container"];
517
+ container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
518
+ if (this.inherit_select_classes && this.form_field.className) {
519
+ container_classes.push(this.form_field.className);
520
+ }
521
+ if (this.is_rtl) {
522
+ container_classes.push("chosen-rtl");
523
+ }
524
+ container_props = {
525
+ 'class': container_classes.join(' '),
526
+ 'style': "width: " + (this.container_width()) + ";",
527
+ 'title': this.form_field.title
528
+ };
529
+ if (this.form_field.id.length) {
530
+ container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
531
+ }
532
+ this.container = $("<div />", container_props);
533
+ if (this.is_multiple) {
534
+ this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
535
+ } else {
536
+ this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
537
+ }
538
+ this.form_field_jq.hide().after(this.container);
539
+ this.dropdown = this.container.find('div.chosen-drop').first();
540
+ this.search_field = this.container.find('input').first();
541
+ this.search_results = this.container.find('ul.chosen-results').first();
542
+ this.search_field_scale();
543
+ this.search_no_results = this.container.find('li.no-results').first();
544
+ if (this.is_multiple) {
545
+ this.search_choices = this.container.find('ul.chosen-choices').first();
546
+ this.search_container = this.container.find('li.search-field').first();
547
+ } else {
548
+ this.search_container = this.container.find('div.chosen-search').first();
549
+ this.selected_item = this.container.find('.chosen-single').first();
550
+ }
551
+ this.results_build();
552
+ this.set_tab_index();
553
+ this.set_label_behavior();
554
+ return this.form_field_jq.trigger("chosen:ready", {
555
+ chosen: this
556
+ });
557
+ };
558
+
559
+ Chosen.prototype.register_observers = function() {
560
+ var _this = this;
561
+
562
+ this.container.bind('mousedown.chosen', function(evt) {
563
+ _this.container_mousedown(evt);
564
+ });
565
+ this.container.bind('mouseup.chosen', function(evt) {
566
+ _this.container_mouseup(evt);
567
+ });
568
+ this.container.bind('mouseenter.chosen', function(evt) {
569
+ _this.mouse_enter(evt);
570
+ });
571
+ this.container.bind('mouseleave.chosen', function(evt) {
572
+ _this.mouse_leave(evt);
573
+ });
574
+ this.search_results.bind('mouseup.chosen', function(evt) {
575
+ _this.search_results_mouseup(evt);
576
+ });
577
+ this.search_results.bind('mouseover.chosen', function(evt) {
578
+ _this.search_results_mouseover(evt);
579
+ });
580
+ this.search_results.bind('mouseout.chosen', function(evt) {
581
+ _this.search_results_mouseout(evt);
582
+ });
583
+ this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {
584
+ _this.search_results_mousewheel(evt);
585
+ });
586
+ this.form_field_jq.bind("chosen:updated.chosen", function(evt) {
587
+ _this.results_update_field(evt);
588
+ });
589
+ this.form_field_jq.bind("chosen:activate.chosen", function(evt) {
590
+ _this.activate_field(evt);
591
+ });
592
+ this.form_field_jq.bind("chosen:open.chosen", function(evt) {
593
+ _this.container_mousedown(evt);
594
+ });
595
+ this.search_field.bind('blur.chosen', function(evt) {
596
+ _this.input_blur(evt);
597
+ });
598
+ this.search_field.bind('keyup.chosen', function(evt) {
599
+ _this.keyup_checker(evt);
600
+ });
601
+ this.search_field.bind('keydown.chosen', function(evt) {
602
+ _this.keydown_checker(evt);
603
+ });
604
+ this.search_field.bind('focus.chosen', function(evt) {
605
+ _this.input_focus(evt);
606
+ });
607
+ if (this.is_multiple) {
608
+ return this.search_choices.bind('click.chosen', function(evt) {
609
+ _this.choices_click(evt);
610
+ });
611
+ } else {
612
+ return this.container.bind('click.chosen', function(evt) {
613
+ evt.preventDefault();
614
+ });
615
+ }
616
+ };
617
+
618
+ Chosen.prototype.destroy = function() {
619
+ $(document).unbind("click.chosen", this.click_test_action);
620
+ if (this.search_field[0].tabIndex) {
621
+ this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
622
+ }
623
+ this.container.remove();
624
+ this.form_field_jq.removeData('chosen');
625
+ return this.form_field_jq.show();
626
+ };
627
+
628
+ Chosen.prototype.search_field_disabled = function() {
629
+ this.is_disabled = this.form_field_jq[0].disabled;
630
+ if (this.is_disabled) {
631
+ this.container.addClass('chosen-disabled');
632
+ this.search_field[0].disabled = true;
633
+ if (!this.is_multiple) {
634
+ this.selected_item.unbind("focus.chosen", this.activate_action);
635
+ }
636
+ return this.close_field();
637
+ } else {
638
+ this.container.removeClass('chosen-disabled');
639
+ this.search_field[0].disabled = false;
640
+ if (!this.is_multiple) {
641
+ return this.selected_item.bind("focus.chosen", this.activate_action);
642
+ }
643
+ }
644
+ };
645
+
646
+ Chosen.prototype.container_mousedown = function(evt) {
647
+ if (!this.is_disabled) {
648
+ if (evt && evt.type === "mousedown" && !this.results_showing) {
649
+ evt.preventDefault();
650
+ }
651
+ if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
652
+ if (!this.active_field) {
653
+ if (this.is_multiple) {
654
+ this.search_field.val("");
655
+ }
656
+ $(document).bind('click.chosen', this.click_test_action);
657
+ this.results_show();
658
+ } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
659
+ evt.preventDefault();
660
+ this.results_toggle();
661
+ }
662
+ return this.activate_field();
663
+ }
664
+ }
665
+ };
666
+
667
+ Chosen.prototype.container_mouseup = function(evt) {
668
+ if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
669
+ return this.results_reset(evt);
670
+ }
671
+ };
672
+
673
+ Chosen.prototype.search_results_mousewheel = function(evt) {
674
+ var delta, _ref1, _ref2;
675
+
676
+ delta = -((_ref1 = evt.originalEvent) != null ? _ref1.wheelDelta : void 0) || ((_ref2 = evt.originialEvent) != null ? _ref2.detail : void 0);
677
+ if (delta != null) {
678
+ evt.preventDefault();
679
+ if (evt.type === 'DOMMouseScroll') {
680
+ delta = delta * 40;
681
+ }
682
+ return this.search_results.scrollTop(delta + this.search_results.scrollTop());
683
+ }
684
+ };
685
+
686
+ Chosen.prototype.blur_test = function(evt) {
687
+ if (!this.active_field && this.container.hasClass("chosen-container-active")) {
688
+ return this.close_field();
689
+ }
690
+ };
691
+
692
+ Chosen.prototype.close_field = function() {
693
+ $(document).unbind("click.chosen", this.click_test_action);
694
+ this.active_field = false;
695
+ this.results_hide();
696
+ this.container.removeClass("chosen-container-active");
697
+ this.clear_backstroke();
698
+ this.show_search_field_default();
699
+ return this.search_field_scale();
700
+ };
701
+
702
+ Chosen.prototype.activate_field = function() {
703
+ this.container.addClass("chosen-container-active");
704
+ this.active_field = true;
705
+ this.search_field.val(this.search_field.val());
706
+ return this.search_field.focus();
707
+ };
708
+
709
+ Chosen.prototype.test_active_click = function(evt) {
710
+ if (this.container.is($(evt.target).closest('.chosen-container'))) {
711
+ return this.active_field = true;
712
+ } else {
713
+ return this.close_field();
714
+ }
715
+ };
716
+
717
+ Chosen.prototype.results_build = function() {
718
+ this.parsing = true;
719
+ this.selected_option_count = null;
720
+ this.results_data = SelectParser.select_to_array(this.form_field);
721
+ if (this.is_multiple) {
722
+ this.search_choices.find("li.search-choice").remove();
723
+ } else if (!this.is_multiple) {
724
+ this.single_set_selected_text();
725
+ if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
726
+ this.search_field[0].readOnly = true;
727
+ this.container.addClass("chosen-container-single-nosearch");
728
+ } else {
729
+ this.search_field[0].readOnly = false;
730
+ this.container.removeClass("chosen-container-single-nosearch");
731
+ }
732
+ }
733
+ this.update_results_content(this.results_option_build({
734
+ first: true
735
+ }));
736
+ this.search_field_disabled();
737
+ this.show_search_field_default();
738
+ this.search_field_scale();
739
+ return this.parsing = false;
740
+ };
741
+
742
+ Chosen.prototype.result_do_highlight = function(el) {
743
+ var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
744
+
745
+ if (el.length) {
746
+ this.result_clear_highlight();
747
+ this.result_highlight = el;
748
+ this.result_highlight.addClass("highlighted");
749
+ maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
750
+ visible_top = this.search_results.scrollTop();
751
+ visible_bottom = maxHeight + visible_top;
752
+ high_top = this.result_highlight.position().top + this.search_results.scrollTop();
753
+ high_bottom = high_top + this.result_highlight.outerHeight();
754
+ if (high_bottom >= visible_bottom) {
755
+ return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
756
+ } else if (high_top < visible_top) {
757
+ return this.search_results.scrollTop(high_top);
758
+ }
759
+ }
760
+ };
761
+
762
+ Chosen.prototype.result_clear_highlight = function() {
763
+ if (this.result_highlight) {
764
+ this.result_highlight.removeClass("highlighted");
765
+ }
766
+ return this.result_highlight = null;
767
+ };
768
+
769
+ Chosen.prototype.results_show = function() {
770
+ if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
771
+ this.form_field_jq.trigger("chosen:maxselected", {
772
+ chosen: this
773
+ });
774
+ return false;
775
+ }
776
+ this.container.addClass("chosen-with-drop");
777
+ this.form_field_jq.trigger("chosen:showing_dropdown", {
778
+ chosen: this
779
+ });
780
+ this.results_showing = true;
781
+ this.search_field.focus();
782
+ this.search_field.val(this.search_field.val());
783
+ return this.winnow_results();
784
+ };
785
+
786
+ Chosen.prototype.update_results_content = function(content) {
787
+ return this.search_results.html(content);
788
+ };
789
+
790
+ Chosen.prototype.results_hide = function() {
791
+ if (this.results_showing) {
792
+ this.result_clear_highlight();
793
+ this.container.removeClass("chosen-with-drop");
794
+ this.form_field_jq.trigger("chosen:hiding_dropdown", {
795
+ chosen: this
796
+ });
797
+ }
798
+ return this.results_showing = false;
799
+ };
800
+
801
+ Chosen.prototype.set_tab_index = function(el) {
802
+ var ti;
803
+
804
+ if (this.form_field.tabIndex) {
805
+ ti = this.form_field.tabIndex;
806
+ this.form_field.tabIndex = -1;
807
+ return this.search_field[0].tabIndex = ti;
808
+ }
809
+ };
810
+
811
+ Chosen.prototype.set_label_behavior = function() {
812
+ var _this = this;
813
+
814
+ this.form_field_label = this.form_field_jq.parents("label");
815
+ if (!this.form_field_label.length && this.form_field.id.length) {
816
+ this.form_field_label = $("label[for='" + this.form_field.id + "']");
817
+ }
818
+ if (this.form_field_label.length > 0) {
819
+ return this.form_field_label.bind('click.chosen', function(evt) {
820
+ if (_this.is_multiple) {
821
+ return _this.container_mousedown(evt);
822
+ } else {
823
+ return _this.activate_field();
824
+ }
825
+ });
826
+ }
827
+ };
828
+
829
+ Chosen.prototype.show_search_field_default = function() {
830
+ if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
831
+ this.search_field.val(this.default_text);
832
+ return this.search_field.addClass("default");
833
+ } else {
834
+ this.search_field.val("");
835
+ return this.search_field.removeClass("default");
836
+ }
837
+ };
838
+
839
+ Chosen.prototype.search_results_mouseup = function(evt) {
840
+ var target;
841
+
842
+ target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
843
+ if (target.length) {
844
+ this.result_highlight = target;
845
+ this.result_select(evt);
846
+ return this.search_field.focus();
847
+ }
848
+ };
849
+
850
+ Chosen.prototype.search_results_mouseover = function(evt) {
851
+ var target;
852
+
853
+ target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
854
+ if (target) {
855
+ return this.result_do_highlight(target);
856
+ }
857
+ };
858
+
859
+ Chosen.prototype.search_results_mouseout = function(evt) {
860
+ if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
861
+ return this.result_clear_highlight();
862
+ }
863
+ };
864
+
865
+ Chosen.prototype.choice_build = function(item) {
866
+ var choice, close_link,
867
+ _this = this;
868
+
869
+ choice = $('<li />', {
870
+ "class": "search-choice"
871
+ }).html("<span>" + item.html + "</span>");
872
+ if (item.disabled) {
873
+ choice.addClass('search-choice-disabled');
874
+ } else {
875
+ close_link = $('<a />', {
876
+ "class": 'search-choice-close',
877
+ 'data-option-array-index': item.array_index
878
+ });
879
+ close_link.bind('click.chosen', function(evt) {
880
+ return _this.choice_destroy_link_click(evt);
881
+ });
882
+ choice.append(close_link);
883
+ }
884
+ return this.search_container.before(choice);
885
+ };
886
+
887
+ Chosen.prototype.choice_destroy_link_click = function(evt) {
888
+ evt.preventDefault();
889
+ evt.stopPropagation();
890
+ if (!this.is_disabled) {
891
+ return this.choice_destroy($(evt.target));
892
+ }
893
+ };
894
+
895
+ Chosen.prototype.choice_destroy = function(link) {
896
+ if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
897
+ this.show_search_field_default();
898
+ if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {
899
+ this.results_hide();
900
+ }
901
+ link.parents('li').first().remove();
902
+ return this.search_field_scale();
903
+ }
904
+ };
905
+
906
+ Chosen.prototype.results_reset = function() {
907
+ this.form_field.options[0].selected = true;
908
+ this.selected_option_count = null;
909
+ this.single_set_selected_text();
910
+ this.show_search_field_default();
911
+ this.results_reset_cleanup();
912
+ this.form_field_jq.trigger("change");
913
+ if (this.active_field) {
914
+ return this.results_hide();
915
+ }
916
+ };
917
+
918
+ Chosen.prototype.results_reset_cleanup = function() {
919
+ this.current_selectedIndex = this.form_field.selectedIndex;
920
+ return this.selected_item.find("abbr").remove();
921
+ };
922
+
923
+ Chosen.prototype.result_select = function(evt) {
924
+ var high, item, selected_index;
925
+
926
+ if (this.result_highlight) {
927
+ high = this.result_highlight;
928
+ this.result_clear_highlight();
929
+ if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
930
+ this.form_field_jq.trigger("chosen:maxselected", {
931
+ chosen: this
932
+ });
933
+ return false;
934
+ }
935
+ if (this.is_multiple) {
936
+ high.removeClass("active-result");
937
+ } else {
938
+ if (this.result_single_selected) {
939
+ this.result_single_selected.removeClass("result-selected");
940
+ selected_index = this.result_single_selected[0].getAttribute('data-option-array-index');
941
+ this.results_data[selected_index].selected = false;
942
+ }
943
+ this.result_single_selected = high;
944
+ }
945
+ high.addClass("result-selected");
946
+ item = this.results_data[high[0].getAttribute("data-option-array-index")];
947
+ item.selected = true;
948
+ this.form_field.options[item.options_index].selected = true;
949
+ this.selected_option_count = null;
950
+ if (this.is_multiple) {
951
+ this.choice_build(item);
952
+ } else {
953
+ this.single_set_selected_text(item.text);
954
+ }
955
+ if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
956
+ this.results_hide();
957
+ }
958
+ this.search_field.val("");
959
+ if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
960
+ this.form_field_jq.trigger("change", {
961
+ 'selected': this.form_field.options[item.options_index].value
962
+ });
963
+ }
964
+ this.current_selectedIndex = this.form_field.selectedIndex;
965
+ return this.search_field_scale();
966
+ }
967
+ };
968
+
969
+ Chosen.prototype.single_set_selected_text = function(text) {
970
+ if (text == null) {
971
+ text = this.default_text;
972
+ }
973
+ if (text === this.default_text) {
974
+ this.selected_item.addClass("chosen-default");
975
+ } else {
976
+ this.single_deselect_control_build();
977
+ this.selected_item.removeClass("chosen-default");
978
+ }
979
+ return this.selected_item.find("span").text(text);
980
+ };
981
+
982
+ Chosen.prototype.result_deselect = function(pos) {
983
+ var result_data;
984
+
985
+ result_data = this.results_data[pos];
986
+ if (!this.form_field.options[result_data.options_index].disabled) {
987
+ result_data.selected = false;
988
+ this.form_field.options[result_data.options_index].selected = false;
989
+ this.selected_option_count = null;
990
+ this.result_clear_highlight();
991
+ if (this.results_showing) {
992
+ this.winnow_results();
993
+ }
994
+ this.form_field_jq.trigger("change", {
995
+ deselected: this.form_field.options[result_data.options_index].value
996
+ });
997
+ this.search_field_scale();
998
+ return true;
999
+ } else {
1000
+ return false;
1001
+ }
1002
+ };
1003
+
1004
+ Chosen.prototype.single_deselect_control_build = function() {
1005
+ if (!this.allow_single_deselect) {
1006
+ return;
1007
+ }
1008
+ if (!this.selected_item.find("abbr").length) {
1009
+ this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
1010
+ }
1011
+ return this.selected_item.addClass("chosen-single-with-deselect");
1012
+ };
1013
+
1014
+ Chosen.prototype.get_search_text = function() {
1015
+ if (this.search_field.val() === this.default_text) {
1016
+ return "";
1017
+ } else {
1018
+ return $('<div/>').text($.trim(this.search_field.val())).html();
1019
+ }
1020
+ };
1021
+
1022
+ Chosen.prototype.winnow_results_set_highlight = function() {
1023
+ var do_high, selected_results;
1024
+
1025
+ selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
1026
+ do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
1027
+ if (do_high != null) {
1028
+ return this.result_do_highlight(do_high);
1029
+ }
1030
+ };
1031
+
1032
+ Chosen.prototype.no_results = function(terms) {
1033
+ var no_results_html;
1034
+
1035
+ no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
1036
+ no_results_html.find("span").first().html(terms);
1037
+ return this.search_results.append(no_results_html);
1038
+ };
1039
+
1040
+ Chosen.prototype.no_results_clear = function() {
1041
+ return this.search_results.find(".no-results").remove();
1042
+ };
1043
+
1044
+ Chosen.prototype.keydown_arrow = function() {
1045
+ var next_sib;
1046
+
1047
+ if (this.results_showing && this.result_highlight) {
1048
+ next_sib = this.result_highlight.nextAll("li.active-result").first();
1049
+ if (next_sib) {
1050
+ return this.result_do_highlight(next_sib);
1051
+ }
1052
+ } else {
1053
+ return this.results_show();
1054
+ }
1055
+ };
1056
+
1057
+ Chosen.prototype.keyup_arrow = function() {
1058
+ var prev_sibs;
1059
+
1060
+ if (!this.results_showing && !this.is_multiple) {
1061
+ return this.results_show();
1062
+ } else if (this.result_highlight) {
1063
+ prev_sibs = this.result_highlight.prevAll("li.active-result");
1064
+ if (prev_sibs.length) {
1065
+ return this.result_do_highlight(prev_sibs.first());
1066
+ } else {
1067
+ if (this.choices_count() > 0) {
1068
+ this.results_hide();
1069
+ }
1070
+ return this.result_clear_highlight();
1071
+ }
1072
+ }
1073
+ };
1074
+
1075
+ Chosen.prototype.keydown_backstroke = function() {
1076
+ var next_available_destroy;
1077
+
1078
+ if (this.pending_backstroke) {
1079
+ this.choice_destroy(this.pending_backstroke.find("a").first());
1080
+ return this.clear_backstroke();
1081
+ } else {
1082
+ next_available_destroy = this.search_container.siblings("li.search-choice").last();
1083
+ if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
1084
+ this.pending_backstroke = next_available_destroy;
1085
+ if (this.single_backstroke_delete) {
1086
+ return this.keydown_backstroke();
1087
+ } else {
1088
+ return this.pending_backstroke.addClass("search-choice-focus");
1089
+ }
1090
+ }
1091
+ }
1092
+ };
1093
+
1094
+ Chosen.prototype.clear_backstroke = function() {
1095
+ if (this.pending_backstroke) {
1096
+ this.pending_backstroke.removeClass("search-choice-focus");
1097
+ }
1098
+ return this.pending_backstroke = null;
1099
+ };
1100
+
1101
+ Chosen.prototype.keydown_checker = function(evt) {
1102
+ var stroke, _ref1;
1103
+
1104
+ stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;
1105
+ this.search_field_scale();
1106
+ if (stroke !== 8 && this.pending_backstroke) {
1107
+ this.clear_backstroke();
1108
+ }
1109
+ switch (stroke) {
1110
+ case 8:
1111
+ this.backstroke_length = this.search_field.val().length;
1112
+ break;
1113
+ case 9:
1114
+ if (this.results_showing && !this.is_multiple) {
1115
+ this.result_select(evt);
1116
+ }
1117
+ this.mouse_on_container = false;
1118
+ break;
1119
+ case 13:
1120
+ evt.preventDefault();
1121
+ break;
1122
+ case 38:
1123
+ evt.preventDefault();
1124
+ this.keyup_arrow();
1125
+ break;
1126
+ case 40:
1127
+ evt.preventDefault();
1128
+ this.keydown_arrow();
1129
+ break;
1130
+ }
1131
+ };
1132
+
1133
+ Chosen.prototype.search_field_scale = function() {
1134
+ var div, f_width, h, style, style_block, styles, w, _i, _len;
1135
+
1136
+ if (this.is_multiple) {
1137
+ h = 0;
1138
+ w = 0;
1139
+ style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
1140
+ styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
1141
+ for (_i = 0, _len = styles.length; _i < _len; _i++) {
1142
+ style = styles[_i];
1143
+ style_block += style + ":" + this.search_field.css(style) + ";";
1144
+ }
1145
+ div = $('<div />', {
1146
+ 'style': style_block
1147
+ });
1148
+ div.text(this.search_field.val());
1149
+ $('body').append(div);
1150
+ w = div.width() + 25;
1151
+ div.remove();
1152
+ f_width = this.container.outerWidth();
1153
+ if (w > f_width - 10) {
1154
+ w = f_width - 10;
1155
+ }
1156
+ return this.search_field.css({
1157
+ 'width': w + 'px'
1158
+ });
1159
+ }
1160
+ };
1161
+
1162
+ return Chosen;
1163
+
1164
+ })(AbstractChosen);
1165
+
1166
+}).call(this);
securis/src/main/webapp/js/vendor/jquery.min.js
....@@ -0,0 +1,4 @@
1
+/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
2
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f
3
+}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)
4
+},a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});
securis/src/main/webapp/js/vendor/jquery.min.map
....@@ -0,0 +1 @@
1
+{"version":3,"file":"jquery-1.11.0.min.js","sources":["jquery-1.11.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","deletedIds","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","trim","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","isEmptyObject","key","nodeType","e","ownLast","globalEval","data","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","makeArray","arr","results","Object","inArray","max","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","compile","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","strundefined","MAX_NEGATIVE","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","childNodes","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","parentNode","id","getElementsByTagName","getElementsByClassName","qsa","test","tokenize","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","createElement","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","doc","parent","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","charAt","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","sibling","n","r","targets","closest","l","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","disable","remove","lock","locked","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","body","setTimeout","trigger","off","detach","removeEventListener","completed","detachEvent","event","readyState","frameElement","doScroll","doScrollCheck","inlineBlockNeedsLayout","container","style","cssText","zoom","offsetWidth","deleteExpando","acceptData","noData","rbrace","rmultiDash","dataAttr","parseJSON","isEmptyDataObject","internalData","pvt","thisCache","internalKey","isNode","toJSON","internalRemoveData","cleanData","applet ","embed ","object ","hasData","removeData","_data","_removeData","queue","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","cssExpand","isHidden","el","css","access","chainable","emptyGet","raw","bulk","rcheckableType","fragment","createDocumentFragment","leadingWhitespace","tbody","htmlSerialize","html5Clone","cloneNode","outerHTML","appendChecked","noCloneChecked","checkClone","noCloneEvent","click","eventName","change","focusin","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","prop","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","one","origFn","triggerHandler","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","option","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","getAll","found","fixDefaultChecked","defaultChecked","manipulationTarget","content","disableScript","restoreScript","setGlobalEval","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultSelected","dataAndEvents","deepDataAndEvents","destElements","srcElements","inPage","buildFragment","scripts","selection","wrap","safe","nodes","createTextNode","append","domManip","prepend","insertBefore","before","after","keepData","html","replaceWith","replaceChild","hasScripts","set","iNoClone","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","actualDisplay","display","getDefaultComputedStyle","defaultDisplay","write","close","shrinkWrapBlocksVal","divReset","opacity","cssFloat","backgroundClip","clearCloneStyle","shrinkWrapBlocks","containerStyles","width","rmargin","rnumnonpx","getStyles","curCSS","rposition","getComputedStyle","computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","addGetHookIf","conditionFn","hookFn","condition","reliableHiddenOffsetsVal","boxSizingVal","boxSizingReliableVal","pixelPositionVal","reliableMarginRightVal","reliableHiddenOffsets","tds","isSupported","offsetHeight","boxSizing","computeStyleTests","boxSizingReliable","pixelPosition","reliableMarginRight","marginDiv","marginRight","swap","ralpha","ropacity","rdisplayswap","rnumsplit","rrelNum","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","vendorPropName","capName","origName","showHide","show","hidden","setPositiveNumber","subtract","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","cssHooks","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","$1","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","unit","propHooks","run","percent","eased","duration","step","tween","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","*","createTween","scale","maxIterations","createFxNow","genFx","includeWidth","height","animation","collection","opts","oldfire","dDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","Animation","properties","stopped","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","getSetAttribute","hrefNormalized","checkOn","optSelected","enctype","optDisabled","radioValue","rreturn","valHooks","optionSet","scrollHeight","nodeHook","boolHook","ruseDefault","getSetInput","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","setAttributeNode","createAttribute","coords","contenteditable","rfocusable","rclickable","removeProp","for","class","notxml","tabindex","parseInt","rclass","addClass","classes","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","nonce","rquery","rvalidtokens","JSON","parse","requireNonComma","depth","str","comma","open","Function","parseXML","DOMParser","parseFromString","ActiveXObject","async","loadXML","ajaxLocParts","ajaxLocation","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","firstDataType","ct","finalDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","processData","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","code","status","abort","statusText","finalText","success","method","crossDomain","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serialize","serializeArray","xhr","createStandardXHR","createActiveXHR","xhrId","xhrCallbacks","xhrSupported","cors","username","xhrFields","isAbort","onreadystatechange","responseText","XMLHttpRequest","script","text script","head","scriptCharset","charset","onload","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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"}
securis/src/main/webapp/js/vendor/modernizr-2.6.2.min.js
....@@ -0,0 +1,4 @@
1
+/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
2
+ * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
3
+ */
4
+;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
securis/src/main/webapp/js/vendor/store.js
....@@ -0,0 +1,165 @@
1
+;(function(win){
2
+ var store = {},
3
+ doc = win.document,
4
+ localStorageName = 'localStorage',
5
+ scriptTag = 'script',
6
+ storage
7
+
8
+ store.disabled = false
9
+ store.set = function(key, value) {}
10
+ store.get = function(key) {}
11
+ store.remove = function(key) {}
12
+ store.clear = function() {}
13
+ store.transact = function(key, defaultVal, transactionFn) {
14
+ var val = store.get(key)
15
+ if (transactionFn == null) {
16
+ transactionFn = defaultVal
17
+ defaultVal = null
18
+ }
19
+ if (typeof val == 'undefined') { val = defaultVal || {} }
20
+ transactionFn(val)
21
+ store.set(key, val)
22
+ }
23
+ store.getAll = function() {}
24
+ store.forEach = function() {}
25
+
26
+ store.serialize = function(value) {
27
+ return JSON.stringify(value)
28
+ }
29
+ store.deserialize = function(value) {
30
+ if (typeof value != 'string') { return undefined }
31
+ try { return JSON.parse(value) }
32
+ catch(e) { return value || undefined }
33
+ }
34
+
35
+ // Functions to encapsulate questionable FireFox 3.6.13 behavior
36
+ // when about.config::dom.storage.enabled === false
37
+ // See https://github.com/marcuswestin/store.js/issues#issue/13
38
+ function isLocalStorageNameSupported() {
39
+ try { return (localStorageName in win && win[localStorageName]) }
40
+ catch(err) { return false }
41
+ }
42
+
43
+ if (isLocalStorageNameSupported()) {
44
+ storage = win[localStorageName]
45
+ store.set = function(key, val) {
46
+ if (val === undefined) { return store.remove(key) }
47
+ storage.setItem(key, store.serialize(val))
48
+ return val
49
+ }
50
+ store.get = function(key) { return store.deserialize(storage.getItem(key)) }
51
+ store.remove = function(key) { storage.removeItem(key) }
52
+ store.clear = function() { storage.clear() }
53
+ store.getAll = function() {
54
+ var ret = {}
55
+ store.forEach(function(key, val) {
56
+ ret[key] = val
57
+ })
58
+ return ret
59
+ }
60
+ store.forEach = function(callback) {
61
+ for (var i=0; i<storage.length; i++) {
62
+ var key = storage.key(i)
63
+ callback(key, store.get(key))
64
+ }
65
+ }
66
+ } else if (doc.documentElement.addBehavior) {
67
+ var storageOwner,
68
+ storageContainer
69
+ // Since #userData storage applies only to specific paths, we need to
70
+ // somehow link our data to a specific path. We choose /favicon.ico
71
+ // as a pretty safe option, since all browsers already make a request to
72
+ // this URL anyway and being a 404 will not hurt us here. We wrap an
73
+ // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
74
+ // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
75
+ // since the iframe access rules appear to allow direct access and
76
+ // manipulation of the document element, even for a 404 page. This
77
+ // document can be used instead of the current document (which would
78
+ // have been limited to the current path) to perform #userData storage.
79
+ try {
80
+ storageContainer = new ActiveXObject('htmlfile')
81
+ storageContainer.open()
82
+ storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>')
83
+ storageContainer.close()
84
+ storageOwner = storageContainer.w.frames[0].document
85
+ storage = storageOwner.createElement('div')
86
+ } catch(e) {
87
+ // somehow ActiveXObject instantiation failed (perhaps some special
88
+ // security settings or otherwse), fall back to per-path storage
89
+ storage = doc.createElement('div')
90
+ storageOwner = doc.body
91
+ }
92
+ function withIEStorage(storeFunction) {
93
+ return function() {
94
+ var args = Array.prototype.slice.call(arguments, 0)
95
+ args.unshift(storage)
96
+ // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
97
+ // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
98
+ storageOwner.appendChild(storage)
99
+ storage.addBehavior('#default#userData')
100
+ storage.load(localStorageName)
101
+ var result = storeFunction.apply(store, args)
102
+ storageOwner.removeChild(storage)
103
+ return result
104
+ }
105
+ }
106
+
107
+ // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40
108
+ var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g")
109
+ function ieKeyFix(key) {
110
+ return key.replace(forbiddenCharsRegex, '___')
111
+ }
112
+ store.set = withIEStorage(function(storage, key, val) {
113
+ key = ieKeyFix(key)
114
+ if (val === undefined) { return store.remove(key) }
115
+ storage.setAttribute(key, store.serialize(val))
116
+ storage.save(localStorageName)
117
+ return val
118
+ })
119
+ store.get = withIEStorage(function(storage, key) {
120
+ key = ieKeyFix(key)
121
+ return store.deserialize(storage.getAttribute(key))
122
+ })
123
+ store.remove = withIEStorage(function(storage, key) {
124
+ key = ieKeyFix(key)
125
+ storage.removeAttribute(key)
126
+ storage.save(localStorageName)
127
+ })
128
+ store.clear = withIEStorage(function(storage) {
129
+ var attributes = storage.XMLDocument.documentElement.attributes
130
+ storage.load(localStorageName)
131
+ for (var i=0, attr; attr=attributes[i]; i++) {
132
+ storage.removeAttribute(attr.name)
133
+ }
134
+ storage.save(localStorageName)
135
+ })
136
+ store.getAll = function(storage) {
137
+ var ret = {}
138
+ store.forEach(function(key, val) {
139
+ ret[key] = val
140
+ })
141
+ return ret
142
+ }
143
+ store.forEach = withIEStorage(function(storage, callback) {
144
+ var attributes = storage.XMLDocument.documentElement.attributes
145
+ for (var i=0, attr; attr=attributes[i]; ++i) {
146
+ callback(attr.name, store.deserialize(storage.getAttribute(attr.name)))
147
+ }
148
+ })
149
+ }
150
+
151
+ try {
152
+ var testKey = '__storejs__'
153
+ store.set(testKey, testKey)
154
+ if (store.get(testKey) != testKey) { store.disabled = true }
155
+ store.remove(testKey)
156
+ } catch(e) {
157
+ store.disabled = true
158
+ }
159
+ store.enabled = !store.disabled
160
+
161
+ if (typeof module != 'undefined' && module.exports) { module.exports = store }
162
+ else if (typeof define === 'function' && define.amd) { define(store) }
163
+ else { win.store = store }
164
+
165
+})(this.window || global);
securis/src/main/webapp/js/vendor/store.min.js
....@@ -0,0 +1,2 @@
1
+/* Copyright (c) 2010-2013 Marcus Westin */
2
+(function(e){function o(){try{return r in e&&e[r]}catch(t){return!1}}var t={},n=e.document,r="localStorage",i="script",s;t.disabled=!1,t.set=function(e,t){},t.get=function(e){},t.remove=function(e){},t.clear=function(){},t.transact=function(e,n,r){var i=t.get(e);r==null&&(r=n,n=null),typeof i=="undefined"&&(i=n||{}),r(i),t.set(e,i)},t.getAll=function(){},t.forEach=function(){},t.serialize=function(e){return JSON.stringify(e)},t.deserialize=function(e){if(typeof e!="string")return undefined;try{return JSON.parse(e)}catch(t){return e||undefined}};if(o())s=e[r],t.set=function(e,n){return n===undefined?t.remove(e):(s.setItem(e,t.serialize(n)),n)},t.get=function(e){return t.deserialize(s.getItem(e))},t.remove=function(e){s.removeItem(e)},t.clear=function(){s.clear()},t.getAll=function(){var e={};return t.forEach(function(t,n){e[t]=n}),e},t.forEach=function(e){for(var n=0;n<s.length;n++){var r=s.key(n);e(r,t.get(r))}};else if(n.documentElement.addBehavior){var u,a;try{a=new ActiveXObject("htmlfile"),a.open(),a.write("<"+i+">document.w=window</"+i+'><iframe src="/favicon.ico"></iframe>'),a.close(),u=a.w.frames[0].document,s=u.createElement("div")}catch(f){s=n.createElement("div"),u=n.body}function l(e){return function(){var n=Array.prototype.slice.call(arguments,0);n.unshift(s),u.appendChild(s),s.addBehavior("#default#userData"),s.load(r);var i=e.apply(t,n);return u.removeChild(s),i}}var c=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g");function h(e){return e.replace(c,"___")}t.set=l(function(e,n,i){return n=h(n),i===undefined?t.remove(n):(e.setAttribute(n,t.serialize(i)),e.save(r),i)}),t.get=l(function(e,n){return n=h(n),t.deserialize(e.getAttribute(n))}),t.remove=l(function(e,t){t=h(t),e.removeAttribute(t),e.save(r)}),t.clear=l(function(e){var t=e.XMLDocument.documentElement.attributes;e.load(r);for(var n=0,i;i=t[n];n++)e.removeAttribute(i.name);e.save(r)}),t.getAll=function(e){var n={};return t.forEach(function(e,t){n[e]=t}),n},t.forEach=l(function(e,n){var r=e.XMLDocument.documentElement.attributes;for(var i=0,s;s=r[i];++i)n(s.name,t.deserialize(e.getAttribute(s.name)))})}try{var p="__storejs__";t.set(p,p),t.get(p)!=p&&(t.disabled=!0),t.remove(p)}catch(f){t.disabled=!0}t.enabled=!t.disabled,typeof module!="undefined"&&module.exports?module.exports=t:typeof define=="function"&&define.amd?define(t):e.store=t})(this.window||global)
securis/src/main/webapp/licenses.html
....@@ -0,0 +1,671 @@
1
+
2
+<div ng-include="'header.html'"></div>
3
+
4
+<div class="container">
5
+ <div class="col-md-12">&nbsp;</div>
6
+ <div id="packs_section" class="col-md-6" ng-controller="PacksCtrl">
7
+ <nav class="navbar navbar-default navbar-static-top" role="navigation">
8
+ <div class="container-fluid">
9
+ <!-- Brand and toggle get grouped for better mobile display -->
10
+ <div class="navbar-header">
11
+ <a class="navbar-brand" i18n>Packs</a>
12
+ </div>
13
+
14
+ <!-- Collect the nav links, forms, and other content for toggling -->
15
+ <div class="collapse navbar-collapse">
16
+ <ul class="nav navbar-nav">
17
+ <li><a i18n ng-click="newPack()"><span
18
+ class="glyphicon glyphicon-plus"></span> New</a></li>
19
+ <li><a i18n ng-click="cancel()"> <span
20
+ class="glyphicon glyphicon-ban-circle"></span> Cancel
21
+ </a></li>
22
+ </ul>
23
+ <div class="navbar-form navbar-right form-group">
24
+ <span class="input-group input-group-sm">
25
+ <div class="input-group-addon" style="width: 28px;">
26
+ <span class=" glyphicon glyphicon-search"></span>
27
+ </div> <input type="text" class="form-control" placeholder="Search"
28
+ ng-model="$searchPacksText">
29
+ <div class="input-group-addon" style="width: 20px;">
30
+ <span class=" glyphicon glyphicon-remove"
31
+ ng-click="$searchPacksText = '';"></span>
32
+ </div>
33
+ </span>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </nav>
38
+
39
+ <div class="panel panel-default animate-show ng-hide"
40
+ ng-show="showForm">
41
+ <form role="form" class="form-horizontal " name="packForm"
42
+ id="packForm" ng-submit="save()">
43
+ <div class="form-group" ng-if="!isNew">
44
+ <label class="col-md-3 control-label">ID</label>
45
+ <div class="col-md-8">
46
+ <p class="form-control-static" ng-bind="pack.id"></p>
47
+ </div>
48
+ </div>
49
+ <div class="form-group">
50
+ <label class="col-md-3 control-label" for="code" i18n>Code</label>
51
+ <div class="col-md-8">
52
+ <input type="string" id="code" name="code" placeholder=""
53
+ class="form-control" ng-model="pack.code"
54
+ ng-required="mandatory.code" ng-maxlength="{{maxlength.code}}" />
55
+ <div class="alert inline-alert alert-warning"
56
+ ng-show="packForm.code.$invalid">
57
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
58
+ ng-show="packForm.code.$error.maxlength"
59
+ ng-bind="maxlengthErrorMsg('Code', maxlength.code)"></span> <span
60
+ ng-show="packForm.code.$error.required"
61
+ ng-bind="mandatoryFieldErrorMsg('Code')"></span>
62
+ </div>
63
+ </div>
64
+ </div>
65
+
66
+ <div class="form-group">
67
+ <label class="col-md-3 control-label" for="code" i18n>Validity (from - to)</label>
68
+ <div class="col-md-4">
69
+ <input type="date" id="init_valid_date" name="init_valid_date" placeholder=""
70
+ class="form-control" ng-model="pack.init_valid_date"
71
+ ng-required="mandatory.init_valid_date" />
72
+ <div class="alert inline-alert alert-warning"
73
+ ng-show="packForm.initValidDate.$invalid">
74
+ <span class="glyphicon glyphicon-warning-sign"></span>
75
+ <span ng-show="packForm.init_valid_date.$error.required"
76
+ ng-bind="mandatoryFieldErrorMsg('Init valid date')"></span>
77
+ </div>
78
+ </div>
79
+ <div class="col-md-4">
80
+ <input type="date" id="end_valid_date" name="end_valid_date" placeholder=""
81
+ class="form-control" ng-model="pack.end_valid_date"
82
+ min="{{pack.init_valid_date | date: 'yyyy-MM-dd'}}"
83
+ ng-required="mandatory.end_valid_date" />
84
+ <div class="alert inline-alert alert-warning"
85
+ ng-show="packForm.end_valid_date.$invalid">
86
+ <span class="glyphicon glyphicon-warning-sign"></span>
87
+ <span ng-show="packForm.end_valid_date.$error.required"
88
+ ng-bind="mandatoryFieldErrorMsg('End valid date')"></span>
89
+ <span ng-show="packForm.end_valid_date.$error.min"
90
+ ng-bind="field1ShouldBeGreaterThanField2('End date', 'Init date')"></span>
91
+ </div>
92
+ </div>
93
+ </div>
94
+
95
+ <div class="form-group">
96
+ <label class="col-md-3 control-label" for="num_licenses" i18n>Num.
97
+ Licenses</label>
98
+ <div class="col-md-8">
99
+ <input type="number" id="num_licenses" name="num_licenses"
100
+ placeholder="" class="form-control" ng-model="pack.num_licenses"
101
+ ng-required="mandatory.num_licenses" />
102
+ <div class="alert inline-alert alert-warning"
103
+ ng-show="packForm.num_licenses.$invalid">
104
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
105
+ ng-show="packForm.num_licenses.$error.maxlength"
106
+ ng-bind="maxlengthErrorMsg('Num. Licenses', maxlength.num_licenses)"></span>
107
+ <span ng-show="packForm.num_licenses.$error.required"
108
+ ng-bind="mandatoryFieldErrorMsg('Num. Licenses')"></span>
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ <div class="form-group" ng-if="!isNew">
114
+ <label class="col-md-3 control-label" for="status" i18n>Status</label>
115
+ <div class="col-md-8">
116
+ <p class="form-control-static" ng-bind="pack.status_name"></p>
117
+ <div class="alert inline-alert alert-warning"
118
+ ng-show="packForm.status.$invalid">
119
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
120
+ ng-show="packForm.status.$error.required"
121
+ ng-bind="mandatoryFieldErrorMsg('Status')"></span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+ <div class="form-group">
127
+ <label class="col-md-3 control-label" for="license_type_id" i18n>License
128
+ type</label>
129
+ <div class="col-md-8">
130
+ <select ng-if="isNew" class="form-control" id="license_type_id"
131
+ ng-change="updateMetadata()"
132
+ ng-required="mandatory.license_type_id"
133
+ ng-model="pack.license_type_id"
134
+ ng-options="o.id as o.label for o in refs.license_type_id">
135
+ </select>
136
+ <p ng-if="!isNew" class="form-control-static" ng-bind="pack.license_type_name"></p>
137
+ <div class="alert inline-alert alert-warning"
138
+ ng-show="packForm.license_type_id.$invalid">
139
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
140
+ ng-show="packForm.license_type_id.$error.required"
141
+ ng-bind="mandatoryFieldErrorMsg('License type')"></span>
142
+ </div>
143
+ </div>
144
+ </div>
145
+
146
+ <div class="form-group">
147
+ <label class="col-md-3 control-label" for="organization_id" i18n>Organization</label>
148
+ <div class="col-md-8">
149
+ <select ng-if="isNew" class="form-control"
150
+ ng-model="pack.organization_id"
151
+ ng-required="mandatory.organization_id"
152
+ ng-options="o.id as o.label for o in refs.organization_id">
153
+ </select>
154
+ <p ng-if="!isNew" class="form-control-static" ng-bind="pack.organization_name"></p>
155
+ <div class="alert inline-alert alert-warning"
156
+ ng-show="packForm.organization_id.$invalid">
157
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
158
+ ng-show="packForm.organization_id.$error.required"
159
+ ng-bind="mandatoryFieldErrorMsg('Organization')"></span>
160
+ </div>
161
+ </div>
162
+ </div>
163
+ <div class="form-group">
164
+ <label class="col-md-3 control-label" for="license_preactivation"
165
+ i18n>License preactivation</label>
166
+ <div class="col-md-8">
167
+ <input type="checkbox" class="form-control"
168
+ ng-model="pack.license_preactivation" />
169
+ </div>
170
+ </div>
171
+ <div class="form-group">
172
+ <label class="col-md-3 control-label" for="license_preactivation"
173
+ i18n>Default valid period (days)</label>
174
+ <div class="col-md-8">
175
+ <input type="number" id="default_valid_period" name="default_valid_period"
176
+ min="1" class="form-control" ng-model="pack.default_valid_period"
177
+ ng-required="pack.license_preactivation" />
178
+ <div class="alert inline-alert alert-warning"
179
+ ng-show="packForm.default_valid_period.$invalid">
180
+ <span class="glyphicon glyphicon-warning-sign"></span>
181
+ <span ng-show="packForm.default_valid_period.$error.required"
182
+ ng-bind="mandatoryFieldErrorMsg('Default valid period')"></span>
183
+ <span ng-show="packForm.default_valid_period.$error.min"
184
+ ng-bind="field1ShouldBeGreaterThanField2('The default valid period', '0')"></span>
185
+ </div>
186
+ </div>
187
+ </div>
188
+
189
+
190
+ <div class="form-group">
191
+ <label class="col-md-3 control-label" for="comments" i18n>Comments</label>
192
+ <div class="col-md-8">
193
+ <textarea type="string" id="comments" name="comments"
194
+ placeholder="" class="form-control" ng-model="pack.comments"
195
+ rows="2" ng-required="mandatory.comments"
196
+ ng-maxlength="{{maxlength.comments}}"></textarea>
197
+ <div class="alert inline-alert alert-warning"
198
+ ng-show="packForm.comments.$invalid">
199
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
200
+ ng-show="packForm.comments.$error.maxlength"
201
+ ng-bind="maxlengthErrorMsg('Comments', maxlength.comments)"></span>
202
+ <span ng-show="packForm.comments.$error.required"
203
+ ng-bind="mandatoryFieldErrorMsg('comments')"></span>
204
+ </div>
205
+ </div>
206
+ </div>
207
+
208
+ <div class="form-group" ng-if="!isNew">
209
+ <label i18n class="col-md-3 control-label">Created by</label>
210
+ <div class="col-md-8">
211
+ <p class="form-control-static" ng-bind="pack.created_by_name"></p>
212
+ </div>
213
+ </div>
214
+
215
+ <div class="form-group" ng-if="!isNew">
216
+ <label i18n class="col-md-3 control-label">Creation date</label>
217
+ <div class="col-md-8">
218
+ <p class="form-control-static"
219
+ ng-bind="pack.creation_timestamp | date:'medium'"></p>
220
+ </div>
221
+ </div>
222
+
223
+ <div class="form-group">
224
+ <label class="col-md-3 control-label" i18n>Metadata</label>
225
+ <div class="col-md-8">
226
+ <table class="table table-hover table-condensed">
227
+ <thead>
228
+ <tr>
229
+ <th i18n>Key</th>
230
+ <th i18n>Value</th>
231
+ </tr>
232
+ </thead>
233
+ <tbody>
234
+ <tr ng-repeat="row_md in pack.metadata">
235
+ <td><input type="text" id="md_key" name="md_key"
236
+ placeholder="" ng-readonly="true"
237
+ class="form-control" ng-model="row_md['key']"
238
+ ng-required="true" /></td>
239
+ <td><input type="text" id="md_value" name="md_value" ng-readonly="row_md['readonly']"
240
+ placeholder="" class="form-control" ng-model="row_md['value']"
241
+ ng-required="row_md['mandatory']" ng-maxlength="150" /></td>
242
+ </tr>
243
+ </tbody>
244
+ </table>
245
+ </div>
246
+ </div>
247
+
248
+ <div class="form-group">
249
+ <div class="col-md-offset-3 col-md-10 " id="saveContainer">
250
+ <button id="save" type="submit" class="btn btn-primary">
251
+ <span i18n class="glyphicon glyphicon-floppy-disk"></span> Save
252
+ </button>
253
+ <button ng-if="!isNew" id="acc" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
254
+ <span i18n class="glyphicon glyphicon-align-justify"></span> Actions
255
+ <span class="caret"></span>
256
+ </button>
257
+ <ul class="dropdown-menu" role="menu">
258
+ <li><a ng-click="execute('activate')" ng-if="Packs.isActionAvailable('activate', pack)" href="#" >Activate</a></li>
259
+ <li><a ng-click="execute('putonhold')" ng-if="Packs.isActionAvailable('putonhold', pack)" href="#">Put on hold</a></li>
260
+ <li class="divider"></li>
261
+ <li><a ng-click="execute('cancel')" ng-if="Packs.isActionAvailable('cancel', pack)" href="#">Cancel</a></li>
262
+ <li><a ng-click="execute('delete')" ng-if="Packs.isActionAvailable('delete', pack)" href="#">Delete</a></li>
263
+ </ul>
264
+ </div>
265
+ </div>
266
+ </form>
267
+ </div>
268
+
269
+ <div class="panel panel-default">
270
+ <div class="panel-heading">
271
+ Packs <span class="badge pull-right" ng-bind="packs.length || 0"></span>
272
+ </div>
273
+
274
+ <table class="table table-hover table-condensed">
275
+ <thead>
276
+ <tr>
277
+ <th i18n>Code</th>
278
+ <th i18n>Organization</th>
279
+ <th i18n>Application</th>
280
+ <th i18n>Licenses</th>
281
+ <th></th>
282
+ </tr>
283
+ </thead>
284
+ <tbody>
285
+ <tr ng-repeat="p in packs | filter:searchText"
286
+ ng-dblclick="editPack(p)"
287
+ ng-class="{success: currentPack.id === p.id}"
288
+ ng-click="selectPack(p)">
289
+ <td style="white-space: nowrap;" ng-bind="p.code"></td>
290
+ <td ng-bind="ellipsis(p.organization_name, 20)"
291
+ title="{{pack.organization_name}}"></td>
292
+ <td ng-bind="p.application_name"></td>
293
+ <td
294
+ title="Total: {{p.num_licenses}}, available: {{p.num_available}}">{{p.num_licenses}}
295
+ ({{p.num_available}})</td>
296
+ <td>
297
+ <div class="dropdown">
298
+ <a class="dropdown-toggle" data-toggle="dropdown"> <span
299
+ class="glyphicon glyphicon-align-justify" style="color: {{Packs.getStatusColor(p.status)}}"></span>
300
+ <span style="color: {{Packs.getStatusColor(p.status)}}" class="caret"></span>
301
+ </a>
302
+ <ul class="dropdown-menu">
303
+ <li ng-if="Packs.isActionAvailable('edit', p)"><a
304
+ ng-click="editPack(p)"><span
305
+ class="glyphicon glyphicon-pencil"></span> <span i18n>Edit</span></a></li>
306
+ <li ng-if="Packs.isActionAvailable('activate', p)"><a
307
+ ng-click="execute('activate', p)"><span
308
+ class="glyphicon glyphicon-check"></span> <span i18n>Activate</span></a></li>
309
+ <li ng-if="Packs.isActionAvailable('putonhold', p)"><a
310
+ ng-click="execute('putonhold', p)"><span
311
+ class="glyphicon glyphicon-pause"></span> <span i18n>Put on hold</span></a></li>
312
+ <li ng-if="Packs.isActionAvailable('cancel', p)"><a
313
+ ng-click="execute('cancel', p)"><span
314
+ class="glyphicon glyphicon-ban-circle"></span> <span i18n>Cancel</span></a></li>
315
+ <li ng-if="Packs.isActionAvailable('delete', p)"><a
316
+ ng-click="execute('delete', p)"><span
317
+ class="glyphicon glyphicon-trash"></span> <span i18n>Delete</span></a></li>
318
+ </ul>
319
+ </div>
320
+ </td>
321
+ </tr>
322
+ </tbody>
323
+ <tfoot>
324
+ </tfoot>
325
+ </table>
326
+ </div>
327
+
328
+ </div>
329
+ <div id="licenses_section" class="col-md-6"
330
+ ng-controller="LicensesCtrl">
331
+ <nav class="navbar navbar-default navbar-static-top"
332
+ ng-disabled="!currentPack">
333
+ <div class="container-fluid">
334
+ <!-- Brand and toggle get grouped for better mobile display -->
335
+ <div class="navbar-header success">
336
+ <a class="navbar-brand" i18n>Licenses</a>
337
+ </div>
338
+
339
+ <!-- Collect the nav links, forms, and other content for toggling -->
340
+ <div class="collapse navbar-collapse"
341
+ id="bs-example-navbar-collapse-1">
342
+ <ul class="nav navbar-nav">
343
+ <li><a i18n ng-click="newLicense()"><span
344
+ class="glyphicon glyphicon-plus"></span> New</a></li>
345
+ <li><a i18n ng-click="cancel()"> <span
346
+ class="glyphicon glyphicon-ban-circle"></span> Cancel
347
+ </a></li>
348
+ </ul>
349
+ <div class="navbar-form navbar-right form-group">
350
+ <span class="input-group input-group-sm">
351
+ <div class="input-group-addon" style="width: 28px;">
352
+ <span class=" glyphicon glyphicon-search"></span>
353
+ </div> <input type="text" class="form-control" placeholder="Search"
354
+ ng-model="$searchLicensesText">
355
+ <div class="input-group-addon" style="width: 20px;">
356
+ <span class=" glyphicon glyphicon-remove"
357
+ ng-click="$searchLicensesText = '';"></span>
358
+ </div>
359
+ </span>
360
+ </div>
361
+ </div>
362
+ </div>
363
+ </nav>
364
+
365
+ <div ng-if="!currentPack" class="well well-lg">
366
+ <h4 i18n>No pack selected</h4>
367
+ <p i18n>Please, select a pack to manage its licenses</p>
368
+ </div>
369
+
370
+ <div ng-if="currentPack"
371
+ class="panel panel-default animate-show ng-hide" ng-show="showForm">
372
+ <form role="form" class="form-horizontal " name="licenseForm"
373
+ id="licenseForm" ng-submit="save()">
374
+ <div class="form-group" ng-if="!isNew">
375
+ <label class="col-md-3 control-label">ID</label>
376
+ <div class="col-md-8">
377
+ <p class="form-control-static" ng-bind="license.id"></p>
378
+ </div>
379
+ </div>
380
+ <div class="form-group">
381
+ <label class="col-md-3 control-label" for="pack_id" i18n>Pack</label>
382
+ <div class="col-md-8">
383
+ <p class="form-control-static" ng-bind="currentPack.code"></p>
384
+ <input type="hidden" id="pack_id" name="pack_id"
385
+ ng-model="license.pack_id" />
386
+ </div>
387
+ </div>
388
+ <div class="form-group">
389
+ <label class="col-md-3 control-label" for="code" i18n>Code</label>
390
+ <div class="col-md-8">
391
+ <input type="string" id="code" name="code" placeholder=""
392
+ class="form-control" ng-model="license.code"
393
+ ng-required="mandatory.code" ng-maxlength="{{maxlength.code}}" />
394
+ <div class="alert inline-alert alert-warning"
395
+ ng-show="licenseForm.code.$invalid">
396
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
397
+ ng-show="licenseForm.code.$error.maxlength"
398
+ ng-bind="maxlengthErrorMsg('Code', maxlength.code)"></span> <span
399
+ ng-show="licenseForm.code.$error.required"
400
+ ng-bind="mandatoryFieldErrorMsg('Code')"></span>
401
+ </div>
402
+ </div>
403
+ </div>
404
+ <div class="form-group" ng-if="!isNew">
405
+ <label class="col-md-3 control-label" i18n>Status</label>
406
+ <div class="col-md-8">
407
+ <p class="form-control-static" ng-bind="showStatusLong(license)"></p>
408
+ </div>
409
+ </div>
410
+
411
+ <div class="form-group">
412
+ <label class="col-md-3 control-label" for="full_name" i18n>User
413
+ full name</label>
414
+ <div class="col-md-8">
415
+ <input type="string" id="full_name" name="full_name"
416
+ placeholder="" class="form-control" ng-model="license.full_name"
417
+ ng-required="mandatory.full_name" />
418
+ <div class="alert inline-alert alert-warning"
419
+ ng-show="licenseForm.full_name.$invalid">
420
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
421
+ ng-show="licenseForm.full_name.$error.maxlength"
422
+ ng-bind="maxlengthErrorMsg('User full name', maxlength.full_name)"></span>
423
+ <span ng-show="licenseForm.full_name.$error.required"
424
+ ng-bind="mandatoryFieldErrorMsg('User full name')"></span>
425
+ </div>
426
+ </div>
427
+ </div>
428
+
429
+ <div class="form-group">
430
+ <label class="col-md-3 control-label" for="email" i18n>User
431
+ email</label>
432
+ <div class="col-md-8">
433
+ <input type="email" id="email" name="email" placeholder=""
434
+ class="form-control" ng-model="license.email"
435
+ ng-required="mandatory.email" />
436
+ <div class="alert inline-alert alert-warning"
437
+ ng-show="licenseForm.email.$invalid">
438
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
439
+ ng-show="licenseForm.email.$error.email"
440
+ ng-bind="'Please, write a valid email address'"></span> <span
441
+ ng-show="licenseForm.email.$error.maxlength"
442
+ ng-bind="maxlengthErrorMsg('User email', maxlength.email)"></span>
443
+ <span ng-show="licenseForm.email.$error.required"
444
+ ng-bind="mandatoryFieldErrorMsg('User email')"></span>
445
+ </div>
446
+ </div>
447
+ </div>
448
+ <div class="form-group" ng-if="isNew || !license.request_data">
449
+ <label class="col-md-3 control-label" for="request_data" i18n>Request
450
+ data</label>
451
+ <div class="col-md-7">
452
+ <textarea id="request_data" name="request_data" placeholder=""
453
+ class="form-control" ng-model="license.request_data" rows="2"
454
+ ng-required="mandatory.request_data"
455
+ ng-maxlength="{{maxlength.request_data}}"></textarea>
456
+ <div class="alert inline-alert alert-warning"
457
+ ng-show="licenseForm.request_data.$invalid">
458
+ Invalid ? {{licenseForm.request_data.$invalid}}
459
+ Error ? {{licenseForm.request_data.$error | json}}
460
+ Error ? {{licenseForm.request_data.$error.maxlength}}
461
+ <span class="glyphicon glyphicon-warning-sign">
462
+ <span
463
+ ng-show="licenseForm.request_data.$error.maxlength"
464
+ ng-bind="maxlengthErrorMsg('Request data', maxlength.request_data)"></span>
465
+ <span ng-show="licenseForm.request_data.$error.required"
466
+ ng-bind="mandatoryFieldErrorMsg('Request data')"></span>
467
+ </span>
468
+ </div>
469
+ </div>
470
+ <span class="btn btn-file btn-default btn-xs">
471
+ <span class="glyphicon glyphicon-folder-open"></span>
472
+ <input file-loader="license.request_data" type="file" />
473
+ </span>
474
+ </div>
475
+
476
+ <div class="form-group">
477
+ <label class="col-md-3 control-label" for="comments" i18n>Comments</label>
478
+ <div class="col-md-8">
479
+ <textarea type="string" id="comments" name="comments"
480
+ placeholder="" class="form-control" ng-model="license.comments"
481
+ rows="2" ng-required="mandatory.comments"
482
+ ng-maxlength="{{maxlength.comments}}"></textarea>
483
+
484
+ <div class="alert inline-alert alert-warning"
485
+ ng-show="licenseForm.comments.$invalid">
486
+ <span class="glyphicon glyphicon-warning-sign"></span> <span
487
+ ng-show="licenseForm.comments.$error.maxlength"
488
+ ng-bind="maxlengthErrorMsg('Comments', maxlength.comments)"></span>
489
+ <span ng-show="licenseForm.comments.$error.required"
490
+ ng-bind="mandatoryFieldErrorMsg('comments')"></span>
491
+ </div>
492
+ </div>
493
+ </div>
494
+
495
+ <div class="form-group" ng-if="!isNew && license.request_data">
496
+ <label class="col-md-3 control-label" i18n>Request data</label>
497
+ <div class="col-md-8">
498
+ <pre class="form-control-static"
499
+ ng-bind="license.request_data | json"></pre>
500
+ </div>
501
+ </div>
502
+
503
+ <div class="form-group" ng-if="!isNew && license.license_data">
504
+ <label class="col-md-3 control-label" i18n>License file</label>
505
+ <div class="col-md-8">
506
+ <p class="form-control-static" ng-bind="license.license_data"></p>
507
+ <button id="downloadLicense" class="btn btn-xs btn-link"
508
+ ng-click="downloadLicense(license)">
509
+ <span i18n class="glyphicon glyphicon-download"></span>
510
+ </button>
511
+ </div>
512
+ </div>
513
+
514
+ <div class="form-group" ng-if="!isNew">
515
+ <label class="col-md-3 control-label" i18n>Created by</label>
516
+ <div class="col-md-8">
517
+ <p class="form-control-static" ng-bind="license.created_by_name"></p>
518
+ </div>
519
+ </div>
520
+
521
+ <div class="form-group" ng-if="!isNew && license.canceled_by_name">
522
+ <label class="col-md-3 control-label">Canceled by</label>
523
+ <div class="col-md-8">
524
+ <p class="form-control-static" ng-bind="license.canceled_by_name"></p>
525
+ </div>
526
+ </div>
527
+
528
+ <div class="form-group" ng-if="!isNew">
529
+ <label class="col-md-3 control-label" i18n>Creation date</label>
530
+ <div class="col-md-8">
531
+ <p class="form-control-static"
532
+ ng-bind="license.creation_timestamp | date:'medium'"></p>
533
+ </div>
534
+ </div>
535
+
536
+ <div class="form-group" ng-if="!isNew">
537
+ <label class="col-md-3 control-label" i18n>Modification
538
+ date</label>
539
+ <div class="col-md-8">
540
+ <p class="form-control-static"
541
+ ng-bind="license.modificationTimestamp | date:'medium'"></p>
542
+ </div>
543
+ </div>
544
+
545
+ <div class="form-group"
546
+ ng-if="!isNew && license.activationTimestamp">
547
+ <label class="col-md-3 control-label" i18n>Activation date</label>
548
+ <div class="col-md-8">
549
+ <p class="form-control-static"
550
+ ng-bind="license.activationTimestamp | date:'medium'"></p>
551
+ </div>
552
+ </div>
553
+
554
+ <div class="form-group" ng-if="!isNew && license.sendTimestamp">
555
+ <label class="col-md-3 control-label" i18n>Send date</label>
556
+ <div class="col-md-8">
557
+ <p class="form-control-static"
558
+ ng-bind="license.sendTimestamp | date:'medium'"></p>
559
+ </div>
560
+ </div>
561
+
562
+ <div class="form-group"
563
+ ng-if="!isNew && license.cancelationTimestamp">
564
+ <label class="col-md-3 control-label" i18n>Cancelation date</label>
565
+ <div class="col-md-8">
566
+ <p class="form-control-static"
567
+ ng-bind="license.cancelationTimestamp | date:'medium'"></p>
568
+ </div>
569
+ </div>
570
+
571
+ <div class="form-group"
572
+ ng-if="!isNew && license.lastAccessTimestamp">
573
+ <label class="col-md-3 control-label" i18n>Last access date</label>
574
+ <div class="col-md-8">
575
+ <p class="form-control-static"
576
+ ng-bind="license.lastAccessTimestamp | date:'medium'"></p>
577
+ </div>
578
+ </div>
579
+
580
+ <div class="form-group">
581
+ <div class="col-md-offset-3 col-md-9" id="saveContainer">
582
+ <button id="save" type="submit" class="btn btn-primary">
583
+ <span i18n class="glyphicon glyphicon-floppy-disk"></span> Save
584
+ </button>
585
+ <button ng-if="!isNew" id="acc" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
586
+ <span i18n class="glyphicon glyphicon-align-justify"></span> Actions
587
+ <span class="caret"></span>
588
+ </button>
589
+ <ul class="dropdown-menu" role="menu">
590
+ <li ng-if="Licenses.isActionAvailable('activate', license)"><a ng-click="execute('activate', license)" href="#">Activate</a></li>
591
+ <li ng-if="Licenses.isActionAvailable('download', license)"><a ng-click="execute('download', license)" href="#">Download</a></li>
592
+ <li ng-if="Licenses.isActionAvailable('send', license)"><a ng-click="execute('send', license)" href="#">Send by email</a></li>
593
+ <li ng-if="Licenses.isActionAvailable('cancel', license)"><a ng-click="execute('cancel', license)" href="#">Cancel</a></li>
594
+ <li ng-if="Licenses.isActionAvailable('delete', license)"><a ng-click="execute('delete', license)" href="#">Delete</a></li>
595
+ </ul>
596
+
597
+ </div>
598
+ </div>
599
+ </form>
600
+ </div>
601
+
602
+ <div class="panel panel-default" ng-if="currentPack">
603
+ <div class="panel-heading">
604
+ <span i18n>Licenses for pack: </span>{{currentPack.code}} <span
605
+ style="color: lightgreen;" class="badge pull-right"
606
+ ng-bind="currentPack.lic_available || 0"></span> <span
607
+ class="badge pull-right" ng-bind="licenses.length || 0"></span>
608
+ </div>
609
+
610
+
611
+ <table class="table table-hover table-condensed">
612
+ <thead>
613
+ <tr>
614
+ <th i18n>License code</th>
615
+ <th i18n>User fullname</th>
616
+ <th i18n>Email</th>
617
+ <th i18n>Status</th>
618
+ <th></th>
619
+ </tr>
620
+ </thead>
621
+ <tbody>
622
+ <tr ng-repeat="lic in licenses | filter:searchLicenseText"
623
+ ng-dblclick="editLicense(lic)">
624
+ <td style="white-space: nowrap;" ng-bind="lic.code"></td>
625
+ <td ng-bind="ellipsis(lic.full_name, 20)"
626
+ title="{{lic.full_name}}"></td>
627
+ <td ng-bind="ellipsis(lic.email, 30)" title="{{lic.email}}"></td>
628
+ <td ng-bind="showStatus(lic.status)"></td>
629
+ <td>
630
+ <div class="dropdown">
631
+ <a class="dropdown-toggle" data-toggle="dropdown"> <span
632
+ class="glyphicon glyphicon-align-justify" style="color: {{Licenses.getStatusColor(lic.status)}}"></span>
633
+ <span style="color: {{Licenses.getStatusColor(lic.status)}}" class="caret"></span>
634
+ </a>
635
+ <ul class="dropdown-menu">
636
+ <li ng-if="Licenses.isActionAvailable('download', lic)"><a
637
+ ng-click="execute('download', lic)"><span
638
+ class="glyphicon glyphicon-download"></span> <span i18n>Download</span></a></li>
639
+ <li ng-if="Licenses.isActionAvailable('edit', lic)"><a
640
+ ng-click="editLicense(lic)"><span
641
+ class="glyphicon glyphicon-pencil"></span> <span i18n>Edit</span></a></li>
642
+ <li ng-if="Licenses.isActionAvailable('activate', lic)"><a
643
+ ng-click="execute('activate', lic)"><span
644
+ class="glyphicon glyphicon-check"></span> <span i18n>Activate</span></a></li>
645
+ <li ng-if="Licenses.isActionAvailable('send', lic)"><a
646
+ ng-click="execute('send', lic)"><span
647
+ class="glyphicon glyphicon-send"></span> <span i18n>Send email</span></a></li>
648
+ <li ng-if="Licenses.isActionAvailable('block', lic)"><a
649
+ ng-click="execute('block', lic)"><span
650
+ class="glyphicon glyphicon-exclamation-sign"></span> <span i18n>Block</span></a></li>
651
+ <li ng-if="Licenses.isActionAvailable('unblock', lic)"><a
652
+ ng-click="execute('unblock', lic)"><span
653
+ class="glyphicon glyphicon-ok-sign"></span> <span i18n>Unblock</span></a></li>
654
+ <li ng-if="Licenses.isActionAvailable('cancel', lic)"><a
655
+ ng-click="execute('cancel', lic)"><span
656
+ class="glyphicon glyphicon-ban-circle"></span> <span i18n>Cancel</span></a></li>
657
+ <li ng-if="Licenses.isActionAvailable('delete', lic)"><a
658
+ ng-click="execute('delete', lic)"><span
659
+ class="glyphicon glyphicon-trash"></span> <span i18n>Delete</span></a></li>
660
+ </ul>
661
+ </div>
662
+ </td>
663
+ </tr>
664
+ </tbody>
665
+ <tfoot>
666
+ </tfoot>
667
+ </table>
668
+ </div>
669
+
670
+ </div>
671
+</div>
securis/src/main/webapp/login.html
....@@ -0,0 +1,60 @@
1
+
2
+ <div class="navbar navbar-inverse navbar-fixed-top">
3
+ <div class="container">
4
+ <div class="navbar-header">
5
+ <button type="button" class="navbar-toggle" data-toggle="collapse"
6
+ data-target=".navbar-collapse">
7
+ <span class="icon-bar"></span> <span class="icon-bar"></span> <span
8
+ class="icon-bar"></span>
9
+ </button>
10
+ <a i18n class="navbar-brand" href="#">SeCuris</a>
11
+ </div>
12
+ <div class="navbar-collapse collapse">
13
+ <ul class="nav navbar-nav navbar-right">
14
+ <li><a i18n href="#about">About</a></li>
15
+ <li><a i18n href="#contact">Contact</a></li>
16
+ </ul>
17
+ </div>
18
+ </div>
19
+ </div>
20
+
21
+ <!-- Main jumbotron for a primary marketing message or call to action -->
22
+ <div class="jumbotron">
23
+ <div class="container">
24
+ <h2 i18n >SeCuris</h2>
25
+ <p i18n >Server License for CurisTEC products.</p>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="container">
30
+ <div class="col-md-8 col-md-offset-2">
31
+ <form role="form" class="form-horizontal"
32
+ ng-submit="submit()" name="loginForm">
33
+ <p i18n class="lead">Sign in SeCuris</p>
34
+ <fieldset>
35
+ <div class="form-group">
36
+ <label i18n class="col-md-3 control-label" for="username">Username</label>
37
+ <div class="col-md-5">
38
+ <input type="text" id="username" name="username" placeholder=""
39
+ class="form-control" ng-model="username" required>
40
+ </div>
41
+ </div>
42
+ <div class="form-group">
43
+ <!-- Password-->
44
+ <label i18n class="col-md-3 control-label" for="password">Password</label>
45
+ <div class="col-md-5">
46
+ <input type="password" id="password" name="password"
47
+ placeholder="" class="form-control" ng-model="password" required>
48
+ </div>
49
+ </div>
50
+ <div class="form-group">
51
+ <div class="col-md-offset-3 col-md-10">
52
+ <button i18n type="submit" class="btn btn-primary">Sign in</button>
53
+ </div>
54
+ </div>
55
+ </fieldset>
56
+
57
+ </form>
58
+ </div>
59
+ </div>
60
+
securis/src/main/webapp/main.html
....@@ -0,0 +1,72 @@
1
+<!DOCTYPE html>
2
+<html class="no-js" lang="en" ng-app="securis"
3
+ xmlns:ng="http://angularjs.org">
4
+<head>
5
+<base href="/">
6
+<meta charset="utf-8">
7
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
8
+<title>SeCuris</title>
9
+<meta name="description" content="">
10
+<meta name="viewport" content="width=device-width">
11
+
12
+<link rel="stylesheet" href="/css/bootstrap.min.css">
13
+<link rel="stylesheet" href="/css/bootstrap-dialog.css">
14
+<link rel="stylesheet" href="/css/toaster.css">
15
+<link rel="stylesheet" href="/css/chosen.css">
16
+<link rel="stylesheet" href="/css/chosen-spinner.css">
17
+<link rel="stylesheet" href="/css/bootstrap-theme.min.css">
18
+<link rel="stylesheet" href="/css/font-awesome.min.css">
19
+
20
+<link rel="stylesheet" href="/css/securis.css">
21
+
22
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
23
+
24
+</head>
25
+<body >
26
+<div ng-controller="MainCtrl">
27
+ <div ng-view ></div>
28
+
29
+ <hr>
30
+ <div>
31
+ <footer>
32
+ <small i18n style="margin: auto; display: block;" class="text-center">&copy; CurisTEC 2014</small>
33
+ </footer>
34
+ </div>
35
+ <!-- /container -->
36
+ <script src="/js/vendor/modernizr-2.6.2.min.js"></script>
37
+ <script
38
+ src="/js/vendor/jquery.min.js"></script>
39
+ <script type="text/javascript"
40
+ src="/js/vendor/bootstrap.min.js"></script>
41
+ <script type="text/javascript"
42
+ src="/js/vendor/bootstrap-dialog.js"></script>
43
+ <script type="text/javascript"
44
+ src="/js/angular/angular.js"></script>
45
+ <script type="text/javascript"
46
+ src="/js/angular/angular-route.min.js"></script>
47
+ <script type="text/javascript"
48
+ src="/js/angular/angular-resource.min.js"></script>
49
+ <script type="text/javascript"
50
+ src="/js/angular/angular-resource.min.js"></script>
51
+ <script type="text/javascript"
52
+ src="/js/angular/toaster.js"></script>
53
+ <script type="text/javascript"
54
+ src="/js/angular/toaster.js"></script>
55
+ <script type="text/javascript"
56
+ src="/js/vendor/chosen.jquery.js"></script>
57
+ <script type="text/javascript"
58
+ src="/js/angular/chosen.js"></script>
59
+ <script type="text/javascript"
60
+ src="/js/vendor/store.min.js"></script>
61
+
62
+ <script type="text/javascript" src="js/i18n.js"></script>
63
+ <script type="text/javascript" src="js/main.js"></script>
64
+ <script type="text/javascript" src="js/login.js"></script>
65
+ <script type="text/javascript" src="js/catalogs.js"></script>
66
+ <script type="text/javascript" src="js/licenses.js"></script>
67
+ <script type="text/javascript" src="js/admin.js"></script>
68
+
69
+ <toaster-container toaster-options="{'time-out': 3000}"></toaster-container>
70
+</div>
71
+</body>
72
+</html>
securis/src/main/webapp/server.js
....@@ -0,0 +1,7 @@
1
+var connect = require('connect');
2
+
3
+connect.createServer(
4
+ connect.static(__dirname)
5
+).listen(8080);
6
+
7
+console.log('Server listening in http://0.0.0.0:8080...');