开源的堡垒机, 使用 GNU GPL v2.0 开源协议, 是符合 4A 的专业运维审计系统。配备 Web Terminal 解决方案, 交互界面美观、用户体验好,支持管理
159 | SSH、 Telnet、 RDP、 VNC 协议资产。
160 |
161 |
162 |
163 |
164 |
167 |
168 |
169 |
Rancher
170 |
容器管理平台,通过 Rancher 可以实现 Docker 和 Kubernetes 的轻松部署。
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
--------------------------------------------------------------------------------
/odo-ldap/ssp/config.inc.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/odo-sonar/sonar.properties:
--------------------------------------------------------------------------------
1 | # Property values can:
2 | # - reference an environment variable, for example sonar.jdbc.url= ${env:SONAR_JDBC_URL}
3 | # - be encrypted. See https://redirect.sonarsource.com/doc/settings-encryption.html
4 |
5 | #--------------------------------------------------------------------------------------------------
6 | # DATABASE
7 | #
8 | # IMPORTANT:
9 | # - The embedded H2 database is used by default. It is recommended for tests but not for
10 | # production use. Supported databases are Oracle, PostgreSQL and Microsoft SQLServer.
11 | # - Changes to database connection URL (sonar.jdbc.url) can affect SonarSource licensed products.
12 |
13 | # User credentials.
14 | # Permissions to create tables, indices and triggers must be granted to JDBC user.
15 | # The schema must be created first.
16 | #sonar.jdbc.username=
17 | #sonar.jdbc.password=
18 |
19 | #----- Embedded Database (default)
20 | # H2 embedded database server listening port, defaults to 9092
21 | #sonar.embeddedDatabase.port=9092
22 |
23 |
24 | #----- Oracle 11g/12c/18c/19c
25 | # The Oracle JDBC driver must be copied into the directory extensions/jdbc-driver/oracle/.
26 | # Only the thin client is supported, and we recommend using the latest Oracle JDBC driver. See
27 | # https://jira.sonarsource.com/browse/SONAR-9758 for more details.
28 | # If you need to set the schema, please refer to http://jira.sonarsource.com/browse/SONAR-5000
29 | #sonar.jdbc.url=jdbc:oracle:thin:@localhost:1521/XE
30 |
31 |
32 | #----- PostgreSQL 9.3 or greater
33 | # By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
34 | #sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema
35 |
36 |
37 | #----- Microsoft SQLServer 2014/2016/2017 and SQL Azure
38 | # A database named sonar must exist and its collation must be case-sensitive (CS) and accent-sensitive (AS)
39 | # Use the following connection string if you want to use integrated security with Microsoft Sql Server
40 | # Do not set sonar.jdbc.username or sonar.jdbc.password property if you are using Integrated Security
41 | # For Integrated Security to work, you have to download the Microsoft SQL JDBC driver package from
42 | # https://www.microsoft.com/en-us/download/details.aspx?id=55539
43 | # and copy sqljdbc_auth.dll to your path. You have to copy the 32 bit or 64 bit version of the dll
44 | # depending upon the architecture of your server machine.
45 | #sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar;integratedSecurity=true
46 |
47 | # Use the following connection string if you want to use SQL Auth while connecting to MS Sql Server.
48 | # Set the sonar.jdbc.username and sonar.jdbc.password appropriately.
49 | #sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar
50 |
51 |
52 | #----- Connection pool settings
53 | # The maximum number of active connections that can be allocated
54 | # at the same time, or negative for no limit.
55 | # The recommended value is 1.2 * max sizes of HTTP pools. For example if HTTP ports are
56 | # enabled with default sizes (50, see property sonar.web.http.maxThreads)
57 | # then sonar.jdbc.maxActive should be 1.2 * 50 = 60.
58 | #sonar.jdbc.maxActive=60
59 |
60 | # The maximum number of connections that can remain idle in the
61 | # pool, without extra ones being released, or negative for no limit.
62 | #sonar.jdbc.maxIdle=5
63 |
64 | # The minimum number of connections that can remain idle in the pool,
65 | # without extra ones being created, or zero to create none.
66 | #sonar.jdbc.minIdle=2
67 |
68 | # The maximum number of milliseconds that the pool will wait (when there
69 | # are no available connections) for a connection to be returned before
70 | # throwing an exception, or <= 0 to wait indefinitely.
71 | #sonar.jdbc.maxWait=5000
72 |
73 | #sonar.jdbc.minEvictableIdleTimeMillis=600000
74 | #sonar.jdbc.timeBetweenEvictionRunsMillis=30000
75 |
76 |
77 |
78 | #--------------------------------------------------------------------------------------------------
79 | # WEB SERVER
80 | # Web server is executed in a dedicated Java process. By default heap size is 512MB.
81 | # Use the following property to customize JVM options.
82 | # Recommendations:
83 | #
84 | # The HotSpot Server VM is recommended. The property -server should be added if server mode
85 | # is not enabled by default on your environment:
86 | # http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html
87 | #
88 | # Startup can be long if entropy source is short of entropy. Adding
89 | # -Djava.security.egd=file:/dev/./urandom is an option to resolve the problem.
90 | # See https://wiki.apache.org/tomcat/HowTo/FasterStartUp#Entropy_Source
91 | #
92 | #sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
93 |
94 | # Same as previous property, but allows to not repeat all other settings like -Xmx
95 | #sonar.web.javaAdditionalOpts=
96 |
97 | # Binding IP address. For servers with more than one IP address, this property specifies which
98 | # address will be used for listening on the specified ports.
99 | # By default, ports will be used on all IP addresses associated with the server.
100 | #sonar.web.host=0.0.0.0
101 |
102 | # Web context. When set, it must start with forward slash (for example /sonarqube).
103 | # The default value is root context (empty value).
104 | #sonar.web.context=
105 | # TCP port for incoming HTTP connections. Default value is 9000.
106 | #sonar.web.port=9000
107 |
108 |
109 | # The maximum number of connections that the server will accept and process at any given time.
110 | # When this number has been reached, the server will not accept any more connections until
111 | # the number of connections falls below this value. The operating system may still accept connections
112 | # based on the sonar.web.connections.acceptCount property. The default value is 50.
113 | #sonar.web.http.maxThreads=50
114 |
115 | # The minimum number of threads always kept running. The default value is 5.
116 | #sonar.web.http.minThreads=5
117 |
118 | # The maximum queue length for incoming connection requests when all possible request processing
119 | # threads are in use. Any requests received when the queue is full will be refused.
120 | # The default value is 25.
121 | #sonar.web.http.acceptCount=25
122 |
123 | # By default users are logged out and sessions closed when server is restarted.
124 | # If you prefer keeping user sessions open, a secret should be defined. Value is
125 | # HS256 key encoded with base64. It must be unique for each installation of SonarQube.
126 | # Example of command-line:
127 | # echo -n "type_what_you_want" | openssl dgst -sha256 -hmac "key" -binary | base64
128 | #sonar.auth.jwtBase64Hs256Secret=
129 |
130 | # The inactivity timeout duration of user sessions, in minutes. After the configured
131 | # period of time, the user is logged out.
132 | # The default value is set to 3 days (4320 minutes)
133 | # and cannot be greater than 3 months. Value must be strictly positive.
134 | #sonar.web.sessionTimeoutInMinutes=4320
135 |
136 | # A passcode can be defined to access some web services from monitoring
137 | # tools without having to use the credentials of a system administrator.
138 | # Check the Web API documentation to know which web services are supporting this authentication mode.
139 | # The passcode should be provided in HTTP requests with the header "X-Sonar-Passcode".
140 | # By default feature is disabled.
141 | #sonar.web.systemPasscode=
142 |
143 |
144 | #--------------------------------------------------------------------------------------------------
145 | # SSO AUTHENTICATION
146 |
147 | # Enable authentication using HTTP headers
148 | #sonar.web.sso.enable=false
149 |
150 | # Name of the header to get the user login.
151 | # Only alphanumeric, '.' and '@' characters are allowed
152 | #sonar.web.sso.loginHeader=X-Forwarded-Login
153 |
154 | # Name of the header to get the user name
155 | #sonar.web.sso.nameHeader=X-Forwarded-Name
156 |
157 | # Name of the header to get the user email (optional)
158 | #sonar.web.sso.emailHeader=X-Forwarded-Email
159 |
160 | # Name of the header to get the list of user groups, separated by comma (optional).
161 | # If the sonar.sso.groupsHeader is set, the user will belong to those groups if groups exist in SonarQube.
162 | # If none of the provided groups exists in SonarQube, the user will only belong to the default group.
163 | # Note that the default group will always be set.
164 | #sonar.web.sso.groupsHeader=X-Forwarded-Groups
165 |
166 | # Interval used to know when to refresh name, email and groups.
167 | # During this interval, if for instance the name of the user is changed in the header, it will only be updated after X minutes.
168 | #sonar.web.sso.refreshIntervalInMinutes=5
169 |
170 | #--------------------------------------------------------------------------------------------------
171 | # LDAP CONFIGURATION
172 |
173 | # Enable the LDAP feature
174 | #sonar.security.realm=LDAP
175 |
176 | # Set to true when connecting to a LDAP server using a case-insensitive setup.
177 | # sonar.authenticator.downcase=true
178 |
179 | # URL of the LDAP server. Note that if you are using ldaps, then you should install the server certificate into the Java truststore.
180 | ldap.url=ldap://odo-ldap-openldap:389
181 |
182 | # Bind DN is the username of an LDAP user to connect (or bind) with. Leave this blank for anonymous access to the LDAP directory (optional)
183 | ldap.bindDn=cn=admin,dc=qualitysphere,dc=github,dc=io
184 |
185 | # Bind Password is the password of the user to connect with. Leave this blank for anonymous access to the LDAP directory (optional)
186 | ldap.bindPassword=opendevops
187 |
188 | # Possible values: simple | CRAM-MD5 | DIGEST-MD5 | GSSAPI See http://java.sun.com/products/jndi/tutorial/ldap/security/auth.html (default: simple)
189 | # ldap.authentication=simple
190 |
191 | # See :
192 | # * http://java.sun.com/products/jndi/tutorial/ldap/security/digest.html
193 | # * http://java.sun.com/products/jndi/tutorial/ldap/security/crammd5.html
194 | # (optional)
195 | # ldap.realm=example.org
196 |
197 | # Context factory class (optional)
198 | # ldap.contextFactoryClass=com.sun.jndi.ldap.LdapCtxFactory
199 |
200 | # Enable usage of StartTLS (default : false)
201 | # ldap.StartTLS=true
202 |
203 | # Follow or not referrals. See http://docs.oracle.com/javase/jndi/tutorial/ldap/referral/jndi.html (default: true)
204 | # ldap.followReferrals=false
205 |
206 | # USER MAPPING
207 |
208 | # Distinguished Name (DN) of the root node in LDAP from which to search for users (mandatory)
209 | ldap.user.baseDn=ou=users,dc=qualitysphere,dc=github,dc=io
210 |
211 | # LDAP user request. (default: (&(objectClass=inetOrgPerson)(uid={login})) )
212 | # ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
213 | ldap.user.request=(&(objectClass=inetOrgPerson)(cn={login}))
214 |
215 | # Attribute in LDAP defining the user’s real name. (default: cn)
216 | # ldap.user.realNameAttribute=name
217 |
218 | # Attribute in LDAP defining the user’s email. (default: mail)
219 | # ldap.user.emailAttribute=email
220 |
221 | # GROUP MAPPING
222 |
223 | # Distinguished Name (DN) of the root node in LDAP from which to search for groups. (optional, default: empty)
224 | ldap.group.baseDn=ou=groups,dc=qualitysphere,dc=github,dc=io
225 |
226 | # LDAP group request (default: (&(objectClass=groupOfUniqueNames)(uniqueMember={dn})) )
227 | # ldap.group.request=(&(objectClass=group)(member={dn}))
228 |
229 | # Property used to specifiy the attribute to be used for returning the list of user groups in the compatibility mode. (default: cn)
230 | # ldap.group.idAttribute=sAMAccountName
231 |
232 | #--------------------------------------------------------------------------------------------------
233 | # COMPUTE ENGINE
234 | # The Compute Engine is responsible for processing background tasks.
235 | # Compute Engine is executed in a dedicated Java process. Default heap size is 512MB.
236 | # Use the following property to customize JVM options.
237 | # Recommendations:
238 | #
239 | # The HotSpot Server VM is recommended. The property -server should be added if server mode
240 | # is not enabled by default on your environment:
241 | # http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html
242 | #
243 | #sonar.ce.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
244 |
245 | # Same as previous property, but allows to not repeat all other settings like -Xmx
246 | #sonar.ce.javaAdditionalOpts=
247 |
248 |
249 | #--------------------------------------------------------------------------------------------------
250 | # ELASTICSEARCH
251 | # Elasticsearch is used to facilitate fast and accurate information retrieval.
252 | # It is executed in a dedicated Java process. Default heap size is 512MB.
253 | #
254 | # --------------------------------------------------
255 | # Word of caution for Linux users on 64bits systems
256 | # --------------------------------------------------
257 | # Please ensure Virtual Memory on your system is correctly configured for Elasticsearch to run properly
258 | # (see https://www.elastic.co/guide/en/elasticsearch/reference/5.5/vm-max-map-count.html for details).
259 | #
260 | # When SonarQube runs standalone, a warning such as the following may appear in logs/es.log:
261 | # "max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]"
262 | # When SonarQube runs as a cluster, however, Elasticsearch will refuse to start.
263 | #
264 |
265 | # JVM options of Elasticsearch process
266 | #sonar.search.javaOpts=-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError
267 |
268 | # Same as previous property, but allows to not repeat all other settings like -Xmx
269 | #sonar.search.javaAdditionalOpts=
270 |
271 | # Elasticsearch port. Default is 9001. Use 0 to get a free port.
272 | # As a security precaution, should be blocked by a firewall and not exposed to the Internet.
273 | #sonar.search.port=9001
274 |
275 | # Elasticsearch host. The search server will bind this address and the search client will connect to it.
276 | # Default is loopback address.
277 | # As a security precaution, should NOT be set to a publicly available address.
278 | #sonar.search.host=
279 |
280 |
281 | #--------------------------------------------------------------------------------------------------
282 | # UPDATE CENTER
283 |
284 | # Update Center requires an internet connection to request https://update.sonarsource.org
285 | # It is enabled by default.
286 | #sonar.updatecenter.activate=true
287 |
288 | # HTTP proxy (default none)
289 | #http.proxyHost=
290 | #http.proxyPort=
291 | # HTTPS proxy (defaults are values of http.proxyHost and http.proxyPort)
292 | #https.proxyHost=
293 | #https.proxyPort=
294 |
295 | # NT domain name if NTLM proxy is used
296 | #http.auth.ntlm.domain=
297 |
298 | # SOCKS proxy (default none)
299 | #socksProxyHost=
300 | #socksProxyPort=
301 |
302 | # Proxy authentication (used for HTTP, HTTPS and SOCKS proxies)
303 | #http.proxyUser=
304 | #http.proxyPassword=
305 |
306 | # Proxy exceptions: list of hosts that can be accessed without going through the proxy
307 | # separated by the '|' character, wildcard character '*' can be used for pattern matching
308 | # used for HTTP and HTTPS (default none)
309 | # (note: localhost and its literal notations (127.0.0.1, ...) are always excluded)
310 | #http.nonProxyHosts=
311 |
312 |
313 | #--------------------------------------------------------------------------------------------------
314 | # LOGGING
315 |
316 | # SonarQube produces logs in 4 logs files located in the same directory (see property sonar.path.logs below),
317 | # one per process:
318 | # Main process (aka. App) logs in sonar.log
319 | # Web Server (aka. Web) logs in web.log
320 | # Compute Engine (aka. CE) logs in ce.log
321 | # Elasticsearch (aka. ES) logs in es.log
322 | #
323 | # All 4 files follow the same rolling policy (see sonar.log.rollingPolicy and sonar.log.maxFiles) but it applies
324 | # individually (eg. if sonar.log.maxFiles=4, there can be at most 4 of each files, ie. 16 files in total).
325 | #
326 | # All 4 files have logs in the same format:
327 | # 1 2 3 4 5 6
328 | # |-----------------| |---| |-|--------------------||------------------------------| |------------------------------------------------------------------------------------------------------------------------------|
329 | # 2016.11.16 16:47:00 INFO ce[AVht0dNXFcyiYejytc3m][o.s.s.c.t.CeWorkerCallableImpl] Executed task | project=org.sonarqube:example-java-maven | type=REPORT | id=AVht0dNXFcyiYejytc3m | submitter=admin | time=1699ms
330 | #
331 | # 1: timestamp. Format is YYYY.MM.DD HH:MM:SS
332 | # YYYY: year on 4 digits
333 | # MM: month on 2 digits
334 | # DD: day on 2 digits
335 | # HH: hour of day on 2 digits in 24 hours format
336 | # MM: minutes on 2 digits
337 | # SS: seconds on 2 digits
338 | # 2: log level.
339 | # Possible values (in order of descending criticality): ERROR, WARN, INFO, DEBUG and TRACE
340 | # 3: process identifier. Possible values: app (main), web (Web Server), ce (Compute Engine) and es (Elasticsearch)
341 | # 4: SQ thread identifier. Can be empty.
342 | # In the Web Server, if present, it will be the HTTP request ID.
343 | # In the Compute Engine, if present, it will be the task ID.
344 | # 5: logger name. Usually a class canonical name.
345 | # Package names are truncated to keep the whole field to 20 characters max
346 | # 6: log payload. Content of this field does not follow any specific format, can vary in length and include line returns.
347 | # Some logs, however, will follow the convention to provide data in payload in the format " | key=value"
348 | # Especially, log of profiled pieces of code will end with " | time=XXXXms".
349 |
350 | # Global level of logs (applies to all 4 processes).
351 | # Supported values are INFO (default), DEBUG and TRACE
352 | #sonar.log.level=INFO
353 |
354 | # Level of logs of each process can be controlled individually with their respective properties.
355 | # When specified, they overwrite the level defined at global level.
356 | # Supported values are INFO, DEBUG and TRACE
357 | #sonar.log.level.app=INFO
358 | #sonar.log.level.web=INFO
359 | #sonar.log.level.ce=INFO
360 | #sonar.log.level.es=INFO
361 |
362 | # Path to log files. Can be absolute or relative to installation directory.
363 | # Default is /logs
364 | #sonar.path.logs=logs
365 |
366 | # Rolling policy of log files
367 | # - based on time if value starts with "time:", for example by day ("time:yyyy-MM-dd")
368 | # or by month ("time:yyyy-MM")
369 | # - based on size if value starts with "size:", for example "size:10MB"
370 | # - disabled if value is "none". That needs logs to be managed by an external system like logrotate.
371 | #sonar.log.rollingPolicy=time:yyyy-MM-dd
372 |
373 | # Maximum number of files to keep if a rolling policy is enabled.
374 | # - maximum value is 20 on size rolling policy
375 | # - unlimited on time rolling policy. Set to zero to disable old file purging.
376 | #sonar.log.maxFiles=7
377 |
378 | # Access log is the list of all the HTTP requests received by server. If enabled, it is stored
379 | # in the file {sonar.path.logs}/access.log. This file follows the same rolling policy as other log file
380 | # (see sonar.log.rollingPolicy and sonar.log.maxFiles).
381 | #sonar.web.accessLogs.enable=true
382 |
383 | # Format of access log. It is ignored if sonar.web.accessLogs.enable=false. Possible values are:
384 | # - "common" is the Common Log Format, shortcut to: %h %l %u %user %date "%r" %s %b
385 | # - "combined" is another format widely recognized, shortcut to: %h %l %u [%t] "%r" %s %b "%i{Referer}" "%i{User-Agent}"
386 | # - else a custom pattern. See http://logback.qos.ch/manual/layouts.html#AccessPatternLayout.
387 | # The login of authenticated user is not implemented with "%u" but with "%reqAttribute{LOGIN}" (since version 6.1).
388 | # The value displayed for anonymous users is "-".
389 | # The SonarQube's HTTP request ID can be added to the pattern with "%reqAttribute{ID}" (since version 6.2).
390 | # If SonarQube is behind a reverse proxy, then the following value allows to display the correct remote IP address:
391 | #sonar.web.accessLogs.pattern=%i{X-Forwarded-For} %l %u [%t] "%r" %s %b "%i{Referer}" "%i{User-Agent}" "%reqAttribute{ID}"
392 | # Default value (which was "combined" before version 6.2) is equivalent to "combined + SQ HTTP request ID":
393 | #sonar.web.accessLogs.pattern=%h %l %u [%t] "%r" %s %b "%i{Referer}" "%i{User-Agent}" "%reqAttribute{ID}"
394 |
395 |
396 | #--------------------------------------------------------------------------------------------------
397 | # OTHERS
398 |
399 | # Delay in seconds between processing of notification queue. Default is 60 seconds.
400 | #sonar.notifications.delay=60
401 |
402 | # Paths to persistent data files (embedded database and search index) and temporary files.
403 | # Can be absolute or relative to installation directory.
404 | # Defaults are respectively /data and /temp
405 | #sonar.path.data=data
406 | #sonar.path.temp=temp
407 |
408 | # Telemetry - Share anonymous SonarQube statistics
409 | # By sharing anonymous SonarQube statistics, you help us understand how SonarQube is used so we can improve the product to work even better for you.
410 | # We don't collect source code or IP addresses. And we don't share the data with anyone else.
411 | # To see an example of the data shared: login as a global administrator, call the WS api/system/info and check the Statistics field.
412 | #sonar.telemetry.enable=true
413 |
414 |
415 | #--------------------------------------------------------------------------------------------------
416 | # DEVELOPMENT - only for developers
417 | # The following properties MUST NOT be used in production environments.
418 |
419 | # Elasticsearch HTTP connector
420 | #sonar.search.httpPort=-1
421 |
--------------------------------------------------------------------------------
/odo-portal/dockerBuild/js/bootstrap.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.3.7 (http://getbootstrap.com)
3 | * Copyright 2011-2016 Twitter, Inc.
4 | * Licensed under the MIT license
5 | */
6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(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){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(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.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):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.3.7",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]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},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")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),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).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(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),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){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.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},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(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&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};var e=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(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),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){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.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 in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(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 c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}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.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");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)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(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.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return 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 d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(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(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},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))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};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|hide/.test(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.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'