├── .gitignore ├── README.md ├── app └── app.go ├── go.mod ├── go.sum ├── img ├── login.png └── shell.png ├── static ├── css │ ├── bk.css │ ├── bk_pack.css │ ├── bootstrap.min.css │ ├── font-awesome.css │ ├── fullscreen.css │ ├── kendo.common.min.css │ ├── kendo.default.min.css │ └── xterm.css └── js │ ├── analysis.js │ ├── bk.js │ ├── bootstrap.min.js │ ├── echarts-all.js │ ├── fullscreen.js │ ├── html5shiv.min.js │ ├── jquery-1.10.2.min.js │ ├── jquery.min.js │ ├── kendo.all.min.js │ ├── reload.min.js │ ├── sockjs.min.js │ ├── xterm.js │ └── xterm.js.map ├── templates ├── index.html └── webshell.html └── webshell.go /.gitignore: -------------------------------------------------------------------------------- 1 | # Files generated by JetBrains 2 | .idea/ 3 | .DS_Store 4 | .vscode/ 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebShell demo 2 | 3 | 通过 `webshell` 连接到 `kubernetes` 集群的指定 `pod`,并执行相互操作 4 | 5 | ## 使用工具 6 | - gin 7 | - client-go 8 | - sockjs 9 | 10 | ## 执行 11 | 12 | ### 启动后端进程 13 | ```shell 14 | # 默认读取 ~/.kube/confg 的 kubeconfig,可根据需要修改 15 | go run webshell.go 16 | ``` 17 | 18 | ### 打开浏览器输入 `127.0.0.1:8080` 19 | ![img.png](img/login.png) 20 | 21 | ### 输入并点击连接 22 | ![img.png](img/shell.png) 23 | -------------------------------------------------------------------------------- /app/app.go: -------------------------------------------------------------------------------- 1 | package app 2 | 3 | import ( 4 | "encoding/json" 5 | "net/http" 6 | "path/filepath" 7 | 8 | "github.com/igm/sockjs-go/v3/sockjs" 9 | "k8s.io/api/core/v1" 10 | "k8s.io/apimachinery/pkg/runtime" 11 | "k8s.io/apimachinery/pkg/runtime/schema" 12 | "k8s.io/client-go/kubernetes/scheme" 13 | "k8s.io/client-go/rest" 14 | "k8s.io/client-go/tools/clientcmd" 15 | "k8s.io/client-go/tools/remotecommand" 16 | "k8s.io/client-go/util/homedir" 17 | ) 18 | 19 | type WebShell struct { 20 | Conn sockjs.Session 21 | SizeChan chan *remotecommand.TerminalSize 22 | 23 | Namespace string 24 | Pod string 25 | Container string 26 | } 27 | 28 | func (w *WebShell) Write(p []byte) (int, error) { 29 | err := w.Conn.Send(string(p)) 30 | return len(p), err 31 | } 32 | 33 | func (w *WebShell) Read(p []byte) (int, error) { 34 | var msg map[string]uint16 35 | reply, err := w.Conn.Recv() 36 | if err != nil { 37 | return 0, err 38 | } 39 | if err = json.Unmarshal([]byte(reply), &msg); err != nil { 40 | return copy(p, reply), nil 41 | } else { 42 | w.SizeChan <- &remotecommand.TerminalSize{ 43 | Height: msg["rows"], 44 | Width: msg["cols"], 45 | } 46 | return 0, nil 47 | } 48 | } 49 | 50 | func (w *WebShell) Next() *remotecommand.TerminalSize { 51 | size := <-w.SizeChan 52 | return size 53 | } 54 | 55 | func WebShellHandler(w *WebShell, cmd string) error { 56 | config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config")) 57 | if err != nil { 58 | return err 59 | } 60 | 61 | gv := schema.GroupVersion{ 62 | Group: "", 63 | Version: "v1", 64 | } 65 | config.GroupVersion = &gv 66 | config.APIPath = "/api" 67 | config.ContentType = runtime.ContentTypeJSON 68 | config.NegotiatedSerializer = scheme.Codecs 69 | clientSet, err := rest.RESTClientFor(config) 70 | if err != nil { 71 | return err 72 | } 73 | req := clientSet.Post(). 74 | Resource("pods"). 75 | Name(w.Pod). 76 | Namespace(w.Namespace). 77 | SubResource("exec"). 78 | Param("container", w.Container). 79 | Param("stdin", "true"). 80 | Param("stdout", "true"). 81 | Param("stderr", "true"). 82 | Param("command", cmd).Param("tty", "true") 83 | req.VersionedParams( 84 | &v1.PodExecOptions{ 85 | Container: w.Container, 86 | Command: []string{}, 87 | Stdin: true, 88 | Stdout: true, 89 | Stderr: true, 90 | TTY: true, 91 | }, 92 | scheme.ParameterCodec, 93 | ) 94 | executor, err := remotecommand.NewSPDYExecutor( 95 | config, http.MethodPost, req.URL(), 96 | ) 97 | if err != nil { 98 | return err 99 | } 100 | return executor.Stream(remotecommand.StreamOptions{ 101 | Stdin: w, 102 | Stdout: w, 103 | Stderr: w, 104 | Tty: true, 105 | TerminalSizeQueue: w, 106 | }) 107 | } 108 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/caoyingjunz/kube-webshell 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/gin-gonic/gin v1.8.1 7 | github.com/igm/sockjs-go/v3 v3.0.2 8 | k8s.io/api v0.23.5 9 | k8s.io/apimachinery v0.23.5 10 | k8s.io/client-go v0.23.5 11 | ) 12 | -------------------------------------------------------------------------------- /img/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/caoyingjunz/kube-webshell/54debd3578317a12b41a8bf87bc9e05132944b09/img/login.png -------------------------------------------------------------------------------- /img/shell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/caoyingjunz/kube-webshell/54debd3578317a12b41a8bf87bc9e05132944b09/img/shell.png -------------------------------------------------------------------------------- /static/css/bk_pack.css: -------------------------------------------------------------------------------- 1 | .form-control { 2 | height: 34px; } 3 | -------------------------------------------------------------------------------- /static/css/font-awesome.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | /* FONT PATH 6 | * -------------------------- */ 7 | @font-face { 8 | font-family: 'FontAwesome'; 9 | src: url('../fonts/fontawesome-webfont.eot?v=4.3.0'); 10 | src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg'); 11 | font-weight: normal; 12 | font-style: normal; 13 | } 14 | .fa { 15 | display: inline-block; 16 | font: normal normal normal 14px/1 FontAwesome; 17 | font-size: inherit; 18 | text-rendering: auto; 19 | -webkit-font-smoothing: antialiased; 20 | -moz-osx-font-smoothing: grayscale; 21 | transform: translate(0, 0); 22 | } 23 | /* makes the font 33% larger relative to the icon container */ 24 | .fa-lg { 25 | font-size: 1.33333333em; 26 | line-height: 0.75em; 27 | vertical-align: -15%; 28 | } 29 | .fa-2x { 30 | font-size: 2em; 31 | } 32 | .fa-3x { 33 | font-size: 3em; 34 | } 35 | .fa-4x { 36 | font-size: 4em; 37 | } 38 | .fa-5x { 39 | font-size: 5em; 40 | } 41 | .fa-fw { 42 | width: 1.28571429em; 43 | text-align: center; 44 | } 45 | .fa-ul { 46 | padding-left: 0; 47 | margin-left: 2.14285714em; 48 | list-style-type: none; 49 | } 50 | .fa-ul > li { 51 | position: relative; 52 | } 53 | .fa-li { 54 | position: absolute; 55 | left: -2.14285714em; 56 | width: 2.14285714em; 57 | top: 0.14285714em; 58 | text-align: center; 59 | } 60 | .fa-li.fa-lg { 61 | left: -1.85714286em; 62 | } 63 | .fa-border { 64 | padding: .2em .25em .15em; 65 | border: solid 0.08em #eeeeee; 66 | border-radius: .1em; 67 | } 68 | .pull-right { 69 | float: right; 70 | } 71 | .pull-left { 72 | float: left; 73 | } 74 | .fa.pull-left { 75 | margin-right: .3em; 76 | } 77 | .fa.pull-right { 78 | margin-left: .3em; 79 | } 80 | .fa-spin { 81 | -webkit-animation: fa-spin 2s infinite linear; 82 | animation: fa-spin 2s infinite linear; 83 | } 84 | .fa-pulse { 85 | -webkit-animation: fa-spin 1s infinite steps(8); 86 | animation: fa-spin 1s infinite steps(8); 87 | } 88 | @-webkit-keyframes fa-spin { 89 | 0% { 90 | -webkit-transform: rotate(0deg); 91 | transform: rotate(0deg); 92 | } 93 | 100% { 94 | -webkit-transform: rotate(359deg); 95 | transform: rotate(359deg); 96 | } 97 | } 98 | @keyframes fa-spin { 99 | 0% { 100 | -webkit-transform: rotate(0deg); 101 | transform: rotate(0deg); 102 | } 103 | 100% { 104 | -webkit-transform: rotate(359deg); 105 | transform: rotate(359deg); 106 | } 107 | } 108 | .fa-rotate-90 { 109 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 110 | -webkit-transform: rotate(90deg); 111 | -ms-transform: rotate(90deg); 112 | transform: rotate(90deg); 113 | } 114 | .fa-rotate-180 { 115 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 116 | -webkit-transform: rotate(180deg); 117 | -ms-transform: rotate(180deg); 118 | transform: rotate(180deg); 119 | } 120 | .fa-rotate-270 { 121 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 122 | -webkit-transform: rotate(270deg); 123 | -ms-transform: rotate(270deg); 124 | transform: rotate(270deg); 125 | } 126 | .fa-flip-horizontal { 127 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); 128 | -webkit-transform: scale(-1, 1); 129 | -ms-transform: scale(-1, 1); 130 | transform: scale(-1, 1); 131 | } 132 | .fa-flip-vertical { 133 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); 134 | -webkit-transform: scale(1, -1); 135 | -ms-transform: scale(1, -1); 136 | transform: scale(1, -1); 137 | } 138 | :root .fa-rotate-90, 139 | :root .fa-rotate-180, 140 | :root .fa-rotate-270, 141 | :root .fa-flip-horizontal, 142 | :root .fa-flip-vertical { 143 | filter: none; 144 | } 145 | .fa-stack { 146 | position: relative; 147 | display: inline-block; 148 | width: 2em; 149 | height: 2em; 150 | line-height: 2em; 151 | vertical-align: middle; 152 | } 153 | .fa-stack-1x, 154 | .fa-stack-2x { 155 | position: absolute; 156 | left: 0; 157 | width: 100%; 158 | text-align: center; 159 | } 160 | .fa-stack-1x { 161 | line-height: inherit; 162 | } 163 | .fa-stack-2x { 164 | font-size: 2em; 165 | } 166 | .fa-inverse { 167 | color: #ffffff; 168 | } 169 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 170 | readers do not read off random characters that represent icons */ 171 | .fa-glass:before { 172 | content: "\f000"; 173 | } 174 | .fa-music:before { 175 | content: "\f001"; 176 | } 177 | .fa-search:before { 178 | content: "\f002"; 179 | } 180 | .fa-envelope-o:before { 181 | content: "\f003"; 182 | } 183 | .fa-heart:before { 184 | content: "\f004"; 185 | } 186 | .fa-star:before { 187 | content: "\f005"; 188 | } 189 | .fa-star-o:before { 190 | content: "\f006"; 191 | } 192 | .fa-user:before { 193 | content: "\f007"; 194 | } 195 | .fa-film:before { 196 | content: "\f008"; 197 | } 198 | .fa-th-large:before { 199 | content: "\f009"; 200 | } 201 | .fa-th:before { 202 | content: "\f00a"; 203 | } 204 | .fa-th-list:before { 205 | content: "\f00b"; 206 | } 207 | .fa-check:before { 208 | content: "\f00c"; 209 | } 210 | .fa-remove:before, 211 | .fa-close:before, 212 | .fa-times:before { 213 | content: "\f00d"; 214 | } 215 | .fa-search-plus:before { 216 | content: "\f00e"; 217 | } 218 | .fa-search-minus:before { 219 | content: "\f010"; 220 | } 221 | .fa-power-off:before { 222 | content: "\f011"; 223 | } 224 | .fa-signal:before { 225 | content: "\f012"; 226 | } 227 | .fa-gear:before, 228 | .fa-cog:before { 229 | content: "\f013"; 230 | } 231 | .fa-trash-o:before { 232 | content: "\f014"; 233 | } 234 | .fa-home:before { 235 | content: "\f015"; 236 | } 237 | .fa-file-o:before { 238 | content: "\f016"; 239 | } 240 | .fa-clock-o:before { 241 | content: "\f017"; 242 | } 243 | .fa-road:before { 244 | content: "\f018"; 245 | } 246 | .fa-download:before { 247 | content: "\f019"; 248 | } 249 | .fa-arrow-circle-o-down:before { 250 | content: "\f01a"; 251 | } 252 | .fa-arrow-circle-o-up:before { 253 | content: "\f01b"; 254 | } 255 | .fa-inbox:before { 256 | content: "\f01c"; 257 | } 258 | .fa-play-circle-o:before { 259 | content: "\f01d"; 260 | } 261 | .fa-rotate-right:before, 262 | .fa-repeat:before { 263 | content: "\f01e"; 264 | } 265 | .fa-refresh:before { 266 | content: "\f021"; 267 | } 268 | .fa-list-alt:before { 269 | content: "\f022"; 270 | } 271 | .fa-lock:before { 272 | content: "\f023"; 273 | } 274 | .fa-flag:before { 275 | content: "\f024"; 276 | } 277 | .fa-headphones:before { 278 | content: "\f025"; 279 | } 280 | .fa-volume-off:before { 281 | content: "\f026"; 282 | } 283 | .fa-volume-down:before { 284 | content: "\f027"; 285 | } 286 | .fa-volume-up:before { 287 | content: "\f028"; 288 | } 289 | .fa-qrcode:before { 290 | content: "\f029"; 291 | } 292 | .fa-barcode:before { 293 | content: "\f02a"; 294 | } 295 | .fa-tag:before { 296 | content: "\f02b"; 297 | } 298 | .fa-tags:before { 299 | content: "\f02c"; 300 | } 301 | .fa-book:before { 302 | content: "\f02d"; 303 | } 304 | .fa-bookmark:before { 305 | content: "\f02e"; 306 | } 307 | .fa-print:before { 308 | content: "\f02f"; 309 | } 310 | .fa-camera:before { 311 | content: "\f030"; 312 | } 313 | .fa-font:before { 314 | content: "\f031"; 315 | } 316 | .fa-bold:before { 317 | content: "\f032"; 318 | } 319 | .fa-italic:before { 320 | content: "\f033"; 321 | } 322 | .fa-text-height:before { 323 | content: "\f034"; 324 | } 325 | .fa-text-width:before { 326 | content: "\f035"; 327 | } 328 | .fa-align-left:before { 329 | content: "\f036"; 330 | } 331 | .fa-align-center:before { 332 | content: "\f037"; 333 | } 334 | .fa-align-right:before { 335 | content: "\f038"; 336 | } 337 | .fa-align-justify:before { 338 | content: "\f039"; 339 | } 340 | .fa-list:before { 341 | content: "\f03a"; 342 | } 343 | .fa-dedent:before, 344 | .fa-outdent:before { 345 | content: "\f03b"; 346 | } 347 | .fa-indent:before { 348 | content: "\f03c"; 349 | } 350 | .fa-video-camera:before { 351 | content: "\f03d"; 352 | } 353 | .fa-photo:before, 354 | .fa-image:before, 355 | .fa-picture-o:before { 356 | content: "\f03e"; 357 | } 358 | .fa-pencil:before { 359 | content: "\f040"; 360 | } 361 | .fa-map-marker:before { 362 | content: "\f041"; 363 | } 364 | .fa-adjust:before { 365 | content: "\f042"; 366 | } 367 | .fa-tint:before { 368 | content: "\f043"; 369 | } 370 | .fa-edit:before, 371 | .fa-pencil-square-o:before { 372 | content: "\f044"; 373 | } 374 | .fa-share-square-o:before { 375 | content: "\f045"; 376 | } 377 | .fa-check-square-o:before { 378 | content: "\f046"; 379 | } 380 | .fa-arrows:before { 381 | content: "\f047"; 382 | } 383 | .fa-step-backward:before { 384 | content: "\f048"; 385 | } 386 | .fa-fast-backward:before { 387 | content: "\f049"; 388 | } 389 | .fa-backward:before { 390 | content: "\f04a"; 391 | } 392 | .fa-play:before { 393 | content: "\f04b"; 394 | } 395 | .fa-pause:before { 396 | content: "\f04c"; 397 | } 398 | .fa-stop:before { 399 | content: "\f04d"; 400 | } 401 | .fa-forward:before { 402 | content: "\f04e"; 403 | } 404 | .fa-fast-forward:before { 405 | content: "\f050"; 406 | } 407 | .fa-step-forward:before { 408 | content: "\f051"; 409 | } 410 | .fa-eject:before { 411 | content: "\f052"; 412 | } 413 | .fa-chevron-left:before { 414 | content: "\f053"; 415 | } 416 | .fa-chevron-right:before { 417 | content: "\f054"; 418 | } 419 | .fa-plus-circle:before { 420 | content: "\f055"; 421 | } 422 | .fa-minus-circle:before { 423 | content: "\f056"; 424 | } 425 | .fa-times-circle:before { 426 | content: "\f057"; 427 | } 428 | .fa-check-circle:before { 429 | content: "\f058"; 430 | } 431 | .fa-question-circle:before { 432 | content: "\f059"; 433 | } 434 | .fa-info-circle:before { 435 | content: "\f05a"; 436 | } 437 | .fa-crosshairs:before { 438 | content: "\f05b"; 439 | } 440 | .fa-times-circle-o:before { 441 | content: "\f05c"; 442 | } 443 | .fa-check-circle-o:before { 444 | content: "\f05d"; 445 | } 446 | .fa-ban:before { 447 | content: "\f05e"; 448 | } 449 | .fa-arrow-left:before { 450 | content: "\f060"; 451 | } 452 | .fa-arrow-right:before { 453 | content: "\f061"; 454 | } 455 | .fa-arrow-up:before { 456 | content: "\f062"; 457 | } 458 | .fa-arrow-down:before { 459 | content: "\f063"; 460 | } 461 | .fa-mail-forward:before, 462 | .fa-share:before { 463 | content: "\f064"; 464 | } 465 | .fa-expand:before { 466 | content: "\f065"; 467 | } 468 | .fa-compress:before { 469 | content: "\f066"; 470 | } 471 | .fa-plus:before { 472 | content: "\f067"; 473 | } 474 | .fa-minus:before { 475 | content: "\f068"; 476 | } 477 | .fa-asterisk:before { 478 | content: "\f069"; 479 | } 480 | .fa-exclamation-circle:before { 481 | content: "\f06a"; 482 | } 483 | .fa-gift:before { 484 | content: "\f06b"; 485 | } 486 | .fa-leaf:before { 487 | content: "\f06c"; 488 | } 489 | .fa-fire:before { 490 | content: "\f06d"; 491 | } 492 | .fa-eye:before { 493 | content: "\f06e"; 494 | } 495 | .fa-eye-slash:before { 496 | content: "\f070"; 497 | } 498 | .fa-warning:before, 499 | .fa-exclamation-triangle:before { 500 | content: "\f071"; 501 | } 502 | .fa-plane:before { 503 | content: "\f072"; 504 | } 505 | .fa-calendar:before { 506 | content: "\f073"; 507 | } 508 | .fa-random:before { 509 | content: "\f074"; 510 | } 511 | .fa-comment:before { 512 | content: "\f075"; 513 | } 514 | .fa-magnet:before { 515 | content: "\f076"; 516 | } 517 | .fa-chevron-up:before { 518 | content: "\f077"; 519 | } 520 | .fa-chevron-down:before { 521 | content: "\f078"; 522 | } 523 | .fa-retweet:before { 524 | content: "\f079"; 525 | } 526 | .fa-shopping-cart:before { 527 | content: "\f07a"; 528 | } 529 | .fa-folder:before { 530 | content: "\f07b"; 531 | } 532 | .fa-folder-open:before { 533 | content: "\f07c"; 534 | } 535 | .fa-arrows-v:before { 536 | content: "\f07d"; 537 | } 538 | .fa-arrows-h:before { 539 | content: "\f07e"; 540 | } 541 | .fa-bar-chart-o:before, 542 | .fa-bar-chart:before { 543 | content: "\f080"; 544 | } 545 | .fa-twitter-square:before { 546 | content: "\f081"; 547 | } 548 | .fa-facebook-square:before { 549 | content: "\f082"; 550 | } 551 | .fa-camera-retro:before { 552 | content: "\f083"; 553 | } 554 | .fa-key:before { 555 | content: "\f084"; 556 | } 557 | .fa-gears:before, 558 | .fa-cogs:before { 559 | content: "\f085"; 560 | } 561 | .fa-comments:before { 562 | content: "\f086"; 563 | } 564 | .fa-thumbs-o-up:before { 565 | content: "\f087"; 566 | } 567 | .fa-thumbs-o-down:before { 568 | content: "\f088"; 569 | } 570 | .fa-star-half:before { 571 | content: "\f089"; 572 | } 573 | .fa-heart-o:before { 574 | content: "\f08a"; 575 | } 576 | .fa-sign-out:before { 577 | content: "\f08b"; 578 | } 579 | .fa-linkedin-square:before { 580 | content: "\f08c"; 581 | } 582 | .fa-thumb-tack:before { 583 | content: "\f08d"; 584 | } 585 | .fa-external-link:before { 586 | content: "\f08e"; 587 | } 588 | .fa-sign-in:before { 589 | content: "\f090"; 590 | } 591 | .fa-trophy:before { 592 | content: "\f091"; 593 | } 594 | .fa-github-square:before { 595 | content: "\f092"; 596 | } 597 | .fa-upload:before { 598 | content: "\f093"; 599 | } 600 | .fa-lemon-o:before { 601 | content: "\f094"; 602 | } 603 | .fa-phone:before { 604 | content: "\f095"; 605 | } 606 | .fa-square-o:before { 607 | content: "\f096"; 608 | } 609 | .fa-bookmark-o:before { 610 | content: "\f097"; 611 | } 612 | .fa-phone-square:before { 613 | content: "\f098"; 614 | } 615 | .fa-twitter:before { 616 | content: "\f099"; 617 | } 618 | .fa-facebook-f:before, 619 | .fa-facebook:before { 620 | content: "\f09a"; 621 | } 622 | .fa-github:before { 623 | content: "\f09b"; 624 | } 625 | .fa-unlock:before { 626 | content: "\f09c"; 627 | } 628 | .fa-credit-card:before { 629 | content: "\f09d"; 630 | } 631 | .fa-rss:before { 632 | content: "\f09e"; 633 | } 634 | .fa-hdd-o:before { 635 | content: "\f0a0"; 636 | } 637 | .fa-bullhorn:before { 638 | content: "\f0a1"; 639 | } 640 | .fa-bell:before { 641 | content: "\f0f3"; 642 | } 643 | .fa-certificate:before { 644 | content: "\f0a3"; 645 | } 646 | .fa-hand-o-right:before { 647 | content: "\f0a4"; 648 | } 649 | .fa-hand-o-left:before { 650 | content: "\f0a5"; 651 | } 652 | .fa-hand-o-up:before { 653 | content: "\f0a6"; 654 | } 655 | .fa-hand-o-down:before { 656 | content: "\f0a7"; 657 | } 658 | .fa-arrow-circle-left:before { 659 | content: "\f0a8"; 660 | } 661 | .fa-arrow-circle-right:before { 662 | content: "\f0a9"; 663 | } 664 | .fa-arrow-circle-up:before { 665 | content: "\f0aa"; 666 | } 667 | .fa-arrow-circle-down:before { 668 | content: "\f0ab"; 669 | } 670 | .fa-globe:before { 671 | content: "\f0ac"; 672 | } 673 | .fa-wrench:before { 674 | content: "\f0ad"; 675 | } 676 | .fa-tasks:before { 677 | content: "\f0ae"; 678 | } 679 | .fa-filter:before { 680 | content: "\f0b0"; 681 | } 682 | .fa-briefcase:before { 683 | content: "\f0b1"; 684 | } 685 | .fa-arrows-alt:before { 686 | content: "\f0b2"; 687 | } 688 | .fa-group:before, 689 | .fa-users:before { 690 | content: "\f0c0"; 691 | } 692 | .fa-chain:before, 693 | .fa-link:before { 694 | content: "\f0c1"; 695 | } 696 | .fa-cloud:before { 697 | content: "\f0c2"; 698 | } 699 | .fa-flask:before { 700 | content: "\f0c3"; 701 | } 702 | .fa-cut:before, 703 | .fa-scissors:before { 704 | content: "\f0c4"; 705 | } 706 | .fa-copy:before, 707 | .fa-files-o:before { 708 | content: "\f0c5"; 709 | } 710 | .fa-paperclip:before { 711 | content: "\f0c6"; 712 | } 713 | .fa-save:before, 714 | .fa-floppy-o:before { 715 | content: "\f0c7"; 716 | } 717 | .fa-square:before { 718 | content: "\f0c8"; 719 | } 720 | .fa-navicon:before, 721 | .fa-reorder:before, 722 | .fa-bars:before { 723 | content: "\f0c9"; 724 | } 725 | .fa-list-ul:before { 726 | content: "\f0ca"; 727 | } 728 | .fa-list-ol:before { 729 | content: "\f0cb"; 730 | } 731 | .fa-strikethrough:before { 732 | content: "\f0cc"; 733 | } 734 | .fa-underline:before { 735 | content: "\f0cd"; 736 | } 737 | .fa-table:before { 738 | content: "\f0ce"; 739 | } 740 | .fa-magic:before { 741 | content: "\f0d0"; 742 | } 743 | .fa-truck:before { 744 | content: "\f0d1"; 745 | } 746 | .fa-pinterest:before { 747 | content: "\f0d2"; 748 | } 749 | .fa-pinterest-square:before { 750 | content: "\f0d3"; 751 | } 752 | .fa-google-plus-square:before { 753 | content: "\f0d4"; 754 | } 755 | .fa-google-plus:before { 756 | content: "\f0d5"; 757 | } 758 | .fa-money:before { 759 | content: "\f0d6"; 760 | } 761 | .fa-caret-down:before { 762 | content: "\f0d7"; 763 | } 764 | .fa-caret-up:before { 765 | content: "\f0d8"; 766 | } 767 | .fa-caret-left:before { 768 | content: "\f0d9"; 769 | } 770 | .fa-caret-right:before { 771 | content: "\f0da"; 772 | } 773 | .fa-columns:before { 774 | content: "\f0db"; 775 | } 776 | .fa-unsorted:before, 777 | .fa-sort:before { 778 | content: "\f0dc"; 779 | } 780 | .fa-sort-down:before, 781 | .fa-sort-desc:before { 782 | content: "\f0dd"; 783 | } 784 | .fa-sort-up:before, 785 | .fa-sort-asc:before { 786 | content: "\f0de"; 787 | } 788 | .fa-envelope:before { 789 | content: "\f0e0"; 790 | } 791 | .fa-linkedin:before { 792 | content: "\f0e1"; 793 | } 794 | .fa-rotate-left:before, 795 | .fa-undo:before { 796 | content: "\f0e2"; 797 | } 798 | .fa-legal:before, 799 | .fa-gavel:before { 800 | content: "\f0e3"; 801 | } 802 | .fa-dashboard:before, 803 | .fa-tachometer:before { 804 | content: "\f0e4"; 805 | } 806 | .fa-comment-o:before { 807 | content: "\f0e5"; 808 | } 809 | .fa-comments-o:before { 810 | content: "\f0e6"; 811 | } 812 | .fa-flash:before, 813 | .fa-bolt:before { 814 | content: "\f0e7"; 815 | } 816 | .fa-sitemap:before { 817 | content: "\f0e8"; 818 | } 819 | .fa-umbrella:before { 820 | content: "\f0e9"; 821 | } 822 | .fa-paste:before, 823 | .fa-clipboard:before { 824 | content: "\f0ea"; 825 | } 826 | .fa-lightbulb-o:before { 827 | content: "\f0eb"; 828 | } 829 | .fa-exchange:before { 830 | content: "\f0ec"; 831 | } 832 | .fa-cloud-download:before { 833 | content: "\f0ed"; 834 | } 835 | .fa-cloud-upload:before { 836 | content: "\f0ee"; 837 | } 838 | .fa-user-md:before { 839 | content: "\f0f0"; 840 | } 841 | .fa-stethoscope:before { 842 | content: "\f0f1"; 843 | } 844 | .fa-suitcase:before { 845 | content: "\f0f2"; 846 | } 847 | .fa-bell-o:before { 848 | content: "\f0a2"; 849 | } 850 | .fa-coffee:before { 851 | content: "\f0f4"; 852 | } 853 | .fa-cutlery:before { 854 | content: "\f0f5"; 855 | } 856 | .fa-file-text-o:before { 857 | content: "\f0f6"; 858 | } 859 | .fa-building-o:before { 860 | content: "\f0f7"; 861 | } 862 | .fa-hospital-o:before { 863 | content: "\f0f8"; 864 | } 865 | .fa-ambulance:before { 866 | content: "\f0f9"; 867 | } 868 | .fa-medkit:before { 869 | content: "\f0fa"; 870 | } 871 | .fa-fighter-jet:before { 872 | content: "\f0fb"; 873 | } 874 | .fa-beer:before { 875 | content: "\f0fc"; 876 | } 877 | .fa-h-square:before { 878 | content: "\f0fd"; 879 | } 880 | .fa-plus-square:before { 881 | content: "\f0fe"; 882 | } 883 | .fa-angle-double-left:before { 884 | content: "\f100"; 885 | } 886 | .fa-angle-double-right:before { 887 | content: "\f101"; 888 | } 889 | .fa-angle-double-up:before { 890 | content: "\f102"; 891 | } 892 | .fa-angle-double-down:before { 893 | content: "\f103"; 894 | } 895 | .fa-angle-left:before { 896 | content: "\f104"; 897 | } 898 | .fa-angle-right:before { 899 | content: "\f105"; 900 | } 901 | .fa-angle-up:before { 902 | content: "\f106"; 903 | } 904 | .fa-angle-down:before { 905 | content: "\f107"; 906 | } 907 | .fa-desktop:before { 908 | content: "\f108"; 909 | } 910 | .fa-laptop:before { 911 | content: "\f109"; 912 | } 913 | .fa-tablet:before { 914 | content: "\f10a"; 915 | } 916 | .fa-mobile-phone:before, 917 | .fa-mobile:before { 918 | content: "\f10b"; 919 | } 920 | .fa-circle-o:before { 921 | content: "\f10c"; 922 | } 923 | .fa-quote-left:before { 924 | content: "\f10d"; 925 | } 926 | .fa-quote-right:before { 927 | content: "\f10e"; 928 | } 929 | .fa-spinner:before { 930 | content: "\f110"; 931 | } 932 | .fa-circle:before { 933 | content: "\f111"; 934 | } 935 | .fa-mail-reply:before, 936 | .fa-reply:before { 937 | content: "\f112"; 938 | } 939 | .fa-github-alt:before { 940 | content: "\f113"; 941 | } 942 | .fa-folder-o:before { 943 | content: "\f114"; 944 | } 945 | .fa-folder-open-o:before { 946 | content: "\f115"; 947 | } 948 | .fa-smile-o:before { 949 | content: "\f118"; 950 | } 951 | .fa-frown-o:before { 952 | content: "\f119"; 953 | } 954 | .fa-meh-o:before { 955 | content: "\f11a"; 956 | } 957 | .fa-gamepad:before { 958 | content: "\f11b"; 959 | } 960 | .fa-keyboard-o:before { 961 | content: "\f11c"; 962 | } 963 | .fa-flag-o:before { 964 | content: "\f11d"; 965 | } 966 | .fa-flag-checkered:before { 967 | content: "\f11e"; 968 | } 969 | .fa-terminal:before { 970 | content: "\f120"; 971 | } 972 | .fa-code:before { 973 | content: "\f121"; 974 | } 975 | .fa-mail-reply-all:before, 976 | .fa-reply-all:before { 977 | content: "\f122"; 978 | } 979 | .fa-star-half-empty:before, 980 | .fa-star-half-full:before, 981 | .fa-star-half-o:before { 982 | content: "\f123"; 983 | } 984 | .fa-location-arrow:before { 985 | content: "\f124"; 986 | } 987 | .fa-crop:before { 988 | content: "\f125"; 989 | } 990 | .fa-code-fork:before { 991 | content: "\f126"; 992 | } 993 | .fa-unlink:before, 994 | .fa-chain-broken:before { 995 | content: "\f127"; 996 | } 997 | .fa-question:before { 998 | content: "\f128"; 999 | } 1000 | .fa-info:before { 1001 | content: "\f129"; 1002 | } 1003 | .fa-exclamation:before { 1004 | content: "\f12a"; 1005 | } 1006 | .fa-superscript:before { 1007 | content: "\f12b"; 1008 | } 1009 | .fa-subscript:before { 1010 | content: "\f12c"; 1011 | } 1012 | .fa-eraser:before { 1013 | content: "\f12d"; 1014 | } 1015 | .fa-puzzle-piece:before { 1016 | content: "\f12e"; 1017 | } 1018 | .fa-microphone:before { 1019 | content: "\f130"; 1020 | } 1021 | .fa-microphone-slash:before { 1022 | content: "\f131"; 1023 | } 1024 | .fa-shield:before { 1025 | content: "\f132"; 1026 | } 1027 | .fa-calendar-o:before { 1028 | content: "\f133"; 1029 | } 1030 | .fa-fire-extinguisher:before { 1031 | content: "\f134"; 1032 | } 1033 | .fa-rocket:before { 1034 | content: "\f135"; 1035 | } 1036 | .fa-maxcdn:before { 1037 | content: "\f136"; 1038 | } 1039 | .fa-chevron-circle-left:before { 1040 | content: "\f137"; 1041 | } 1042 | .fa-chevron-circle-right:before { 1043 | content: "\f138"; 1044 | } 1045 | .fa-chevron-circle-up:before { 1046 | content: "\f139"; 1047 | } 1048 | .fa-chevron-circle-down:before { 1049 | content: "\f13a"; 1050 | } 1051 | .fa-html5:before { 1052 | content: "\f13b"; 1053 | } 1054 | .fa-css3:before { 1055 | content: "\f13c"; 1056 | } 1057 | .fa-anchor:before { 1058 | content: "\f13d"; 1059 | } 1060 | .fa-unlock-alt:before { 1061 | content: "\f13e"; 1062 | } 1063 | .fa-bullseye:before { 1064 | content: "\f140"; 1065 | } 1066 | .fa-ellipsis-h:before { 1067 | content: "\f141"; 1068 | } 1069 | .fa-ellipsis-v:before { 1070 | content: "\f142"; 1071 | } 1072 | .fa-rss-square:before { 1073 | content: "\f143"; 1074 | } 1075 | .fa-play-circle:before { 1076 | content: "\f144"; 1077 | } 1078 | .fa-ticket:before { 1079 | content: "\f145"; 1080 | } 1081 | .fa-minus-square:before { 1082 | content: "\f146"; 1083 | } 1084 | .fa-minus-square-o:before { 1085 | content: "\f147"; 1086 | } 1087 | .fa-level-up:before { 1088 | content: "\f148"; 1089 | } 1090 | .fa-level-down:before { 1091 | content: "\f149"; 1092 | } 1093 | .fa-check-square:before { 1094 | content: "\f14a"; 1095 | } 1096 | .fa-pencil-square:before { 1097 | content: "\f14b"; 1098 | } 1099 | .fa-external-link-square:before { 1100 | content: "\f14c"; 1101 | } 1102 | .fa-share-square:before { 1103 | content: "\f14d"; 1104 | } 1105 | .fa-compass:before { 1106 | content: "\f14e"; 1107 | } 1108 | .fa-toggle-down:before, 1109 | .fa-caret-square-o-down:before { 1110 | content: "\f150"; 1111 | } 1112 | .fa-toggle-up:before, 1113 | .fa-caret-square-o-up:before { 1114 | content: "\f151"; 1115 | } 1116 | .fa-toggle-right:before, 1117 | .fa-caret-square-o-right:before { 1118 | content: "\f152"; 1119 | } 1120 | .fa-euro:before, 1121 | .fa-eur:before { 1122 | content: "\f153"; 1123 | } 1124 | .fa-gbp:before { 1125 | content: "\f154"; 1126 | } 1127 | .fa-dollar:before, 1128 | .fa-usd:before { 1129 | content: "\f155"; 1130 | } 1131 | .fa-rupee:before, 1132 | .fa-inr:before { 1133 | content: "\f156"; 1134 | } 1135 | .fa-cny:before, 1136 | .fa-rmb:before, 1137 | .fa-yen:before, 1138 | .fa-jpy:before { 1139 | content: "\f157"; 1140 | } 1141 | .fa-ruble:before, 1142 | .fa-rouble:before, 1143 | .fa-rub:before { 1144 | content: "\f158"; 1145 | } 1146 | .fa-won:before, 1147 | .fa-krw:before { 1148 | content: "\f159"; 1149 | } 1150 | .fa-bitcoin:before, 1151 | .fa-btc:before { 1152 | content: "\f15a"; 1153 | } 1154 | .fa-file:before { 1155 | content: "\f15b"; 1156 | } 1157 | .fa-file-text:before { 1158 | content: "\f15c"; 1159 | } 1160 | .fa-sort-alpha-asc:before { 1161 | content: "\f15d"; 1162 | } 1163 | .fa-sort-alpha-desc:before { 1164 | content: "\f15e"; 1165 | } 1166 | .fa-sort-amount-asc:before { 1167 | content: "\f160"; 1168 | } 1169 | .fa-sort-amount-desc:before { 1170 | content: "\f161"; 1171 | } 1172 | .fa-sort-numeric-asc:before { 1173 | content: "\f162"; 1174 | } 1175 | .fa-sort-numeric-desc:before { 1176 | content: "\f163"; 1177 | } 1178 | .fa-thumbs-up:before { 1179 | content: "\f164"; 1180 | } 1181 | .fa-thumbs-down:before { 1182 | content: "\f165"; 1183 | } 1184 | .fa-youtube-square:before { 1185 | content: "\f166"; 1186 | } 1187 | .fa-youtube:before { 1188 | content: "\f167"; 1189 | } 1190 | .fa-xing:before { 1191 | content: "\f168"; 1192 | } 1193 | .fa-xing-square:before { 1194 | content: "\f169"; 1195 | } 1196 | .fa-youtube-play:before { 1197 | content: "\f16a"; 1198 | } 1199 | .fa-dropbox:before { 1200 | content: "\f16b"; 1201 | } 1202 | .fa-stack-overflow:before { 1203 | content: "\f16c"; 1204 | } 1205 | .fa-instagram:before { 1206 | content: "\f16d"; 1207 | } 1208 | .fa-flickr:before { 1209 | content: "\f16e"; 1210 | } 1211 | .fa-adn:before { 1212 | content: "\f170"; 1213 | } 1214 | .fa-bitbucket:before { 1215 | content: "\f171"; 1216 | } 1217 | .fa-bitbucket-square:before { 1218 | content: "\f172"; 1219 | } 1220 | .fa-tumblr:before { 1221 | content: "\f173"; 1222 | } 1223 | .fa-tumblr-square:before { 1224 | content: "\f174"; 1225 | } 1226 | .fa-long-arrow-down:before { 1227 | content: "\f175"; 1228 | } 1229 | .fa-long-arrow-up:before { 1230 | content: "\f176"; 1231 | } 1232 | .fa-long-arrow-left:before { 1233 | content: "\f177"; 1234 | } 1235 | .fa-long-arrow-right:before { 1236 | content: "\f178"; 1237 | } 1238 | .fa-apple:before { 1239 | content: "\f179"; 1240 | } 1241 | .fa-windows:before { 1242 | content: "\f17a"; 1243 | } 1244 | .fa-android:before { 1245 | content: "\f17b"; 1246 | } 1247 | .fa-linux:before { 1248 | content: "\f17c"; 1249 | } 1250 | .fa-dribbble:before { 1251 | content: "\f17d"; 1252 | } 1253 | .fa-skype:before { 1254 | content: "\f17e"; 1255 | } 1256 | .fa-foursquare:before { 1257 | content: "\f180"; 1258 | } 1259 | .fa-trello:before { 1260 | content: "\f181"; 1261 | } 1262 | .fa-female:before { 1263 | content: "\f182"; 1264 | } 1265 | .fa-male:before { 1266 | content: "\f183"; 1267 | } 1268 | .fa-gittip:before, 1269 | .fa-gratipay:before { 1270 | content: "\f184"; 1271 | } 1272 | .fa-sun-o:before { 1273 | content: "\f185"; 1274 | } 1275 | .fa-moon-o:before { 1276 | content: "\f186"; 1277 | } 1278 | .fa-archive:before { 1279 | content: "\f187"; 1280 | } 1281 | .fa-bug:before { 1282 | content: "\f188"; 1283 | } 1284 | .fa-vk:before { 1285 | content: "\f189"; 1286 | } 1287 | .fa-weibo:before { 1288 | content: "\f18a"; 1289 | } 1290 | .fa-renren:before { 1291 | content: "\f18b"; 1292 | } 1293 | .fa-pagelines:before { 1294 | content: "\f18c"; 1295 | } 1296 | .fa-stack-exchange:before { 1297 | content: "\f18d"; 1298 | } 1299 | .fa-arrow-circle-o-right:before { 1300 | content: "\f18e"; 1301 | } 1302 | .fa-arrow-circle-o-left:before { 1303 | content: "\f190"; 1304 | } 1305 | .fa-toggle-left:before, 1306 | .fa-caret-square-o-left:before { 1307 | content: "\f191"; 1308 | } 1309 | .fa-dot-circle-o:before { 1310 | content: "\f192"; 1311 | } 1312 | .fa-wheelchair:before { 1313 | content: "\f193"; 1314 | } 1315 | .fa-vimeo-square:before { 1316 | content: "\f194"; 1317 | } 1318 | .fa-turkish-lira:before, 1319 | .fa-try:before { 1320 | content: "\f195"; 1321 | } 1322 | .fa-plus-square-o:before { 1323 | content: "\f196"; 1324 | } 1325 | .fa-space-shuttle:before { 1326 | content: "\f197"; 1327 | } 1328 | .fa-slack:before { 1329 | content: "\f198"; 1330 | } 1331 | .fa-envelope-square:before { 1332 | content: "\f199"; 1333 | } 1334 | .fa-wordpress:before { 1335 | content: "\f19a"; 1336 | } 1337 | .fa-openid:before { 1338 | content: "\f19b"; 1339 | } 1340 | .fa-institution:before, 1341 | .fa-bank:before, 1342 | .fa-university:before { 1343 | content: "\f19c"; 1344 | } 1345 | .fa-mortar-board:before, 1346 | .fa-graduation-cap:before { 1347 | content: "\f19d"; 1348 | } 1349 | .fa-yahoo:before { 1350 | content: "\f19e"; 1351 | } 1352 | .fa-google:before { 1353 | content: "\f1a0"; 1354 | } 1355 | .fa-reddit:before { 1356 | content: "\f1a1"; 1357 | } 1358 | .fa-reddit-square:before { 1359 | content: "\f1a2"; 1360 | } 1361 | .fa-stumbleupon-circle:before { 1362 | content: "\f1a3"; 1363 | } 1364 | .fa-stumbleupon:before { 1365 | content: "\f1a4"; 1366 | } 1367 | .fa-delicious:before { 1368 | content: "\f1a5"; 1369 | } 1370 | .fa-digg:before { 1371 | content: "\f1a6"; 1372 | } 1373 | .fa-pied-piper:before { 1374 | content: "\f1a7"; 1375 | } 1376 | .fa-pied-piper-alt:before { 1377 | content: "\f1a8"; 1378 | } 1379 | .fa-drupal:before { 1380 | content: "\f1a9"; 1381 | } 1382 | .fa-joomla:before { 1383 | content: "\f1aa"; 1384 | } 1385 | .fa-language:before { 1386 | content: "\f1ab"; 1387 | } 1388 | .fa-fax:before { 1389 | content: "\f1ac"; 1390 | } 1391 | .fa-building:before { 1392 | content: "\f1ad"; 1393 | } 1394 | .fa-child:before { 1395 | content: "\f1ae"; 1396 | } 1397 | .fa-paw:before { 1398 | content: "\f1b0"; 1399 | } 1400 | .fa-spoon:before { 1401 | content: "\f1b1"; 1402 | } 1403 | .fa-cube:before { 1404 | content: "\f1b2"; 1405 | } 1406 | .fa-cubes:before { 1407 | content: "\f1b3"; 1408 | } 1409 | .fa-behance:before { 1410 | content: "\f1b4"; 1411 | } 1412 | .fa-behance-square:before { 1413 | content: "\f1b5"; 1414 | } 1415 | .fa-steam:before { 1416 | content: "\f1b6"; 1417 | } 1418 | .fa-steam-square:before { 1419 | content: "\f1b7"; 1420 | } 1421 | .fa-recycle:before { 1422 | content: "\f1b8"; 1423 | } 1424 | .fa-automobile:before, 1425 | .fa-car:before { 1426 | content: "\f1b9"; 1427 | } 1428 | .fa-cab:before, 1429 | .fa-taxi:before { 1430 | content: "\f1ba"; 1431 | } 1432 | .fa-tree:before { 1433 | content: "\f1bb"; 1434 | } 1435 | .fa-spotify:before { 1436 | content: "\f1bc"; 1437 | } 1438 | .fa-deviantart:before { 1439 | content: "\f1bd"; 1440 | } 1441 | .fa-soundcloud:before { 1442 | content: "\f1be"; 1443 | } 1444 | .fa-database:before { 1445 | content: "\f1c0"; 1446 | } 1447 | .fa-file-pdf-o:before { 1448 | content: "\f1c1"; 1449 | } 1450 | .fa-file-word-o:before { 1451 | content: "\f1c2"; 1452 | } 1453 | .fa-file-excel-o:before { 1454 | content: "\f1c3"; 1455 | } 1456 | .fa-file-powerpoint-o:before { 1457 | content: "\f1c4"; 1458 | } 1459 | .fa-file-photo-o:before, 1460 | .fa-file-picture-o:before, 1461 | .fa-file-image-o:before { 1462 | content: "\f1c5"; 1463 | } 1464 | .fa-file-zip-o:before, 1465 | .fa-file-archive-o:before { 1466 | content: "\f1c6"; 1467 | } 1468 | .fa-file-sound-o:before, 1469 | .fa-file-audio-o:before { 1470 | content: "\f1c7"; 1471 | } 1472 | .fa-file-movie-o:before, 1473 | .fa-file-video-o:before { 1474 | content: "\f1c8"; 1475 | } 1476 | .fa-file-code-o:before { 1477 | content: "\f1c9"; 1478 | } 1479 | .fa-vine:before { 1480 | content: "\f1ca"; 1481 | } 1482 | .fa-codepen:before { 1483 | content: "\f1cb"; 1484 | } 1485 | .fa-jsfiddle:before { 1486 | content: "\f1cc"; 1487 | } 1488 | .fa-life-bouy:before, 1489 | .fa-life-buoy:before, 1490 | .fa-life-saver:before, 1491 | .fa-support:before, 1492 | .fa-life-ring:before { 1493 | content: "\f1cd"; 1494 | } 1495 | .fa-circle-o-notch:before { 1496 | content: "\f1ce"; 1497 | } 1498 | .fa-ra:before, 1499 | .fa-rebel:before { 1500 | content: "\f1d0"; 1501 | } 1502 | .fa-ge:before, 1503 | .fa-empire:before { 1504 | content: "\f1d1"; 1505 | } 1506 | .fa-git-square:before { 1507 | content: "\f1d2"; 1508 | } 1509 | .fa-git:before { 1510 | content: "\f1d3"; 1511 | } 1512 | .fa-hacker-news:before { 1513 | content: "\f1d4"; 1514 | } 1515 | .fa-tencent-weibo:before { 1516 | content: "\f1d5"; 1517 | } 1518 | .fa-qq:before { 1519 | content: "\f1d6"; 1520 | } 1521 | .fa-wechat:before, 1522 | .fa-weixin:before { 1523 | content: "\f1d7"; 1524 | } 1525 | .fa-send:before, 1526 | .fa-paper-plane:before { 1527 | content: "\f1d8"; 1528 | } 1529 | .fa-send-o:before, 1530 | .fa-paper-plane-o:before { 1531 | content: "\f1d9"; 1532 | } 1533 | .fa-history:before { 1534 | content: "\f1da"; 1535 | } 1536 | .fa-genderless:before, 1537 | .fa-circle-thin:before { 1538 | content: "\f1db"; 1539 | } 1540 | .fa-header:before { 1541 | content: "\f1dc"; 1542 | } 1543 | .fa-paragraph:before { 1544 | content: "\f1dd"; 1545 | } 1546 | .fa-sliders:before { 1547 | content: "\f1de"; 1548 | } 1549 | .fa-share-alt:before { 1550 | content: "\f1e0"; 1551 | } 1552 | .fa-share-alt-square:before { 1553 | content: "\f1e1"; 1554 | } 1555 | .fa-bomb:before { 1556 | content: "\f1e2"; 1557 | } 1558 | .fa-soccer-ball-o:before, 1559 | .fa-futbol-o:before { 1560 | content: "\f1e3"; 1561 | } 1562 | .fa-tty:before { 1563 | content: "\f1e4"; 1564 | } 1565 | .fa-binoculars:before { 1566 | content: "\f1e5"; 1567 | } 1568 | .fa-plug:before { 1569 | content: "\f1e6"; 1570 | } 1571 | .fa-slideshare:before { 1572 | content: "\f1e7"; 1573 | } 1574 | .fa-twitch:before { 1575 | content: "\f1e8"; 1576 | } 1577 | .fa-yelp:before { 1578 | content: "\f1e9"; 1579 | } 1580 | .fa-newspaper-o:before { 1581 | content: "\f1ea"; 1582 | } 1583 | .fa-wifi:before { 1584 | content: "\f1eb"; 1585 | } 1586 | .fa-calculator:before { 1587 | content: "\f1ec"; 1588 | } 1589 | .fa-paypal:before { 1590 | content: "\f1ed"; 1591 | } 1592 | .fa-google-wallet:before { 1593 | content: "\f1ee"; 1594 | } 1595 | .fa-cc-visa:before { 1596 | content: "\f1f0"; 1597 | } 1598 | .fa-cc-mastercard:before { 1599 | content: "\f1f1"; 1600 | } 1601 | .fa-cc-discover:before { 1602 | content: "\f1f2"; 1603 | } 1604 | .fa-cc-amex:before { 1605 | content: "\f1f3"; 1606 | } 1607 | .fa-cc-paypal:before { 1608 | content: "\f1f4"; 1609 | } 1610 | .fa-cc-stripe:before { 1611 | content: "\f1f5"; 1612 | } 1613 | .fa-bell-slash:before { 1614 | content: "\f1f6"; 1615 | } 1616 | .fa-bell-slash-o:before { 1617 | content: "\f1f7"; 1618 | } 1619 | .fa-trash:before { 1620 | content: "\f1f8"; 1621 | } 1622 | .fa-copyright:before { 1623 | content: "\f1f9"; 1624 | } 1625 | .fa-at:before { 1626 | content: "\f1fa"; 1627 | } 1628 | .fa-eyedropper:before { 1629 | content: "\f1fb"; 1630 | } 1631 | .fa-paint-brush:before { 1632 | content: "\f1fc"; 1633 | } 1634 | .fa-birthday-cake:before { 1635 | content: "\f1fd"; 1636 | } 1637 | .fa-area-chart:before { 1638 | content: "\f1fe"; 1639 | } 1640 | .fa-pie-chart:before { 1641 | content: "\f200"; 1642 | } 1643 | .fa-line-chart:before { 1644 | content: "\f201"; 1645 | } 1646 | .fa-lastfm:before { 1647 | content: "\f202"; 1648 | } 1649 | .fa-lastfm-square:before { 1650 | content: "\f203"; 1651 | } 1652 | .fa-toggle-off:before { 1653 | content: "\f204"; 1654 | } 1655 | .fa-toggle-on:before { 1656 | content: "\f205"; 1657 | } 1658 | .fa-bicycle:before { 1659 | content: "\f206"; 1660 | } 1661 | .fa-bus:before { 1662 | content: "\f207"; 1663 | } 1664 | .fa-ioxhost:before { 1665 | content: "\f208"; 1666 | } 1667 | .fa-angellist:before { 1668 | content: "\f209"; 1669 | } 1670 | .fa-cc:before { 1671 | content: "\f20a"; 1672 | } 1673 | .fa-shekel:before, 1674 | .fa-sheqel:before, 1675 | .fa-ils:before { 1676 | content: "\f20b"; 1677 | } 1678 | .fa-meanpath:before { 1679 | content: "\f20c"; 1680 | } 1681 | .fa-buysellads:before { 1682 | content: "\f20d"; 1683 | } 1684 | .fa-connectdevelop:before { 1685 | content: "\f20e"; 1686 | } 1687 | .fa-dashcube:before { 1688 | content: "\f210"; 1689 | } 1690 | .fa-forumbee:before { 1691 | content: "\f211"; 1692 | } 1693 | .fa-leanpub:before { 1694 | content: "\f212"; 1695 | } 1696 | .fa-sellsy:before { 1697 | content: "\f213"; 1698 | } 1699 | .fa-shirtsinbulk:before { 1700 | content: "\f214"; 1701 | } 1702 | .fa-simplybuilt:before { 1703 | content: "\f215"; 1704 | } 1705 | .fa-skyatlas:before { 1706 | content: "\f216"; 1707 | } 1708 | .fa-cart-plus:before { 1709 | content: "\f217"; 1710 | } 1711 | .fa-cart-arrow-down:before { 1712 | content: "\f218"; 1713 | } 1714 | .fa-diamond:before { 1715 | content: "\f219"; 1716 | } 1717 | .fa-ship:before { 1718 | content: "\f21a"; 1719 | } 1720 | .fa-user-secret:before { 1721 | content: "\f21b"; 1722 | } 1723 | .fa-motorcycle:before { 1724 | content: "\f21c"; 1725 | } 1726 | .fa-street-view:before { 1727 | content: "\f21d"; 1728 | } 1729 | .fa-heartbeat:before { 1730 | content: "\f21e"; 1731 | } 1732 | .fa-venus:before { 1733 | content: "\f221"; 1734 | } 1735 | .fa-mars:before { 1736 | content: "\f222"; 1737 | } 1738 | .fa-mercury:before { 1739 | content: "\f223"; 1740 | } 1741 | .fa-transgender:before { 1742 | content: "\f224"; 1743 | } 1744 | .fa-transgender-alt:before { 1745 | content: "\f225"; 1746 | } 1747 | .fa-venus-double:before { 1748 | content: "\f226"; 1749 | } 1750 | .fa-mars-double:before { 1751 | content: "\f227"; 1752 | } 1753 | .fa-venus-mars:before { 1754 | content: "\f228"; 1755 | } 1756 | .fa-mars-stroke:before { 1757 | content: "\f229"; 1758 | } 1759 | .fa-mars-stroke-v:before { 1760 | content: "\f22a"; 1761 | } 1762 | .fa-mars-stroke-h:before { 1763 | content: "\f22b"; 1764 | } 1765 | .fa-neuter:before { 1766 | content: "\f22c"; 1767 | } 1768 | .fa-facebook-official:before { 1769 | content: "\f230"; 1770 | } 1771 | .fa-pinterest-p:before { 1772 | content: "\f231"; 1773 | } 1774 | .fa-whatsapp:before { 1775 | content: "\f232"; 1776 | } 1777 | .fa-server:before { 1778 | content: "\f233"; 1779 | } 1780 | .fa-user-plus:before { 1781 | content: "\f234"; 1782 | } 1783 | .fa-user-times:before { 1784 | content: "\f235"; 1785 | } 1786 | .fa-hotel:before, 1787 | .fa-bed:before { 1788 | content: "\f236"; 1789 | } 1790 | .fa-viacoin:before { 1791 | content: "\f237"; 1792 | } 1793 | .fa-train:before { 1794 | content: "\f238"; 1795 | } 1796 | .fa-subway:before { 1797 | content: "\f239"; 1798 | } 1799 | .fa-medium:before { 1800 | content: "\f23a"; 1801 | } 1802 | -------------------------------------------------------------------------------- /static/css/fullscreen.css: -------------------------------------------------------------------------------- 1 | .xterm.fullscreen { 2 | position: fixed; 3 | top: 0; 4 | bottom: 0; 5 | left: 0; 6 | right: 0; 7 | width: auto; 8 | height: auto; 9 | z-index: 255; 10 | } 11 | -------------------------------------------------------------------------------- /static/css/xterm.css: -------------------------------------------------------------------------------- 1 | /** 2 | * xterm.js: xterm, in the browser 3 | * Copyright (c) 2014-2016, SourceLair Private Company (www.sourcelair.com (MIT License) 4 | * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) 5 | * https://github.com/chjj/term.js 6 | * 7 | * Permission is hereby granted, free of charge, to any person obtaining a copy 8 | * of this software and associated documentation files (the "Software"), to deal 9 | * in the Software without restriction, including without limitation the rights 10 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | * copies of the Software, and to permit persons to whom the Software is 12 | * furnished to do so, subject to the following conditions: 13 | * 14 | * The above copyright notice and this permission notice shall be included in 15 | * all copies or substantial portions of the Software. 16 | * 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | * THE SOFTWARE. 24 | * 25 | * Originally forked from (with the author's permission): 26 | * Fabrice Bellard's javascript vt100 for jslinux: 27 | * http://bellard.org/jslinux/ 28 | * Copyright (c) 2011 Fabrice Bellard 29 | * The original design remains. The terminal itself 30 | * has been extended to include xterm CSI codes, among 31 | * other features. 32 | */ 33 | 34 | /* 35 | * Default style for xterm.js 36 | */ 37 | 38 | .terminal { 39 | background-color: #000; 40 | color: #fff; 41 | font-family: courier-new, courier, monospace; 42 | font-feature-settings: "liga" 0; 43 | position: relative; 44 | } 45 | 46 | .terminal.focus, 47 | .terminal:focus { 48 | outline: none; 49 | } 50 | 51 | .terminal .xterm-helpers { 52 | position: absolute; 53 | top: 0; 54 | } 55 | 56 | .terminal .xterm-helper-textarea { 57 | /* 58 | * HACK: to fix IE's blinking cursor 59 | * Move textarea out of the screen to the far left, so that the cursor is not visible. 60 | */ 61 | position: absolute; 62 | opacity: 0; 63 | left: -9999em; 64 | top: 0; 65 | width: 0; 66 | height: 0; 67 | z-index: -10; 68 | /** Prevent wrapping so the IME appears against the textarea at the correct position */ 69 | white-space: nowrap; 70 | overflow: hidden; 71 | resize: none; 72 | } 73 | 74 | .terminal a { 75 | color: inherit; 76 | text-decoration: none; 77 | } 78 | 79 | .terminal a:hover { 80 | cursor: pointer; 81 | text-decoration: underline; 82 | } 83 | 84 | .terminal a.xterm-invalid-link:hover { 85 | cursor: text; 86 | text-decoration: none; 87 | } 88 | 89 | .terminal.focus:not(.xterm-cursor-style-underline):not(.xterm-cursor-style-bar) .terminal-cursor { 90 | background-color: #fff; 91 | color: #000; 92 | } 93 | 94 | .terminal:not(.focus) .terminal-cursor { 95 | outline: 1px solid #fff; 96 | outline-offset: -1px; 97 | background-color: transparent; 98 | } 99 | 100 | .terminal:not(.xterm-cursor-style-underline):not(.xterm-cursor-style-bar).focus.xterm-cursor-blink-on .terminal-cursor { 101 | background-color: transparent; 102 | color: inherit; 103 | } 104 | 105 | .terminal.xterm-cursor-style-bar .terminal-cursor, 106 | .terminal.xterm-cursor-style-underline .terminal-cursor { 107 | position: relative; 108 | } 109 | .terminal.xterm-cursor-style-bar .terminal-cursor::before, 110 | .terminal.xterm-cursor-style-underline .terminal-cursor::before { 111 | content: ""; 112 | display: block; 113 | position: absolute; 114 | background-color: #fff; 115 | } 116 | .terminal.xterm-cursor-style-bar .terminal-cursor::before { 117 | top: 0; 118 | bottom: 0; 119 | left: 0; 120 | width: 1px; 121 | } 122 | .terminal.xterm-cursor-style-underline .terminal-cursor::before { 123 | bottom: 0; 124 | left: 0; 125 | right: 0; 126 | height: 1px; 127 | } 128 | .terminal.xterm-cursor-style-bar.focus.xterm-cursor-blink.xterm-cursor-blink-on .terminal-cursor::before, 129 | .terminal.xterm-cursor-style-underline.focus.xterm-cursor-blink.xterm-cursor-blink-on .terminal-cursor::before { 130 | background-color: transparent; 131 | } 132 | .terminal.xterm-cursor-style-bar.focus.xterm-cursor-blink .terminal-cursor::before, 133 | .terminal.xterm-cursor-style-underline.focus.xterm-cursor-blink .terminal-cursor::before { 134 | background-color: #fff; 135 | } 136 | 137 | .terminal .composition-view { 138 | background: #000; 139 | color: #FFF; 140 | display: none; 141 | position: absolute; 142 | white-space: nowrap; 143 | z-index: 1; 144 | } 145 | 146 | .terminal .composition-view.active { 147 | display: block; 148 | } 149 | 150 | .terminal .xterm-viewport { 151 | /* On OS X this is required in order for the scroll bar to appear fully opaque */ 152 | background-color: #000; 153 | overflow-y: scroll; 154 | } 155 | 156 | .terminal .xterm-wide-char { 157 | display: inline-block; 158 | } 159 | 160 | .terminal .xterm-rows { 161 | position: absolute; 162 | left: 0; 163 | top: 0; 164 | } 165 | 166 | .terminal .xterm-rows > div { 167 | /* Lines containing spans and text nodes ocassionally wrap despite being the same width (#327) */ 168 | white-space: nowrap; 169 | } 170 | 171 | .terminal .xterm-scroll-area { 172 | visibility: hidden; 173 | } 174 | 175 | .terminal .xterm-char-measure-element { 176 | display: inline-block; 177 | visibility: hidden; 178 | position: absolute; 179 | left: -9999em; 180 | } 181 | 182 | /* 183 | * Determine default colors for xterm.js 184 | */ 185 | .terminal .xterm-bold { 186 | font-weight: bold; 187 | } 188 | 189 | .terminal .xterm-underline { 190 | text-decoration: underline; 191 | } 192 | 193 | .terminal .xterm-blink { 194 | text-decoration: blink; 195 | } 196 | 197 | .terminal .xterm-hidden { 198 | visibility: hidden; 199 | } 200 | 201 | .terminal .xterm-color-0 { 202 | color: #2e3436; 203 | } 204 | 205 | .terminal .xterm-bg-color-0 { 206 | background-color: #2e3436; 207 | } 208 | 209 | .terminal .xterm-color-1 { 210 | color: #cc0000; 211 | } 212 | 213 | .terminal .xterm-bg-color-1 { 214 | background-color: #cc0000; 215 | } 216 | 217 | .terminal .xterm-color-2 { 218 | color: #4e9a06; 219 | } 220 | 221 | .terminal .xterm-bg-color-2 { 222 | background-color: #4e9a06; 223 | } 224 | 225 | .terminal .xterm-color-3 { 226 | color: #c4a000; 227 | } 228 | 229 | .terminal .xterm-bg-color-3 { 230 | background-color: #c4a000; 231 | } 232 | 233 | .terminal .xterm-color-4 { 234 | color: #3465a4; 235 | } 236 | 237 | .terminal .xterm-bg-color-4 { 238 | background-color: #3465a4; 239 | } 240 | 241 | .terminal .xterm-color-5 { 242 | color: #75507b; 243 | } 244 | 245 | .terminal .xterm-bg-color-5 { 246 | background-color: #75507b; 247 | } 248 | 249 | .terminal .xterm-color-6 { 250 | color: #06989a; 251 | } 252 | 253 | .terminal .xterm-bg-color-6 { 254 | background-color: #06989a; 255 | } 256 | 257 | .terminal .xterm-color-7 { 258 | color: #d3d7cf; 259 | } 260 | 261 | .terminal .xterm-bg-color-7 { 262 | background-color: #d3d7cf; 263 | } 264 | 265 | .terminal .xterm-color-8 { 266 | color: #555753; 267 | } 268 | 269 | .terminal .xterm-bg-color-8 { 270 | background-color: #555753; 271 | } 272 | 273 | .terminal .xterm-color-9 { 274 | color: #ef2929; 275 | } 276 | 277 | .terminal .xterm-bg-color-9 { 278 | background-color: #ef2929; 279 | } 280 | 281 | .terminal .xterm-color-10 { 282 | color: #8ae234; 283 | } 284 | 285 | .terminal .xterm-bg-color-10 { 286 | background-color: #8ae234; 287 | } 288 | 289 | .terminal .xterm-color-11 { 290 | color: #fce94f; 291 | } 292 | 293 | .terminal .xterm-bg-color-11 { 294 | background-color: #fce94f; 295 | } 296 | 297 | .terminal .xterm-color-12 { 298 | color: #729fcf; 299 | } 300 | 301 | .terminal .xterm-bg-color-12 { 302 | background-color: #729fcf; 303 | } 304 | 305 | .terminal .xterm-color-13 { 306 | color: #ad7fa8; 307 | } 308 | 309 | .terminal .xterm-bg-color-13 { 310 | background-color: #ad7fa8; 311 | } 312 | 313 | .terminal .xterm-color-14 { 314 | color: #34e2e2; 315 | } 316 | 317 | .terminal .xterm-bg-color-14 { 318 | background-color: #34e2e2; 319 | } 320 | 321 | .terminal .xterm-color-15 { 322 | color: #eeeeec; 323 | } 324 | 325 | .terminal .xterm-bg-color-15 { 326 | background-color: #eeeeec; 327 | } 328 | 329 | .terminal .xterm-color-16 { 330 | color: #000000; 331 | } 332 | 333 | .terminal .xterm-bg-color-16 { 334 | background-color: #000000; 335 | } 336 | 337 | .terminal .xterm-color-17 { 338 | color: #00005f; 339 | } 340 | 341 | .terminal .xterm-bg-color-17 { 342 | background-color: #00005f; 343 | } 344 | 345 | .terminal .xterm-color-18 { 346 | color: #000087; 347 | } 348 | 349 | .terminal .xterm-bg-color-18 { 350 | background-color: #000087; 351 | } 352 | 353 | .terminal .xterm-color-19 { 354 | color: #0000af; 355 | } 356 | 357 | .terminal .xterm-bg-color-19 { 358 | background-color: #0000af; 359 | } 360 | 361 | .terminal .xterm-color-20 { 362 | color: #0000d7; 363 | } 364 | 365 | .terminal .xterm-bg-color-20 { 366 | background-color: #0000d7; 367 | } 368 | 369 | .terminal .xterm-color-21 { 370 | color: #0000ff; 371 | } 372 | 373 | .terminal .xterm-bg-color-21 { 374 | background-color: #0000ff; 375 | } 376 | 377 | .terminal .xterm-color-22 { 378 | color: #005f00; 379 | } 380 | 381 | .terminal .xterm-bg-color-22 { 382 | background-color: #005f00; 383 | } 384 | 385 | .terminal .xterm-color-23 { 386 | color: #005f5f; 387 | } 388 | 389 | .terminal .xterm-bg-color-23 { 390 | background-color: #005f5f; 391 | } 392 | 393 | .terminal .xterm-color-24 { 394 | color: #005f87; 395 | } 396 | 397 | .terminal .xterm-bg-color-24 { 398 | background-color: #005f87; 399 | } 400 | 401 | .terminal .xterm-color-25 { 402 | color: #005faf; 403 | } 404 | 405 | .terminal .xterm-bg-color-25 { 406 | background-color: #005faf; 407 | } 408 | 409 | .terminal .xterm-color-26 { 410 | color: #005fd7; 411 | } 412 | 413 | .terminal .xterm-bg-color-26 { 414 | background-color: #005fd7; 415 | } 416 | 417 | .terminal .xterm-color-27 { 418 | color: #005fff; 419 | } 420 | 421 | .terminal .xterm-bg-color-27 { 422 | background-color: #005fff; 423 | } 424 | 425 | .terminal .xterm-color-28 { 426 | color: #008700; 427 | } 428 | 429 | .terminal .xterm-bg-color-28 { 430 | background-color: #008700; 431 | } 432 | 433 | .terminal .xterm-color-29 { 434 | color: #00875f; 435 | } 436 | 437 | .terminal .xterm-bg-color-29 { 438 | background-color: #00875f; 439 | } 440 | 441 | .terminal .xterm-color-30 { 442 | color: #008787; 443 | } 444 | 445 | .terminal .xterm-bg-color-30 { 446 | background-color: #008787; 447 | } 448 | 449 | .terminal .xterm-color-31 { 450 | color: #0087af; 451 | } 452 | 453 | .terminal .xterm-bg-color-31 { 454 | background-color: #0087af; 455 | } 456 | 457 | .terminal .xterm-color-32 { 458 | color: #0087d7; 459 | } 460 | 461 | .terminal .xterm-bg-color-32 { 462 | background-color: #0087d7; 463 | } 464 | 465 | .terminal .xterm-color-33 { 466 | color: #0087ff; 467 | } 468 | 469 | .terminal .xterm-bg-color-33 { 470 | background-color: #0087ff; 471 | } 472 | 473 | .terminal .xterm-color-34 { 474 | color: #00af00; 475 | } 476 | 477 | .terminal .xterm-bg-color-34 { 478 | background-color: #00af00; 479 | } 480 | 481 | .terminal .xterm-color-35 { 482 | color: #00af5f; 483 | } 484 | 485 | .terminal .xterm-bg-color-35 { 486 | background-color: #00af5f; 487 | } 488 | 489 | .terminal .xterm-color-36 { 490 | color: #00af87; 491 | } 492 | 493 | .terminal .xterm-bg-color-36 { 494 | background-color: #00af87; 495 | } 496 | 497 | .terminal .xterm-color-37 { 498 | color: #00afaf; 499 | } 500 | 501 | .terminal .xterm-bg-color-37 { 502 | background-color: #00afaf; 503 | } 504 | 505 | .terminal .xterm-color-38 { 506 | color: #00afd7; 507 | } 508 | 509 | .terminal .xterm-bg-color-38 { 510 | background-color: #00afd7; 511 | } 512 | 513 | .terminal .xterm-color-39 { 514 | color: #00afff; 515 | } 516 | 517 | .terminal .xterm-bg-color-39 { 518 | background-color: #00afff; 519 | } 520 | 521 | .terminal .xterm-color-40 { 522 | color: #00d700; 523 | } 524 | 525 | .terminal .xterm-bg-color-40 { 526 | background-color: #00d700; 527 | } 528 | 529 | .terminal .xterm-color-41 { 530 | color: #00d75f; 531 | } 532 | 533 | .terminal .xterm-bg-color-41 { 534 | background-color: #00d75f; 535 | } 536 | 537 | .terminal .xterm-color-42 { 538 | color: #00d787; 539 | } 540 | 541 | .terminal .xterm-bg-color-42 { 542 | background-color: #00d787; 543 | } 544 | 545 | .terminal .xterm-color-43 { 546 | color: #00d7af; 547 | } 548 | 549 | .terminal .xterm-bg-color-43 { 550 | background-color: #00d7af; 551 | } 552 | 553 | .terminal .xterm-color-44 { 554 | color: #00d7d7; 555 | } 556 | 557 | .terminal .xterm-bg-color-44 { 558 | background-color: #00d7d7; 559 | } 560 | 561 | .terminal .xterm-color-45 { 562 | color: #00d7ff; 563 | } 564 | 565 | .terminal .xterm-bg-color-45 { 566 | background-color: #00d7ff; 567 | } 568 | 569 | .terminal .xterm-color-46 { 570 | color: #00ff00; 571 | } 572 | 573 | .terminal .xterm-bg-color-46 { 574 | background-color: #00ff00; 575 | } 576 | 577 | .terminal .xterm-color-47 { 578 | color: #00ff5f; 579 | } 580 | 581 | .terminal .xterm-bg-color-47 { 582 | background-color: #00ff5f; 583 | } 584 | 585 | .terminal .xterm-color-48 { 586 | color: #00ff87; 587 | } 588 | 589 | .terminal .xterm-bg-color-48 { 590 | background-color: #00ff87; 591 | } 592 | 593 | .terminal .xterm-color-49 { 594 | color: #00ffaf; 595 | } 596 | 597 | .terminal .xterm-bg-color-49 { 598 | background-color: #00ffaf; 599 | } 600 | 601 | .terminal .xterm-color-50 { 602 | color: #00ffd7; 603 | } 604 | 605 | .terminal .xterm-bg-color-50 { 606 | background-color: #00ffd7; 607 | } 608 | 609 | .terminal .xterm-color-51 { 610 | color: #00ffff; 611 | } 612 | 613 | .terminal .xterm-bg-color-51 { 614 | background-color: #00ffff; 615 | } 616 | 617 | .terminal .xterm-color-52 { 618 | color: #5f0000; 619 | } 620 | 621 | .terminal .xterm-bg-color-52 { 622 | background-color: #5f0000; 623 | } 624 | 625 | .terminal .xterm-color-53 { 626 | color: #5f005f; 627 | } 628 | 629 | .terminal .xterm-bg-color-53 { 630 | background-color: #5f005f; 631 | } 632 | 633 | .terminal .xterm-color-54 { 634 | color: #5f0087; 635 | } 636 | 637 | .terminal .xterm-bg-color-54 { 638 | background-color: #5f0087; 639 | } 640 | 641 | .terminal .xterm-color-55 { 642 | color: #5f00af; 643 | } 644 | 645 | .terminal .xterm-bg-color-55 { 646 | background-color: #5f00af; 647 | } 648 | 649 | .terminal .xterm-color-56 { 650 | color: #5f00d7; 651 | } 652 | 653 | .terminal .xterm-bg-color-56 { 654 | background-color: #5f00d7; 655 | } 656 | 657 | .terminal .xterm-color-57 { 658 | color: #5f00ff; 659 | } 660 | 661 | .terminal .xterm-bg-color-57 { 662 | background-color: #5f00ff; 663 | } 664 | 665 | .terminal .xterm-color-58 { 666 | color: #5f5f00; 667 | } 668 | 669 | .terminal .xterm-bg-color-58 { 670 | background-color: #5f5f00; 671 | } 672 | 673 | .terminal .xterm-color-59 { 674 | color: #5f5f5f; 675 | } 676 | 677 | .terminal .xterm-bg-color-59 { 678 | background-color: #5f5f5f; 679 | } 680 | 681 | .terminal .xterm-color-60 { 682 | color: #5f5f87; 683 | } 684 | 685 | .terminal .xterm-bg-color-60 { 686 | background-color: #5f5f87; 687 | } 688 | 689 | .terminal .xterm-color-61 { 690 | color: #5f5faf; 691 | } 692 | 693 | .terminal .xterm-bg-color-61 { 694 | background-color: #5f5faf; 695 | } 696 | 697 | .terminal .xterm-color-62 { 698 | color: #5f5fd7; 699 | } 700 | 701 | .terminal .xterm-bg-color-62 { 702 | background-color: #5f5fd7; 703 | } 704 | 705 | .terminal .xterm-color-63 { 706 | color: #5f5fff; 707 | } 708 | 709 | .terminal .xterm-bg-color-63 { 710 | background-color: #5f5fff; 711 | } 712 | 713 | .terminal .xterm-color-64 { 714 | color: #5f8700; 715 | } 716 | 717 | .terminal .xterm-bg-color-64 { 718 | background-color: #5f8700; 719 | } 720 | 721 | .terminal .xterm-color-65 { 722 | color: #5f875f; 723 | } 724 | 725 | .terminal .xterm-bg-color-65 { 726 | background-color: #5f875f; 727 | } 728 | 729 | .terminal .xterm-color-66 { 730 | color: #5f8787; 731 | } 732 | 733 | .terminal .xterm-bg-color-66 { 734 | background-color: #5f8787; 735 | } 736 | 737 | .terminal .xterm-color-67 { 738 | color: #5f87af; 739 | } 740 | 741 | .terminal .xterm-bg-color-67 { 742 | background-color: #5f87af; 743 | } 744 | 745 | .terminal .xterm-color-68 { 746 | color: #5f87d7; 747 | } 748 | 749 | .terminal .xterm-bg-color-68 { 750 | background-color: #5f87d7; 751 | } 752 | 753 | .terminal .xterm-color-69 { 754 | color: #5f87ff; 755 | } 756 | 757 | .terminal .xterm-bg-color-69 { 758 | background-color: #5f87ff; 759 | } 760 | 761 | .terminal .xterm-color-70 { 762 | color: #5faf00; 763 | } 764 | 765 | .terminal .xterm-bg-color-70 { 766 | background-color: #5faf00; 767 | } 768 | 769 | .terminal .xterm-color-71 { 770 | color: #5faf5f; 771 | } 772 | 773 | .terminal .xterm-bg-color-71 { 774 | background-color: #5faf5f; 775 | } 776 | 777 | .terminal .xterm-color-72 { 778 | color: #5faf87; 779 | } 780 | 781 | .terminal .xterm-bg-color-72 { 782 | background-color: #5faf87; 783 | } 784 | 785 | .terminal .xterm-color-73 { 786 | color: #5fafaf; 787 | } 788 | 789 | .terminal .xterm-bg-color-73 { 790 | background-color: #5fafaf; 791 | } 792 | 793 | .terminal .xterm-color-74 { 794 | color: #5fafd7; 795 | } 796 | 797 | .terminal .xterm-bg-color-74 { 798 | background-color: #5fafd7; 799 | } 800 | 801 | .terminal .xterm-color-75 { 802 | color: #5fafff; 803 | } 804 | 805 | .terminal .xterm-bg-color-75 { 806 | background-color: #5fafff; 807 | } 808 | 809 | .terminal .xterm-color-76 { 810 | color: #5fd700; 811 | } 812 | 813 | .terminal .xterm-bg-color-76 { 814 | background-color: #5fd700; 815 | } 816 | 817 | .terminal .xterm-color-77 { 818 | color: #5fd75f; 819 | } 820 | 821 | .terminal .xterm-bg-color-77 { 822 | background-color: #5fd75f; 823 | } 824 | 825 | .terminal .xterm-color-78 { 826 | color: #5fd787; 827 | } 828 | 829 | .terminal .xterm-bg-color-78 { 830 | background-color: #5fd787; 831 | } 832 | 833 | .terminal .xterm-color-79 { 834 | color: #5fd7af; 835 | } 836 | 837 | .terminal .xterm-bg-color-79 { 838 | background-color: #5fd7af; 839 | } 840 | 841 | .terminal .xterm-color-80 { 842 | color: #5fd7d7; 843 | } 844 | 845 | .terminal .xterm-bg-color-80 { 846 | background-color: #5fd7d7; 847 | } 848 | 849 | .terminal .xterm-color-81 { 850 | color: #5fd7ff; 851 | } 852 | 853 | .terminal .xterm-bg-color-81 { 854 | background-color: #5fd7ff; 855 | } 856 | 857 | .terminal .xterm-color-82 { 858 | color: #5fff00; 859 | } 860 | 861 | .terminal .xterm-bg-color-82 { 862 | background-color: #5fff00; 863 | } 864 | 865 | .terminal .xterm-color-83 { 866 | color: #5fff5f; 867 | } 868 | 869 | .terminal .xterm-bg-color-83 { 870 | background-color: #5fff5f; 871 | } 872 | 873 | .terminal .xterm-color-84 { 874 | color: #5fff87; 875 | } 876 | 877 | .terminal .xterm-bg-color-84 { 878 | background-color: #5fff87; 879 | } 880 | 881 | .terminal .xterm-color-85 { 882 | color: #5fffaf; 883 | } 884 | 885 | .terminal .xterm-bg-color-85 { 886 | background-color: #5fffaf; 887 | } 888 | 889 | .terminal .xterm-color-86 { 890 | color: #5fffd7; 891 | } 892 | 893 | .terminal .xterm-bg-color-86 { 894 | background-color: #5fffd7; 895 | } 896 | 897 | .terminal .xterm-color-87 { 898 | color: #5fffff; 899 | } 900 | 901 | .terminal .xterm-bg-color-87 { 902 | background-color: #5fffff; 903 | } 904 | 905 | .terminal .xterm-color-88 { 906 | color: #870000; 907 | } 908 | 909 | .terminal .xterm-bg-color-88 { 910 | background-color: #870000; 911 | } 912 | 913 | .terminal .xterm-color-89 { 914 | color: #87005f; 915 | } 916 | 917 | .terminal .xterm-bg-color-89 { 918 | background-color: #87005f; 919 | } 920 | 921 | .terminal .xterm-color-90 { 922 | color: #870087; 923 | } 924 | 925 | .terminal .xterm-bg-color-90 { 926 | background-color: #870087; 927 | } 928 | 929 | .terminal .xterm-color-91 { 930 | color: #8700af; 931 | } 932 | 933 | .terminal .xterm-bg-color-91 { 934 | background-color: #8700af; 935 | } 936 | 937 | .terminal .xterm-color-92 { 938 | color: #8700d7; 939 | } 940 | 941 | .terminal .xterm-bg-color-92 { 942 | background-color: #8700d7; 943 | } 944 | 945 | .terminal .xterm-color-93 { 946 | color: #8700ff; 947 | } 948 | 949 | .terminal .xterm-bg-color-93 { 950 | background-color: #8700ff; 951 | } 952 | 953 | .terminal .xterm-color-94 { 954 | color: #875f00; 955 | } 956 | 957 | .terminal .xterm-bg-color-94 { 958 | background-color: #875f00; 959 | } 960 | 961 | .terminal .xterm-color-95 { 962 | color: #875f5f; 963 | } 964 | 965 | .terminal .xterm-bg-color-95 { 966 | background-color: #875f5f; 967 | } 968 | 969 | .terminal .xterm-color-96 { 970 | color: #875f87; 971 | } 972 | 973 | .terminal .xterm-bg-color-96 { 974 | background-color: #875f87; 975 | } 976 | 977 | .terminal .xterm-color-97 { 978 | color: #875faf; 979 | } 980 | 981 | .terminal .xterm-bg-color-97 { 982 | background-color: #875faf; 983 | } 984 | 985 | .terminal .xterm-color-98 { 986 | color: #875fd7; 987 | } 988 | 989 | .terminal .xterm-bg-color-98 { 990 | background-color: #875fd7; 991 | } 992 | 993 | .terminal .xterm-color-99 { 994 | color: #875fff; 995 | } 996 | 997 | .terminal .xterm-bg-color-99 { 998 | background-color: #875fff; 999 | } 1000 | 1001 | .terminal .xterm-color-100 { 1002 | color: #878700; 1003 | } 1004 | 1005 | .terminal .xterm-bg-color-100 { 1006 | background-color: #878700; 1007 | } 1008 | 1009 | .terminal .xterm-color-101 { 1010 | color: #87875f; 1011 | } 1012 | 1013 | .terminal .xterm-bg-color-101 { 1014 | background-color: #87875f; 1015 | } 1016 | 1017 | .terminal .xterm-color-102 { 1018 | color: #878787; 1019 | } 1020 | 1021 | .terminal .xterm-bg-color-102 { 1022 | background-color: #878787; 1023 | } 1024 | 1025 | .terminal .xterm-color-103 { 1026 | color: #8787af; 1027 | } 1028 | 1029 | .terminal .xterm-bg-color-103 { 1030 | background-color: #8787af; 1031 | } 1032 | 1033 | .terminal .xterm-color-104 { 1034 | color: #8787d7; 1035 | } 1036 | 1037 | .terminal .xterm-bg-color-104 { 1038 | background-color: #8787d7; 1039 | } 1040 | 1041 | .terminal .xterm-color-105 { 1042 | color: #8787ff; 1043 | } 1044 | 1045 | .terminal .xterm-bg-color-105 { 1046 | background-color: #8787ff; 1047 | } 1048 | 1049 | .terminal .xterm-color-106 { 1050 | color: #87af00; 1051 | } 1052 | 1053 | .terminal .xterm-bg-color-106 { 1054 | background-color: #87af00; 1055 | } 1056 | 1057 | .terminal .xterm-color-107 { 1058 | color: #87af5f; 1059 | } 1060 | 1061 | .terminal .xterm-bg-color-107 { 1062 | background-color: #87af5f; 1063 | } 1064 | 1065 | .terminal .xterm-color-108 { 1066 | color: #87af87; 1067 | } 1068 | 1069 | .terminal .xterm-bg-color-108 { 1070 | background-color: #87af87; 1071 | } 1072 | 1073 | .terminal .xterm-color-109 { 1074 | color: #87afaf; 1075 | } 1076 | 1077 | .terminal .xterm-bg-color-109 { 1078 | background-color: #87afaf; 1079 | } 1080 | 1081 | .terminal .xterm-color-110 { 1082 | color: #87afd7; 1083 | } 1084 | 1085 | .terminal .xterm-bg-color-110 { 1086 | background-color: #87afd7; 1087 | } 1088 | 1089 | .terminal .xterm-color-111 { 1090 | color: #87afff; 1091 | } 1092 | 1093 | .terminal .xterm-bg-color-111 { 1094 | background-color: #87afff; 1095 | } 1096 | 1097 | .terminal .xterm-color-112 { 1098 | color: #87d700; 1099 | } 1100 | 1101 | .terminal .xterm-bg-color-112 { 1102 | background-color: #87d700; 1103 | } 1104 | 1105 | .terminal .xterm-color-113 { 1106 | color: #87d75f; 1107 | } 1108 | 1109 | .terminal .xterm-bg-color-113 { 1110 | background-color: #87d75f; 1111 | } 1112 | 1113 | .terminal .xterm-color-114 { 1114 | color: #87d787; 1115 | } 1116 | 1117 | .terminal .xterm-bg-color-114 { 1118 | background-color: #87d787; 1119 | } 1120 | 1121 | .terminal .xterm-color-115 { 1122 | color: #87d7af; 1123 | } 1124 | 1125 | .terminal .xterm-bg-color-115 { 1126 | background-color: #87d7af; 1127 | } 1128 | 1129 | .terminal .xterm-color-116 { 1130 | color: #87d7d7; 1131 | } 1132 | 1133 | .terminal .xterm-bg-color-116 { 1134 | background-color: #87d7d7; 1135 | } 1136 | 1137 | .terminal .xterm-color-117 { 1138 | color: #87d7ff; 1139 | } 1140 | 1141 | .terminal .xterm-bg-color-117 { 1142 | background-color: #87d7ff; 1143 | } 1144 | 1145 | .terminal .xterm-color-118 { 1146 | color: #87ff00; 1147 | } 1148 | 1149 | .terminal .xterm-bg-color-118 { 1150 | background-color: #87ff00; 1151 | } 1152 | 1153 | .terminal .xterm-color-119 { 1154 | color: #87ff5f; 1155 | } 1156 | 1157 | .terminal .xterm-bg-color-119 { 1158 | background-color: #87ff5f; 1159 | } 1160 | 1161 | .terminal .xterm-color-120 { 1162 | color: #87ff87; 1163 | } 1164 | 1165 | .terminal .xterm-bg-color-120 { 1166 | background-color: #87ff87; 1167 | } 1168 | 1169 | .terminal .xterm-color-121 { 1170 | color: #87ffaf; 1171 | } 1172 | 1173 | .terminal .xterm-bg-color-121 { 1174 | background-color: #87ffaf; 1175 | } 1176 | 1177 | .terminal .xterm-color-122 { 1178 | color: #87ffd7; 1179 | } 1180 | 1181 | .terminal .xterm-bg-color-122 { 1182 | background-color: #87ffd7; 1183 | } 1184 | 1185 | .terminal .xterm-color-123 { 1186 | color: #87ffff; 1187 | } 1188 | 1189 | .terminal .xterm-bg-color-123 { 1190 | background-color: #87ffff; 1191 | } 1192 | 1193 | .terminal .xterm-color-124 { 1194 | color: #af0000; 1195 | } 1196 | 1197 | .terminal .xterm-bg-color-124 { 1198 | background-color: #af0000; 1199 | } 1200 | 1201 | .terminal .xterm-color-125 { 1202 | color: #af005f; 1203 | } 1204 | 1205 | .terminal .xterm-bg-color-125 { 1206 | background-color: #af005f; 1207 | } 1208 | 1209 | .terminal .xterm-color-126 { 1210 | color: #af0087; 1211 | } 1212 | 1213 | .terminal .xterm-bg-color-126 { 1214 | background-color: #af0087; 1215 | } 1216 | 1217 | .terminal .xterm-color-127 { 1218 | color: #af00af; 1219 | } 1220 | 1221 | .terminal .xterm-bg-color-127 { 1222 | background-color: #af00af; 1223 | } 1224 | 1225 | .terminal .xterm-color-128 { 1226 | color: #af00d7; 1227 | } 1228 | 1229 | .terminal .xterm-bg-color-128 { 1230 | background-color: #af00d7; 1231 | } 1232 | 1233 | .terminal .xterm-color-129 { 1234 | color: #af00ff; 1235 | } 1236 | 1237 | .terminal .xterm-bg-color-129 { 1238 | background-color: #af00ff; 1239 | } 1240 | 1241 | .terminal .xterm-color-130 { 1242 | color: #af5f00; 1243 | } 1244 | 1245 | .terminal .xterm-bg-color-130 { 1246 | background-color: #af5f00; 1247 | } 1248 | 1249 | .terminal .xterm-color-131 { 1250 | color: #af5f5f; 1251 | } 1252 | 1253 | .terminal .xterm-bg-color-131 { 1254 | background-color: #af5f5f; 1255 | } 1256 | 1257 | .terminal .xterm-color-132 { 1258 | color: #af5f87; 1259 | } 1260 | 1261 | .terminal .xterm-bg-color-132 { 1262 | background-color: #af5f87; 1263 | } 1264 | 1265 | .terminal .xterm-color-133 { 1266 | color: #af5faf; 1267 | } 1268 | 1269 | .terminal .xterm-bg-color-133 { 1270 | background-color: #af5faf; 1271 | } 1272 | 1273 | .terminal .xterm-color-134 { 1274 | color: #af5fd7; 1275 | } 1276 | 1277 | .terminal .xterm-bg-color-134 { 1278 | background-color: #af5fd7; 1279 | } 1280 | 1281 | .terminal .xterm-color-135 { 1282 | color: #af5fff; 1283 | } 1284 | 1285 | .terminal .xterm-bg-color-135 { 1286 | background-color: #af5fff; 1287 | } 1288 | 1289 | .terminal .xterm-color-136 { 1290 | color: #af8700; 1291 | } 1292 | 1293 | .terminal .xterm-bg-color-136 { 1294 | background-color: #af8700; 1295 | } 1296 | 1297 | .terminal .xterm-color-137 { 1298 | color: #af875f; 1299 | } 1300 | 1301 | .terminal .xterm-bg-color-137 { 1302 | background-color: #af875f; 1303 | } 1304 | 1305 | .terminal .xterm-color-138 { 1306 | color: #af8787; 1307 | } 1308 | 1309 | .terminal .xterm-bg-color-138 { 1310 | background-color: #af8787; 1311 | } 1312 | 1313 | .terminal .xterm-color-139 { 1314 | color: #af87af; 1315 | } 1316 | 1317 | .terminal .xterm-bg-color-139 { 1318 | background-color: #af87af; 1319 | } 1320 | 1321 | .terminal .xterm-color-140 { 1322 | color: #af87d7; 1323 | } 1324 | 1325 | .terminal .xterm-bg-color-140 { 1326 | background-color: #af87d7; 1327 | } 1328 | 1329 | .terminal .xterm-color-141 { 1330 | color: #af87ff; 1331 | } 1332 | 1333 | .terminal .xterm-bg-color-141 { 1334 | background-color: #af87ff; 1335 | } 1336 | 1337 | .terminal .xterm-color-142 { 1338 | color: #afaf00; 1339 | } 1340 | 1341 | .terminal .xterm-bg-color-142 { 1342 | background-color: #afaf00; 1343 | } 1344 | 1345 | .terminal .xterm-color-143 { 1346 | color: #afaf5f; 1347 | } 1348 | 1349 | .terminal .xterm-bg-color-143 { 1350 | background-color: #afaf5f; 1351 | } 1352 | 1353 | .terminal .xterm-color-144 { 1354 | color: #afaf87; 1355 | } 1356 | 1357 | .terminal .xterm-bg-color-144 { 1358 | background-color: #afaf87; 1359 | } 1360 | 1361 | .terminal .xterm-color-145 { 1362 | color: #afafaf; 1363 | } 1364 | 1365 | .terminal .xterm-bg-color-145 { 1366 | background-color: #afafaf; 1367 | } 1368 | 1369 | .terminal .xterm-color-146 { 1370 | color: #afafd7; 1371 | } 1372 | 1373 | .terminal .xterm-bg-color-146 { 1374 | background-color: #afafd7; 1375 | } 1376 | 1377 | .terminal .xterm-color-147 { 1378 | color: #afafff; 1379 | } 1380 | 1381 | .terminal .xterm-bg-color-147 { 1382 | background-color: #afafff; 1383 | } 1384 | 1385 | .terminal .xterm-color-148 { 1386 | color: #afd700; 1387 | } 1388 | 1389 | .terminal .xterm-bg-color-148 { 1390 | background-color: #afd700; 1391 | } 1392 | 1393 | .terminal .xterm-color-149 { 1394 | color: #afd75f; 1395 | } 1396 | 1397 | .terminal .xterm-bg-color-149 { 1398 | background-color: #afd75f; 1399 | } 1400 | 1401 | .terminal .xterm-color-150 { 1402 | color: #afd787; 1403 | } 1404 | 1405 | .terminal .xterm-bg-color-150 { 1406 | background-color: #afd787; 1407 | } 1408 | 1409 | .terminal .xterm-color-151 { 1410 | color: #afd7af; 1411 | } 1412 | 1413 | .terminal .xterm-bg-color-151 { 1414 | background-color: #afd7af; 1415 | } 1416 | 1417 | .terminal .xterm-color-152 { 1418 | color: #afd7d7; 1419 | } 1420 | 1421 | .terminal .xterm-bg-color-152 { 1422 | background-color: #afd7d7; 1423 | } 1424 | 1425 | .terminal .xterm-color-153 { 1426 | color: #afd7ff; 1427 | } 1428 | 1429 | .terminal .xterm-bg-color-153 { 1430 | background-color: #afd7ff; 1431 | } 1432 | 1433 | .terminal .xterm-color-154 { 1434 | color: #afff00; 1435 | } 1436 | 1437 | .terminal .xterm-bg-color-154 { 1438 | background-color: #afff00; 1439 | } 1440 | 1441 | .terminal .xterm-color-155 { 1442 | color: #afff5f; 1443 | } 1444 | 1445 | .terminal .xterm-bg-color-155 { 1446 | background-color: #afff5f; 1447 | } 1448 | 1449 | .terminal .xterm-color-156 { 1450 | color: #afff87; 1451 | } 1452 | 1453 | .terminal .xterm-bg-color-156 { 1454 | background-color: #afff87; 1455 | } 1456 | 1457 | .terminal .xterm-color-157 { 1458 | color: #afffaf; 1459 | } 1460 | 1461 | .terminal .xterm-bg-color-157 { 1462 | background-color: #afffaf; 1463 | } 1464 | 1465 | .terminal .xterm-color-158 { 1466 | color: #afffd7; 1467 | } 1468 | 1469 | .terminal .xterm-bg-color-158 { 1470 | background-color: #afffd7; 1471 | } 1472 | 1473 | .terminal .xterm-color-159 { 1474 | color: #afffff; 1475 | } 1476 | 1477 | .terminal .xterm-bg-color-159 { 1478 | background-color: #afffff; 1479 | } 1480 | 1481 | .terminal .xterm-color-160 { 1482 | color: #d70000; 1483 | } 1484 | 1485 | .terminal .xterm-bg-color-160 { 1486 | background-color: #d70000; 1487 | } 1488 | 1489 | .terminal .xterm-color-161 { 1490 | color: #d7005f; 1491 | } 1492 | 1493 | .terminal .xterm-bg-color-161 { 1494 | background-color: #d7005f; 1495 | } 1496 | 1497 | .terminal .xterm-color-162 { 1498 | color: #d70087; 1499 | } 1500 | 1501 | .terminal .xterm-bg-color-162 { 1502 | background-color: #d70087; 1503 | } 1504 | 1505 | .terminal .xterm-color-163 { 1506 | color: #d700af; 1507 | } 1508 | 1509 | .terminal .xterm-bg-color-163 { 1510 | background-color: #d700af; 1511 | } 1512 | 1513 | .terminal .xterm-color-164 { 1514 | color: #d700d7; 1515 | } 1516 | 1517 | .terminal .xterm-bg-color-164 { 1518 | background-color: #d700d7; 1519 | } 1520 | 1521 | .terminal .xterm-color-165 { 1522 | color: #d700ff; 1523 | } 1524 | 1525 | .terminal .xterm-bg-color-165 { 1526 | background-color: #d700ff; 1527 | } 1528 | 1529 | .terminal .xterm-color-166 { 1530 | color: #d75f00; 1531 | } 1532 | 1533 | .terminal .xterm-bg-color-166 { 1534 | background-color: #d75f00; 1535 | } 1536 | 1537 | .terminal .xterm-color-167 { 1538 | color: #d75f5f; 1539 | } 1540 | 1541 | .terminal .xterm-bg-color-167 { 1542 | background-color: #d75f5f; 1543 | } 1544 | 1545 | .terminal .xterm-color-168 { 1546 | color: #d75f87; 1547 | } 1548 | 1549 | .terminal .xterm-bg-color-168 { 1550 | background-color: #d75f87; 1551 | } 1552 | 1553 | .terminal .xterm-color-169 { 1554 | color: #d75faf; 1555 | } 1556 | 1557 | .terminal .xterm-bg-color-169 { 1558 | background-color: #d75faf; 1559 | } 1560 | 1561 | .terminal .xterm-color-170 { 1562 | color: #d75fd7; 1563 | } 1564 | 1565 | .terminal .xterm-bg-color-170 { 1566 | background-color: #d75fd7; 1567 | } 1568 | 1569 | .terminal .xterm-color-171 { 1570 | color: #d75fff; 1571 | } 1572 | 1573 | .terminal .xterm-bg-color-171 { 1574 | background-color: #d75fff; 1575 | } 1576 | 1577 | .terminal .xterm-color-172 { 1578 | color: #d78700; 1579 | } 1580 | 1581 | .terminal .xterm-bg-color-172 { 1582 | background-color: #d78700; 1583 | } 1584 | 1585 | .terminal .xterm-color-173 { 1586 | color: #d7875f; 1587 | } 1588 | 1589 | .terminal .xterm-bg-color-173 { 1590 | background-color: #d7875f; 1591 | } 1592 | 1593 | .terminal .xterm-color-174 { 1594 | color: #d78787; 1595 | } 1596 | 1597 | .terminal .xterm-bg-color-174 { 1598 | background-color: #d78787; 1599 | } 1600 | 1601 | .terminal .xterm-color-175 { 1602 | color: #d787af; 1603 | } 1604 | 1605 | .terminal .xterm-bg-color-175 { 1606 | background-color: #d787af; 1607 | } 1608 | 1609 | .terminal .xterm-color-176 { 1610 | color: #d787d7; 1611 | } 1612 | 1613 | .terminal .xterm-bg-color-176 { 1614 | background-color: #d787d7; 1615 | } 1616 | 1617 | .terminal .xterm-color-177 { 1618 | color: #d787ff; 1619 | } 1620 | 1621 | .terminal .xterm-bg-color-177 { 1622 | background-color: #d787ff; 1623 | } 1624 | 1625 | .terminal .xterm-color-178 { 1626 | color: #d7af00; 1627 | } 1628 | 1629 | .terminal .xterm-bg-color-178 { 1630 | background-color: #d7af00; 1631 | } 1632 | 1633 | .terminal .xterm-color-179 { 1634 | color: #d7af5f; 1635 | } 1636 | 1637 | .terminal .xterm-bg-color-179 { 1638 | background-color: #d7af5f; 1639 | } 1640 | 1641 | .terminal .xterm-color-180 { 1642 | color: #d7af87; 1643 | } 1644 | 1645 | .terminal .xterm-bg-color-180 { 1646 | background-color: #d7af87; 1647 | } 1648 | 1649 | .terminal .xterm-color-181 { 1650 | color: #d7afaf; 1651 | } 1652 | 1653 | .terminal .xterm-bg-color-181 { 1654 | background-color: #d7afaf; 1655 | } 1656 | 1657 | .terminal .xterm-color-182 { 1658 | color: #d7afd7; 1659 | } 1660 | 1661 | .terminal .xterm-bg-color-182 { 1662 | background-color: #d7afd7; 1663 | } 1664 | 1665 | .terminal .xterm-color-183 { 1666 | color: #d7afff; 1667 | } 1668 | 1669 | .terminal .xterm-bg-color-183 { 1670 | background-color: #d7afff; 1671 | } 1672 | 1673 | .terminal .xterm-color-184 { 1674 | color: #d7d700; 1675 | } 1676 | 1677 | .terminal .xterm-bg-color-184 { 1678 | background-color: #d7d700; 1679 | } 1680 | 1681 | .terminal .xterm-color-185 { 1682 | color: #d7d75f; 1683 | } 1684 | 1685 | .terminal .xterm-bg-color-185 { 1686 | background-color: #d7d75f; 1687 | } 1688 | 1689 | .terminal .xterm-color-186 { 1690 | color: #d7d787; 1691 | } 1692 | 1693 | .terminal .xterm-bg-color-186 { 1694 | background-color: #d7d787; 1695 | } 1696 | 1697 | .terminal .xterm-color-187 { 1698 | color: #d7d7af; 1699 | } 1700 | 1701 | .terminal .xterm-bg-color-187 { 1702 | background-color: #d7d7af; 1703 | } 1704 | 1705 | .terminal .xterm-color-188 { 1706 | color: #d7d7d7; 1707 | } 1708 | 1709 | .terminal .xterm-bg-color-188 { 1710 | background-color: #d7d7d7; 1711 | } 1712 | 1713 | .terminal .xterm-color-189 { 1714 | color: #d7d7ff; 1715 | } 1716 | 1717 | .terminal .xterm-bg-color-189 { 1718 | background-color: #d7d7ff; 1719 | } 1720 | 1721 | .terminal .xterm-color-190 { 1722 | color: #d7ff00; 1723 | } 1724 | 1725 | .terminal .xterm-bg-color-190 { 1726 | background-color: #d7ff00; 1727 | } 1728 | 1729 | .terminal .xterm-color-191 { 1730 | color: #d7ff5f; 1731 | } 1732 | 1733 | .terminal .xterm-bg-color-191 { 1734 | background-color: #d7ff5f; 1735 | } 1736 | 1737 | .terminal .xterm-color-192 { 1738 | color: #d7ff87; 1739 | } 1740 | 1741 | .terminal .xterm-bg-color-192 { 1742 | background-color: #d7ff87; 1743 | } 1744 | 1745 | .terminal .xterm-color-193 { 1746 | color: #d7ffaf; 1747 | } 1748 | 1749 | .terminal .xterm-bg-color-193 { 1750 | background-color: #d7ffaf; 1751 | } 1752 | 1753 | .terminal .xterm-color-194 { 1754 | color: #d7ffd7; 1755 | } 1756 | 1757 | .terminal .xterm-bg-color-194 { 1758 | background-color: #d7ffd7; 1759 | } 1760 | 1761 | .terminal .xterm-color-195 { 1762 | color: #d7ffff; 1763 | } 1764 | 1765 | .terminal .xterm-bg-color-195 { 1766 | background-color: #d7ffff; 1767 | } 1768 | 1769 | .terminal .xterm-color-196 { 1770 | color: #ff0000; 1771 | } 1772 | 1773 | .terminal .xterm-bg-color-196 { 1774 | background-color: #ff0000; 1775 | } 1776 | 1777 | .terminal .xterm-color-197 { 1778 | color: #ff005f; 1779 | } 1780 | 1781 | .terminal .xterm-bg-color-197 { 1782 | background-color: #ff005f; 1783 | } 1784 | 1785 | .terminal .xterm-color-198 { 1786 | color: #ff0087; 1787 | } 1788 | 1789 | .terminal .xterm-bg-color-198 { 1790 | background-color: #ff0087; 1791 | } 1792 | 1793 | .terminal .xterm-color-199 { 1794 | color: #ff00af; 1795 | } 1796 | 1797 | .terminal .xterm-bg-color-199 { 1798 | background-color: #ff00af; 1799 | } 1800 | 1801 | .terminal .xterm-color-200 { 1802 | color: #ff00d7; 1803 | } 1804 | 1805 | .terminal .xterm-bg-color-200 { 1806 | background-color: #ff00d7; 1807 | } 1808 | 1809 | .terminal .xterm-color-201 { 1810 | color: #ff00ff; 1811 | } 1812 | 1813 | .terminal .xterm-bg-color-201 { 1814 | background-color: #ff00ff; 1815 | } 1816 | 1817 | .terminal .xterm-color-202 { 1818 | color: #ff5f00; 1819 | } 1820 | 1821 | .terminal .xterm-bg-color-202 { 1822 | background-color: #ff5f00; 1823 | } 1824 | 1825 | .terminal .xterm-color-203 { 1826 | color: #ff5f5f; 1827 | } 1828 | 1829 | .terminal .xterm-bg-color-203 { 1830 | background-color: #ff5f5f; 1831 | } 1832 | 1833 | .terminal .xterm-color-204 { 1834 | color: #ff5f87; 1835 | } 1836 | 1837 | .terminal .xterm-bg-color-204 { 1838 | background-color: #ff5f87; 1839 | } 1840 | 1841 | .terminal .xterm-color-205 { 1842 | color: #ff5faf; 1843 | } 1844 | 1845 | .terminal .xterm-bg-color-205 { 1846 | background-color: #ff5faf; 1847 | } 1848 | 1849 | .terminal .xterm-color-206 { 1850 | color: #ff5fd7; 1851 | } 1852 | 1853 | .terminal .xterm-bg-color-206 { 1854 | background-color: #ff5fd7; 1855 | } 1856 | 1857 | .terminal .xterm-color-207 { 1858 | color: #ff5fff; 1859 | } 1860 | 1861 | .terminal .xterm-bg-color-207 { 1862 | background-color: #ff5fff; 1863 | } 1864 | 1865 | .terminal .xterm-color-208 { 1866 | color: #ff8700; 1867 | } 1868 | 1869 | .terminal .xterm-bg-color-208 { 1870 | background-color: #ff8700; 1871 | } 1872 | 1873 | .terminal .xterm-color-209 { 1874 | color: #ff875f; 1875 | } 1876 | 1877 | .terminal .xterm-bg-color-209 { 1878 | background-color: #ff875f; 1879 | } 1880 | 1881 | .terminal .xterm-color-210 { 1882 | color: #ff8787; 1883 | } 1884 | 1885 | .terminal .xterm-bg-color-210 { 1886 | background-color: #ff8787; 1887 | } 1888 | 1889 | .terminal .xterm-color-211 { 1890 | color: #ff87af; 1891 | } 1892 | 1893 | .terminal .xterm-bg-color-211 { 1894 | background-color: #ff87af; 1895 | } 1896 | 1897 | .terminal .xterm-color-212 { 1898 | color: #ff87d7; 1899 | } 1900 | 1901 | .terminal .xterm-bg-color-212 { 1902 | background-color: #ff87d7; 1903 | } 1904 | 1905 | .terminal .xterm-color-213 { 1906 | color: #ff87ff; 1907 | } 1908 | 1909 | .terminal .xterm-bg-color-213 { 1910 | background-color: #ff87ff; 1911 | } 1912 | 1913 | .terminal .xterm-color-214 { 1914 | color: #ffaf00; 1915 | } 1916 | 1917 | .terminal .xterm-bg-color-214 { 1918 | background-color: #ffaf00; 1919 | } 1920 | 1921 | .terminal .xterm-color-215 { 1922 | color: #ffaf5f; 1923 | } 1924 | 1925 | .terminal .xterm-bg-color-215 { 1926 | background-color: #ffaf5f; 1927 | } 1928 | 1929 | .terminal .xterm-color-216 { 1930 | color: #ffaf87; 1931 | } 1932 | 1933 | .terminal .xterm-bg-color-216 { 1934 | background-color: #ffaf87; 1935 | } 1936 | 1937 | .terminal .xterm-color-217 { 1938 | color: #ffafaf; 1939 | } 1940 | 1941 | .terminal .xterm-bg-color-217 { 1942 | background-color: #ffafaf; 1943 | } 1944 | 1945 | .terminal .xterm-color-218 { 1946 | color: #ffafd7; 1947 | } 1948 | 1949 | .terminal .xterm-bg-color-218 { 1950 | background-color: #ffafd7; 1951 | } 1952 | 1953 | .terminal .xterm-color-219 { 1954 | color: #ffafff; 1955 | } 1956 | 1957 | .terminal .xterm-bg-color-219 { 1958 | background-color: #ffafff; 1959 | } 1960 | 1961 | .terminal .xterm-color-220 { 1962 | color: #ffd700; 1963 | } 1964 | 1965 | .terminal .xterm-bg-color-220 { 1966 | background-color: #ffd700; 1967 | } 1968 | 1969 | .terminal .xterm-color-221 { 1970 | color: #ffd75f; 1971 | } 1972 | 1973 | .terminal .xterm-bg-color-221 { 1974 | background-color: #ffd75f; 1975 | } 1976 | 1977 | .terminal .xterm-color-222 { 1978 | color: #ffd787; 1979 | } 1980 | 1981 | .terminal .xterm-bg-color-222 { 1982 | background-color: #ffd787; 1983 | } 1984 | 1985 | .terminal .xterm-color-223 { 1986 | color: #ffd7af; 1987 | } 1988 | 1989 | .terminal .xterm-bg-color-223 { 1990 | background-color: #ffd7af; 1991 | } 1992 | 1993 | .terminal .xterm-color-224 { 1994 | color: #ffd7d7; 1995 | } 1996 | 1997 | .terminal .xterm-bg-color-224 { 1998 | background-color: #ffd7d7; 1999 | } 2000 | 2001 | .terminal .xterm-color-225 { 2002 | color: #ffd7ff; 2003 | } 2004 | 2005 | .terminal .xterm-bg-color-225 { 2006 | background-color: #ffd7ff; 2007 | } 2008 | 2009 | .terminal .xterm-color-226 { 2010 | color: #ffff00; 2011 | } 2012 | 2013 | .terminal .xterm-bg-color-226 { 2014 | background-color: #ffff00; 2015 | } 2016 | 2017 | .terminal .xterm-color-227 { 2018 | color: #ffff5f; 2019 | } 2020 | 2021 | .terminal .xterm-bg-color-227 { 2022 | background-color: #ffff5f; 2023 | } 2024 | 2025 | .terminal .xterm-color-228 { 2026 | color: #ffff87; 2027 | } 2028 | 2029 | .terminal .xterm-bg-color-228 { 2030 | background-color: #ffff87; 2031 | } 2032 | 2033 | .terminal .xterm-color-229 { 2034 | color: #ffffaf; 2035 | } 2036 | 2037 | .terminal .xterm-bg-color-229 { 2038 | background-color: #ffffaf; 2039 | } 2040 | 2041 | .terminal .xterm-color-230 { 2042 | color: #ffffd7; 2043 | } 2044 | 2045 | .terminal .xterm-bg-color-230 { 2046 | background-color: #ffffd7; 2047 | } 2048 | 2049 | .terminal .xterm-color-231 { 2050 | color: #ffffff; 2051 | } 2052 | 2053 | .terminal .xterm-bg-color-231 { 2054 | background-color: #ffffff; 2055 | } 2056 | 2057 | .terminal .xterm-color-232 { 2058 | color: #080808; 2059 | } 2060 | 2061 | .terminal .xterm-bg-color-232 { 2062 | background-color: #080808; 2063 | } 2064 | 2065 | .terminal .xterm-color-233 { 2066 | color: #121212; 2067 | } 2068 | 2069 | .terminal .xterm-bg-color-233 { 2070 | background-color: #121212; 2071 | } 2072 | 2073 | .terminal .xterm-color-234 { 2074 | color: #1c1c1c; 2075 | } 2076 | 2077 | .terminal .xterm-bg-color-234 { 2078 | background-color: #1c1c1c; 2079 | } 2080 | 2081 | .terminal .xterm-color-235 { 2082 | color: #262626; 2083 | } 2084 | 2085 | .terminal .xterm-bg-color-235 { 2086 | background-color: #262626; 2087 | } 2088 | 2089 | .terminal .xterm-color-236 { 2090 | color: #303030; 2091 | } 2092 | 2093 | .terminal .xterm-bg-color-236 { 2094 | background-color: #303030; 2095 | } 2096 | 2097 | .terminal .xterm-color-237 { 2098 | color: #3a3a3a; 2099 | } 2100 | 2101 | .terminal .xterm-bg-color-237 { 2102 | background-color: #3a3a3a; 2103 | } 2104 | 2105 | .terminal .xterm-color-238 { 2106 | color: #444444; 2107 | } 2108 | 2109 | .terminal .xterm-bg-color-238 { 2110 | background-color: #444444; 2111 | } 2112 | 2113 | .terminal .xterm-color-239 { 2114 | color: #4e4e4e; 2115 | } 2116 | 2117 | .terminal .xterm-bg-color-239 { 2118 | background-color: #4e4e4e; 2119 | } 2120 | 2121 | .terminal .xterm-color-240 { 2122 | color: #585858; 2123 | } 2124 | 2125 | .terminal .xterm-bg-color-240 { 2126 | background-color: #585858; 2127 | } 2128 | 2129 | .terminal .xterm-color-241 { 2130 | color: #626262; 2131 | } 2132 | 2133 | .terminal .xterm-bg-color-241 { 2134 | background-color: #626262; 2135 | } 2136 | 2137 | .terminal .xterm-color-242 { 2138 | color: #6c6c6c; 2139 | } 2140 | 2141 | .terminal .xterm-bg-color-242 { 2142 | background-color: #6c6c6c; 2143 | } 2144 | 2145 | .terminal .xterm-color-243 { 2146 | color: #767676; 2147 | } 2148 | 2149 | .terminal .xterm-bg-color-243 { 2150 | background-color: #767676; 2151 | } 2152 | 2153 | .terminal .xterm-color-244 { 2154 | color: #808080; 2155 | } 2156 | 2157 | .terminal .xterm-bg-color-244 { 2158 | background-color: #808080; 2159 | } 2160 | 2161 | .terminal .xterm-color-245 { 2162 | color: #8a8a8a; 2163 | } 2164 | 2165 | .terminal .xterm-bg-color-245 { 2166 | background-color: #8a8a8a; 2167 | } 2168 | 2169 | .terminal .xterm-color-246 { 2170 | color: #949494; 2171 | } 2172 | 2173 | .terminal .xterm-bg-color-246 { 2174 | background-color: #949494; 2175 | } 2176 | 2177 | .terminal .xterm-color-247 { 2178 | color: #9e9e9e; 2179 | } 2180 | 2181 | .terminal .xterm-bg-color-247 { 2182 | background-color: #9e9e9e; 2183 | } 2184 | 2185 | .terminal .xterm-color-248 { 2186 | color: #a8a8a8; 2187 | } 2188 | 2189 | .terminal .xterm-bg-color-248 { 2190 | background-color: #a8a8a8; 2191 | } 2192 | 2193 | .terminal .xterm-color-249 { 2194 | color: #b2b2b2; 2195 | } 2196 | 2197 | .terminal .xterm-bg-color-249 { 2198 | background-color: #b2b2b2; 2199 | } 2200 | 2201 | .terminal .xterm-color-250 { 2202 | color: #bcbcbc; 2203 | } 2204 | 2205 | .terminal .xterm-bg-color-250 { 2206 | background-color: #bcbcbc; 2207 | } 2208 | 2209 | .terminal .xterm-color-251 { 2210 | color: #c6c6c6; 2211 | } 2212 | 2213 | .terminal .xterm-bg-color-251 { 2214 | background-color: #c6c6c6; 2215 | } 2216 | 2217 | .terminal .xterm-color-252 { 2218 | color: #d0d0d0; 2219 | } 2220 | 2221 | .terminal .xterm-bg-color-252 { 2222 | background-color: #d0d0d0; 2223 | } 2224 | 2225 | .terminal .xterm-color-253 { 2226 | color: #dadada; 2227 | } 2228 | 2229 | .terminal .xterm-bg-color-253 { 2230 | background-color: #dadada; 2231 | } 2232 | 2233 | .terminal .xterm-color-254 { 2234 | color: #e4e4e4; 2235 | } 2236 | 2237 | .terminal .xterm-bg-color-254 { 2238 | background-color: #e4e4e4; 2239 | } 2240 | 2241 | .terminal .xterm-color-255 { 2242 | color: #eeeeee; 2243 | } 2244 | 2245 | .terminal .xterm-bg-color-255 { 2246 | background-color: #eeeeee; 2247 | } 2248 | -------------------------------------------------------------------------------- /static/js/analysis.js: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net) 2 | * Dual licensed under the MIT (MIT_LICENSE.txt) 3 | * and GPL Version 2 (GPL_LICENSE.txt) licenses. 4 | * 5 | * Version: 1.1.1 6 | * Requires jQuery 1.3+ 7 | * Docs: http://docs.jquery.com/Plugins/livequery 8 | */ 9 | (function(a){a.extend(a.fn,{livequery:function(e,d,c){var b=this,f;if(a.isFunction(e)){c=d,d=e,e=undefined}a.each(a.livequery.queries,function(g,h){if(b.selector==h.selector&&b.context==h.context&&e==h.type&&(!d||d.$lqguid==h.fn.$lqguid)&&(!c||c.$lqguid==h.fn2.$lqguid)){return(f=h)&&false}});f=f||new a.livequery(this.selector,this.context,e,d,c);f.stopped=false;f.run();return this},expire:function(e,d,c){var b=this;if(a.isFunction(e)){c=d,d=e,e=undefined}a.each(a.livequery.queries,function(f,g){if(b.selector==g.selector&&b.context==g.context&&(!e||e==g.type)&&(!d||d.$lqguid==g.fn.$lqguid)&&(!c||c.$lqguid==g.fn2.$lqguid)&&!this.stopped){a.livequery.stop(g.id)}});return this}});a.livequery=function(b,d,f,e,c){this.selector=b;this.context=d;this.type=f;this.fn=e;this.fn2=c;this.elements=[];this.stopped=false;this.id=a.livequery.queries.push(this)-1;e.$lqguid=e.$lqguid||a.livequery.guid++;if(c){c.$lqguid=c.$lqguid||a.livequery.guid++}return this};a.livequery.prototype={stop:function(){var b=this;if(this.type){this.elements.unbind(this.type,this.fn)}else{if(this.fn2){this.elements.each(function(c,d){b.fn2.apply(d)})}}this.elements=[];this.stopped=true},run:function(){if(this.stopped){return}var d=this;var e=this.elements,c=a(this.selector,this.context),b=c.not(e);this.elements=c;if(this.type){b.bind(this.type,this.fn);if(e.length>0){a.each(e,function(f,g){if(a.inArray(g,c)<0){a.event.remove(g,d.type,d.fn)}})}}else{b.each(function(){d.fn.apply(this)});if(this.fn2&&e.length>0){a.each(e,function(f,g){if(a.inArray(g,c)<0){d.fn2.apply(g)}})}}}};a.extend(a.livequery,{guid:0,queries:[],queue:[],running:false,timeout:null,checkQueue:function(){if(a.livequery.running&&a.livequery.queue.length){var b=a.livequery.queue.length;while(b--){a.livequery.queries[a.livequery.queue.shift()].run()}}},pause:function(){a.livequery.running=false},play:function(){a.livequery.running=true;a.livequery.run()},registerPlugin:function(){a.each(arguments,function(c,d){if(!a.fn[d]){return}var b=a.fn[d];a.fn[d]=function(){var e=b.apply(this,arguments);a.livequery.run();return e}})},run:function(b){if(b!=undefined){if(a.inArray(b,a.livequery.queue)<0){a.livequery.queue.push(b)}}else{a.each(a.livequery.queries,function(c){if(a.inArray(c,a.livequery.queue)<0){a.livequery.queue.push(c)}})}if(a.livequery.timeout){clearTimeout(a.livequery.timeout)}a.livequery.timeout=setTimeout(a.livequery.checkQueue,20)},stop:function(b){if(b!=undefined){a.livequery.queries[b].stop()}else{a.each(a.livequery.queries,function(c){a.livequery.queries[c].stop()})}}});a.livequery.registerPlugin("append","prepend","after","before","wrap","attr","removeAttr","addClass","removeClass","toggleClass","empty","remove","html");a(function(){a.livequery.play()})})(jQuery); 10 | 11 | //统计页面点击量(系统应用不添加) 12 | $(function(){ 13 | var location = window.location.href; 14 | //例如: list = ["http:", "", "app.o.tencent.com", "test", "server_manage", ""] 15 | var list = location.split('/'); 16 | /* 17 | * 活跃度统计(内建应用进行统计) 18 | */ 19 | //根据window url 判断app_code 20 | console.log(list[2]) 21 | if(list[2] == 'app.o.tencent.com' || list[2] == 'app.o.bkclouds.cc' || list[2] == 'cc.o.bkclouds.cc' || list[2] == 'job.o.bkclouds.cc'){ 22 | // 内建应用,记录活跃度 23 | if (list[2] == 'cc.o.bkclouds.cc'){ 24 | var app_code_analysis = 'cc'; 25 | }else if (list[2] == 'job.o.bkclouds.cc'){ 26 | var app_code_analysis = 'job_clouds'; 27 | }if(list.length >= 4 && list[3] != "test"){ 28 | var app_code_analysis = list[3]; 29 | }else if(list.length >= 4 && list[3] == "test"){ 30 | var app_code_analysis = list[4]; 31 | }else{ 32 | var app_code_analysis = 'workbench'; 33 | } 34 | // 绑定点击事件 35 | $("a, button, input:button, input:submit, .btn") 36 | .livequery('click', function() { 37 | console.log('app_code_analysis:' + app_code_analysis) 38 | try{ 39 | // 调用统计接口 40 | window.top.app_click_record(app_code_analysis, 1); 41 | }catch(err){ 42 | var msg = {operation: 'app_click_record', 43 | app_code: app_code_analysis} 44 | window.top.postMessage(JSON.stringify(msg),'*') 45 | } 46 | }); 47 | }else{ 48 | //平台和系统应用 49 | var app_code_analysis = 'workbench'; 50 | } 51 | 52 | /* 53 | * 在线时长统计,平台、系统应用及内建应用都使用 54 | */ 55 | //离线时间限制为2分钟(默认,后台可配) 56 | try{ 57 | var time_limit = parseInt(window.top.user_online_time) ? parseInt(window.top.user_online_time) : 12000; 58 | }catch(err){ 59 | var time_limit = 12000; 60 | } 61 | //默认激活时间、失去焦点时间、最后活动时间均为当前时间 62 | var as_date_now = new Date(); 63 | var as_s_time = as_date_now, 64 | as_e_time = as_date_now, 65 | as_l_active = as_date_now; 66 | 67 | //获取浏览器来源 TODO 68 | //var browser_type = _judge_browser_from(); 69 | 70 | //页面激活 71 | window.onfocus = function(){ 72 | as_date_now = new Date(); //当前时间 73 | as_s_time = as_date_now; //激活时间 74 | //逻辑判断,激活时间与上次失效时间间隔小于等于两分钟,认为是在线状态,统计,否则为离线状态,不统计 75 | var short_time = as_s_time - as_e_time; 76 | //保存在线时间(时间差大于0且小于2分钟,则记录cookie) 77 | if(short_time <= time_limit && short_time > 0){ 78 | try{ 79 | window.top.app_online_record(app_code_analysis, short_time); 80 | }catch(err){ 81 | console.log('window.onfocus:'+short_time) 82 | var msg = {operation: 'app_online_record', 83 | app_code: app_code_analysis, 84 | short_time:short_time } 85 | window.top.postMessage(JSON.stringify(msg),'*') 86 | } 87 | } 88 | // 失去焦点的时间、最后活动时间调为和激活时间一致 89 | as_e_time = as_date_now; 90 | as_l_active = as_date_now; 91 | } 92 | 93 | //页面失去焦点 94 | window.onblur = function(){ 95 | as_date_now = new Date(); //当前时间 96 | as_e_time = as_date_now; //刷新失去焦点的时间 97 | //逻辑判断,最后活动时间与现在时间比较,大于2分钟,则记录最后活动时间与激活时间的差值,否则记录失去焦点时间和激活时间差值 98 | if(as_date_now - as_l_active > time_limit){ 99 | //保存在线时间(最后活动时间与激活时间差,大于0保存) 100 | if(as_l_active - as_s_time > 0){ 101 | try{ 102 | window.top.app_online_record(app_code_analysis, as_l_active - as_s_time); 103 | }catch(err){ 104 | console.log('window.onblur:'+(as_l_active - as_s_time)) 105 | var msg = {operation: 'app_online_record', 106 | app_code: app_code_analysis, 107 | short_time:as_l_active - as_s_time } 108 | window.top.postMessage(JSON.stringify(msg),'*') 109 | } 110 | } 111 | }else{ 112 | //保存在线时间(失去焦点时间与激活时间差,大于0保存) 113 | if(as_e_time - as_s_time > 0){ 114 | try{ 115 | window.top.app_online_record(app_code_analysis, as_e_time - as_s_time); 116 | }catch(err){ 117 | console.log('window.onblur:'+(as_e_time - as_s_time)) 118 | var msg = {operation: 'app_online_record', 119 | app_code: app_code_analysis, 120 | short_time: as_e_time - as_s_time } 121 | window.top.postMessage(JSON.stringify(msg),'*') 122 | } 123 | } 124 | } 125 | //变量重置 126 | as_s_time = as_date_now; 127 | as_e_time = as_date_now; 128 | as_l_active = as_date_now; 129 | } 130 | 131 | //页面关闭或刷新(判断方法同失去焦点) 132 | window.onunload = function (){ 133 | as_date_now = new Date(); //当前时间 134 | as_e_time = as_date_now; //刷新失去焦点的时间 135 | //逻辑判断,最后活动时间与现在时间比较,大于2分钟,则记录最后时间与激活时间的差值,否则记录失去焦点时间和激活时间差值 136 | if(as_date_now - as_l_active > time_limit){ 137 | //保存在线时间(最后活动时间与激活时间差,大于0保存) 138 | if(as_l_active - as_s_time > 0){ 139 | try{ 140 | window.top.app_online_record(app_code_analysis, as_l_active - as_s_time); 141 | }catch(err){ 142 | console.log('window.onunload2:'+(as_l_active - as_s_time)) 143 | var msg = {operation: 'app_online_record', 144 | app_code: app_code_analysis, 145 | short_time: as_l_active - as_s_time } 146 | window.top.postMessage(JSON.stringify(msg),'*') 147 | } 148 | } 149 | }else{ 150 | //保存在线时间(失去焦点时间与激活时间差,大于0保存) 151 | if(as_e_time - as_s_time > 0){ 152 | try{ 153 | window.top.app_online_record(app_code_analysis, as_e_time - as_s_time); 154 | }catch(err){ 155 | console.log('window.onunload1:'+(as_e_time - as_s_time)) 156 | var msg = {operation: 'app_online_record', 157 | app_code: app_code_analysis, 158 | short_time: as_e_time - as_s_time } 159 | window.top.postMessage(JSON.stringify(msg),'*') 160 | } 161 | } 162 | } 163 | //变量重置 164 | as_s_time = as_date_now; 165 | as_e_time = as_date_now; 166 | as_l_active = as_date_now; 167 | } 168 | 169 | //页面有click活动,防止长时间页面不活动 170 | window.onclick = function(){ 171 | as_date_now = new Date(); //当前时间 172 | //最后活动时间与现在时间比较,大于2分钟,则记录最后时间与激活时间的差值,否则更新最后活动时间 173 | if(as_date_now - as_l_active > time_limit){ 174 | //保存在线时间(最后活动时间与激活时间差,大于0保存) 175 | if(as_l_active - as_s_time > 0){ 176 | try{ 177 | console.log('window.onclick:'+(as_l_active - as_s_time)) 178 | window.top.app_online_record(app_code_analysis, as_l_active - as_s_time); 179 | }catch(err){ 180 | console.log('window.onclick:'+(as_l_active - as_s_time)) 181 | var msg = {operation: 'app_online_record', 182 | app_code: app_code_analysis, 183 | short_time: as_l_active - as_s_time } 184 | window.top.postMessage(JSON.stringify(msg),'*') 185 | } 186 | } 187 | //更新激活时间和失去焦点时间为当前时间 188 | as_s_time = as_date_now; 189 | as_e_time = as_date_now; 190 | } 191 | //最后活动时间重置 192 | as_l_active = as_date_now; 193 | } 194 | 195 | }); 196 | 197 | 198 | //判断浏览器来源,0:PC,1:phone,2:ipad 199 | function _judge_browser_from(){ 200 | var browser = navigator.userAgent.toLowerCase(); 201 | if(browser.indexOf('ipad') > 0 && browser.indexOf('iphone') > 0){ 202 | return 2; 203 | }else if((browser.indexOf('linux') > 0 && browser.indexOf('android') > 0) || browser.indexOf('iphone') > 0){ 204 | return 1; 205 | }else{ 206 | return 0; 207 | } 208 | } 209 | 210 | -------------------------------------------------------------------------------- /static/js/bk.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/caoyingjunz/kube-webshell/54debd3578317a12b41a8bf87bc9e05132944b09/static/js/bk.js -------------------------------------------------------------------------------- /static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.5 (http://getbootstrap.com) 3 | * Copyright 2011-2015 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)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(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.3.5",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);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.5",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)):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")&&(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);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).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.5",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"));return a>this.$items.length-1||0>a?void 0: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(){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,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.5",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("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.5",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("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);return 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()?void 0:(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})};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.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),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").children().detach().end()[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")};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){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.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",a.proxy(this.process,this)),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.3.5",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=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.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[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.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};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(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=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},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=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};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||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); -------------------------------------------------------------------------------- /static/js/fullscreen.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Fullscreen addon for xterm.js 3 | * @module xterm/addons/fullscreen/fullscreen 4 | * @license MIT 5 | */ 6 | (function (fullscreen) { 7 | if (typeof exports === 'object' && typeof module === 'object') { 8 | /* 9 | * CommonJS environment 10 | */ 11 | module.exports = fullscreen(require('../../Terminal').Terminal); 12 | } else if (typeof define == 'function') { 13 | /* 14 | * Require.js is available 15 | */ 16 | define(['../../xterm'], fullscreen); 17 | } else { 18 | /* 19 | * Plain browser environment 20 | */ 21 | fullscreen(window.Terminal); 22 | } 23 | })(function (Terminal) { 24 | var exports = {}; 25 | 26 | /** 27 | * Toggle the given terminal's fullscreen mode. 28 | * @param {Terminal} term - The terminal to toggle full screen mode 29 | * @param {boolean} fullscreen - Toggle fullscreen on (true) or off (false) 30 | */ 31 | exports.toggleFullScreen = function (term, fullscreen) { 32 | var fn; 33 | 34 | if (typeof fullscreen == 'undefined') { 35 | fn = (term.element.classList.contains('fullscreen')) ? 'remove' : 'add'; 36 | } else if (!fullscreen) { 37 | fn = 'remove'; 38 | } else { 39 | fn = 'add'; 40 | } 41 | 42 | term.element.classList[fn]('fullscreen'); 43 | }; 44 | 45 | Terminal.prototype.toggleFullscreen = function (fullscreen) { 46 | exports.toggleFullScreen(this, fullscreen); 47 | }; 48 | 49 | return exports; 50 | }); 51 | -------------------------------------------------------------------------------- /static/js/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?: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,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); -------------------------------------------------------------------------------- /static/js/reload.min.js: -------------------------------------------------------------------------------- 1 | function b(a){var c=new WebSocket(a);c.onclose=function(){setTimeout(function(){b(a)},2E3)};c.onmessage=function(){location.reload()}}try{if(window.WebSocket)try{b("ws://localhost:12450/reload")}catch(a){console.error(a)}else console.log("Your browser does not support WebSockets.")}catch(a){console.error("Exception during connecting to Reload:",a)}; 2 | -------------------------------------------------------------------------------- /static/js/sockjs.min.js: -------------------------------------------------------------------------------- 1 | /* sockjs-client v1.6.1 | http://sockjs.org | MIT license */ 2 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).SockJS=e()}}(function(){return function i(s,a,l){function u(t,e){if(!a[t]){if(!s[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=a[t]={exports:{}};s[t][0].call(o.exports,function(e){return u(s[t][1][e]||e)},o,o.exports,i,s,a,l)}return a[t].exports}for(var c="function"==typeof require&&require,e=0;e>>0;if(!a(e))throw new TypeError;for(;++i>>0;if(!r)return-1;var o=0;for(1>>0:function(e){return e>>>0}(t);(o=e.exec(n))&&!(u<(i=o.index+o[0].length)&&(a.push(n.slice(u,o.index)),!_&&1=t));)e.lastIndex===o.index&&e.lastIndex++;return u===n.length?!s&&e.test("")||a.push(""):a.push(n.slice(u)),a.length>t?a.slice(0,t):a}):"0".split(void 0,0).length&&(s.split=function(e,t){return void 0===e&&0===t?[]:E.call(this,e,t)});var S=s.substr,O="".substr&&"b"!=="0b".substr(-1);d(s,{substr:function(e,t){return S.call(this,e<0&&(e=this.length+e)<0?0:e,t)}},O)},{}],16:[function(e,t,n){"use strict";t.exports=[e("./transport/websocket"),e("./transport/xhr-streaming"),e("./transport/xdr-streaming"),e("./transport/eventsource"),e("./transport/lib/iframe-wrap")(e("./transport/eventsource")),e("./transport/htmlfile"),e("./transport/lib/iframe-wrap")(e("./transport/htmlfile")),e("./transport/xhr-polling"),e("./transport/xdr-polling"),e("./transport/lib/iframe-wrap")(e("./transport/xhr-polling")),e("./transport/jsonp-polling")]},{"./transport/eventsource":20,"./transport/htmlfile":21,"./transport/jsonp-polling":23,"./transport/lib/iframe-wrap":26,"./transport/websocket":38,"./transport/xdr-polling":39,"./transport/xdr-streaming":40,"./transport/xhr-polling":41,"./transport/xhr-streaming":42}],17:[function(o,f,e){(function(r){(function(){"use strict";var i=o("events").EventEmitter,e=o("inherits"),s=o("../../utils/event"),a=o("../../utils/url"),l=r.XMLHttpRequest,u=function(){};function c(e,t,n,r){u(e,t);var o=this;i.call(this),setTimeout(function(){o._start(e,t,n,r)},0)}e(c,i),c.prototype._start=function(e,t,n,r){var o=this;try{this.xhr=new l}catch(e){}if(!this.xhr)return u("no xhr"),this.emit("finish",0,"no xhr support"),void this._cleanup();t=a.addQuery(t,"t="+ +new Date),this.unloadRef=s.unloadAdd(function(){u("unload cleanup"),o._cleanup(!0)});try{this.xhr.open(e,t,!0),this.timeout&&"timeout"in this.xhr&&(this.xhr.timeout=this.timeout,this.xhr.ontimeout=function(){u("xhr timeout"),o.emit("finish",0,""),o._cleanup(!1)})}catch(e){return u("exception",e),this.emit("finish",0,""),void this._cleanup(!1)}if(r&&r.noCredentials||!c.supportsCORS||(u("withCredentials"),this.xhr.withCredentials=!0),r&&r.headers)for(var i in r.headers)this.xhr.setRequestHeader(i,r.headers[i]);this.xhr.onreadystatechange=function(){if(o.xhr){var e,t,n=o.xhr;switch(u("readyState",n.readyState),n.readyState){case 3:try{t=n.status,e=n.responseText}catch(e){}u("status",t),1223===t&&(t=204),200===t&&e&&0')}catch(e){var n=f.document.createElement("iframe");return n.name=t,n}}(r);o.id=r,o.style.display="none",s.appendChild(o);try{a.value=t}catch(e){}s.submit();function i(e){c("completed",r,e),o.onerror&&(o.onreadystatechange=o.onerror=o.onload=null,setTimeout(function(){c("cleaning up",r),o.parentNode.removeChild(o),o=null},500),a.value="",n(e))}return o.onerror=function(){c("onerror",r),i()},o.onload=function(){c("onload",r),i()},o.onreadystatechange=function(e){c("onreadystatechange",r,o.readyState,e),"complete"===o.readyState&&i()},function(){c("aborted",r),i(new Error("Aborted"))}}}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../../utils/random":50,"../../utils/url":52,"debug":void 0}],34:[function(r,u,e){(function(l){(function(){"use strict";var o=r("events").EventEmitter,e=r("inherits"),i=r("../../utils/event"),t=r("../../utils/browser"),s=r("../../utils/url"),a=function(){};function n(e,t,n){a(e,t);var r=this;o.call(this),setTimeout(function(){r._start(e,t,n)},0)}e(n,o),n.prototype._start=function(e,t,n){a("_start");var r=this,o=new l.XDomainRequest;t=s.addQuery(t,"t="+ +new Date),o.onerror=function(){a("onerror"),r._error()},o.ontimeout=function(){a("ontimeout"),r._error()},o.onprogress=function(){a("progress",o.responseText),r.emit("chunk",200,o.responseText)},o.onload=function(){a("load"),r.emit("finish",200,o.responseText),r._cleanup(!1)},this.xdr=o,this.unloadRef=i.unloadAdd(function(){r._cleanup(!0)});try{this.xdr.open(e,t),this.timeout&&(this.xdr.timeout=this.timeout),this.xdr.send(n)}catch(e){this._error()}},n.prototype._error=function(){this.emit("finish",0,""),this._cleanup(!1)},n.prototype._cleanup=function(e){if(a("cleanup",e),this.xdr){if(this.removeAllListeners(),i.unloadDel(this.unloadRef),this.xdr.ontimeout=this.xdr.onerror=this.xdr.onprogress=this.xdr.onload=null,e)try{this.xdr.abort()}catch(e){}this.unloadRef=this.xdr=null}},n.prototype.close=function(){a("close"),this._cleanup(!0)},n.enabled=!(!l.XDomainRequest||!t.hasDomain()),u.exports=n}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../../utils/browser":44,"../../utils/event":46,"../../utils/url":52,"debug":void 0,"events":3,"inherits":54}],35:[function(e,t,n){"use strict";var r=e("inherits"),o=e("../driver/xhr");function i(e,t,n,r){o.call(this,e,t,n,r)}r(i,o),i.enabled=o.enabled&&o.supportsCORS,t.exports=i},{"../driver/xhr":17,"inherits":54}],36:[function(e,t,n){"use strict";var r=e("events").EventEmitter;function o(){var e=this;r.call(this),this.to=setTimeout(function(){e.emit("finish",200,"{}")},o.timeout)}e("inherits")(o,r),o.prototype.close=function(){clearTimeout(this.to)},o.timeout=2e3,t.exports=o},{"events":3,"inherits":54}],37:[function(e,t,n){"use strict";var r=e("inherits"),o=e("../driver/xhr");function i(e,t,n){o.call(this,e,t,n,{noCredentials:!0})}r(i,o),i.enabled=o.enabled,t.exports=i},{"../driver/xhr":17,"inherits":54}],38:[function(e,t,n){"use strict";var i=e("../utils/event"),s=e("../utils/url"),r=e("inherits"),a=e("events").EventEmitter,l=e("./driver/websocket"),u=function(){};function c(e,t,n){if(!c.enabled())throw new Error("Transport created when disabled");a.call(this),u("constructor",e);var r=this,o=s.addPath(e,"/websocket");o="https"===o.slice(0,5)?"wss"+o.slice(5):"ws"+o.slice(4),this.url=o,this.ws=new l(this.url,[],n),this.ws.onmessage=function(e){u("message event",e.data),r.emit("message",e.data)},this.unloadRef=i.unloadAdd(function(){u("unload"),r.ws.close()}),this.ws.onclose=function(e){u("close event",e.code,e.reason),r.emit("close",e.code,e.reason),r._cleanup()},this.ws.onerror=function(e){u("error event",e),r.emit("close",1006,"WebSocket connection broken"),r._cleanup()}}r(c,a),c.prototype.send=function(e){var t="["+e+"]";u("send",t),this.ws.send(t)},c.prototype.close=function(){u("close");var e=this.ws;this._cleanup(),e&&e.close()},c.prototype._cleanup=function(){u("_cleanup");var e=this.ws;e&&(e.onmessage=e.onclose=e.onerror=null),i.unloadDel(this.unloadRef),this.unloadRef=this.ws=null,this.removeAllListeners()},c.enabled=function(){return u("enabled"),!!l},c.transportName="websocket",c.roundTrips=2,t.exports=c},{"../utils/event":46,"../utils/url":52,"./driver/websocket":19,"debug":void 0,"events":3,"inherits":54}],39:[function(e,t,n){"use strict";var r=e("inherits"),o=e("./lib/ajax-based"),i=e("./xdr-streaming"),s=e("./receiver/xhr"),a=e("./sender/xdr");function l(e){if(!a.enabled)throw new Error("Transport created when disabled");o.call(this,e,"/xhr",s,a)}r(l,o),l.enabled=i.enabled,l.transportName="xdr-polling",l.roundTrips=2,t.exports=l},{"./lib/ajax-based":24,"./receiver/xhr":32,"./sender/xdr":34,"./xdr-streaming":40,"inherits":54}],40:[function(e,t,n){"use strict";var r=e("inherits"),o=e("./lib/ajax-based"),i=e("./receiver/xhr"),s=e("./sender/xdr");function a(e){if(!s.enabled)throw new Error("Transport created when disabled");o.call(this,e,"/xhr_streaming",i,s)}r(a,o),a.enabled=function(e){return!e.cookie_needed&&!e.nullOrigin&&(s.enabled&&e.sameScheme)},a.transportName="xdr-streaming",a.roundTrips=2,t.exports=a},{"./lib/ajax-based":24,"./receiver/xhr":32,"./sender/xdr":34,"inherits":54}],41:[function(e,t,n){"use strict";var r=e("inherits"),o=e("./lib/ajax-based"),i=e("./receiver/xhr"),s=e("./sender/xhr-cors"),a=e("./sender/xhr-local");function l(e){if(!a.enabled&&!s.enabled)throw new Error("Transport created when disabled");o.call(this,e,"/xhr",i,s)}r(l,o),l.enabled=function(e){return!e.nullOrigin&&(!(!a.enabled||!e.sameOrigin)||s.enabled)},l.transportName="xhr-polling",l.roundTrips=2,t.exports=l},{"./lib/ajax-based":24,"./receiver/xhr":32,"./sender/xhr-cors":35,"./sender/xhr-local":37,"inherits":54}],42:[function(l,u,e){(function(a){(function(){"use strict";var e=l("inherits"),t=l("./lib/ajax-based"),n=l("./receiver/xhr"),r=l("./sender/xhr-cors"),o=l("./sender/xhr-local"),i=l("../utils/browser");function s(e){if(!o.enabled&&!r.enabled)throw new Error("Transport created when disabled");t.call(this,e,"/xhr_streaming",n,r)}e(s,t),s.enabled=function(e){return!e.nullOrigin&&(!i.isOpera()&&r.enabled)},s.transportName="xhr-streaming",s.roundTrips=2,s.needBody=!!a.document,u.exports=s}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../utils/browser":44,"./lib/ajax-based":24,"./receiver/xhr":32,"./sender/xhr-cors":35,"./sender/xhr-local":37,"inherits":54}],43:[function(e,t,n){(function(n){(function(){"use strict";n.crypto&&n.crypto.getRandomValues?t.exports.randomBytes=function(e){var t=new Uint8Array(e);return n.crypto.getRandomValues(t),t}:t.exports.randomBytes=function(e){for(var t=new Array(e),n=0;n 6 | 7 | 8 | 9 | 10 | 11 | 33 | 34 | 35 | 36 |
37 | 38 |
39 |
40 |
41 |
42 | 43 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /webshell.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/gin-gonic/gin" 7 | "github.com/igm/sockjs-go/v3/sockjs" 8 | "k8s.io/client-go/tools/remotecommand" 9 | 10 | "github.com/caoyingjunz/kube-webshell/app" 11 | ) 12 | 13 | func main() { 14 | r := gin.Default() 15 | 16 | // 静态文件和 html 文件引入 17 | r.Static("./static", "./static") 18 | r.LoadHTMLGlob("templates/*") 19 | 20 | r.GET("", func(c *gin.Context) { 21 | c.Request.URL.Path = "/index" 22 | r.HandleContext(c) 23 | }) 24 | r.GET("/index", func(c *gin.Context) { 25 | c.HTML(http.StatusOK, "index.html", gin.H{}) 26 | }) 27 | 28 | r.GET("/webshell", func(c *gin.Context) { 29 | var query struct { 30 | Namespace string `form:"namespace"` 31 | Pod string `form:"pod"` 32 | Container string `form:"container"` 33 | } 34 | if err := c.ShouldBindQuery(&query); err != nil { 35 | c.JSON(http.StatusBadRequest, gin.H{ 36 | "message": err.Error(), 37 | }) 38 | return 39 | } 40 | c.HTML(http.StatusOK, "webshell.html", gin.H{ 41 | "namespace": query.Namespace, 42 | "pod": query.Pod, 43 | "container": query.Container, 44 | }) 45 | }) 46 | 47 | r.GET("/webshell/ws/*info", func(c *gin.Context) { 48 | var query struct { 49 | Namespace string `form:"namespace"` 50 | Pod string `form:"pod"` 51 | Container string `form:"container"` 52 | } 53 | if err := c.ShouldBindQuery(&query); err != nil { 54 | c.JSON(http.StatusBadRequest, gin.H{ 55 | "message": err.Error(), 56 | }) 57 | return 58 | } 59 | sockjs.NewHandler("/webshell/ws", sockjs.DefaultOptions, func(session sockjs.Session) { 60 | if err := app.WebShellHandler(&app.WebShell{ 61 | Conn: session, 62 | SizeChan: make(chan *remotecommand.TerminalSize), 63 | Namespace: query.Namespace, 64 | Pod: query.Pod, 65 | Container: query.Container, 66 | }, "/bin/bash"); err != nil { 67 | } 68 | }).ServeHTTP(c.Writer, c.Request) 69 | }) 70 | 71 | _ = r.Run(":8080") 72 | } 73 | --------------------------------------------------------------------------------